Add daily metric snapshot logging framework

Bug: 209811134
Test: ran on device and checked on westworld
Change-Id: I4bb65de9b88d290a82972bebafe544fd978433c2
This commit is contained in:
Yixuan Wang
2021-12-15 06:10:10 +00:00
parent 6d2adf4215
commit 64d95faa18
2 changed files with 51 additions and 1 deletions

View File

@@ -72,6 +72,9 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
@@ -138,11 +141,23 @@ public class ContextHubService extends IContextHubService.Stub {
// The manager for the internal nanoapp state cache
private final NanoAppStateManager mNanoAppStateManager = new NanoAppStateManager();
// An executor and the future object for scheduling timeout timers
private final ScheduledThreadPoolExecutor mDailyMetricTimer =
new ScheduledThreadPoolExecutor(1);
// The period of the recurring time
private static final int PERIOD_METRIC_QUERY_DAYS = 1;
// True if WiFi is available for the Context Hub
private boolean mIsWifiAvailable = false;
private boolean mIsWifiScanningEnabled = false;
private boolean mIsWifiMainEnabled = false;
// A hashmap used to record if a contexthub is waiting for daily query
private Set<Integer> mMetricQueryPendingContextHubIds =
Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());
// Lock object for sendWifiSettingUpdate()
private final Object mSendWifiSettingUpdateLock = new Object();
@@ -317,6 +332,8 @@ public class ContextHubService extends IContextHubService.Stub {
});
}
scheduleDailyMetricSnapshot();
}
/**
@@ -747,6 +764,18 @@ public class ContextHubService extends IContextHubService.Stub {
* @param nanoappStateList the list of loaded nanoapps
*/
private void handleQueryAppsCallback(int contextHubId, List<NanoAppState> nanoappStateList) {
if (mMetricQueryPendingContextHubIds.contains(contextHubId)) {
for (NanoAppState nanoappState : nanoappStateList) {
ContextHubStatsLog.write(
ContextHubStatsLog.CONTEXT_HUB_LOADED_NANOAPP_SNAPSHOT_REPORTED,
contextHubId, nanoappState.getNanoAppId(),
(int) nanoappState.getNanoAppVersion());
}
mMetricQueryPendingContextHubIds.remove(contextHubId);
if (mMetricQueryPendingContextHubIds.isEmpty()) {
scheduleDailyMetricSnapshot();
}
}
mNanoAppStateManager.updateCache(contextHubId, nanoappStateList);
mTransactionManager.onQueryResponse(nanoappStateList);
}
@@ -1135,6 +1164,23 @@ public class ContextHubService extends IContextHubService.Stub {
sendMicrophoneDisableSettingUpdate(isEnabled);
}
/**
* Invokes a daily timer to query all context hubs
*/
private void scheduleDailyMetricSnapshot() {
Runnable queryAllContextHub = () -> {
for (int contextHubId : mContextHubIdToInfoMap.keySet()) {
mMetricQueryPendingContextHubIds.add(contextHubId);
queryNanoAppsInternal(contextHubId);
}
};
try {
mDailyMetricTimer.schedule(queryAllContextHub, PERIOD_METRIC_QUERY_DAYS,
TimeUnit.DAYS);
} catch (Exception e) {
Log.e(TAG, "Error when schedule a timer", e);
}
}
private String getCallingPackageName() {
return mContext.getPackageManager().getNameForUid(Binder.getCallingUid());

View File

@@ -463,8 +463,12 @@ import java.util.concurrent.atomic.AtomicInteger;
};
long timeoutSeconds = transaction.getTimeout(TimeUnit.SECONDS);
mTimeoutFuture = mTimeoutExecutor.schedule(onTimeoutFunc, timeoutSeconds,
try {
mTimeoutFuture = mTimeoutExecutor.schedule(onTimeoutFunc, timeoutSeconds,
TimeUnit.SECONDS);
} catch (Exception e) {
Log.e(TAG, "Error when schedule a timer", e);
}
} else {
transaction.onTransactionComplete(
ContextHubServiceUtil.toTransactionResult(result));