Report registration metrics data
Collect information about registration successes, failures, and unregistrations, then build metrics data from this information and report it. Bug: 287546772 Test: atest FrameworksNetTestCases NsdManagerTest Change-Id: I6324279b479da2e61b7519d96df5ad24a432e54a
This commit is contained in:
@@ -162,6 +162,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
private static final long CLEANUP_DELAY_MS = 10000;
|
||||
private static final int IFACE_IDX_ANY = 0;
|
||||
private static final int NO_TRANSACTION = -1;
|
||||
private static final SharedLog LOGGER = new SharedLog("serviceDiscovery");
|
||||
|
||||
private final Context mContext;
|
||||
@@ -178,6 +179,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
private final MdnsSocketProvider mMdnsSocketProvider;
|
||||
@NonNull
|
||||
private final MdnsAdvertiser mAdvertiser;
|
||||
@NonNull
|
||||
private final Clock mClock;
|
||||
private final SharedLog mServiceLogs = LOGGER.forSubComponent(TAG);
|
||||
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
|
||||
// state machine thread. If change this outside state machine, it will need to introduce
|
||||
@@ -530,8 +533,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
try {
|
||||
cb.asBinder().linkToDeath(arg.connector, 0);
|
||||
final String tag = "Client" + arg.uid + "-" + mClientNumberId++;
|
||||
final NetworkNsdReportedMetrics metrics = new NetworkNsdReportedMetrics(
|
||||
!arg.useJavaBackend, (int) new Clock().elapsedRealtime());
|
||||
final NetworkNsdReportedMetrics metrics =
|
||||
mDeps.makeNetworkNsdReportedMetrics(
|
||||
!arg.useJavaBackend, (int) mClock.elapsedRealtime());
|
||||
cInfo = new ClientInfo(cb, arg.uid, arg.useJavaBackend,
|
||||
mServiceLogs.forSubComponent(tag), metrics);
|
||||
mClients.put(arg.connector, cInfo);
|
||||
@@ -569,7 +573,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
case NsdManager.REGISTER_SERVICE:
|
||||
cInfo = getClientInfoForReply(msg);
|
||||
if (cInfo != null) {
|
||||
cInfo.onRegisterServiceFailed(
|
||||
cInfo.onRegisterServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
}
|
||||
break;
|
||||
@@ -651,8 +655,8 @@ 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));
|
||||
clientInfo.mClientRequests.put(clientRequestId, new LegacyClientRequest(
|
||||
transactionId, what, mClock, mClock.elapsedRealtime()));
|
||||
mTransactionIdToClientInfoMap.put(transactionId, clientInfo);
|
||||
// Remove the cleanup event because here comes a new request.
|
||||
cancelStop();
|
||||
@@ -660,8 +664,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
|
||||
private void storeAdvertiserRequestMap(int clientRequestId, int transactionId,
|
||||
ClientInfo clientInfo, @Nullable Network requestedNetwork) {
|
||||
clientInfo.mClientRequests.put(clientRequestId,
|
||||
new AdvertiserClientRequest(transactionId, requestedNetwork));
|
||||
clientInfo.mClientRequests.put(clientRequestId, new AdvertiserClientRequest(
|
||||
transactionId, requestedNetwork, mClock, mClock.elapsedRealtime()));
|
||||
mTransactionIdToClientInfoMap.put(transactionId, clientInfo);
|
||||
updateMulticastLock();
|
||||
}
|
||||
@@ -684,8 +688,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
private void storeDiscoveryManagerRequestMap(int clientRequestId, int transactionId,
|
||||
MdnsListener listener, ClientInfo clientInfo,
|
||||
@Nullable Network requestedNetwork) {
|
||||
clientInfo.mClientRequests.put(clientRequestId,
|
||||
new DiscoveryManagerRequest(transactionId, listener, requestedNetwork));
|
||||
clientInfo.mClientRequests.put(clientRequestId, new DiscoveryManagerRequest(
|
||||
transactionId, listener, requestedNetwork, mClock,
|
||||
mClock.elapsedRealtime()));
|
||||
mTransactionIdToClientInfoMap.put(transactionId, clientInfo);
|
||||
updateMulticastLock();
|
||||
}
|
||||
@@ -838,7 +843,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
if (requestLimitReached(clientInfo)) {
|
||||
clientInfo.onRegisterServiceFailed(
|
||||
clientInfo.onRegisterServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_MAX_LIMIT);
|
||||
break;
|
||||
}
|
||||
@@ -854,8 +859,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
|| useAdvertiserForType(registerServiceType)) {
|
||||
if (registerServiceType == null) {
|
||||
Log.e(TAG, "Invalid service type: " + serviceType);
|
||||
clientInfo.onRegisterServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
clientInfo.onRegisterServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
break;
|
||||
}
|
||||
serviceInfo.setServiceType(registerServiceType);
|
||||
@@ -882,7 +887,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
// Return success after mDns reports success
|
||||
} else {
|
||||
unregisterService(transactionId);
|
||||
clientInfo.onRegisterServiceFailed(
|
||||
clientInfo.onRegisterServiceFailedImmediately(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
@@ -914,10 +919,12 @@ public class NsdService extends INsdManager.Stub {
|
||||
// instead of looking at the flag value.
|
||||
if (request instanceof AdvertiserClientRequest) {
|
||||
mAdvertiser.removeService(transactionId);
|
||||
clientInfo.onUnregisterServiceSucceeded(clientRequestId);
|
||||
clientInfo.onUnregisterServiceSucceeded(clientRequestId, transactionId,
|
||||
request.calculateRequestDurationMs());
|
||||
} else {
|
||||
if (unregisterService(transactionId)) {
|
||||
clientInfo.onUnregisterServiceSucceeded(clientRequestId);
|
||||
clientInfo.onUnregisterServiceSucceeded(clientRequestId,
|
||||
transactionId, request.calculateRequestDurationMs());
|
||||
} else {
|
||||
clientInfo.onUnregisterServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
@@ -1181,12 +1188,18 @@ public class NsdService extends INsdManager.Stub {
|
||||
final RegistrationInfo info = (RegistrationInfo) obj;
|
||||
final String name = info.serviceName;
|
||||
servInfo = new NsdServiceInfo(name, null /* serviceType */);
|
||||
clientInfo.onRegisterServiceSucceeded(clientRequestId, servInfo);
|
||||
final ClientRequest request =
|
||||
clientInfo.mClientRequests.get(clientRequestId);
|
||||
clientInfo.onRegisterServiceSucceeded(clientRequestId, servInfo,
|
||||
transactionId, request.calculateRequestDurationMs());
|
||||
break;
|
||||
}
|
||||
case IMDnsEventListener.SERVICE_REGISTRATION_FAILED:
|
||||
clientInfo.onRegisterServiceFailed(
|
||||
clientRequestId, NsdManager.FAILURE_INTERNAL_ERROR);
|
||||
final ClientRequest request =
|
||||
clientInfo.mClientRequests.get(clientRequestId);
|
||||
clientInfo.onRegisterServiceFailed(clientRequestId,
|
||||
NsdManager.FAILURE_INTERNAL_ERROR, transactionId,
|
||||
request.calculateRequestDurationMs());
|
||||
break;
|
||||
case IMDnsEventListener.SERVICE_RESOLVED: {
|
||||
final ResolutionInfo info = (ResolutionInfo) obj;
|
||||
@@ -1566,6 +1579,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
|
||||
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
|
||||
new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"));
|
||||
mClock = deps.makeClock();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1655,6 +1669,21 @@ public class NsdService extends INsdManager.Stub {
|
||||
public int getCallingUid() {
|
||||
return Binder.getCallingUid();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see NetworkNsdReportedMetrics
|
||||
*/
|
||||
public NetworkNsdReportedMetrics makeNetworkNsdReportedMetrics(
|
||||
boolean isLegacy, int clientId) {
|
||||
return new NetworkNsdReportedMetrics(isLegacy, clientId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see MdnsUtils.Clock
|
||||
*/
|
||||
public Clock makeClock() {
|
||||
return new Clock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1755,7 +1784,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
// onRegisterServiceSucceeded only has the service name in its info. This aligns with
|
||||
// historical behavior.
|
||||
final NsdServiceInfo cbInfo = new NsdServiceInfo(registeredInfo.getServiceName(), null);
|
||||
clientInfo.onRegisterServiceSucceeded(clientRequestId, cbInfo);
|
||||
final ClientRequest request = clientInfo.mClientRequests.get(clientRequestId);
|
||||
clientInfo.onRegisterServiceSucceeded(
|
||||
clientRequestId, cbInfo, transactionId, request.calculateRequestDurationMs());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1765,8 +1796,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
|
||||
final int clientRequestId = getClientRequestIdOrLog(clientInfo, transactionId);
|
||||
if (clientRequestId < 0) return;
|
||||
|
||||
clientInfo.onRegisterServiceFailed(clientRequestId, errorCode);
|
||||
final ClientRequest request = clientInfo.mClientRequests.get(clientRequestId);
|
||||
clientInfo.onRegisterServiceFailed(clientRequestId, errorCode, transactionId,
|
||||
request.calculateRequestDurationMs());
|
||||
}
|
||||
|
||||
private ClientInfo getClientInfoOrLog(int transactionId) {
|
||||
@@ -2026,17 +2058,27 @@ public class NsdService extends INsdManager.Stub {
|
||||
|
||||
private abstract static class ClientRequest {
|
||||
private final int mTransactionId;
|
||||
private final Clock mClock;
|
||||
private final long mStartTimeMs;
|
||||
|
||||
private ClientRequest(int transactionId) {
|
||||
private ClientRequest(int transactionId, @NonNull Clock clock, long startTimeMs) {
|
||||
mTransactionId = transactionId;
|
||||
mClock = clock;
|
||||
mStartTimeMs = startTimeMs;
|
||||
}
|
||||
|
||||
public long calculateRequestDurationMs() {
|
||||
final long stopTimeMs = mClock.elapsedRealtime();
|
||||
return stopTimeMs - mStartTimeMs;
|
||||
}
|
||||
}
|
||||
|
||||
private static class LegacyClientRequest extends ClientRequest {
|
||||
private final int mRequestCode;
|
||||
|
||||
private LegacyClientRequest(int transactionId, int requestCode) {
|
||||
super(transactionId);
|
||||
private LegacyClientRequest(int transactionId, int requestCode, @NonNull Clock clock,
|
||||
long startTimeMs) {
|
||||
super(transactionId, clock, startTimeMs);
|
||||
mRequestCode = requestCode;
|
||||
}
|
||||
}
|
||||
@@ -2045,8 +2087,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
@Nullable
|
||||
private final Network mRequestedNetwork;
|
||||
|
||||
private JavaBackendClientRequest(int transactionId, @Nullable Network requestedNetwork) {
|
||||
super(transactionId);
|
||||
private JavaBackendClientRequest(int transactionId, @Nullable Network requestedNetwork,
|
||||
@NonNull Clock clock, long startTimeMs) {
|
||||
super(transactionId, clock, startTimeMs);
|
||||
mRequestedNetwork = requestedNetwork;
|
||||
}
|
||||
|
||||
@@ -2057,8 +2100,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
|
||||
private static class AdvertiserClientRequest extends JavaBackendClientRequest {
|
||||
private AdvertiserClientRequest(int transactionId, @Nullable Network requestedNetwork) {
|
||||
super(transactionId, requestedNetwork);
|
||||
private AdvertiserClientRequest(int transactionId, @Nullable Network requestedNetwork,
|
||||
@NonNull Clock clock, long startTimeMs) {
|
||||
super(transactionId, requestedNetwork, clock, startTimeMs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2067,8 +2111,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
private final MdnsListener mListener;
|
||||
|
||||
private DiscoveryManagerRequest(int transactionId, @NonNull MdnsListener listener,
|
||||
@Nullable Network requestedNetwork) {
|
||||
super(transactionId, requestedNetwork);
|
||||
@Nullable Network requestedNetwork, @NonNull Clock clock, long startTimeMs) {
|
||||
super(transactionId, requestedNetwork, clock, startTimeMs);
|
||||
mListener = listener;
|
||||
}
|
||||
}
|
||||
@@ -2161,6 +2205,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
|
||||
if (request instanceof AdvertiserClientRequest) {
|
||||
mAdvertiser.removeService(transactionId);
|
||||
mMetrics.reportServiceUnregistration(
|
||||
transactionId, request.calculateRequestDurationMs());
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2177,6 +2223,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
break;
|
||||
case NsdManager.REGISTER_SERVICE:
|
||||
unregisterService(transactionId);
|
||||
mMetrics.reportServiceUnregistration(
|
||||
transactionId, request.calculateRequestDurationMs());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -2268,7 +2316,13 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void onRegisterServiceFailed(int listenerKey, int error) {
|
||||
void onRegisterServiceFailedImmediately(int listenerKey, int error) {
|
||||
onRegisterServiceFailed(listenerKey, error, NO_TRANSACTION, 0 /* durationMs */);
|
||||
}
|
||||
|
||||
void onRegisterServiceFailed(int listenerKey, int error, int transactionId,
|
||||
long durationMs) {
|
||||
mMetrics.reportServiceRegistrationFailed(transactionId, durationMs);
|
||||
try {
|
||||
mCb.onRegisterServiceFailed(listenerKey, error);
|
||||
} catch (RemoteException e) {
|
||||
@@ -2276,7 +2330,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void onRegisterServiceSucceeded(int listenerKey, NsdServiceInfo info) {
|
||||
void onRegisterServiceSucceeded(int listenerKey, NsdServiceInfo info, int transactionId,
|
||||
long durationMs) {
|
||||
mMetrics.reportServiceRegistrationSucceeded(transactionId, durationMs);
|
||||
try {
|
||||
mCb.onRegisterServiceSucceeded(listenerKey, info);
|
||||
} catch (RemoteException e) {
|
||||
@@ -2292,7 +2348,8 @@ public class NsdService extends INsdManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void onUnregisterServiceSucceeded(int listenerKey) {
|
||||
void onUnregisterServiceSucceeded(int listenerKey, int transactionId, long durationMs) {
|
||||
mMetrics.reportServiceUnregistration(transactionId, durationMs);
|
||||
try {
|
||||
mCb.onUnregisterServiceSucceeded(listenerKey);
|
||||
} catch (RemoteException e) {
|
||||
|
||||
Reference in New Issue
Block a user