blob: bbe9dcda25c52d4e3d0b89b64785e8bfb52fe509 [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"
Thiemo Nagel0b8cc1c2014-08-21 15:00:50 +020033 " -c: return exit status 0 if user consents to stats, 1 otherwise,\n"
34 " in guest mode always return 1\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070035 " -e: send linear/enumeration histogram data\n"
36 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070037 " -s: send a sparse histogram sample\n"
Darin Petkoved824852011-01-06 10:51:47 -080038 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070039 " -u: send a user action to Chrome\n"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070040 " -v: send a Platform.CrOSEvent enum histogram sample\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070041 exit(1);
42}
Darin Petkov65b01462010-04-14 13:32:20 -070043
Luigi Semenzatod8abf552014-03-27 14:19:06 -070044static int ParseInt(const char *arg) {
45 char *endptr;
46 int value = strtol(arg, &endptr, 0);
47 if (*endptr != '\0') {
48 fprintf(stderr, "metrics client: bad integer \"%s\"\n", arg);
49 ShowUsage();
50 }
51 return value;
52}
53
54static double ParseDouble(const char *arg) {
55 char *endptr;
56 double value = strtod(arg, &endptr);
57 if (*endptr != '\0') {
58 fprintf(stderr, "metrics client: bad double \"%s\"\n", arg);
59 ShowUsage();
60 }
61 return value;
62}
63
Ken Mixtereafbbdf2010-10-01 15:38:42 -070064static int SendStats(char* argv[],
65 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070066 enum Mode mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -070067 bool secs_to_msecs,
68 bool send_to_autotest,
69 bool send_to_chrome) {
Darin Petkovc2526a12010-04-21 14:24:04 -070070 const char* name = argv[name_index];
71 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070072 if (secs_to_msecs) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070073 sample = static_cast<int>(ParseDouble(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070074 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070075 sample = ParseInt(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070076 }
77
Darin Petkov65b01462010-04-14 13:32:20 -070078 // Send metrics
79 if (send_to_autotest) {
Darin Petkovc2526a12010-04-21 14:24:04 -070080 MetricsLibrary::SendToAutotest(name, sample);
Darin Petkov65b01462010-04-14 13:32:20 -070081 }
Darin Petkov5b7dce12010-04-21 15:45:10 -070082
Darin Petkov65b01462010-04-14 13:32:20 -070083 if (send_to_chrome) {
Darin Petkov21cd2c52010-05-12 15:26:16 -070084 MetricsLibrary metrics_lib;
85 metrics_lib.Init();
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070086 if (mode == kModeSendSparseSample) {
87 metrics_lib.SendSparseToUMA(name, sample);
88 } else if (mode == kModeSendEnumSample) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070089 int max = ParseInt(argv[name_index + 2]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070090 metrics_lib.SendEnumToUMA(name, sample, max);
Darin Petkov5b7dce12010-04-21 15:45:10 -070091 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070092 int min = ParseInt(argv[name_index + 2]);
93 int max = ParseInt(argv[name_index + 3]);
94 int nbuckets = ParseInt(argv[name_index + 4]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070095 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov5b7dce12010-04-21 15:45:10 -070096 }
Darin Petkov65b01462010-04-14 13:32:20 -070097 }
98 return 0;
99}
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700100
Darin Petkoved824852011-01-06 10:51:47 -0800101static int SendUserAction(char* argv[], int action_index) {
102 const char* action = argv[action_index];
103 MetricsLibrary metrics_lib;
104 metrics_lib.Init();
105 metrics_lib.SendUserActionToUMA(action);
106 return 0;
107}
108
Luigi Semenzato32684222013-03-13 10:53:55 -0700109static int SendCrosEvent(char* argv[], int action_index) {
110 const char* event = argv[action_index];
111 bool result;
112 MetricsLibrary metrics_lib;
113 metrics_lib.Init();
114 result = metrics_lib.SendCrosEventToUMA(event);
115 if (!result) {
116 fprintf(stderr, "metrics_client: could not send event %s\n", event);
117 return 1;
118 }
119 return 0;
120}
121
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700122static int HasConsent() {
123 MetricsLibrary metrics_lib;
124 metrics_lib.Init();
125 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
126}
127
128static int IsGuestMode() {
129 MetricsLibrary metrics_lib;
130 metrics_lib.Init();
131 return metrics_lib.IsGuestMode() ? 0 : 1;
132}
133
134int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700135 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700136 bool send_to_autotest = false;
137 bool send_to_chrome = true;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700138 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700139
140 // Parse arguments
141 int flag;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700142 while ((flag = getopt(argc, argv, "abcegstuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700143 switch (flag) {
144 case 'a':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700145 send_to_autotest = true;
146 send_to_chrome = false;
147 break;
148 case 'b':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700149 send_to_chrome = true;
150 send_to_autotest = true;
151 break;
152 case 'c':
153 mode = kModeHasConsent;
154 break;
155 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700156 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700157 break;
158 case 'g':
159 mode = kModeIsGuestMode;
160 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700161 case 's':
162 mode = kModeSendSparseSample;
163 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700164 case 't':
165 secs_to_msecs = true;
166 break;
Darin Petkoved824852011-01-06 10:51:47 -0800167 case 'u':
168 mode = kModeSendUserAction;
169 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700170 case 'v':
171 mode = kModeSendCrosEvent;
172 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700173 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700174 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700175 break;
176 }
177 }
Darin Petkoved824852011-01-06 10:51:47 -0800178 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700179
180 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700181 if (mode == kModeSendSample)
182 expected_args = 5;
183 else if (mode == kModeSendEnumSample)
184 expected_args = 3;
185 else if (mode == kModeSendSparseSample)
186 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800187 else if (mode == kModeSendUserAction)
188 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700189 else if (mode == kModeSendCrosEvent)
190 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700191
Darin Petkoved824852011-01-06 10:51:47 -0800192 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700193 ShowUsage();
194 }
195
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -0700196 switch (mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700197 case kModeSendSample:
198 case kModeSendEnumSample:
199 case kModeSendSparseSample:
200 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700201 ShowUsage();
202 }
203 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800204 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700205 mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700206 secs_to_msecs,
207 send_to_autotest,
208 send_to_chrome);
Darin Petkoved824852011-01-06 10:51:47 -0800209 case kModeSendUserAction:
210 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700211 case kModeSendCrosEvent:
212 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700213 case kModeHasConsent:
214 return HasConsent();
215 case kModeIsGuestMode:
216 return IsGuestMode();
217 default:
218 ShowUsage();
219 return 0;
220 }
221}