blob: 57e96c29e639fec7f0fb9453c1b494ba1e0c5d52 [file] [log] [blame]
Bertrand SIMONNET52e5b992015-08-10 15:18:00 -07001/*
2 * Copyright (C) 2015 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 */
Darin Petkov65b01462010-04-14 13:32:20 -070016
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070017#include <cstdio>
Darin Petkov65b01462010-04-14 13:32:20 -070018#include <cstdlib>
Darin Petkov65b01462010-04-14 13:32:20 -070019
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070020#include "metrics/metrics_library.h"
Darin Petkov65b01462010-04-14 13:32:20 -070021
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070022enum Mode {
23 kModeSendSample,
24 kModeSendEnumSample,
25 kModeSendSparseSample,
26 kModeSendUserAction,
27 kModeSendCrosEvent,
28 kModeHasConsent,
29 kModeIsGuestMode,
30};
31
Ken Mixtereafbbdf2010-10-01 15:38:42 -070032void ShowUsage() {
33 fprintf(stderr,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070034 "Usage: metrics_client [-t] name sample min max nbuckets\n"
35 " metrics_client -e name sample max\n"
36 " metrics_client -s name sample\n"
37 " metrics_client -v event\n"
Darin Petkoved824852011-01-06 10:51:47 -080038 " metrics_client -u action\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070039 " metrics_client [-cg]\n"
40 "\n"
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070041 " default: send metric with integer values \n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070042 " |min| > 0, |min| <= sample < |max|\n"
Thiemo Nagel0b8cc1c2014-08-21 15:00:50 +020043 " -c: return exit status 0 if user consents to stats, 1 otherwise,\n"
44 " in guest mode always return 1\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070045 " -e: send linear/enumeration histogram data\n"
46 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070047 " -s: send a sparse histogram sample\n"
Darin Petkoved824852011-01-06 10:51:47 -080048 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070049 " -u: send a user action to Chrome\n"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070050 " -v: send a Platform.CrOSEvent enum histogram sample\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070051 exit(1);
52}
Darin Petkov65b01462010-04-14 13:32:20 -070053
Luigi Semenzatod8abf552014-03-27 14:19:06 -070054static int ParseInt(const char *arg) {
55 char *endptr;
56 int value = strtol(arg, &endptr, 0);
57 if (*endptr != '\0') {
58 fprintf(stderr, "metrics client: bad integer \"%s\"\n", arg);
59 ShowUsage();
60 }
61 return value;
62}
63
64static double ParseDouble(const char *arg) {
65 char *endptr;
66 double value = strtod(arg, &endptr);
67 if (*endptr != '\0') {
68 fprintf(stderr, "metrics client: bad double \"%s\"\n", arg);
69 ShowUsage();
70 }
71 return value;
72}
73
Ken Mixtereafbbdf2010-10-01 15:38:42 -070074static int SendStats(char* argv[],
75 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070076 enum Mode mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070077 bool secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070078 const char* name = argv[name_index];
79 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070080 if (secs_to_msecs) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070081 sample = static_cast<int>(ParseDouble(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070082 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070083 sample = ParseInt(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070084 }
85
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070086 MetricsLibrary metrics_lib;
87 metrics_lib.Init();
88 if (mode == kModeSendSparseSample) {
89 metrics_lib.SendSparseToUMA(name, sample);
90 } else if (mode == kModeSendEnumSample) {
91 int max = ParseInt(argv[name_index + 2]);
92 metrics_lib.SendEnumToUMA(name, sample, max);
93 } else {
94 int min = ParseInt(argv[name_index + 2]);
95 int max = ParseInt(argv[name_index + 3]);
96 int nbuckets = ParseInt(argv[name_index + 4]);
97 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov65b01462010-04-14 13:32:20 -070098 }
99 return 0;
100}
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700101
Darin Petkoved824852011-01-06 10:51:47 -0800102static int SendUserAction(char* argv[], int action_index) {
103 const char* action = argv[action_index];
104 MetricsLibrary metrics_lib;
105 metrics_lib.Init();
106 metrics_lib.SendUserActionToUMA(action);
107 return 0;
108}
109
Luigi Semenzato32684222013-03-13 10:53:55 -0700110static int SendCrosEvent(char* argv[], int action_index) {
111 const char* event = argv[action_index];
112 bool result;
113 MetricsLibrary metrics_lib;
114 metrics_lib.Init();
115 result = metrics_lib.SendCrosEventToUMA(event);
116 if (!result) {
117 fprintf(stderr, "metrics_client: could not send event %s\n", event);
118 return 1;
119 }
120 return 0;
121}
122
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700123static int HasConsent() {
124 MetricsLibrary metrics_lib;
125 metrics_lib.Init();
126 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
127}
128
129static int IsGuestMode() {
130 MetricsLibrary metrics_lib;
131 metrics_lib.Init();
132 return metrics_lib.IsGuestMode() ? 0 : 1;
133}
134
135int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700136 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700137 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700138
139 // Parse arguments
140 int flag;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700141 while ((flag = getopt(argc, argv, "abcegstuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700142 switch (flag) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700143 case 'c':
144 mode = kModeHasConsent;
145 break;
146 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700147 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700148 break;
149 case 'g':
150 mode = kModeIsGuestMode;
151 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700152 case 's':
153 mode = kModeSendSparseSample;
154 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700155 case 't':
156 secs_to_msecs = true;
157 break;
Darin Petkoved824852011-01-06 10:51:47 -0800158 case 'u':
159 mode = kModeSendUserAction;
160 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700161 case 'v':
162 mode = kModeSendCrosEvent;
163 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700164 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700165 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700166 break;
167 }
168 }
Darin Petkoved824852011-01-06 10:51:47 -0800169 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700170
171 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700172 if (mode == kModeSendSample)
173 expected_args = 5;
174 else if (mode == kModeSendEnumSample)
175 expected_args = 3;
176 else if (mode == kModeSendSparseSample)
177 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800178 else if (mode == kModeSendUserAction)
179 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700180 else if (mode == kModeSendCrosEvent)
181 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700182
Darin Petkoved824852011-01-06 10:51:47 -0800183 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700184 ShowUsage();
185 }
186
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -0700187 switch (mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700188 case kModeSendSample:
189 case kModeSendEnumSample:
190 case kModeSendSparseSample:
191 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700192 ShowUsage();
193 }
194 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800195 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700196 mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -0700197 secs_to_msecs);
Darin Petkoved824852011-01-06 10:51:47 -0800198 case kModeSendUserAction:
199 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700200 case kModeSendCrosEvent:
201 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700202 case kModeHasConsent:
203 return HasConsent();
204 case kModeIsGuestMode:
205 return IsGuestMode();
206 default:
207 ShowUsage();
208 return 0;
209 }
210}