Merge changes I47b91c0c,I630c0e49 into main
* changes: Report sent query count Report service info callback metrics data
This commit is contained in:
@@ -160,9 +160,10 @@ public class NetworkNsdReportedMetrics {
|
|||||||
* @param foundCallbackCount The count of found service callbacks before stop discovery.
|
* @param foundCallbackCount The count of found service callbacks before stop discovery.
|
||||||
* @param lostCallbackCount The count of lost service callbacks before stop discovery.
|
* @param lostCallbackCount The count of lost service callbacks before stop discovery.
|
||||||
* @param servicesCount The count of found services.
|
* @param servicesCount The count of found services.
|
||||||
|
* @param sentQueryCount The count of sent queries before stop discovery.
|
||||||
*/
|
*/
|
||||||
public void reportServiceDiscoveryStop(int transactionId, long durationMs,
|
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();
|
final Builder builder = makeReportedBuilder();
|
||||||
builder.setTransactionId(transactionId);
|
builder.setTransactionId(transactionId);
|
||||||
builder.setType(NsdEventType.NET_DISCOVER);
|
builder.setType(NsdEventType.NET_DISCOVER);
|
||||||
@@ -171,6 +172,7 @@ public class NetworkNsdReportedMetrics {
|
|||||||
builder.setFoundCallbackCount(foundCallbackCount);
|
builder.setFoundCallbackCount(foundCallbackCount);
|
||||||
builder.setLostCallbackCount(lostCallbackCount);
|
builder.setLostCallbackCount(lostCallbackCount);
|
||||||
builder.setFoundServiceCount(servicesCount);
|
builder.setFoundServiceCount(servicesCount);
|
||||||
|
builder.setSentQueryCount(sentQueryCount);
|
||||||
mDependencies.statsWrite(builder.build());
|
mDependencies.statsWrite(builder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,15 +182,17 @@ public class NetworkNsdReportedMetrics {
|
|||||||
* @param transactionId The transaction id of service resolution.
|
* @param transactionId The transaction id of service resolution.
|
||||||
* @param durationMs The duration of resolving services.
|
* @param durationMs The duration of resolving services.
|
||||||
* @param isServiceFromCache Whether the resolved service is from cache.
|
* @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,
|
public void reportServiceResolved(int transactionId, long durationMs,
|
||||||
boolean isServiceFromCache) {
|
boolean isServiceFromCache, int sentQueryCount) {
|
||||||
final Builder builder = makeReportedBuilder();
|
final Builder builder = makeReportedBuilder();
|
||||||
builder.setTransactionId(transactionId);
|
builder.setTransactionId(transactionId);
|
||||||
builder.setType(NsdEventType.NET_RESOLVE);
|
builder.setType(NsdEventType.NET_RESOLVE);
|
||||||
builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_RESOLVED);
|
builder.setQueryResult(MdnsQueryResult.MQR_SERVICE_RESOLVED);
|
||||||
builder.setEventDurationMillisec(durationMs);
|
builder.setEventDurationMillisec(durationMs);
|
||||||
builder.setIsKnownService(isServiceFromCache);
|
builder.setIsKnownService(isServiceFromCache);
|
||||||
|
builder.setSentQueryCount(sentQueryCount);
|
||||||
mDependencies.statsWrite(builder.build());
|
mDependencies.statsWrite(builder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,4 +225,55 @@ public class NetworkNsdReportedMetrics {
|
|||||||
builder.setEventDurationMillisec(durationMs);
|
builder.setEventDurationMillisec(durationMs);
|
||||||
mDependencies.statsWrite(builder.build());
|
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.
|
||||||
|
* @param sentQueryCount The count of sent queries during this registration.
|
||||||
|
*/
|
||||||
|
public void reportServiceInfoCallbackUnregistered(int transactionId, long durationMs,
|
||||||
|
int updateCallbackCount, int lostCallbackCount, boolean isServiceFromCache,
|
||||||
|
int sentQueryCount) {
|
||||||
|
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);
|
||||||
|
builder.setSentQueryCount(sentQueryCount);
|
||||||
|
mDependencies.statsWrite(builder.build());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,6 +172,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private static final int MAX_SERVICES_COUNT_METRIC_PER_CLIENT = 100;
|
private static final int MAX_SERVICES_COUNT_METRIC_PER_CLIENT = 100;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final int NO_TRANSACTION = -1;
|
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 static final SharedLog LOGGER = new SharedLog("serviceDiscovery");
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
@@ -288,7 +290,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
public void onSearchFailedToStart() { }
|
public void onSearchFailedToStart() { }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDiscoveryQuerySent(@NonNull List<String> subtypes, int transactionId) { }
|
public void onDiscoveryQuerySent(@NonNull List<String> subtypes,
|
||||||
|
int sentQueryTransactionId) { }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode) { }
|
public void onFailedToParseMdnsResponse(int receivedPacketNumber, int errorCode) { }
|
||||||
@@ -315,6 +318,13 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
NsdManager.SERVICE_LOST,
|
NsdManager.SERVICE_LOST,
|
||||||
new MdnsEvent(mClientRequestId, serviceInfo));
|
new MdnsEvent(mClientRequestId, serviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDiscoveryQuerySent(@NonNull List<String> subtypes,
|
||||||
|
int sentQueryTransactionId) {
|
||||||
|
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||||
|
DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ResolutionListener extends MdnsListener {
|
private class ResolutionListener extends MdnsListener {
|
||||||
@@ -330,6 +340,13 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
NsdManager.RESOLVE_SERVICE_SUCCEEDED,
|
NsdManager.RESOLVE_SERVICE_SUCCEEDED,
|
||||||
new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache));
|
new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDiscoveryQuerySent(@NonNull List<String> subtypes,
|
||||||
|
int sentQueryTransactionId) {
|
||||||
|
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||||
|
DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ServiceInfoListener extends MdnsListener {
|
private class ServiceInfoListener extends MdnsListener {
|
||||||
@@ -360,6 +377,13 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
NsdManager.SERVICE_UPDATED_LOST,
|
NsdManager.SERVICE_UPDATED_LOST,
|
||||||
new MdnsEvent(mClientRequestId, serviceInfo));
|
new MdnsEvent(mClientRequestId, serviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDiscoveryQuerySent(@NonNull List<String> subtypes,
|
||||||
|
int sentQueryTransactionId) {
|
||||||
|
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||||
|
DISCOVERY_QUERY_SENT_CALLBACK, new MdnsEvent(mClientRequestId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SocketRequestMonitor implements MdnsSocketProvider.SocketRequestMonitor {
|
private class SocketRequestMonitor implements MdnsSocketProvider.SocketRequestMonitor {
|
||||||
@@ -465,15 +489,19 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
*/
|
*/
|
||||||
private static class MdnsEvent {
|
private static class MdnsEvent {
|
||||||
final int mClientRequestId;
|
final int mClientRequestId;
|
||||||
@NonNull
|
@Nullable
|
||||||
final MdnsServiceInfo mMdnsServiceInfo;
|
final MdnsServiceInfo mMdnsServiceInfo;
|
||||||
final boolean mIsServiceFromCache;
|
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 */);
|
this(clientRequestId, mdnsServiceInfo, false /* isServiceFromCache */);
|
||||||
}
|
}
|
||||||
|
|
||||||
MdnsEvent(int clientRequestId, @NonNull MdnsServiceInfo mdnsServiceInfo,
|
MdnsEvent(int clientRequestId, @Nullable MdnsServiceInfo mdnsServiceInfo,
|
||||||
boolean isServiceFromCache) {
|
boolean isServiceFromCache) {
|
||||||
mClientRequestId = clientRequestId;
|
mClientRequestId = clientRequestId;
|
||||||
mMdnsServiceInfo = mdnsServiceInfo;
|
mMdnsServiceInfo = mdnsServiceInfo;
|
||||||
@@ -1114,6 +1142,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
resolveServiceType, listener, options);
|
resolveServiceType, listener, options);
|
||||||
storeDiscoveryManagerRequestMap(clientRequestId, transactionId, listener,
|
storeDiscoveryManagerRequestMap(clientRequestId, transactionId, listener,
|
||||||
clientInfo, info.getNetwork());
|
clientInfo, info.getNetwork());
|
||||||
|
clientInfo.onServiceInfoCallbackRegistered(transactionId);
|
||||||
clientInfo.log("Register a ServiceInfoListener " + transactionId
|
clientInfo.log("Register a ServiceInfoListener " + transactionId
|
||||||
+ " for service type:" + resolveServiceType);
|
+ " for service type:" + resolveServiceType);
|
||||||
break;
|
break;
|
||||||
@@ -1140,7 +1169,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
if (request instanceof DiscoveryManagerRequest) {
|
if (request instanceof DiscoveryManagerRequest) {
|
||||||
stopDiscoveryManagerRequest(
|
stopDiscoveryManagerRequest(
|
||||||
request, clientRequestId, transactionId, clientInfo);
|
request, clientRequestId, transactionId, clientInfo);
|
||||||
clientInfo.onServiceInfoCallbackUnregistered(clientRequestId);
|
clientInfo.onServiceInfoCallbackUnregistered(clientRequestId, request);
|
||||||
clientInfo.log("Unregister the ServiceInfoListener " + transactionId);
|
clientInfo.log("Unregister the ServiceInfoListener " + transactionId);
|
||||||
} else {
|
} else {
|
||||||
loge("Unregister failed with non-DiscoveryManagerRequest.");
|
loge("Unregister failed with non-DiscoveryManagerRequest.");
|
||||||
@@ -1410,17 +1439,25 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
|
|
||||||
final MdnsEvent event = (MdnsEvent) obj;
|
final MdnsEvent event = (MdnsEvent) obj;
|
||||||
final int clientRequestId = event.mClientRequestId;
|
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);
|
final NsdServiceInfo info = buildNsdServiceInfoFromMdnsEvent(event, code);
|
||||||
// Errors are already logged if null
|
// Errors are already logged if null
|
||||||
if (info == null) return false;
|
if (info == null) return false;
|
||||||
mServiceLogs.log(String.format(
|
mServiceLogs.log(String.format(
|
||||||
"MdnsDiscoveryManager event code=%s transactionId=%d",
|
"MdnsDiscoveryManager event code=%s transactionId=%d",
|
||||||
NsdManager.nameOf(code), transactionId));
|
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) {
|
switch (code) {
|
||||||
case NsdManager.SERVICE_FOUND:
|
case NsdManager.SERVICE_FOUND:
|
||||||
clientInfo.onServiceFound(clientRequestId, info, request);
|
clientInfo.onServiceFound(clientRequestId, info, request);
|
||||||
@@ -1478,11 +1515,17 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
|
|
||||||
final List<InetAddress> addresses = getInetAddresses(serviceInfo);
|
final List<InetAddress> addresses = getInetAddresses(serviceInfo);
|
||||||
info.setHostAddresses(addresses);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case NsdManager.SERVICE_UPDATED_LOST:
|
case NsdManager.SERVICE_UPDATED_LOST:
|
||||||
clientInfo.onServiceUpdatedLost(clientRequestId);
|
clientInfo.onServiceUpdatedLost(clientRequestId, request);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@@ -2218,6 +2261,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private int mLostServiceCount = 0;
|
private int mLostServiceCount = 0;
|
||||||
private final Set<String> mServices = new ArraySet<>();
|
private final Set<String> mServices = new ArraySet<>();
|
||||||
private boolean mIsServiceFromCache = false;
|
private boolean mIsServiceFromCache = false;
|
||||||
|
private int mSentQueryCount = NO_SENT_QUERY_COUNT;
|
||||||
|
|
||||||
private ClientRequest(int transactionId, long startTimeMs) {
|
private ClientRequest(int transactionId, long startTimeMs) {
|
||||||
mTransactionId = transactionId;
|
mTransactionId = transactionId;
|
||||||
@@ -2258,6 +2302,14 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
public boolean isServiceFromCache() {
|
public boolean isServiceFromCache() {
|
||||||
return mIsServiceFromCache;
|
return mIsServiceFromCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onQuerySent() {
|
||||||
|
mSentQueryCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSentQueryCount() {
|
||||||
|
return mSentQueryCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class LegacyClientRequest extends ClientRequest {
|
private static class LegacyClientRequest extends ClientRequest {
|
||||||
@@ -2392,10 +2444,18 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||||
request.getFoundServiceCount(),
|
request.getFoundServiceCount(),
|
||||||
request.getLostServiceCount(),
|
request.getLostServiceCount(),
|
||||||
request.getServicesCount());
|
request.getServicesCount(),
|
||||||
|
request.getSentQueryCount());
|
||||||
} else if (listener instanceof ResolutionListener) {
|
} else if (listener instanceof ResolutionListener) {
|
||||||
mMetrics.reportServiceResolutionStop(transactionId,
|
mMetrics.reportServiceResolutionStop(transactionId,
|
||||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||||
|
} else if (listener instanceof ServiceInfoListener) {
|
||||||
|
mMetrics.reportServiceInfoCallbackUnregistered(transactionId,
|
||||||
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||||
|
request.getFoundServiceCount(),
|
||||||
|
request.getLostServiceCount(),
|
||||||
|
request.isServiceFromCache(),
|
||||||
|
request.getSentQueryCount());
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2418,7 +2478,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||||
request.getFoundServiceCount(),
|
request.getFoundServiceCount(),
|
||||||
request.getLostServiceCount(),
|
request.getLostServiceCount(),
|
||||||
request.getServicesCount());
|
request.getServicesCount(),
|
||||||
|
NO_SENT_QUERY_COUNT);
|
||||||
break;
|
break;
|
||||||
case NsdManager.RESOLVE_SERVICE:
|
case NsdManager.RESOLVE_SERVICE:
|
||||||
stopResolveService(transactionId);
|
stopResolveService(transactionId);
|
||||||
@@ -2526,7 +2587,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||||
request.getFoundServiceCount(),
|
request.getFoundServiceCount(),
|
||||||
request.getLostServiceCount(),
|
request.getLostServiceCount(),
|
||||||
request.getServicesCount());
|
request.getServicesCount(),
|
||||||
|
request.getSentQueryCount());
|
||||||
try {
|
try {
|
||||||
mCb.onStopDiscoverySucceeded(listenerKey);
|
mCb.onStopDiscoverySucceeded(listenerKey);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2594,7 +2656,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMetrics.reportServiceResolved(
|
mMetrics.reportServiceResolved(
|
||||||
request.mTransactionId,
|
request.mTransactionId,
|
||||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||||
request.isServiceFromCache());
|
request.isServiceFromCache(),
|
||||||
|
request.getSentQueryCount());
|
||||||
try {
|
try {
|
||||||
mCb.onResolveServiceSucceeded(listenerKey, info);
|
mCb.onResolveServiceSucceeded(listenerKey, info);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2622,6 +2685,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onServiceInfoCallbackRegistrationFailed(int listenerKey, int error) {
|
void onServiceInfoCallbackRegistrationFailed(int listenerKey, int error) {
|
||||||
|
mMetrics.reportServiceInfoCallbackRegistrationFailed(NO_TRANSACTION);
|
||||||
try {
|
try {
|
||||||
mCb.onServiceInfoCallbackRegistrationFailed(listenerKey, error);
|
mCb.onServiceInfoCallbackRegistrationFailed(listenerKey, error);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2629,7 +2693,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 {
|
try {
|
||||||
mCb.onServiceUpdated(listenerKey, info);
|
mCb.onServiceUpdated(listenerKey, info);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2637,7 +2706,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onServiceUpdatedLost(int listenerKey) {
|
void onServiceUpdatedLost(int listenerKey, ClientRequest request) {
|
||||||
|
request.onServiceLost();
|
||||||
try {
|
try {
|
||||||
mCb.onServiceUpdatedLost(listenerKey);
|
mCb.onServiceUpdatedLost(listenerKey);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2645,7 +2715,14 @@ 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(),
|
||||||
|
request.getSentQueryCount());
|
||||||
try {
|
try {
|
||||||
mCb.onServiceInfoCallbackUnregistered(listenerKey);
|
mCb.onServiceInfoCallbackUnregistered(listenerKey);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
|
|||||||
@@ -141,9 +141,10 @@ class NetworkNsdReportedMetricsTest {
|
|||||||
val foundCallbackCount = 100
|
val foundCallbackCount = 100
|
||||||
val lostCallbackCount = 49
|
val lostCallbackCount = 49
|
||||||
val servicesCount = 75
|
val servicesCount = 75
|
||||||
|
val sentQueryCount = 150
|
||||||
val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps)
|
val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps)
|
||||||
metrics.reportServiceDiscoveryStop(
|
metrics.reportServiceDiscoveryStop(transactionId, durationMs, foundCallbackCount,
|
||||||
transactionId, durationMs, foundCallbackCount, lostCallbackCount, servicesCount)
|
lostCallbackCount, servicesCount, sentQueryCount)
|
||||||
|
|
||||||
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
||||||
verify(deps).statsWrite(eventCaptor.capture())
|
verify(deps).statsWrite(eventCaptor.capture())
|
||||||
@@ -158,6 +159,7 @@ class NetworkNsdReportedMetricsTest {
|
|||||||
assertEquals(lostCallbackCount, it.lostCallbackCount)
|
assertEquals(lostCallbackCount, it.lostCallbackCount)
|
||||||
assertEquals(servicesCount, it.foundServiceCount)
|
assertEquals(servicesCount, it.foundServiceCount)
|
||||||
assertEquals(durationMs, it.eventDurationMillisec)
|
assertEquals(durationMs, it.eventDurationMillisec)
|
||||||
|
assertEquals(sentQueryCount, it.sentQueryCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,8 +168,10 @@ class NetworkNsdReportedMetricsTest {
|
|||||||
val clientId = 99
|
val clientId = 99
|
||||||
val transactionId = 100
|
val transactionId = 100
|
||||||
val durationMs = 10L
|
val durationMs = 10L
|
||||||
|
val sentQueryCount = 0
|
||||||
val metrics = NetworkNsdReportedMetrics(true /* isLegacy */, clientId, deps)
|
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)
|
val eventCaptor = ArgumentCaptor.forClass(NetworkNsdReported::class.java)
|
||||||
verify(deps).statsWrite(eventCaptor.capture())
|
verify(deps).statsWrite(eventCaptor.capture())
|
||||||
@@ -179,6 +183,7 @@ class NetworkNsdReportedMetricsTest {
|
|||||||
assertEquals(MdnsQueryResult.MQR_SERVICE_RESOLVED, it.queryResult)
|
assertEquals(MdnsQueryResult.MQR_SERVICE_RESOLVED, it.queryResult)
|
||||||
assertTrue(it.isKnownService)
|
assertTrue(it.isKnownService)
|
||||||
assertEquals(durationMs, it.eventDurationMillisec)
|
assertEquals(durationMs, it.eventDurationMillisec)
|
||||||
|
assertEquals(sentQueryCount, it.sentQueryCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,4 +226,70 @@ class NetworkNsdReportedMetricsTest {
|
|||||||
assertEquals(durationMs, it.eventDurationMillisec)
|
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 sentQueryCount = 150
|
||||||
|
val metrics = NetworkNsdReportedMetrics(false /* isLegacy */, clientId, deps)
|
||||||
|
metrics.reportServiceInfoCallbackUnregistered(transactionId, durationMs,
|
||||||
|
updateCallbackCount, lostCallbackCount, false /* isServiceFromCache */,
|
||||||
|
sentQueryCount)
|
||||||
|
|
||||||
|
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)
|
||||||
|
assertEquals(sentQueryCount, it.sentQueryCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -472,8 +472,8 @@ public class NsdServiceTest {
|
|||||||
final ArgumentCaptor<NsdServiceInfo> resInfoCaptor =
|
final ArgumentCaptor<NsdServiceInfo> resInfoCaptor =
|
||||||
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
||||||
verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(resInfoCaptor.capture());
|
verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(resInfoCaptor.capture());
|
||||||
verify(mMetrics).reportServiceResolved(
|
verify(mMetrics).reportServiceResolved(getAddrId, 10L /* durationMs */,
|
||||||
getAddrId, 10L /* durationMs */, false /* isServiceFromCache */);
|
false /* isServiceFromCache */, 0 /* sentQueryCount */);
|
||||||
|
|
||||||
final NsdServiceInfo resolvedService = resInfoCaptor.getValue();
|
final NsdServiceInfo resolvedService = resInfoCaptor.getValue();
|
||||||
assertEquals(SERVICE_NAME, resolvedService.getServiceName());
|
assertEquals(SERVICE_NAME, resolvedService.getServiceName());
|
||||||
@@ -822,13 +822,17 @@ public class NsdServiceTest {
|
|||||||
client.registerServiceInfoCallback(request, Runnable::run, serviceInfoCallback);
|
client.registerServiceInfoCallback(request, Runnable::run, serviceInfoCallback);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
// Verify the registration callback start.
|
// Verify the registration callback start.
|
||||||
final ArgumentCaptor<MdnsServiceBrowserListener> listenerCaptor =
|
final ArgumentCaptor<MdnsListener> listenerCaptor =
|
||||||
ArgumentCaptor.forClass(MdnsServiceBrowserListener.class);
|
ArgumentCaptor.forClass(MdnsListener.class);
|
||||||
verify(mSocketProvider).startMonitoringSockets();
|
verify(mSocketProvider).startMonitoringSockets();
|
||||||
verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain),
|
verify(mDiscoveryManager).registerListener(eq(serviceTypeWithLocalDomain),
|
||||||
listenerCaptor.capture(), argThat(options -> network.equals(options.getNetwork())));
|
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(
|
final MdnsServiceInfo mdnsServiceInfo = new MdnsServiceInfo(
|
||||||
SERVICE_NAME,
|
SERVICE_NAME,
|
||||||
serviceTypeWithLocalDomain.split("\\."),
|
serviceTypeWithLocalDomain.split("\\."),
|
||||||
@@ -842,8 +846,11 @@ public class NsdServiceTest {
|
|||||||
1234,
|
1234,
|
||||||
network);
|
network);
|
||||||
|
|
||||||
|
// Callbacks for query sent.
|
||||||
|
listener.onDiscoveryQuerySent(Collections.emptyList(), 1 /* transactionId */);
|
||||||
|
|
||||||
// Verify onServiceFound callback
|
// Verify onServiceFound callback
|
||||||
listener.onServiceFound(mdnsServiceInfo, false /* isServiceFromCache */);
|
listener.onServiceFound(mdnsServiceInfo, true /* isServiceFromCache */);
|
||||||
final ArgumentCaptor<NsdServiceInfo> updateInfoCaptor =
|
final ArgumentCaptor<NsdServiceInfo> updateInfoCaptor =
|
||||||
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
||||||
verify(serviceInfoCallback, timeout(TIMEOUT_MS).times(1))
|
verify(serviceInfoCallback, timeout(TIMEOUT_MS).times(1))
|
||||||
@@ -878,10 +885,18 @@ public class NsdServiceTest {
|
|||||||
List.of(parseNumericAddress(v4Address), parseNumericAddress(v6Address)),
|
List.of(parseNumericAddress(v4Address), parseNumericAddress(v6Address)),
|
||||||
PORT, IFACE_IDX_ANY, new Network(999));
|
PORT, IFACE_IDX_ANY, new Network(999));
|
||||||
|
|
||||||
|
// Service lost then recovered.
|
||||||
|
listener.onServiceRemoved(updatedServiceInfo);
|
||||||
|
listener.onServiceFound(updatedServiceInfo, false /* isServiceFromCache */);
|
||||||
|
|
||||||
// Verify service callback unregistration.
|
// Verify service callback unregistration.
|
||||||
|
doReturn(TEST_TIME_MS + 10L).when(mClock).elapsedRealtime();
|
||||||
client.unregisterServiceInfoCallback(serviceInfoCallback);
|
client.unregisterServiceInfoCallback(serviceInfoCallback);
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(serviceInfoCallback, timeout(TIMEOUT_MS)).onServiceInfoCallbackUnregistered();
|
verify(serviceInfoCallback, timeout(TIMEOUT_MS)).onServiceInfoCallbackUnregistered();
|
||||||
|
verify(mMetrics).reportServiceInfoCallbackUnregistered(servInfoId, 10L /* durationMs */,
|
||||||
|
3 /* updateCallbackCount */, 1 /* lostCallbackCount */,
|
||||||
|
true /* isServiceFromCache */, 1 /* sentQueryCount */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -897,6 +912,7 @@ public class NsdServiceTest {
|
|||||||
// Fail to register service callback.
|
// Fail to register service callback.
|
||||||
verify(serviceInfoCallback, timeout(TIMEOUT_MS))
|
verify(serviceInfoCallback, timeout(TIMEOUT_MS))
|
||||||
.onServiceInfoCallbackRegistrationFailed(eq(FAILURE_BAD_PARAMETERS));
|
.onServiceInfoCallbackRegistrationFailed(eq(FAILURE_BAD_PARAMETERS));
|
||||||
|
verify(mMetrics).reportServiceInfoCallbackRegistrationFailed(NO_TRANSACTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -973,6 +989,11 @@ public class NsdServiceTest {
|
|||||||
final int discId = listener.mTransactionId;
|
final int discId = listener.mTransactionId;
|
||||||
verify(mMetrics).reportServiceDiscoveryStarted(discId);
|
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(
|
final MdnsServiceInfo foundInfo = new MdnsServiceInfo(
|
||||||
SERVICE_NAME, /* serviceInstanceName */
|
SERVICE_NAME, /* serviceInstanceName */
|
||||||
serviceTypeWithLocalDomain.split("\\."), /* serviceType */
|
serviceTypeWithLocalDomain.split("\\."), /* serviceType */
|
||||||
@@ -1021,7 +1042,8 @@ public class NsdServiceTest {
|
|||||||
verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStopped(SERVICE_TYPE);
|
verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStopped(SERVICE_TYPE);
|
||||||
verify(mSocketProvider, timeout(CLEANUP_DELAY_MS + TIMEOUT_MS)).requestStopWhenInactive();
|
verify(mSocketProvider, timeout(CLEANUP_DELAY_MS + TIMEOUT_MS)).requestStopWhenInactive();
|
||||||
verify(mMetrics).reportServiceDiscoveryStop(discId, 10L /* durationMs */,
|
verify(mMetrics).reportServiceDiscoveryStop(discId, 10L /* durationMs */,
|
||||||
1 /* foundCallbackCount */, 1 /* lostCallbackCount */, 1 /* servicesCount */);
|
1 /* foundCallbackCount */, 1 /* lostCallbackCount */, 1 /* servicesCount */,
|
||||||
|
3 /* sentQueryCount */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -1133,8 +1155,8 @@ public class NsdServiceTest {
|
|||||||
final ArgumentCaptor<NsdServiceInfo> infoCaptor =
|
final ArgumentCaptor<NsdServiceInfo> infoCaptor =
|
||||||
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
ArgumentCaptor.forClass(NsdServiceInfo.class);
|
||||||
verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(infoCaptor.capture());
|
verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(infoCaptor.capture());
|
||||||
verify(mMetrics).reportServiceResolved(
|
verify(mMetrics).reportServiceResolved(listener.mTransactionId, 10 /* durationMs */,
|
||||||
listener.mTransactionId, 10 /* durationMs */, true /* isServiceFromCache */);
|
true /* isServiceFromCache */, 0 /* sendQueryCount */);
|
||||||
|
|
||||||
final NsdServiceInfo info = infoCaptor.getValue();
|
final NsdServiceInfo info = infoCaptor.getValue();
|
||||||
assertEquals(SERVICE_NAME, info.getServiceName());
|
assertEquals(SERVICE_NAME, info.getServiceName());
|
||||||
|
|||||||
Reference in New Issue
Block a user