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 */ 16 package com.android.statsd.loadtest; 17 18 import android.text.format.DateFormat; 19 20 import com.android.os.StatsLog; 21 22 import java.util.List; 23 24 public 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