blob: 6819e1d95b4a5d01f375d069ef4f563650d013e9 [file] [log] [blame]
Darin Petkov8032dd02011-05-09 16:33:19 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
Darin Petkov65b01462010-04-14 13:32:20 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkov4fcb2ac2010-04-15 16:40:23 -07005#include <cstdio>
Darin Petkov65b01462010-04-14 13:32:20 -07006#include <cstdlib>
Darin Petkov65b01462010-04-14 13:32:20 -07007
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -07008#include "metrics/metrics_library.h"
Darin Petkov65b01462010-04-14 13:32:20 -07009
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070010enum Mode {
11 kModeSendSample,
12 kModeSendEnumSample,
13 kModeSendSparseSample,
14 kModeSendUserAction,
15 kModeSendCrosEvent,
16 kModeHasConsent,
17 kModeIsGuestMode,
18};
19
Ken Mixtereafbbdf2010-10-01 15:38:42 -070020void ShowUsage() {
21 fprintf(stderr,
22 "Usage: metrics_client [-ab] [-t] name sample min max nbuckets\n"
23 " metrics_client [-ab] -e name sample max\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070024 " metrics_client [-ab] -s name sample\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070025 " metrics_client [-ab] -v event\n"
Darin Petkoved824852011-01-06 10:51:47 -080026 " metrics_client -u action\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070027 " metrics_client [-cg]\n"
28 "\n"
29 " default: send metric with integer values to Chrome only\n"
30 " |min| > 0, |min| <= sample < |max|\n"
31 " -a: send metric (name/sample) to Autotest only\n"
32 " -b: send metric to both Chrome and Autotest\n"
33 " -c: return exit status 0 if user consents to stats, 1 otherwise\n"
34 " -e: send linear/enumeration histogram data\n"
35 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070036 " -s: send a sparse histogram sample\n"
Darin Petkoved824852011-01-06 10:51:47 -080037 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070038 " -u: send a user action to Chrome\n"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070039 " -v: send a Platform.CrOSEvent enum histogram sample\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070040 exit(1);
41}
Darin Petkov65b01462010-04-14 13:32:20 -070042
Luigi Semenzatod8abf552014-03-27 14:19:06 -070043static int ParseInt(const char *arg) {
44 char *endptr;
45 int value = strtol(arg, &endptr, 0);
46 if (*endptr != '\0') {
47 fprintf(stderr, "metrics client: bad integer \"%s\"\n", arg);
48 ShowUsage();
49 }
50 return value;
51}
52
53static double ParseDouble(const char *arg) {
54 char *endptr;
55 double value = strtod(arg, &endptr);
56 if (*endptr != '\0') {
57 fprintf(stderr, "metrics client: bad double \"%s\"\n", arg);
58 ShowUsage();
59 }
60 return value;
61}
62
Ken Mixtereafbbdf2010-10-01 15:38:42 -070063static int SendStats(char* argv[],
64 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070065 enum Mode mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -070066 bool secs_to_msecs,
67 bool send_to_autotest,
68 bool send_to_chrome) {
Darin Petkovc2526a12010-04-21 14:24:04 -070069 const char* name = argv[name_index];
70 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070071 if (secs_to_msecs) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070072 sample = static_cast<int>(ParseDouble(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070073 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070074 sample = ParseInt(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070075 }
76
Darin Petkov65b01462010-04-14 13:32:20 -070077 // Send metrics
78 if (send_to_autotest) {
Darin Petkovc2526a12010-04-21 14:24:04 -070079 MetricsLibrary::SendToAutotest(name, sample);
Darin Petkov65b01462010-04-14 13:32:20 -070080 }
Darin Petkov5b7dce12010-04-21 15:45:10 -070081
Darin Petkov65b01462010-04-14 13:32:20 -070082 if (send_to_chrome) {
Darin Petkov21cd2c52010-05-12 15:26:16 -070083 MetricsLibrary metrics_lib;
84 metrics_lib.Init();
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070085 if (mode == kModeSendSparseSample) {
86 metrics_lib.SendSparseToUMA(name, sample);
87 } else if (mode == kModeSendEnumSample) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070088 int max = ParseInt(argv[name_index + 2]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070089 metrics_lib.SendEnumToUMA(name, sample, max);
Darin Petkov5b7dce12010-04-21 15:45:10 -070090 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070091 int min = ParseInt(argv[name_index + 2]);
92 int max = ParseInt(argv[name_index + 3]);
93 int nbuckets = ParseInt(argv[name_index + 4]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070094 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov5b7dce12010-04-21 15:45:10 -070095 }
Darin Petkov65b01462010-04-14 13:32:20 -070096 }
97 return 0;
98}
Ken Mixtereafbbdf2010-10-01 15:38:42 -070099
Darin Petkoved824852011-01-06 10:51:47 -0800100static int SendUserAction(char* argv[], int action_index) {
101 const char* action = argv[action_index];
102 MetricsLibrary metrics_lib;
103 metrics_lib.Init();
104 metrics_lib.SendUserActionToUMA(action);
105 return 0;
106}
107
Luigi Semenzato32684222013-03-13 10:53:55 -0700108static int SendCrosEvent(char* argv[], int action_index) {
109 const char* event = argv[action_index];
110 bool result;
111 MetricsLibrary metrics_lib;
112 metrics_lib.Init();
113 result = metrics_lib.SendCrosEventToUMA(event);
114 if (!result) {
115 fprintf(stderr, "metrics_client: could not send event %s\n", event);
116 return 1;
117 }
118 return 0;
119}
120
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700121static int HasConsent() {
122 MetricsLibrary metrics_lib;
123 metrics_lib.Init();
124 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
125}
126
127static int IsGuestMode() {
128 MetricsLibrary metrics_lib;
129 metrics_lib.Init();
130 return metrics_lib.IsGuestMode() ? 0 : 1;
131}
132
133int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700134 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700135 bool send_to_autotest = false;
136 bool send_to_chrome = true;
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) {
143 case 'a':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700144 send_to_autotest = true;
145 send_to_chrome = false;
146 break;
147 case 'b':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700148 send_to_chrome = true;
149 send_to_autotest = true;
150 break;
151 case 'c':
152 mode = kModeHasConsent;
153 break;
154 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700155 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700156 break;
157 case 'g':
158 mode = kModeIsGuestMode;
159 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700160 case 's':
161 mode = kModeSendSparseSample;
162 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700163 case 't':
164 secs_to_msecs = true;
165 break;
Darin Petkoved824852011-01-06 10:51:47 -0800166 case 'u':
167 mode = kModeSendUserAction;
168 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700169 case 'v':
170 mode = kModeSendCrosEvent;
171 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700172 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700173 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700174 break;
175 }
176 }
Darin Petkoved824852011-01-06 10:51:47 -0800177 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700178
179 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700180 if (mode == kModeSendSample)
181 expected_args = 5;
182 else if (mode == kModeSendEnumSample)
183 expected_args = 3;
184 else if (mode == kModeSendSparseSample)
185 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800186 else if (mode == kModeSendUserAction)
187 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700188 else if (mode == kModeSendCrosEvent)
189 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700190
Darin Petkoved824852011-01-06 10:51:47 -0800191 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700192 ShowUsage();
193 }
194
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -0700195 switch (mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700196 case kModeSendSample:
197 case kModeSendEnumSample:
198 case kModeSendSparseSample:
199 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700200 ShowUsage();
201 }
202 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800203 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700204 mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700205 secs_to_msecs,
206 send_to_autotest,
207 send_to_chrome);
Darin Petkoved824852011-01-06 10:51:47 -0800208 case kModeSendUserAction:
209 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700210 case kModeSendCrosEvent:
211 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700212 case kModeHasConsent:
213 return HasConsent();
214 case kModeIsGuestMode:
215 return IsGuestMode();
216 default:
217 ShowUsage();
218 return 0;
219 }
220}