blob: b587e3a2477312a10563a42333e18695bb2e1d97 [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,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070022 "Usage: metrics_client [-t] name sample min max nbuckets\n"
23 " metrics_client -e name sample max\n"
24 " metrics_client -s name sample\n"
25 " metrics_client -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"
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070029 " default: send metric with integer values \n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070030 " |min| > 0, |min| <= sample < |max|\n"
Thiemo Nagel0b8cc1c2014-08-21 15:00:50 +020031 " -c: return exit status 0 if user consents to stats, 1 otherwise,\n"
32 " in guest mode always return 1\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070033 " -e: send linear/enumeration histogram data\n"
34 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070035 " -s: send a sparse histogram sample\n"
Darin Petkoved824852011-01-06 10:51:47 -080036 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070037 " -u: send a user action to Chrome\n"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070038 " -v: send a Platform.CrOSEvent enum histogram sample\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070039 exit(1);
40}
Darin Petkov65b01462010-04-14 13:32:20 -070041
Luigi Semenzatod8abf552014-03-27 14:19:06 -070042static int ParseInt(const char *arg) {
43 char *endptr;
44 int value = strtol(arg, &endptr, 0);
45 if (*endptr != '\0') {
46 fprintf(stderr, "metrics client: bad integer \"%s\"\n", arg);
47 ShowUsage();
48 }
49 return value;
50}
51
52static double ParseDouble(const char *arg) {
53 char *endptr;
54 double value = strtod(arg, &endptr);
55 if (*endptr != '\0') {
56 fprintf(stderr, "metrics client: bad double \"%s\"\n", arg);
57 ShowUsage();
58 }
59 return value;
60}
61
Ken Mixtereafbbdf2010-10-01 15:38:42 -070062static int SendStats(char* argv[],
63 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070064 enum Mode mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070065 bool secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070066 const char* name = argv[name_index];
67 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070068 if (secs_to_msecs) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070069 sample = static_cast<int>(ParseDouble(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070070 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070071 sample = ParseInt(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070072 }
73
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070074 MetricsLibrary metrics_lib;
75 metrics_lib.Init();
76 if (mode == kModeSendSparseSample) {
77 metrics_lib.SendSparseToUMA(name, sample);
78 } else if (mode == kModeSendEnumSample) {
79 int max = ParseInt(argv[name_index + 2]);
80 metrics_lib.SendEnumToUMA(name, sample, max);
81 } else {
82 int min = ParseInt(argv[name_index + 2]);
83 int max = ParseInt(argv[name_index + 3]);
84 int nbuckets = ParseInt(argv[name_index + 4]);
85 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov65b01462010-04-14 13:32:20 -070086 }
87 return 0;
88}
Ken Mixtereafbbdf2010-10-01 15:38:42 -070089
Darin Petkoved824852011-01-06 10:51:47 -080090static int SendUserAction(char* argv[], int action_index) {
91 const char* action = argv[action_index];
92 MetricsLibrary metrics_lib;
93 metrics_lib.Init();
94 metrics_lib.SendUserActionToUMA(action);
95 return 0;
96}
97
Luigi Semenzato32684222013-03-13 10:53:55 -070098static int SendCrosEvent(char* argv[], int action_index) {
99 const char* event = argv[action_index];
100 bool result;
101 MetricsLibrary metrics_lib;
102 metrics_lib.Init();
103 result = metrics_lib.SendCrosEventToUMA(event);
104 if (!result) {
105 fprintf(stderr, "metrics_client: could not send event %s\n", event);
106 return 1;
107 }
108 return 0;
109}
110
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700111static int HasConsent() {
112 MetricsLibrary metrics_lib;
113 metrics_lib.Init();
114 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
115}
116
117static int IsGuestMode() {
118 MetricsLibrary metrics_lib;
119 metrics_lib.Init();
120 return metrics_lib.IsGuestMode() ? 0 : 1;
121}
122
123int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700124 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700125 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700126
127 // Parse arguments
128 int flag;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700129 while ((flag = getopt(argc, argv, "abcegstuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700130 switch (flag) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700131 case 'c':
132 mode = kModeHasConsent;
133 break;
134 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700135 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700136 break;
137 case 'g':
138 mode = kModeIsGuestMode;
139 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700140 case 's':
141 mode = kModeSendSparseSample;
142 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700143 case 't':
144 secs_to_msecs = true;
145 break;
Darin Petkoved824852011-01-06 10:51:47 -0800146 case 'u':
147 mode = kModeSendUserAction;
148 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700149 case 'v':
150 mode = kModeSendCrosEvent;
151 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700152 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700153 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700154 break;
155 }
156 }
Darin Petkoved824852011-01-06 10:51:47 -0800157 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700158
159 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700160 if (mode == kModeSendSample)
161 expected_args = 5;
162 else if (mode == kModeSendEnumSample)
163 expected_args = 3;
164 else if (mode == kModeSendSparseSample)
165 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800166 else if (mode == kModeSendUserAction)
167 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700168 else if (mode == kModeSendCrosEvent)
169 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700170
Darin Petkoved824852011-01-06 10:51:47 -0800171 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700172 ShowUsage();
173 }
174
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -0700175 switch (mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700176 case kModeSendSample:
177 case kModeSendEnumSample:
178 case kModeSendSparseSample:
179 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700180 ShowUsage();
181 }
182 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800183 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700184 mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -0700185 secs_to_msecs);
Darin Petkoved824852011-01-06 10:51:47 -0800186 case kModeSendUserAction:
187 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700188 case kModeSendCrosEvent:
189 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700190 case kModeHasConsent:
191 return HasConsent();
192 case kModeIsGuestMode:
193 return IsGuestMode();
194 default:
195 ShowUsage();
196 return 0;
197 }
198}