blob: cdf09a2cad9cb7fb254fedc2b465f0c83570d4d3 [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
8#include "metrics_library.h"
9
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"
39 " -v: send a Platform.CrOSEvent enum histogram sample\n"
40 );
Ken Mixtereafbbdf2010-10-01 15:38:42 -070041 exit(1);
42}
Darin Petkov65b01462010-04-14 13:32:20 -070043
Ken Mixtereafbbdf2010-10-01 15:38:42 -070044static int SendStats(char* argv[],
45 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070046 enum Mode mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -070047 bool secs_to_msecs,
48 bool send_to_autotest,
49 bool send_to_chrome) {
Darin Petkovc2526a12010-04-21 14:24:04 -070050 const char* name = argv[name_index];
51 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070052 if (secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070053 sample = static_cast<int>(atof(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070054 } else {
Darin Petkovc2526a12010-04-21 14:24:04 -070055 sample = atoi(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070056 }
57
Darin Petkov65b01462010-04-14 13:32:20 -070058 // Send metrics
59 if (send_to_autotest) {
Darin Petkovc2526a12010-04-21 14:24:04 -070060 MetricsLibrary::SendToAutotest(name, sample);
Darin Petkov65b01462010-04-14 13:32:20 -070061 }
Darin Petkov5b7dce12010-04-21 15:45:10 -070062
Darin Petkov65b01462010-04-14 13:32:20 -070063 if (send_to_chrome) {
Darin Petkov21cd2c52010-05-12 15:26:16 -070064 MetricsLibrary metrics_lib;
65 metrics_lib.Init();
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070066 if (mode == kModeSendSparseSample) {
67 metrics_lib.SendSparseToUMA(name, sample);
68 } else if (mode == kModeSendEnumSample) {
Darin Petkov5b7dce12010-04-21 15:45:10 -070069 int max = atoi(argv[name_index + 2]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070070 metrics_lib.SendEnumToUMA(name, sample, max);
Darin Petkov5b7dce12010-04-21 15:45:10 -070071 } else {
72 int min = atoi(argv[name_index + 2]);
73 int max = atoi(argv[name_index + 3]);
74 int nbuckets = atoi(argv[name_index + 4]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070075 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov5b7dce12010-04-21 15:45:10 -070076 }
Darin Petkov65b01462010-04-14 13:32:20 -070077 }
78 return 0;
79}
Ken Mixtereafbbdf2010-10-01 15:38:42 -070080
Darin Petkoved824852011-01-06 10:51:47 -080081static int SendUserAction(char* argv[], int action_index) {
82 const char* action = argv[action_index];
83 MetricsLibrary metrics_lib;
84 metrics_lib.Init();
85 metrics_lib.SendUserActionToUMA(action);
86 return 0;
87}
88
Luigi Semenzato32684222013-03-13 10:53:55 -070089static int SendCrosEvent(char* argv[], int action_index) {
90 const char* event = argv[action_index];
91 bool result;
92 MetricsLibrary metrics_lib;
93 metrics_lib.Init();
94 result = metrics_lib.SendCrosEventToUMA(event);
95 if (!result) {
96 fprintf(stderr, "metrics_client: could not send event %s\n", event);
97 return 1;
98 }
99 return 0;
100}
101
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700102static int HasConsent() {
103 MetricsLibrary metrics_lib;
104 metrics_lib.Init();
105 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
106}
107
108static int IsGuestMode() {
109 MetricsLibrary metrics_lib;
110 metrics_lib.Init();
111 return metrics_lib.IsGuestMode() ? 0 : 1;
112}
113
114int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700115 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700116 bool send_to_autotest = false;
117 bool send_to_chrome = true;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700118 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700119
120 // Parse arguments
121 int flag;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700122 while ((flag = getopt(argc, argv, "abcegstuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700123 switch (flag) {
124 case 'a':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700125 send_to_autotest = true;
126 send_to_chrome = false;
127 break;
128 case 'b':
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700129 send_to_chrome = true;
130 send_to_autotest = true;
131 break;
132 case 'c':
133 mode = kModeHasConsent;
134 break;
135 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700136 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700137 break;
138 case 'g':
139 mode = kModeIsGuestMode;
140 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700141 case 's':
142 mode = kModeSendSparseSample;
143 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700144 case 't':
145 secs_to_msecs = true;
146 break;
Darin Petkoved824852011-01-06 10:51:47 -0800147 case 'u':
148 mode = kModeSendUserAction;
149 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700150 case 'v':
151 mode = kModeSendCrosEvent;
152 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700153 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700154 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700155 break;
156 }
157 }
Darin Petkoved824852011-01-06 10:51:47 -0800158 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700159
160 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700161 if (mode == kModeSendSample)
162 expected_args = 5;
163 else if (mode == kModeSendEnumSample)
164 expected_args = 3;
165 else if (mode == kModeSendSparseSample)
166 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800167 else if (mode == kModeSendUserAction)
168 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700169 else if (mode == kModeSendCrosEvent)
170 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700171
Darin Petkoved824852011-01-06 10:51:47 -0800172 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700173 ShowUsage();
174 }
175
176 switch(mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700177 case kModeSendSample:
178 case kModeSendEnumSample:
179 case kModeSendSparseSample:
180 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700181 ShowUsage();
182 }
183 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800184 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700185 mode,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700186 secs_to_msecs,
187 send_to_autotest,
188 send_to_chrome);
Darin Petkoved824852011-01-06 10:51:47 -0800189 case kModeSendUserAction:
190 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700191 case kModeSendCrosEvent:
192 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700193 case kModeHasConsent:
194 return HasConsent();
195 case kModeIsGuestMode:
196 return IsGuestMode();
197 default:
198 ShowUsage();
199 return 0;
200 }
201}