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 android.text.format.DateFormat;
19
20import com.android.os.StatsLog;
21
22import java.util.List;
23
24public class DisplayProtoUtils {
25    private static final int MAX_NUM_METRICS_TO_DISPLAY = 10;
26
27    public static void displayLogReport(StringBuilder sb, StatsLog.ConfigMetricsReportList reports) {
28        sb.append("******************** Report ********************\n");
29        if (reports.hasConfigKey()) {
30            sb.append("ConfigKey: ");
31            com.android.os.StatsLog.ConfigMetricsReportList.ConfigKey key = reports.getConfigKey();
32            sb.append("\tuid: ").append(key.getUid()).append(" id: ").append(key.getId())
33                    .append("\n");
34        }
35
36        int numMetrics = 0;
37        for (StatsLog.ConfigMetricsReport report : reports.getReportsList()) {
38            sb.append("StatsLogReport size: ").append(report.getMetricsCount()).append("\n");
39            sb.append("Last report time:").append(getDateStr(report.getLastReportElapsedNanos())).
40                    append("\n");
41            sb.append("Current report time:").append(getDateStr(report.getCurrentReportElapsedNanos())).
42                    append("\n");
43            for (StatsLog.StatsLogReport log : report.getMetricsList()) {
44                numMetrics++;
45                if (numMetrics > MAX_NUM_METRICS_TO_DISPLAY) {
46                    sb.append("... output truncated\n");
47                    sb.append("************************************************");
48                    return;
49                }
50                sb.append("\n");
51                sb.append("metric id: ").append(log.getMetricId()).append("\n");
52
53                switch (log.getDataCase()) {
54                    case DURATION_METRICS:
55                        sb.append("Duration metric data\n");
56                        displayDurationMetricData(sb, log);
57                        break;
58                    case EVENT_METRICS:
59                        sb.append("Event metric data\n");
60                        displayEventMetricData(sb, log);
61                        break;
62                    case COUNT_METRICS:
63                        sb.append("Count metric data\n");
64                        displayCountMetricData(sb, log);
65                        break;
66                    case GAUGE_METRICS:
67                        sb.append("Gauge metric data\n");
68                        displayGaugeMetricData(sb, log);
69                        break;
70                    case VALUE_METRICS:
71                        sb.append("Value metric data\n");
72                        displayValueMetricData(sb, log);
73                        break;
74                    case DATA_NOT_SET:
75                        sb.append("No metric data\n");
76                        break;
77                }
78            }
79        }
80        sb.append("************************************************");
81    }
82
83    public static String getDateStr(long nanoSec) {
84        return DateFormat.format("dd/MM hh:mm:ss", nanoSec/1000000).toString();
85    }
86
87    private static void displayDimension(StringBuilder sb, StatsLog.DimensionsValue dimensionValue) {
88        sb.append(dimensionValue.getField()).append(":");
89        if (dimensionValue.hasValueBool()) {
90            sb.append(dimensionValue.getValueBool());
91        } else if (dimensionValue.hasValueFloat()) {
92            sb.append(dimensionValue.getValueFloat());
93        } else if (dimensionValue.hasValueInt()) {
94            sb.append(dimensionValue.getValueInt());
95        } else if (dimensionValue.hasValueStr()) {
96            sb.append(dimensionValue.getValueStr());
97        } else if (dimensionValue.hasValueTuple()) {
98            sb.append("{");
99            for (StatsLog.DimensionsValue child :
100                    dimensionValue.getValueTuple().getDimensionsValueList()) {
101                displayDimension(sb, child);
102            }
103            sb.append("}");
104        }
105        sb.append(" ");
106    }
107
108    public static void displayDurationMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
109        StatsLog.StatsLogReport.DurationMetricDataWrapper durationMetricDataWrapper
110                = log.getDurationMetrics();
111        sb.append("Dimension size: ").append(durationMetricDataWrapper.getDataCount()).append("\n");
112        for (StatsLog.DurationMetricData duration : durationMetricDataWrapper.getDataList()) {
113            sb.append("dimension_in_what: ");
114            displayDimension(sb, duration.getDimensionsInWhat());
115            sb.append("\n");
116            if (duration.hasDimensionsInCondition()) {
117                sb.append("dimension_in_condition: ");
118                displayDimension(sb, duration.getDimensionsInCondition());
119                sb.append("\n");
120            }
121
122            for (StatsLog.DurationBucketInfo info : duration.getBucketInfoList())  {
123                sb.append("\t[").append(getDateStr(info.getStartBucketElapsedNanos())).append("-")
124                        .append(getDateStr(info.getEndBucketElapsedNanos())).append("] -> ")
125                        .append(info.getDurationNanos()).append(" ns\n");
126            }
127        }
128    }
129
130    public static void displayEventMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
131        sb.append("Contains ").append(log.getEventMetrics().getDataCount()).append(" events\n");
132        StatsLog.StatsLogReport.EventMetricDataWrapper eventMetricDataWrapper =
133                log.getEventMetrics();
134        for (StatsLog.EventMetricData event : eventMetricDataWrapper.getDataList()) {
135            sb.append(getDateStr(event.getElapsedTimestampNanos())).append(": ");
136            sb.append(event.getAtom().getPushedCase().toString()).append("\n");
137        }
138    }
139
140    public static void displayCountMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
141        StatsLog.StatsLogReport.CountMetricDataWrapper countMetricDataWrapper
142                = log.getCountMetrics();
143        sb.append("Dimension size: ").append(countMetricDataWrapper.getDataCount()).append("\n");
144        for (StatsLog.CountMetricData count : countMetricDataWrapper.getDataList()) {
145            sb.append("dimension_in_what: ");
146            displayDimension(sb, count.getDimensionsInWhat());
147            sb.append("\n");
148            if (count.hasDimensionsInCondition()) {
149                sb.append("dimension_in_condition: ");
150                displayDimension(sb, count.getDimensionsInCondition());
151                sb.append("\n");
152            }
153
154            for (StatsLog.CountBucketInfo info : count.getBucketInfoList())  {
155                sb.append("\t[").append(getDateStr(info.getStartBucketElapsedNanos())).append("-")
156                        .append(getDateStr(info.getEndBucketElapsedNanos())).append("] -> ")
157                        .append(info.getCount()).append("\n");
158            }
159        }
160    }
161
162    public static void displayGaugeMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
163        sb.append("Display me!");
164    }
165
166    public static void displayValueMetricData(StringBuilder sb, StatsLog.StatsLogReport log) {
167        sb.append("Display me!");
168    }
169}
170