Migrate pullBinderStats

Test: atest UidAtomTests#testBinderStats
Test: adb shell cmd stats pull-source 10022
Test: adb shell cmd stats pull-source 10023
Change-Id: Ib321743b725abe6770b840477d7fbce755a0bde3
This commit is contained in:
Jeffrey Huang
2020-01-15 17:16:43 -08:00
parent b92de55380
commit 877adfea28
3 changed files with 72 additions and 80 deletions

View File

@@ -722,57 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pulledData.add(e);
}
private void pullBinderCallsStats(
int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
BinderCallsStatsService.Internal binderStats =
LocalServices.getService(BinderCallsStatsService.Internal.class);
if (binderStats == null) {
throw new IllegalStateException("binderStats is null");
}
List<ExportedCallStat> callStats = binderStats.getExportedCallStats();
binderStats.reset();
for (ExportedCallStat callStat : callStats) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeInt(callStat.workSourceUid);
e.writeString(callStat.className);
e.writeString(callStat.methodName);
e.writeLong(callStat.callCount);
e.writeLong(callStat.exceptionCount);
e.writeLong(callStat.latencyMicros);
e.writeLong(callStat.maxLatencyMicros);
e.writeLong(callStat.cpuTimeMicros);
e.writeLong(callStat.maxCpuTimeMicros);
e.writeLong(callStat.maxReplySizeBytes);
e.writeLong(callStat.maxRequestSizeBytes);
e.writeLong(callStat.recordedCallCount);
e.writeInt(callStat.screenInteractive ? 1 : 0);
e.writeInt(callStat.callingUid);
pulledData.add(e);
}
}
private void pullBinderCallsStatsExceptions(
int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
BinderCallsStatsService.Internal binderStats =
LocalServices.getService(BinderCallsStatsService.Internal.class);
if (binderStats == null) {
throw new IllegalStateException("binderStats is null");
}
ArrayMap<String, Integer> exceptionStats = binderStats.getExportedExceptionStats();
// TODO: decouple binder calls exceptions with the rest of the binder calls data so that we
// can reset the exception stats.
for (Entry<String, Integer> entry : exceptionStats.entrySet()) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeString(entry.getKey());
e.writeInt(entry.getValue());
pulledData.add(e);
}
}
private void pullLooperStats(int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
LooperStats looperStats = LocalServices.getService(LooperStats.class);
@@ -1630,16 +1579,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
break;
}
case StatsLog.BINDER_CALLS: {
pullBinderCallsStats(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
case StatsLog.BINDER_CALLS_EXCEPTIONS: {
pullBinderCallsStatsExceptions(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
case StatsLog.LOOPER_STATS: {
pullLooperStats(tagId, elapsedNanos, wallClockNanos, ret);
break;

View File

@@ -95,15 +95,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{{.atomTag = android::util::BATTERY_CYCLE_COUNT},
{.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}},
// binder_calls
{{.atomTag = android::util::BINDER_CALLS},
{.additiveFields = {4, 5, 6, 8, 12},
.puller = new StatsCompanionServicePuller(android::util::BINDER_CALLS)}},
// binder_calls_exceptions
{{.atomTag = android::util::BINDER_CALLS_EXCEPTIONS},
{.puller = new StatsCompanionServicePuller(android::util::BINDER_CALLS_EXCEPTIONS)}},
// looper_stats
{{.atomTag = android::util::LOOPER_STATS},
{.additiveFields = {5, 6, 7, 8, 9},

View File

@@ -270,8 +270,8 @@ public class StatsPullAtomService extends SystemService {
registerProcessSystemIonHeapSize();
registerTemperature();
registerCoolingDevice();
registerBinderCalls();
registerBinderCallsExceptions();
registerBinderCallsStats();
registerBinderCallsStatsExceptions();
registerLooperStats();
registerDiskStats();
registerDirectoryUsage();
@@ -1348,20 +1348,82 @@ public class StatsPullAtomService extends SystemService {
return StatsManager.PULL_SUCCESS;
}
private void registerBinderCalls() {
// No op.
private void registerBinderCallsStats() {
int tagId = StatsLog.BINDER_CALLS;
PullAtomMetadata metadata = PullAtomMetadata.newBuilder()
.setAdditiveFields(new int[] {4, 5, 6, 8, 12})
.build();
mStatsManager.registerPullAtomCallback(
tagId,
metadata,
(atomTag, data) -> pullBinderCallsStats(atomTag, data),
BackgroundThread.getExecutor()
);
}
private void pullBinderCalls() {
// No op.
private int pullBinderCallsStats(int atomTag, List<StatsEvent> pulledData) {
BinderCallsStatsService.Internal binderStats =
LocalServices.getService(BinderCallsStatsService.Internal.class);
if (binderStats == null) {
Slog.e(TAG, "failed to get binderStats");
return StatsManager.PULL_SKIP;
}
List<ExportedCallStat> callStats = binderStats.getExportedCallStats();
binderStats.reset();
for (ExportedCallStat callStat : callStats) {
StatsEvent e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeInt(callStat.workSourceUid)
.writeString(callStat.className)
.writeString(callStat.methodName)
.writeLong(callStat.callCount)
.writeLong(callStat.exceptionCount)
.writeLong(callStat.latencyMicros)
.writeLong(callStat.maxLatencyMicros)
.writeLong(callStat.cpuTimeMicros)
.writeLong(callStat.maxCpuTimeMicros)
.writeLong(callStat.maxReplySizeBytes)
.writeLong(callStat.maxRequestSizeBytes)
.writeLong(callStat.recordedCallCount)
.writeInt(callStat.screenInteractive ? 1 : 0)
.writeInt(callStat.callingUid)
.build();
pulledData.add(e);
}
return StatsManager.PULL_SUCCESS;
}
private void registerBinderCallsExceptions() {
// No op.
private void registerBinderCallsStatsExceptions() {
int tagId = StatsLog.BINDER_CALLS_EXCEPTIONS;
mStatsManager.registerPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
(atomTag, data) -> pullBinderCallsStatsExceptions(atomTag, data),
BackgroundThread.getExecutor()
);
}
private void pullBinderCallsExceptions() {
// No op.
private int pullBinderCallsStatsExceptions(int atomTag, List<StatsEvent> pulledData) {
BinderCallsStatsService.Internal binderStats =
LocalServices.getService(BinderCallsStatsService.Internal.class);
if (binderStats == null) {
Slog.e(TAG, "failed to get binderStats");
return StatsManager.PULL_SKIP;
}
ArrayMap<String, Integer> exceptionStats = binderStats.getExportedExceptionStats();
// TODO: decouple binder calls exceptions with the rest of the binder calls data so that we
// can reset the exception stats.
for (Map.Entry<String, Integer> entry : exceptionStats.entrySet()) {
StatsEvent e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeString(entry.getKey())
.writeInt(entry.getValue())
.build();
pulledData.add(e);
}
return StatsManager.PULL_SUCCESS;
}
private void registerLooperStats() {