blob: 6ffc13b8c4e28437ecf274befb33435dde534243 [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
Ken Mixtereafbbdf2010-10-01 15:38:42 -070010void ShowUsage() {
11 fprintf(stderr,
12 "Usage: metrics_client [-ab] [-t] name sample min max nbuckets\n"
13 " metrics_client [-ab] -e name sample max\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070014 " metrics_client [-ab] -v event\n"
Darin Petkoved824852011-01-06 10:51:47 -080015 " metrics_client -u action\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070016 " metrics_client [-cg]\n"
17 "\n"
18 " default: send metric with integer values to Chrome only\n"
19 " |min| > 0, |min| <= sample < |max|\n"
20 " -a: send metric (name/sample) to Autotest only\n"
21 " -b: send metric to both Chrome and Autotest\n"
22 " -c: return exit status 0 if user consents to stats, 1 otherwise\n"
23 " -e: send linear/enumeration histogram data\n"
24 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Darin Petkoved824852011-01-06 10:51:47 -080025 " -t: convert sample from double seconds to int milliseconds\n"
Luigi Semenzato32684222013-03-13 10:53:55 -070026 " -u: send a user action to Chrome\n"
27 " -v: send a Platform.CrOSEvent enum histogram sample\n"
28 );
Ken Mixtereafbbdf2010-10-01 15:38:42 -070029 exit(1);
30}
Darin Petkov65b01462010-04-14 13:32:20 -070031
Ken Mixtereafbbdf2010-10-01 15:38:42 -070032static int SendStats(char* argv[],
33 int name_index,
34 bool send_enum,
35 bool secs_to_msecs,
36 bool send_to_autotest,
37 bool send_to_chrome) {
Darin Petkovc2526a12010-04-21 14:24:04 -070038 const char* name = argv[name_index];
39 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070040 if (secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070041 sample = static_cast<int>(atof(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070042 } else {
Darin Petkovc2526a12010-04-21 14:24:04 -070043 sample = atoi(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070044 }
45
Darin Petkov65b01462010-04-14 13:32:20 -070046 // Send metrics
47 if (send_to_autotest) {
Darin Petkovc2526a12010-04-21 14:24:04 -070048 MetricsLibrary::SendToAutotest(name, sample);
Darin Petkov65b01462010-04-14 13:32:20 -070049 }
Darin Petkov5b7dce12010-04-21 15:45:10 -070050
Darin Petkov65b01462010-04-14 13:32:20 -070051 if (send_to_chrome) {
Darin Petkov21cd2c52010-05-12 15:26:16 -070052 MetricsLibrary metrics_lib;
53 metrics_lib.Init();
Darin Petkov5b7dce12010-04-21 15:45:10 -070054 if (send_enum) {
55 int max = atoi(argv[name_index + 2]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070056 metrics_lib.SendEnumToUMA(name, sample, max);
Darin Petkov5b7dce12010-04-21 15:45:10 -070057 } else {
58 int min = atoi(argv[name_index + 2]);
59 int max = atoi(argv[name_index + 3]);
60 int nbuckets = atoi(argv[name_index + 4]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070061 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov5b7dce12010-04-21 15:45:10 -070062 }
Darin Petkov65b01462010-04-14 13:32:20 -070063 }
64 return 0;
65}
Ken Mixtereafbbdf2010-10-01 15:38:42 -070066
Darin Petkoved824852011-01-06 10:51:47 -080067static int SendUserAction(char* argv[], int action_index) {
68 const char* action = argv[action_index];
69 MetricsLibrary metrics_lib;
70 metrics_lib.Init();
71 metrics_lib.SendUserActionToUMA(action);
72 return 0;
73}
74
Luigi Semenzato32684222013-03-13 10:53:55 -070075static int SendCrosEvent(char* argv[], int action_index) {
76 const char* event = argv[action_index];
77 bool result;
78 MetricsLibrary metrics_lib;
79 metrics_lib.Init();
80 result = metrics_lib.SendCrosEventToUMA(event);
81 if (!result) {
82 fprintf(stderr, "metrics_client: could not send event %s\n", event);
83 return 1;
84 }
85 return 0;
86}
87
Ken Mixtereafbbdf2010-10-01 15:38:42 -070088static int HasConsent() {
89 MetricsLibrary metrics_lib;
90 metrics_lib.Init();
91 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
92}
93
94static int IsGuestMode() {
95 MetricsLibrary metrics_lib;
96 metrics_lib.Init();
97 return metrics_lib.IsGuestMode() ? 0 : 1;
98}
99
100int main(int argc, char** argv) {
101 enum Mode {
102 kModeSendStats,
Darin Petkoved824852011-01-06 10:51:47 -0800103 kModeSendUserAction,
Luigi Semenzato32684222013-03-13 10:53:55 -0700104 kModeSendCrosEvent,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700105 kModeHasConsent,
106 kModeIsGuestMode
107 } mode = kModeSendStats;
108 bool send_to_autotest = false;
109 bool send_to_chrome = true;
110 bool send_enum = false;
111 bool secs_to_msecs = false;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700112
113 // Parse arguments
114 int flag;
Luigi Semenzato32684222013-03-13 10:53:55 -0700115 while ((flag = getopt(argc, argv, "abcegtuv")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700116 switch (flag) {
117 case 'a':
118 mode = kModeSendStats;
119 send_to_autotest = true;
120 send_to_chrome = false;
121 break;
122 case 'b':
123 mode = kModeSendStats;
124 send_to_chrome = true;
125 send_to_autotest = true;
126 break;
127 case 'c':
128 mode = kModeHasConsent;
129 break;
130 case 'e':
131 send_enum = true;
132 break;
133 case 'g':
134 mode = kModeIsGuestMode;
135 break;
136 case 't':
137 secs_to_msecs = true;
138 break;
Darin Petkoved824852011-01-06 10:51:47 -0800139 case 'u':
140 mode = kModeSendUserAction;
141 break;
Luigi Semenzato32684222013-03-13 10:53:55 -0700142 case 'v':
143 mode = kModeSendCrosEvent;
144 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700145 default:
Darin Petkov8032dd02011-05-09 16:33:19 -0700146 ShowUsage();
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700147 break;
148 }
149 }
Darin Petkoved824852011-01-06 10:51:47 -0800150 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700151
152 int expected_args = 0;
153 if (mode == kModeSendStats)
154 expected_args = send_enum ? 3 : 5;
Darin Petkoved824852011-01-06 10:51:47 -0800155 else if (mode == kModeSendUserAction)
156 expected_args = 1;
Luigi Semenzato32684222013-03-13 10:53:55 -0700157 else if (mode == kModeSendCrosEvent)
158 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700159
Darin Petkoved824852011-01-06 10:51:47 -0800160 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700161 ShowUsage();
162 }
163
164 switch(mode) {
165 case kModeSendStats:
166 if (send_enum && secs_to_msecs) {
167 ShowUsage();
168 }
169 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800170 arg_index,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700171 send_enum,
172 secs_to_msecs,
173 send_to_autotest,
174 send_to_chrome);
Darin Petkoved824852011-01-06 10:51:47 -0800175 case kModeSendUserAction:
176 return SendUserAction(argv, arg_index);
Luigi Semenzato32684222013-03-13 10:53:55 -0700177 case kModeSendCrosEvent:
178 return SendCrosEvent(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700179 case kModeHasConsent:
180 return HasConsent();
181 case kModeIsGuestMode:
182 return IsGuestMode();
183 default:
184 ShowUsage();
185 return 0;
186 }
187}