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