From 877adfea282fcef4e1278ec728fe7ff1055d2a48 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Wed, 15 Jan 2020 17:16:43 -0800 Subject: [PATCH] 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 --- .../server/stats/StatsCompanionService.java | 61 -------------- .../src/external/StatsPullerManager.cpp | 9 -- .../stats/pull/StatsPullAtomService.java | 82 ++++++++++++++++--- 3 files changed, 72 insertions(+), 80 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index bf64f9dae836c..17573bb22feaf 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,57 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullBinderCallsStats( - int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - BinderCallsStatsService.Internal binderStats = - LocalServices.getService(BinderCallsStatsService.Internal.class); - if (binderStats == null) { - throw new IllegalStateException("binderStats is null"); - } - - List 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 pulledData) { - BinderCallsStatsService.Internal binderStats = - LocalServices.getService(BinderCallsStatsService.Internal.class); - if (binderStats == null) { - throw new IllegalStateException("binderStats is null"); - } - - ArrayMap 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 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 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; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index d88f538c39cff..d5cda85f412a2 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,15 +95,6 @@ std::map 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}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index f25f69a3ee77f..3bc860adff0c7 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -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 pulledData) { + BinderCallsStatsService.Internal binderStats = + LocalServices.getService(BinderCallsStatsService.Internal.class); + if (binderStats == null) { + Slog.e(TAG, "failed to get binderStats"); + return StatsManager.PULL_SKIP; + } + + List 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 pulledData) { + BinderCallsStatsService.Internal binderStats = + LocalServices.getService(BinderCallsStatsService.Internal.class); + if (binderStats == null) { + Slog.e(TAG, "failed to get binderStats"); + return StatsManager.PULL_SKIP; + } + + ArrayMap 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 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() {