Report resolution metrics data
Collect information on resolution success and failure events, then use this data to build metrics and report them. Bug: 287546772 Test: atest FrameworksNetTestCases NsdManagerTest Change-Id: I373ce91fea9d5a278f53fc0c505be90dd39b2d5b
This commit is contained in:
@@ -265,7 +265,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(@NonNull MdnsServiceInfo serviceInfo) { }
|
||||
public void onServiceFound(@NonNull MdnsServiceInfo serviceInfo,
|
||||
boolean isServiceFromCache) { }
|
||||
|
||||
@Override
|
||||
public void onServiceUpdated(@NonNull MdnsServiceInfo serviceInfo) { }
|
||||
@@ -274,7 +275,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
public void onServiceRemoved(@NonNull MdnsServiceInfo serviceInfo) { }
|
||||
|
||||
@Override
|
||||
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo) { }
|
||||
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo,
|
||||
boolean isServiceFromCache) { }
|
||||
|
||||
@Override
|
||||
public void onServiceNameRemoved(@NonNull MdnsServiceInfo serviceInfo) { }
|
||||
@@ -300,10 +302,11 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo) {
|
||||
public void onServiceNameDiscovered(@NonNull MdnsServiceInfo serviceInfo,
|
||||
boolean isServiceFromCache) {
|
||||
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||
NsdManager.SERVICE_FOUND,
|
||||
new MdnsEvent(mClientRequestId, serviceInfo));
|
||||
new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -322,10 +325,10 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(MdnsServiceInfo serviceInfo) {
|
||||
public void onServiceFound(MdnsServiceInfo serviceInfo, boolean isServiceFromCache) {
|
||||
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||
NsdManager.RESOLVE_SERVICE_SUCCEEDED,
|
||||
new MdnsEvent(mClientRequestId, serviceInfo));
|
||||
new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,10 +340,11 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceFound(@NonNull MdnsServiceInfo serviceInfo) {
|
||||
public void onServiceFound(@NonNull MdnsServiceInfo serviceInfo,
|
||||
boolean isServiceFromCache) {
|
||||
mNsdStateMachine.sendMessage(MDNS_DISCOVERY_MANAGER_EVENT, mTransactionId,
|
||||
NsdManager.SERVICE_UPDATED,
|
||||
new MdnsEvent(mClientRequestId, serviceInfo));
|
||||
new MdnsEvent(mClientRequestId, serviceInfo, isServiceFromCache));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -463,10 +467,17 @@ public class NsdService extends INsdManager.Stub {
|
||||
final int mClientRequestId;
|
||||
@NonNull
|
||||
final MdnsServiceInfo mMdnsServiceInfo;
|
||||
final boolean mIsServiceFromCache;
|
||||
|
||||
MdnsEvent(int clientRequestId, @NonNull MdnsServiceInfo mdnsServiceInfo) {
|
||||
this(clientRequestId, mdnsServiceInfo, false /* isServiceFromCache */);
|
||||
}
|
||||
|
||||
MdnsEvent(int clientRequestId, @NonNull MdnsServiceInfo mdnsServiceInfo,
|
||||
boolean isServiceFromCache) {
|
||||
mClientRequestId = clientRequestId;
|
||||
mMdnsServiceInfo = mdnsServiceInfo;
|
||||
mIsServiceFromCache = isServiceFromCache;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -615,7 +626,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
case NsdManager.RESOLVE_SERVICE:
|
||||
cInfo = getClientInfoForReply(msg);
|
||||
if (cInfo != null) {
|
||||
cInfo.onResolveServiceFailed(
|
||||
cInfo.onResolveServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
}
|
||||
break;
|
||||
@@ -682,9 +693,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
private void storeLegacyRequestMap(int clientRequestId, int transactionId,
|
||||
ClientInfo clientInfo, int what) {
|
||||
clientInfo.mClientRequests.put(clientRequestId, new LegacyClientRequest(
|
||||
transactionId, what, mClock.elapsedRealtime()));
|
||||
ClientInfo clientInfo, int what, long startTimeMs) {
|
||||
clientInfo.mClientRequests.put(clientRequestId,
|
||||
new LegacyClientRequest(transactionId, what, startTimeMs));
|
||||
mTransactionIdToClientInfoMap.put(transactionId, clientInfo);
|
||||
// Remove the cleanup event because here comes a new request.
|
||||
cancelStop();
|
||||
@@ -810,8 +821,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
Log.d(TAG, "Discover " + msg.arg2 + " " + transactionId
|
||||
+ info.getServiceType());
|
||||
}
|
||||
storeLegacyRequestMap(
|
||||
clientRequestId, transactionId, clientInfo, msg.what);
|
||||
storeLegacyRequestMap(clientRequestId, transactionId, clientInfo,
|
||||
msg.what, mClock.elapsedRealtime());
|
||||
clientInfo.onDiscoverServicesStarted(
|
||||
clientRequestId, info, transactionId);
|
||||
} else {
|
||||
@@ -912,8 +923,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
Log.d(TAG, "Register " + clientRequestId
|
||||
+ " " + transactionId);
|
||||
}
|
||||
storeLegacyRequestMap(
|
||||
clientRequestId, transactionId, clientInfo, msg.what);
|
||||
storeLegacyRequestMap(clientRequestId, transactionId, clientInfo,
|
||||
msg.what, mClock.elapsedRealtime());
|
||||
// Return success after mDns reports success
|
||||
} else {
|
||||
unregisterService(transactionId);
|
||||
@@ -986,8 +997,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
|| mDeps.isMdnsDiscoveryManagerEnabled(mContext)
|
||||
|| useDiscoveryManagerForType(serviceType)) {
|
||||
if (serviceType == null) {
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
break;
|
||||
}
|
||||
final String resolveServiceType = serviceType + ".local";
|
||||
@@ -1009,7 +1020,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
+ " for service type:" + resolveServiceType);
|
||||
} else {
|
||||
if (clientInfo.mResolvedService != null) {
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientInfo.onResolveServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_ALREADY_ACTIVE);
|
||||
break;
|
||||
}
|
||||
@@ -1017,10 +1028,10 @@ public class NsdService extends INsdManager.Stub {
|
||||
maybeStartDaemon();
|
||||
if (resolveService(transactionId, info)) {
|
||||
clientInfo.mResolvedService = new NsdServiceInfo();
|
||||
storeLegacyRequestMap(
|
||||
clientRequestId, transactionId, clientInfo, msg.what);
|
||||
storeLegacyRequestMap(clientRequestId, transactionId, clientInfo,
|
||||
msg.what, mClock.elapsedRealtime());
|
||||
} else {
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientInfo.onResolveServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
@@ -1279,10 +1290,11 @@ public class NsdService extends INsdManager.Stub {
|
||||
final int transactionId2 = getUniqueId();
|
||||
if (getAddrInfo(transactionId2, info.hostname, info.interfaceIdx)) {
|
||||
storeLegacyRequestMap(clientRequestId, transactionId2, clientInfo,
|
||||
NsdManager.RESOLVE_SERVICE);
|
||||
NsdManager.RESOLVE_SERVICE, request.mStartTimeMs);
|
||||
} else {
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||
clientInfo.mResolvedService = null;
|
||||
}
|
||||
break;
|
||||
@@ -1291,16 +1303,18 @@ public class NsdService extends INsdManager.Stub {
|
||||
/* NNN resolveId errorCode */
|
||||
stopResolveService(transactionId);
|
||||
removeRequestMap(clientRequestId, transactionId, clientInfo);
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||
clientInfo.mResolvedService = null;
|
||||
break;
|
||||
case IMDnsEventListener.SERVICE_GET_ADDR_FAILED:
|
||||
/* NNN resolveId errorCode */
|
||||
stopGetAddrInfo(transactionId);
|
||||
removeRequestMap(clientRequestId, transactionId, clientInfo);
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||
clientInfo.mResolvedService = null;
|
||||
break;
|
||||
case IMDnsEventListener.SERVICE_GET_ADDR_SUCCESS: {
|
||||
@@ -1323,10 +1337,11 @@ public class NsdService extends INsdManager.Stub {
|
||||
setServiceNetworkForCallback(clientInfo.mResolvedService,
|
||||
netId, info.interfaceIdx);
|
||||
clientInfo.onResolveServiceSucceeded(
|
||||
clientRequestId, clientInfo.mResolvedService);
|
||||
clientRequestId, clientInfo.mResolvedService, request);
|
||||
} else {
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||
}
|
||||
stopGetAddrInfo(transactionId);
|
||||
removeRequestMap(clientRequestId, transactionId, clientInfo);
|
||||
@@ -1429,11 +1444,13 @@ public class NsdService extends INsdManager.Stub {
|
||||
final List<InetAddress> addresses = getInetAddresses(serviceInfo);
|
||||
if (addresses.size() != 0) {
|
||||
info.setHostAddresses(addresses);
|
||||
clientInfo.onResolveServiceSucceeded(clientRequestId, info);
|
||||
request.setServiceFromCache(event.mIsServiceFromCache);
|
||||
clientInfo.onResolveServiceSucceeded(clientRequestId, info, request);
|
||||
} else {
|
||||
// No address. Notify resolution failure.
|
||||
clientInfo.onResolveServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onResolveServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()));
|
||||
}
|
||||
|
||||
// Unregister the listener immediately like IMDnsEventListener design
|
||||
@@ -2200,6 +2217,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
private int mFoundServiceCount = 0;
|
||||
private int mLostServiceCount = 0;
|
||||
private final Set<String> mServices = new ArraySet<>();
|
||||
private boolean mIsServiceFromCache = false;
|
||||
|
||||
private ClientRequest(int transactionId, long startTimeMs) {
|
||||
mTransactionId = transactionId;
|
||||
@@ -2232,6 +2250,14 @@ public class NsdService extends INsdManager.Stub {
|
||||
public int getServicesCount() {
|
||||
return mServices.size();
|
||||
}
|
||||
|
||||
public void setServiceFromCache(boolean isServiceFromCache) {
|
||||
mIsServiceFromCache = isServiceFromCache;
|
||||
}
|
||||
|
||||
public boolean isServiceFromCache() {
|
||||
return mIsServiceFromCache;
|
||||
}
|
||||
}
|
||||
|
||||
private static class LegacyClientRequest extends ClientRequest {
|
||||
@@ -2544,7 +2570,13 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void onResolveServiceFailed(int listenerKey, int error) {
|
||||
void onResolveServiceFailedImmediately(int listenerKey, int error) {
|
||||
onResolveServiceFailed(listenerKey, error, NO_TRANSACTION, 0L /* durationMs */);
|
||||
}
|
||||
|
||||
void onResolveServiceFailed(int listenerKey, int error, int transactionId,
|
||||
long durationMs) {
|
||||
mMetrics.reportServiceResolutionFailed(transactionId, durationMs);
|
||||
try {
|
||||
mCb.onResolveServiceFailed(listenerKey, error);
|
||||
} catch (RemoteException e) {
|
||||
@@ -2552,7 +2584,12 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void onResolveServiceSucceeded(int listenerKey, NsdServiceInfo info) {
|
||||
void onResolveServiceSucceeded(int listenerKey, NsdServiceInfo info,
|
||||
ClientRequest request) {
|
||||
mMetrics.reportServiceResolved(
|
||||
request.mTransactionId,
|
||||
request.calculateRequestDurationMs(mClock.elapsedRealtime()),
|
||||
request.isServiceFromCache());
|
||||
try {
|
||||
mCb.onResolveServiceSucceeded(listenerKey, info);
|
||||
} catch (RemoteException e) {
|
||||
|
||||
Reference in New Issue
Block a user