blob: 5aedd8b261da7ec33b7fd11ee2b604c847c3c05c [file] [log] [blame]
Darin Petkov65b01462010-04-14 13:32:20 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2// 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"
Darin Petkoved824852011-01-06 10:51:47 -080014 " metrics_client -u action\n"
Ken Mixtereafbbdf2010-10-01 15:38:42 -070015 " metrics_client [-cg]\n"
16 "\n"
17 " default: send metric with integer values to Chrome only\n"
18 " |min| > 0, |min| <= sample < |max|\n"
19 " -a: send metric (name/sample) to Autotest only\n"
20 " -b: send metric to both Chrome and Autotest\n"
21 " -c: return exit status 0 if user consents to stats, 1 otherwise\n"
22 " -e: send linear/enumeration histogram data\n"
23 " -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
Darin Petkoved824852011-01-06 10:51:47 -080024 " -t: convert sample from double seconds to int milliseconds\n"
25 " -u: send a user action to Chrome\n");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070026 exit(1);
27}
Darin Petkov65b01462010-04-14 13:32:20 -070028
Ken Mixtereafbbdf2010-10-01 15:38:42 -070029static int SendStats(char* argv[],
30 int name_index,
31 bool send_enum,
32 bool secs_to_msecs,
33 bool send_to_autotest,
34 bool send_to_chrome) {
Darin Petkovc2526a12010-04-21 14:24:04 -070035 const char* name = argv[name_index];
36 int sample;
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070037 if (secs_to_msecs) {
Darin Petkovc2526a12010-04-21 14:24:04 -070038 sample = static_cast<int>(atof(argv[name_index + 1]) * 1000.0);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070039 } else {
Darin Petkovc2526a12010-04-21 14:24:04 -070040 sample = atoi(argv[name_index + 1]);
Darin Petkov4fcb2ac2010-04-15 16:40:23 -070041 }
42
Darin Petkov65b01462010-04-14 13:32:20 -070043 // Send metrics
44 if (send_to_autotest) {
Darin Petkovc2526a12010-04-21 14:24:04 -070045 MetricsLibrary::SendToAutotest(name, sample);
Darin Petkov65b01462010-04-14 13:32:20 -070046 }
Darin Petkov5b7dce12010-04-21 15:45:10 -070047
Darin Petkov65b01462010-04-14 13:32:20 -070048 if (send_to_chrome) {
Darin Petkov21cd2c52010-05-12 15:26:16 -070049 MetricsLibrary metrics_lib;
50 metrics_lib.Init();
Darin Petkov5b7dce12010-04-21 15:45:10 -070051 if (send_enum) {
52 int max = atoi(argv[name_index + 2]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070053 metrics_lib.SendEnumToUMA(name, sample, max);
Darin Petkov5b7dce12010-04-21 15:45:10 -070054 } else {
55 int min = atoi(argv[name_index + 2]);
56 int max = atoi(argv[name_index + 3]);
57 int nbuckets = atoi(argv[name_index + 4]);
Darin Petkov21cd2c52010-05-12 15:26:16 -070058 metrics_lib.SendToUMA(name, sample, min, max, nbuckets);
Darin Petkov5b7dce12010-04-21 15:45:10 -070059 }
Darin Petkov65b01462010-04-14 13:32:20 -070060 }
61 return 0;
62}
Ken Mixtereafbbdf2010-10-01 15:38:42 -070063
Darin Petkoved824852011-01-06 10:51:47 -080064static int SendUserAction(char* argv[], int action_index) {
65 const char* action = argv[action_index];
66 MetricsLibrary metrics_lib;
67 metrics_lib.Init();
68 metrics_lib.SendUserActionToUMA(action);
69 return 0;
70}
71
Ken Mixtereafbbdf2010-10-01 15:38:42 -070072static int HasConsent() {
73 MetricsLibrary metrics_lib;
74 metrics_lib.Init();
75 return metrics_lib.AreMetricsEnabled() ? 0 : 1;
76}
77
78static int IsGuestMode() {
79 MetricsLibrary metrics_lib;
80 metrics_lib.Init();
81 return metrics_lib.IsGuestMode() ? 0 : 1;
82}
83
84int main(int argc, char** argv) {
85 enum Mode {
86 kModeSendStats,
Darin Petkoved824852011-01-06 10:51:47 -080087 kModeSendUserAction,
Ken Mixtereafbbdf2010-10-01 15:38:42 -070088 kModeHasConsent,
89 kModeIsGuestMode
90 } mode = kModeSendStats;
91 bool send_to_autotest = false;
92 bool send_to_chrome = true;
93 bool send_enum = false;
94 bool secs_to_msecs = false;
95 bool print_usage = false;
96
97 // Parse arguments
98 int flag;
Darin Petkoved824852011-01-06 10:51:47 -080099 while ((flag = getopt(argc, argv, "abcegtu")) != -1) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700100 switch (flag) {
101 case 'a':
102 mode = kModeSendStats;
103 send_to_autotest = true;
104 send_to_chrome = false;
105 break;
106 case 'b':
107 mode = kModeSendStats;
108 send_to_chrome = true;
109 send_to_autotest = true;
110 break;
111 case 'c':
112 mode = kModeHasConsent;
113 break;
114 case 'e':
115 send_enum = true;
116 break;
117 case 'g':
118 mode = kModeIsGuestMode;
119 break;
120 case 't':
121 secs_to_msecs = true;
122 break;
Darin Petkoved824852011-01-06 10:51:47 -0800123 case 'u':
124 mode = kModeSendUserAction;
125 break;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700126 default:
127 print_usage = true;
128 break;
129 }
130 }
Darin Petkoved824852011-01-06 10:51:47 -0800131 int arg_index = optind;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700132
133 int expected_args = 0;
134 if (mode == kModeSendStats)
135 expected_args = send_enum ? 3 : 5;
Darin Petkoved824852011-01-06 10:51:47 -0800136 else if (mode == kModeSendUserAction)
137 expected_args = 1;
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700138
Darin Petkoved824852011-01-06 10:51:47 -0800139 if ((arg_index + expected_args) != argc) {
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700140 ShowUsage();
141 }
142
143 switch(mode) {
144 case kModeSendStats:
145 if (send_enum && secs_to_msecs) {
146 ShowUsage();
147 }
148 return SendStats(argv,
Darin Petkoved824852011-01-06 10:51:47 -0800149 arg_index,
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700150 send_enum,
151 secs_to_msecs,
152 send_to_autotest,
153 send_to_chrome);
Darin Petkoved824852011-01-06 10:51:47 -0800154 case kModeSendUserAction:
155 return SendUserAction(argv, arg_index);
Ken Mixtereafbbdf2010-10-01 15:38:42 -0700156 case kModeHasConsent:
157 return HasConsent();
158 case kModeIsGuestMode:
159 return IsGuestMode();
160 default:
161 ShowUsage();
162 return 0;
163 }
164}