blob: 5d73555824429bfecc41b039daf675c54a5f1f1a [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
James Hawkins5f646002015-09-08 15:18:17 -070020#include <base/memory/scoped_vector.h>
21
22#include "constants.h"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070023#include "metrics/metrics_library.h"
Darin Petkov65b01462010-04-14 13:32:20 -070024
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070025enum Mode {
26 kModeSendSample,
27 kModeSendEnumSample,
28 kModeSendSparseSample,
29 kModeSendUserAction,
30 kModeSendCrosEvent,
31 kModeHasConsent,
32 kModeIsGuestMode,
33};
34
Ken Mixtereafbbdf2010-10-01 15:38:42 -070035void ShowUsage() {
36 fprintf(stderr,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070037 "Usage: metrics_client [-t] name sample min max nbuckets\n"
38 " metrics_client -e name sample max\n"
39 " metrics_client -s name sample\n"
40 " metrics_client -v event\n"
Darin Petkoved824852011-01-06 10:51:47 -080041 " metrics_client -u action\n"
James Hawkins5f646002015-09-08 15:18:17 -070042 " metrics_client [-cdg]\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070043 "\n"
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070044 " default: send metric with integer values \n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070045 " |min| > 0, |min| <= sample < |max|\n"
Thiemo Nagel0b8cc1c2014-08-21 15:00:50 +020046 " -c: return exit status 0 if user consents to stats, 1 otherwise,\n"
47 " in guest mode always return 1\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070048 " -e: send linear/enumeration histogram data\n"
49 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070050 " -s: send a sparse histogram sample\n"
Darin Petkoved824852011-01-06 10:51:47 -080051 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070052 " -u: send a user action to Chrome\n"
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -070053 " -v: send a Platform.CrOSEvent enum histogram sample\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070054 exit(1);
55}
Darin Petkov65b01462010-04-14 13:32:20 -070056
Luigi Semenzatod8abf552014-03-27 14:19:06 -070057static int ParseInt(const char *arg) {
58 char *endptr;
59 int value = strtol(arg, &endptr, 0);
60 if (*endptr != '\0') {
61 fprintf(stderr, "metrics client: bad integer \"%s\"\n", arg);
62 ShowUsage();
63 }
64 return value;
65}
66
67static double ParseDouble(const char *arg) {
68 char *endptr;
69 double value = strtod(arg, &endptr);
70 if (*endptr != '\0') {
71 fprintf(stderr, "metrics client: bad double \"%s\"\n", arg);
72 ShowUsage();
73 }
74 return value;
75}
76
Ken Mixtereafbbdf2010-10-01 15:38:42 -070077static int SendStats(char* argv[],
78 int name_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -070079 enum Mode mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070080 bool secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070081 const char* name = argv[name_index];
82 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070083 if (secs_to_msecs) {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070084 sample = static_cast<int>(ParseDouble(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070085 } else {
Luigi Semenzatod8abf552014-03-27 14:19:06 -070086 sample = ParseInt(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070087 }
88
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -070089 MetricsLibrary metrics_lib;
90 metrics_lib.Init();
91 if (mode == kModeSendSparseSample) {
92 metrics_lib.SendSparseToUMA(name, sample);
93 } else if (mode == kModeSendEnumSample) {
94 int max = ParseInt(argv[name_index + 2]);
95 metrics_lib.SendEnumToUMA(name, sample, max);
96 } else {
97 int min = ParseInt(argv[name_index + 2]);
98 int max = ParseInt(argv[name_index + 3]);
99 int nbuckets = ParseInt(argv[name_index + 4]);
100 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov65b01462010-04-14 13:32:20 -0700101 }
102 return 0;
103}
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700104
Darin Petkoved824852011-01-06 10:51:47 -0800105static int SendUserAction(char* argv[], int action_index) {
106 const char* action = argv[action_index];
107 MetricsLibrary metrics_lib;
108 metrics_lib.Init();
109 metrics_lib.SendUserActionToUMA(action);
110 return 0;
111}
112
Luigi Semenzato32684222013-03-13 10:53:55 -0700113static int SendCrosEvent(char* argv[], int action_index) {
114 const char* event = argv[action_index];
115 bool result;
116 MetricsLibrary metrics_lib;
117 metrics_lib.Init();
118 result = metrics_lib.SendCrosEventToUMA(event);
119 if (!result) {
120 fprintf(stderr, "metrics_client: could not send event %s\n", event);
121 return 1;
122 }
123 return 0;
124}
125
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700126static int HasConsent() {
127 MetricsLibrary metrics_lib;
128 metrics_lib.Init();
129 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
130}
131
132static int IsGuestMode() {
133 MetricsLibrary metrics_lib;
134 metrics_lib.Init();
135 return metrics_lib.IsGuestMode() ? 0 : 1;
136}
137
138int main(int argc, char** argv) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700139 enum Mode mode = kModeSendSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700140 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700141
142 // Parse arguments
143 int flag;
Bertrand SIMONNET6b8629a2015-11-18 13:46:33 -0800144 while ((flag = getopt(argc, argv, "abcegstuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700145 switch (flag) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700146 case 'c':
147 mode = kModeHasConsent;
148 break;
149 case 'e':
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700150 mode = kModeSendEnumSample;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700151 break;
152 case 'g':
153 mode = kModeIsGuestMode;
154 break;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700155 case 's':
156 mode = kModeSendSparseSample;
157 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700158 case 't':
159 secs_to_msecs = true;
160 break;
Darin Petkoved824852011-01-06 10:51:47 -0800161 case 'u':
162 mode = kModeSendUserAction;
163 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700164 case 'v':
165 mode = kModeSendCrosEvent;
166 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700167 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700168 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700169 break;
170 }
171 }
Darin Petkoved824852011-01-06 10:51:47 -0800172 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700173
174 int expected_args = 0;
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700175 if (mode == kModeSendSample)
176 expected_args = 5;
177 else if (mode == kModeSendEnumSample)
178 expected_args = 3;
179 else if (mode == kModeSendSparseSample)
180 expected_args = 2;
Darin Petkoved824852011-01-06 10:51:47 -0800181 else if (mode == kModeSendUserAction)
182 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700183 else if (mode == kModeSendCrosEvent)
184 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700185
Darin Petkoved824852011-01-06 10:51:47 -0800186 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700187 ShowUsage();
188 }
189
Bertrand SIMONNETe6cfd642014-07-09 16:35:23 -0700190 switch (mode) {
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700191 case kModeSendSample:
192 case kModeSendEnumSample:
193 case kModeSendSparseSample:
194 if ((mode != kModeSendSample) && secs_to_msecs) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700195 ShowUsage();
196 }
197 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800198 arg_index,
Luigi Semenzatoa7ebeb32013-03-19 15:02:42 -0700199 mode,
Bertrand SIMONNET475dfa62015-08-04 14:10:10 -0700200 secs_to_msecs);
Darin Petkoved824852011-01-06 10:51:47 -0800201 case kModeSendUserAction:
202 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700203 case kModeSendCrosEvent:
204 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700205 case kModeHasConsent:
206 return HasConsent();
207 case kModeIsGuestMode:
208 return IsGuestMode();
209 default:
210 ShowUsage();
211 return 0;
212 }
213}