PerfData.java revision c6f2fa2700c12b44ef7b28d42c513125bc9476ae
1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.statsd.loadtest;
17
18import com.android.internal.os.StatsdConfigProto.TimeUnit;
19
20import android.annotation.Nullable;
21import android.app.AlarmManager;
22import android.app.PendingIntent;
23import android.content.BroadcastReceiver;
24import android.content.Context;
25import android.content.Intent;
26import android.os.SystemClock;
27import android.util.Log;
28
29import java.util.HashSet;
30import java.util.Set;
31
32/** Prints some information about the device via Dumpsys in order to evaluate health metrics. */
33public class PerfData extends PerfDataRecorder {
34
35    private static final String TAG = "loadtest.PerfData";
36
37    /** Polling period for performance snapshots like memory. */
38    private static final long POLLING_PERIOD_MILLIS = 1 * 60 * 1000;
39
40    public final static class PerfAlarmReceiver extends BroadcastReceiver {
41        @Override
42        public void onReceive(Context context, Intent intent) {
43            Intent activityIntent = new Intent(context, LoadtestActivity.class);
44            activityIntent.putExtra(LoadtestActivity.TYPE, LoadtestActivity.PERF_ALARM);
45            context.startActivity(activityIntent);
46         }
47    }
48
49    private AlarmManager mAlarmMgr;
50
51    /** Used to periodically poll some dumpsys data. */
52    private PendingIntent mPendingIntent;
53
54    private final Set<PerfDataRecorder> mRecorders;
55
56    public PerfData(LoadtestActivity loadtestActivity, boolean placebo, int replication,
57        TimeUnit bucket, long periodSecs,  int burst, boolean includeCountMetric,
58        boolean includeDurationMetric, boolean includeEventMetric,  boolean includeValueMetric,
59        boolean includeGaugeMetric) {
60      super(placebo, replication, bucket, periodSecs, burst, includeCountMetric,
61          includeDurationMetric, includeEventMetric, includeValueMetric, includeGaugeMetric);
62        mRecorders = new HashSet();
63        mRecorders.add(new BatteryDataRecorder(placebo, replication, bucket, periodSecs, burst,
64                includeCountMetric, includeDurationMetric, includeEventMetric, includeValueMetric,
65                includeGaugeMetric));
66        mRecorders.add(new MemoryDataRecorder(placebo, replication, bucket, periodSecs, burst,
67                includeCountMetric, includeDurationMetric, includeEventMetric, includeValueMetric,
68                includeGaugeMetric));
69        mRecorders.add(new StatsdStatsRecorder(loadtestActivity, placebo, replication, bucket,
70                periodSecs, burst, includeCountMetric, includeDurationMetric, includeEventMetric,
71                includeValueMetric, includeGaugeMetric));
72        mRecorders.add(new ValidationRecorder(loadtestActivity, placebo, replication, bucket,
73                periodSecs, burst, includeCountMetric, includeDurationMetric, includeEventMetric,
74                includeValueMetric, includeGaugeMetric));
75        mAlarmMgr = (AlarmManager) loadtestActivity.getSystemService(Context.ALARM_SERVICE);
76    }
77
78    public void onDestroy() {
79        if (mPendingIntent != null) {
80            mAlarmMgr.cancel(mPendingIntent);
81            mPendingIntent = null;
82        }
83    }
84
85    @Override
86    public void startRecording(Context context) {
87        Intent intent = new Intent(context, PerfAlarmReceiver.class);
88        intent.putExtra(LoadtestActivity.TYPE, LoadtestActivity.PERF_ALARM);
89        mPendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
90        mAlarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, -1 /* now */,
91            POLLING_PERIOD_MILLIS, mPendingIntent);
92
93        for (PerfDataRecorder recorder : mRecorders) {
94            recorder.startRecording(context);
95        }
96    }
97
98    @Override
99    public void onAlarm(Context context) {
100        for (PerfDataRecorder recorder : mRecorders) {
101            recorder.onAlarm(context);
102        }
103    }
104
105    @Override
106    public void stopRecording(Context context) {
107        if (mPendingIntent != null) {
108            mAlarmMgr.cancel(mPendingIntent);
109            mPendingIntent = null;
110        }
111
112        for (PerfDataRecorder recorder : mRecorders) {
113            recorder.stopRecording(context);
114        }
115    }
116}
117