From ddce5919afd5905fb8885f8ec6cda63c65fdee0f Mon Sep 17 00:00:00 2001 From: Paul Hu Date: Tue, 1 Aug 2023 10:26:49 +0800 Subject: [PATCH 1/2] Report service info callback metrics data Bug: 287546772 Test: atest FrameworksNetTestCases Change-Id: I630c0e4921f7acf42bf29812d9790ee5a894d60b --- .../metrics/NetworkNsdReportedMetrics.java | 48 ++++++++++++++ .../src/com/android/server/NsdService.java | 38 +++++++++-- .../metrics/NetworkNsdReportedMetricsTest.kt | 63 +++++++++++++++++++ .../com/android/server/NsdServiceTest.java | 24 +++++-- 4 files changed, 163 insertions(+), 10 deletions(-) diff --git a/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java b/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java index 052019fc80..665c41cdf6 100644 --- a/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java +++ b/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java @@ -221,4 +221,52 @@ public class NetworkNsdReportedMetrics { builder.setEventDurationMillisec(durationMs); mDependencies.statsWrite(builder.build()); } + + /** + * Report service info callback registered metric data. + * + * @param transactionId The transaction id of service info callback registration. + */ + public void reportServiceInfoCallbackRegistered(int transactionId) { + final Builder builder = makeReportedBuilder(); + builder.setTransactionId(transactionId); + builder.setType(NsdEventType.NET_SERVICE_INFO_CALLBACK); + builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_REGISTERED); + mDependencies.statsWrite(builder.build()); + } + + /** + * Report service info callback registration failed metric data. + * + * @param transactionId The transaction id of service callback registration. + */ + public void reportServiceInfoCallbackRegistrationFailed(int transactionId) { + final Builder builder = makeReportedBuilder(); + builder.setTransactionId(transactionId); + builder.setType(NsdEventType.NET_SERVICE_INFO_CALLBACK); + builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_REGISTRATION_FAILED); + mDependencies.statsWrite(builder.build()); + } + + /** + * Report service callback unregistered metric data. + * + * @param transactionId The transaction id of service callback registration. + * @param durationMs The duration of service callback stayed registered. + * @param updateCallbackCount The count of service update callbacks during this registration. + * @param lostCallbackCount The count of service lost callbacks during this registration. + * @param isServiceFromCache Whether the resolved service is from cache. + */ + public void reportServiceInfoCallbackUnregistered(int transactionId, long durationMs, + int updateCallbackCount, int lostCallbackCount, boolean isServiceFromCache) { + final Builder builder = makeReportedBuilder(); + builder.setTransactionId(transactionId); + builder.setType(NsdEventType.NET_SERVICE_INFO_CALLBACK); + builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_UNREGISTERED); + builder.setEventDurationMillisec(durationMs); + builder.setFoundCallbackCount(updateCallbackCount); + builder.setLostCallbackCount(lostCallbackCount); + builder.setIsKnownService(isServiceFromCache); + mDependencies.statsWrite(builder.build()); + } } diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java index 0a7ac9b94b..e189d69aca 100644 --- a/service-t/src/com/android/server/NsdService.java +++ b/service-t/src/com/android/server/NsdService.java @@ -1114,6 +1114,7 @@ public class NsdService extends INsdManager.Stub { resolveServiceType, listener, options); storeDiscoveryManagerRequestMap(clientRequestId, transactionId, listener, clientInfo, info.getNetwork()); + clientInfo.onServiceInfoCallbackRegistered(transactionId); clientInfo.log("Register a ServiceInfoListener " + transactionId + " for service type:" + resolveServiceType); break; @@ -1140,7 +1141,7 @@ public class NsdService extends INsdManager.Stub { if (request instanceof DiscoveryManagerRequest) { stopDiscoveryManagerRequest( request, clientRequestId, transactionId, clientInfo); - clientInfo.onServiceInfoCallbackUnregistered(clientRequestId); + clientInfo.onServiceInfoCallbackUnregistered(clientRequestId, request); clientInfo.log("Unregister the ServiceInfoListener " + transactionId); } else { loge("Unregister failed with non-DiscoveryManagerRequest."); @@ -1478,11 +1479,17 @@ public class NsdService extends INsdManager.Stub { final List addresses = getInetAddresses(serviceInfo); info.setHostAddresses(addresses); - clientInfo.onServiceUpdated(clientRequestId, info); + clientInfo.onServiceUpdated(clientRequestId, info, request); + // Set the ServiceFromCache flag only if the service is actually being + // retrieved from the cache. This flag should not be overridden by later + // service updates, which may not be cached. + if (event.mIsServiceFromCache) { + request.setServiceFromCache(true); + } break; } case NsdManager.SERVICE_UPDATED_LOST: - clientInfo.onServiceUpdatedLost(clientRequestId); + clientInfo.onServiceUpdatedLost(clientRequestId, request); break; default: return false; @@ -2396,6 +2403,12 @@ public class NsdService extends INsdManager.Stub { } else if (listener instanceof ResolutionListener) { mMetrics.reportServiceResolutionStop(transactionId, request.calculateRequestDurationMs(mClock.elapsedRealtime())); + } else if (listener instanceof ServiceInfoListener) { + mMetrics.reportServiceInfoCallbackUnregistered(transactionId, + request.calculateRequestDurationMs(mClock.elapsedRealtime()), + request.getFoundServiceCount(), + request.getLostServiceCount(), + request.isServiceFromCache()); } continue; } @@ -2622,6 +2635,7 @@ public class NsdService extends INsdManager.Stub { } void onServiceInfoCallbackRegistrationFailed(int listenerKey, int error) { + mMetrics.reportServiceInfoCallbackRegistrationFailed(NO_TRANSACTION); try { mCb.onServiceInfoCallbackRegistrationFailed(listenerKey, error); } catch (RemoteException e) { @@ -2629,7 +2643,12 @@ public class NsdService extends INsdManager.Stub { } } - void onServiceUpdated(int listenerKey, NsdServiceInfo info) { + void onServiceInfoCallbackRegistered(int transactionId) { + mMetrics.reportServiceInfoCallbackRegistered(transactionId); + } + + void onServiceUpdated(int listenerKey, NsdServiceInfo info, ClientRequest request) { + request.onServiceFound(info.getServiceName()); try { mCb.onServiceUpdated(listenerKey, info); } catch (RemoteException e) { @@ -2637,7 +2656,8 @@ public class NsdService extends INsdManager.Stub { } } - void onServiceUpdatedLost(int listenerKey) { + void onServiceUpdatedLost(int listenerKey, ClientRequest request) { + request.onServiceLost(); try { mCb.onServiceUpdatedLost(listenerKey); } catch (RemoteException e) { @@ -2645,7 +2665,13 @@ public class NsdService extends INsdManager.Stub { } } - void onServiceInfoCallbackUnregistered(int listenerKey) { + void onServiceInfoCallbackUnregistered(int listenerKey, ClientRequest request) { + mMetrics.reportServiceInfoCallbackUnregistered( + request.mTransactionId, + request.calculateRequestDurationMs(mClock.elapsedRealtime()), + request.getFoundServiceCount(), + request.getLostServiceCount(), + request.isServiceFromCache()); try { mCb.onServiceInfoCallbackUnregistered(listenerKey); } catch (RemoteException e) { diff --git a/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt b/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt index 97aa5759cb..740aa883a2 100644 --- a/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt +++ b/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt @@ -221,4 +221,67 @@ class NetworkNsdReportedMetricsTest { assertEquals(durationMs, it.eventDurationMillisec) } } + + @Test + fun testReportServiceInfoCallbackRegistered() { + val clientId = 99 + val transactionId = 100 + val metrics = NetworkNsdReportedMetrics(false /* isLegacy */, clientId, deps) + metrics.reportServiceInfoCallbackRegistered(transactionId) + + val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) + verify(deps).statsWrite(eventCaptor.capture()) + eventCaptor.value.let { + assertFalse(it.isLegacy) + assertEquals(clientId, it.clientId) + assertEquals(transactionId, it.transactionId) + assertEquals(NsdEventType.NET_SERVICE_INFO_CALLBACK, it.type) + assertEquals(MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_REGISTERED, it.queryResult) + } + } + + @Test + fun testReportServiceInfoCallbackRegistrationFailed() { + val clientId = 99 + val transactionId = 100 + val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps) + metrics.reportServiceInfoCallbackRegistrationFailed(transactionId) + + val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) + verify(deps).statsWrite(eventCaptor.capture()) + eventCaptor.value.let { + assertTrue(it.isLegacy) + assertEquals(clientId, it.clientId) + assertEquals(transactionId, it.transactionId) + assertEquals(NsdEventType.NET_SERVICE_INFO_CALLBACK, it.type) + assertEquals( + MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_REGISTRATION_FAILED, it.queryResult) + } + } + + @Test + fun testReportServiceInfoCallbackUnregistered() { + val clientId = 99 + val transactionId = 100 + val durationMs = 10L + val updateCallbackCount = 100 + val lostCallbackCount = 10 + val metrics = NetworkNsdReportedMetrics(false /* isLegacy */, clientId, deps) + metrics.reportServiceInfoCallbackUnregistered(transactionId, durationMs, + updateCallbackCount, lostCallbackCount, false /* isServiceFromCache */) + + val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) + verify(deps).statsWrite(eventCaptor.capture()) + eventCaptor.value.let { + assertFalse(it.isLegacy) + assertEquals(clientId, it.clientId) + assertEquals(transactionId, it.transactionId) + assertEquals(NsdEventType.NET_SERVICE_INFO_CALLBACK, it.type) + assertEquals(MdnsQueryResult.MQR_SERVICE_INFO_CALLBACK_UNREGISTERED, it.queryResult) + assertEquals(durationMs, it.eventDurationMillisec) + assertEquals(updateCallbackCount, it.foundCallbackCount) + assertEquals(lostCallbackCount, it.lostCallbackCount) + assertFalse(it.isKnownService) + } + } } diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java index c715c8e7af..ffc7904cbf 100644 --- a/tests/unit/java/com/android/server/NsdServiceTest.java +++ b/tests/unit/java/com/android/server/NsdServiceTest.java @@ -822,13 +822,17 @@ public class NsdServiceTest { client.registerServiceInfoCallback(request, Runnable::run, serviceInfoCallback); waitForIdle(); // Verify the registration callback start. - final ArgumentCaptor listenerCaptor = - ArgumentCaptor.forClass(MdnsServiceBrowserListener.class); + final ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(MdnsListener.class); verify(mSocketProvider).startMonitoringSockets(); verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain), listenerCaptor.capture(), argThat(options -> network.equals(options.getNetwork()))); - final MdnsServiceBrowserListener listener = listenerCaptor.getValue(); + final MdnsListener listener = listenerCaptor.getValue(); + final int servInfoId = listener.mTransactionId; + // Verify the service info callback registered. + verify(mMetrics).reportServiceInfoCallbackRegistered(servInfoId); + final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo( SERVICE_NAME, serviceTypeWithLocalDomain.split("\\."), @@ -842,8 +846,11 @@ public class NsdServiceTest { 1234, network); + // Callbacks for query sent. + listener.onDiscoveryQuerySent(Collections.emptyList(), 1 /* transactionId */); + // Verify onServiceFound callback - listener.onServiceFound(mdnsServiceInfo, false /* isServiceFromCache */); + listener.onServiceFound(mdnsServiceInfo, true /* isServiceFromCache */); final ArgumentCaptor updateInfoCaptor = ArgumentCaptor.forClass(NsdServiceInfo.class); verify(serviceInfoCallback, timeout(TIMEOUT_MS).times(1)) @@ -878,10 +885,18 @@ public class NsdServiceTest { List.of(parseNumericAddress(v4Address), parseNumericAddress(v6Address)), PORT, IFACE_IDX_ANY, new Network(999)); + // Service lost then recovered. + listener.onServiceRemoved(updatedServiceInfo); + listener.onServiceFound(updatedServiceInfo, false /* isServiceFromCache */); + // Verify service callback unregistration. + doReturn(TEST_TIME_MS + 10L).when(mClock).elapsedRealtime(); client.unregisterServiceInfoCallback(serviceInfoCallback); waitForIdle(); verify(serviceInfoCallback, timeout(TIMEOUT_MS)).onServiceInfoCallbackUnregistered(); + verify(mMetrics).reportServiceInfoCallbackUnregistered(servInfoId, 10L /* durationMs */, + 3 /* updateCallbackCount */, 1 /* lostCallbackCount */, + true /* isServiceFromCache */); } @Test @@ -897,6 +912,7 @@ public class NsdServiceTest { // Fail to register service callback. verify(serviceInfoCallback, timeout(TIMEOUT_MS)) .onServiceInfoCallbackRegistrationFailed(eq(FAILURE_BAD_PARAMETERS)); + verify(mMetrics).reportServiceInfoCallbackRegistrationFailed(NO_TRANSACTION); } @Test From bad6fe9835c05a8364d1a24e0e13c3e4b5d0e35c Mon Sep 17 00:00:00 2001 From: Paul Hu Date: Mon, 24 Jul 2023 21:25:22 +0800 Subject: [PATCH 2/2] Report sent query count Report the sent query count when the discovery is stopped. Bug: 287546772 Test: atest FrameworksNetTestCases NsdManagerTest Change-Id: I47b91c0c530eee2f00920ee5ea99e8d7b6e2e9ee --- .../metrics/NetworkNsdReportedMetrics.java | 13 ++- .../src/com/android/server/NsdService.java | 81 +++++++++++++++---- .../metrics/NetworkNsdReportedMetricsTest.kt | 16 +++- .../com/android/server/NsdServiceTest.java | 18 +++-- 4 files changed, 100 insertions(+), 28 deletions(-) diff --git a/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java b/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java index 665c41cdf6..597c06ffed 100644 --- a/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java +++ b/service-t/src/com/android/metrics/NetworkNsdReportedMetrics.java @@ -160,9 +160,10 @@ public class NetworkNsdReportedMetrics { * @param foundCallbackCount The count of found service callbacks before stop discovery. * @param lostCallbackCount The count of lost service callbacks before stop discovery. * @param servicesCount The count of found services. + * @param sentQueryCount The count of sent queries before stop discovery. */ public void reportServiceDiscoveryStop(int transactionId, long durationMs, - int foundCallbackCount, int lostCallbackCount, int servicesCount) { + int foundCallbackCount, int lostCallbackCount, int servicesCount, int sentQueryCount) { final Builder builder = makeReportedBuilder(); builder.setTransactionId(transactionId); builder.setType(NsdEventType.NET_DISCOVER); @@ -171,6 +172,7 @@ public class NetworkNsdReportedMetrics { builder.setFoundCallbackCount(foundCallbackCount); builder.setLostCallbackCount(lostCallbackCount); builder.setFoundServiceCount(servicesCount); + builder.setSentQueryCount(sentQueryCount); mDependencies.statsWrite(builder.build()); } @@ -180,15 +182,17 @@ public class NetworkNsdReportedMetrics { * @param transactionId The transaction id of service resolution. * @param durationMs The duration of resolving services. * @param isServiceFromCache Whether the resolved service is from cache. + * @param sentQueryCount The count of sent queries during resolving. */ public void reportServiceResolved(int transactionId, long durationMs, - boolean isServiceFromCache) { + boolean isServiceFromCache, int sentQueryCount) { final Builder builder = makeReportedBuilder(); builder.setTransactionId(transactionId); builder.setType(NsdEventType.NET_RESOLVE); builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_RESOLVED); builder.setEventDurationMillisec(durationMs); builder.setIsKnownService(isServiceFromCache); + builder.setSentQueryCount(sentQueryCount); mDependencies.statsWrite(builder.build()); } @@ -256,9 +260,11 @@ public class NetworkNsdReportedMetrics { * @param updateCallbackCount The count of service update callbacks during this registration. * @param lostCallbackCount The count of service lost callbacks during this registration. * @param isServiceFromCache Whether the resolved service is from cache. + * @param sentQueryCount The count of sent queries during this registration. */ public void reportServiceInfoCallbackUnregistered(int transactionId, long durationMs, - int updateCallbackCount, int lostCallbackCount, boolean isServiceFromCache) { + int updateCallbackCount, int lostCallbackCount, boolean isServiceFromCache, + int sentQueryCount) { final Builder builder = makeReportedBuilder(); builder.setTransactionId(transactionId); builder.setType(NsdEventType.NET_SERVICE_INFO_CALLBACK); @@ -267,6 +273,7 @@ public class NetworkNsdReportedMetrics { builder.setFoundCallbackCount(updateCallbackCount); builder.setLostCallbackCount(lostCallbackCount); builder.setIsKnownService(isServiceFromCache); + builder.setSentQueryCount(sentQueryCount); mDependencies.statsWrite(builder.build()); } } diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java index e189d69aca..ff1f02dff6 100644 --- a/service-t/src/com/android/server/NsdService.java +++ b/service-t/src/com/android/server/NsdService.java @@ -172,6 +172,8 @@ public class NsdService extends INsdManager.Stub { private static final int MAX_SERVICES_COUNT_METRIC_PER_CLIENT = 100; @VisibleForTesting static final int NO_TRANSACTION = -1; + private static final int NO_SENT_QUERY_COUNT = 0; + private static final int DISCOVERY_QUERY_SENT_CALLBACK = 1000; private static final SharedLog LOGGER = new SharedLog("serviceDiscovery"); private final Context mContext; @@ -288,7 +290,8 @@ public class NsdService extends INsdManager.Stub { public void onSearchFailedToStart() { } @Override - public void onDiscoveryQuerySent(@NonNull List subtypes, int transactionId) { } + public void onDiscoveryQuerySent(@NonNull List subtypes, + int sentQueryTransactionId) { } @Override public void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode) { } @@ -315,6 +318,13 @@ public class NsdService extends INsdManager.Stub { NsdManager.SERVICE_LOST, new MdnsEvent(mClientRequestId, serviceInfo)); } + + @Override + public void onDiscoveryQuerySent(@NonNull List subtypes, + int sentQueryTransactionId) { + mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId, + DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId)); + } } private class ResolutionListener extends MdnsListener { @@ -330,6 +340,13 @@ public class NsdService extends INsdManager.Stub { NsdManager.RESOLVE_SERVICE_SUCCEEDED, new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache)); } + + @Override + public void onDiscoveryQuerySent(@NonNull List subtypes, + int sentQueryTransactionId) { + mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId, + DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId)); + } } private class ServiceInfoListener extends MdnsListener { @@ -360,6 +377,13 @@ public class NsdService extends INsdManager.Stub { NsdManager.SERVICE_UPDATED_LOST, new MdnsEvent(mClientRequestId, serviceInfo)); } + + @Override + public void onDiscoveryQuerySent(@NonNull List subtypes, + int sentQueryTransactionId) { + mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId, + DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId)); + } } private class SocketRequestMonitor implements MdnsSocketProvider.SocketRequestMonitor { @@ -465,15 +489,19 @@ public class NsdService extends INsdManager.Stub { */ private static class MdnsEvent { final int mClientRequestId; - @NonNull + @Nullable final MdnsServiceInfo mMdnsServiceInfo; final boolean mIsServiceFromCache; - MdnsEvent(int clientRequestId, @NonNull MdnsServiceInfo mdnsServiceInfo) { + MdnsEvent(int clientRequestId) { + this(clientRequestId, null /* mdnsServiceInfo */, false /* isServiceFromCache */); + } + + MdnsEvent(int clientRequestId, @Nullable MdnsServiceInfo mdnsServiceInfo) { this(clientRequestId, mdnsServiceInfo, false /* isServiceFromCache */); } - MdnsEvent(int clientRequestId, @NonNull MdnsServiceInfo mdnsServiceInfo, + MdnsEvent(int clientRequestId, @Nullable MdnsServiceInfo mdnsServiceInfo, boolean isServiceFromCache) { mClientRequestId = clientRequestId; mMdnsServiceInfo = mdnsServiceInfo; @@ -1411,17 +1439,25 @@ public class NsdService extends INsdManager.Stub { final MdnsEvent event = (MdnsEvent) obj; final int clientRequestId = event.mClientRequestId; + final ClientRequest request = clientInfo.mClientRequests.get(clientRequestId); + if (request == null) { + Log.e(TAG, "Unknown client request. clientRequestId=" + clientRequestId); + return false; + } + + // Deal with the discovery sent callback + if (code == DISCOVERY_QUERY_SENT_CALLBACK) { + request.onQuerySent(); + return true; + } + + // Deal with other callbacks. final NsdServiceInfo info = buildNsdServiceInfoFromMdnsEvent(event, code); // Errors are already logged if null if (info == null) return false; mServiceLogs.log(String.format( "MdnsDiscoveryManager event code=%s transactionId=%d", NsdManager.nameOf(code), transactionId)); - final ClientRequest request = clientInfo.mClientRequests.get(clientRequestId); - if (request == null) { - Log.e(TAG, "Unknown client request. clientRequestId=" + clientRequestId); - return false; - } switch (code) { case NsdManager.SERVICE_FOUND: clientInfo.onServiceFound(clientRequestId, info, request); @@ -2225,6 +2261,7 @@ public class NsdService extends INsdManager.Stub { private int mLostServiceCount = 0; private final Set mServices = new ArraySet<>(); private boolean mIsServiceFromCache = false; + private int mSentQueryCount = NO_SENT_QUERY_COUNT; private ClientRequest(int transactionId, long startTimeMs) { mTransactionId = transactionId; @@ -2265,6 +2302,14 @@ public class NsdService extends INsdManager.Stub { public boolean isServiceFromCache() { return mIsServiceFromCache; } + + public void onQuerySent() { + mSentQueryCount++; + } + + public int getSentQueryCount() { + return mSentQueryCount; + } } private static class LegacyClientRequest extends ClientRequest { @@ -2399,7 +2444,8 @@ public class NsdService extends INsdManager.Stub { request.calculateRequestDurationMs(mClock.elapsedRealtime()), request.getFoundServiceCount(), request.getLostServiceCount(), - request.getServicesCount()); + request.getServicesCount(), + request.getSentQueryCount()); } else if (listener instanceof ResolutionListener) { mMetrics.reportServiceResolutionStop(transactionId, request.calculateRequestDurationMs(mClock.elapsedRealtime())); @@ -2408,7 +2454,8 @@ public class NsdService extends INsdManager.Stub { request.calculateRequestDurationMs(mClock.elapsedRealtime()), request.getFoundServiceCount(), request.getLostServiceCount(), - request.isServiceFromCache()); + request.isServiceFromCache(), + request.getSentQueryCount()); } continue; } @@ -2431,7 +2478,8 @@ public class NsdService extends INsdManager.Stub { request.calculateRequestDurationMs(mClock.elapsedRealtime()), request.getFoundServiceCount(), request.getLostServiceCount(), - request.getServicesCount()); + request.getServicesCount(), + NO_SENT_QUERY_COUNT); break; case NsdManager.RESOLVE_SERVICE: stopResolveService(transactionId); @@ -2539,7 +2587,8 @@ public class NsdService extends INsdManager.Stub { request.calculateRequestDurationMs(mClock.elapsedRealtime()), request.getFoundServiceCount(), request.getLostServiceCount(), - request.getServicesCount()); + request.getServicesCount(), + request.getSentQueryCount()); try { mCb.onStopDiscoverySucceeded(listenerKey); } catch (RemoteException e) { @@ -2607,7 +2656,8 @@ public class NsdService extends INsdManager.Stub { mMetrics.reportServiceResolved( request.mTransactionId, request.calculateRequestDurationMs(mClock.elapsedRealtime()), - request.isServiceFromCache()); + request.isServiceFromCache(), + request.getSentQueryCount()); try { mCb.onResolveServiceSucceeded(listenerKey, info); } catch (RemoteException e) { @@ -2671,7 +2721,8 @@ public class NsdService extends INsdManager.Stub { request.calculateRequestDurationMs(mClock.elapsedRealtime()), request.getFoundServiceCount(), request.getLostServiceCount(), - request.isServiceFromCache()); + request.isServiceFromCache(), + request.getSentQueryCount()); try { mCb.onServiceInfoCallbackUnregistered(listenerKey); } catch (RemoteException e) { diff --git a/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt b/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt index 740aa883a2..7f893df2c7 100644 --- a/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt +++ b/tests/unit/java/com/android/metrics/NetworkNsdReportedMetricsTest.kt @@ -141,9 +141,10 @@ class NetworkNsdReportedMetricsTest { val foundCallbackCount = 100 val lostCallbackCount = 49 val servicesCount = 75 + val sentQueryCount = 150 val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps) - metrics.reportServiceDiscoveryStop( - transactionId, durationMs, foundCallbackCount, lostCallbackCount, servicesCount) + metrics.reportServiceDiscoveryStop(transactionId, durationMs, foundCallbackCount, + lostCallbackCount, servicesCount, sentQueryCount) val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) verify(deps).statsWrite(eventCaptor.capture()) @@ -158,6 +159,7 @@ class NetworkNsdReportedMetricsTest { assertEquals(lostCallbackCount, it.lostCallbackCount) assertEquals(servicesCount, it.foundServiceCount) assertEquals(durationMs, it.eventDurationMillisec) + assertEquals(sentQueryCount, it.sentQueryCount) } } @@ -166,8 +168,10 @@ class NetworkNsdReportedMetricsTest { val clientId = 99 val transactionId = 100 val durationMs = 10L + val sentQueryCount = 0 val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps) - metrics.reportServiceResolved(transactionId, durationMs, true /* isServiceFromCache */) + metrics.reportServiceResolved(transactionId, durationMs, true /* isServiceFromCache */, + sentQueryCount) val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) verify(deps).statsWrite(eventCaptor.capture()) @@ -179,6 +183,7 @@ class NetworkNsdReportedMetricsTest { assertEquals(MdnsQueryResult.MQR_SERVICE_RESOLVED, it.queryResult) assertTrue(it.isKnownService) assertEquals(durationMs, it.eventDurationMillisec) + assertEquals(sentQueryCount, it.sentQueryCount) } } @@ -266,9 +271,11 @@ class NetworkNsdReportedMetricsTest { val durationMs = 10L val updateCallbackCount = 100 val lostCallbackCount = 10 + val sentQueryCount = 150 val metrics = NetworkNsdReportedMetrics(false /* isLegacy */, clientId, deps) metrics.reportServiceInfoCallbackUnregistered(transactionId, durationMs, - updateCallbackCount, lostCallbackCount, false /* isServiceFromCache */) + updateCallbackCount, lostCallbackCount, false /* isServiceFromCache */, + sentQueryCount) val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java) verify(deps).statsWrite(eventCaptor.capture()) @@ -282,6 +289,7 @@ class NetworkNsdReportedMetricsTest { assertEquals(updateCallbackCount, it.foundCallbackCount) assertEquals(lostCallbackCount, it.lostCallbackCount) assertFalse(it.isKnownService) + assertEquals(sentQueryCount, it.sentQueryCount) } } } diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java index ffc7904cbf..7a6424eeb9 100644 --- a/tests/unit/java/com/android/server/NsdServiceTest.java +++ b/tests/unit/java/com/android/server/NsdServiceTest.java @@ -472,8 +472,8 @@ public class NsdServiceTest { final ArgumentCaptor resInfoCaptor = ArgumentCaptor.forClass(NsdServiceInfo.class); verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(resInfoCaptor.capture()); - verify(mMetrics).reportServiceResolved( - getAddrId, 10L /* durationMs */, false /* isServiceFromCache */); + verify(mMetrics).reportServiceResolved(getAddrId, 10L /* durationMs */, + false /* isServiceFromCache */, 0 /* sentQueryCount */); final NsdServiceInfo resolvedService = resInfoCaptor.getValue(); assertEquals(SERVICE_NAME, resolvedService.getServiceName()); @@ -896,7 +896,7 @@ public class NsdServiceTest { verify(serviceInfoCallback, timeout(TIMEOUT_MS)).onServiceInfoCallbackUnregistered(); verify(mMetrics).reportServiceInfoCallbackUnregistered(servInfoId, 10L /* durationMs */, 3 /* updateCallbackCount */, 1 /* lostCallbackCount */, - true /* isServiceFromCache */); + true /* isServiceFromCache */, 1 /* sentQueryCount */); } @Test @@ -989,6 +989,11 @@ public class NsdServiceTest { final int discId = listener.mTransactionId; verify(mMetrics).reportServiceDiscoveryStarted(discId); + // Callbacks for query sent. + listener.onDiscoveryQuerySent(Collections.emptyList(), 1 /* transactionId */); + listener.onDiscoveryQuerySent(Collections.emptyList(), 2 /* transactionId */); + listener.onDiscoveryQuerySent(Collections.emptyList(), 3 /* transactionId */); + final MdnsServiceInfo foundInfo = new MdnsServiceInfo( SERVICE_NAME, /* serviceInstanceName */ serviceTypeWithLocalDomain.split("\\."), /* serviceType */ @@ -1037,7 +1042,8 @@ public class NsdServiceTest { verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStopped(SERVICE_TYPE); verify(mSocketProvider, timeout(CLEANUP_DELAY_MS + TIMEOUT_MS)).requestStopWhenInactive(); verify(mMetrics).reportServiceDiscoveryStop(discId, 10L /* durationMs */, - 1 /* foundCallbackCount */, 1 /* lostCallbackCount */, 1 /* servicesCount */); + 1 /* foundCallbackCount */, 1 /* lostCallbackCount */, 1 /* servicesCount */, + 3 /* sentQueryCount */); } @Test @@ -1149,8 +1155,8 @@ public class NsdServiceTest { final ArgumentCaptor infoCaptor = ArgumentCaptor.forClass(NsdServiceInfo.class); verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(infoCaptor.capture()); - verify(mMetrics).reportServiceResolved( - listener.mTransactionId, 10 /* durationMs */, true /* isServiceFromCache */); + verify(mMetrics).reportServiceResolved(listener.mTransactionId, 10 /* durationMs */, + true /* isServiceFromCache */, 0 /* sendQueryCount */); final NsdServiceInfo info = infoCaptor.getValue(); assertEquals(SERVICE_NAME, info.getServiceName());