12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/metrics_private/metrics_private_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/metrics/field_trial.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/metrics/sparse_histogram.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/metrics_private.h"
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/variations_associated_data.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/user_metrics.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace GetIsCrashReportingEnabled =
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    api::metrics_private::GetIsCrashReportingEnabled;
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace GetVariationParams = api::metrics_private::GetVariationParams;
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace GetFieldTrial = api::metrics_private::GetFieldTrial;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordUserAction = api::metrics_private::RecordUserAction;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordValue = api::metrics_private::RecordValue;
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace RecordSparseValue = api::metrics_private::RecordSparseValue;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordPercentage = api::metrics_private::RecordPercentage;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordCount = api::metrics_private::RecordCount;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordSmallCount = api::metrics_private::RecordSmallCount;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordMediumCount = api::metrics_private::RecordMediumCount;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordTime = api::metrics_private::RecordTime;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordMediumTime = api::metrics_private::RecordMediumTime;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace RecordLongTime = api::metrics_private::RecordLongTime;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxBuckets = 10000; // We don't ever want more than these many
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  // buckets; there is no real need for them
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  // and would cause crazy memory usage
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetIsCrashReportingEnabledFunction::RunSync() {
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SetResult(new base::FundamentalValue(
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ChromeMetricsServiceAccessor::IsCrashReportingEnabled()));
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetFieldTrialFunction::RunSync() {
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string name;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &name));
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetResult(new base::StringValue(base::FieldTrialList::FindFullName(name)));
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateGetVariationParamsFunction::RunSync() {
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<GetVariationParams::Params> params(
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GetVariationParams::Params::Create(*args_));
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXTENSION_FUNCTION_VALIDATE(params.get());
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetVariationParams::Results::Params result;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (variations::GetVariationParams(params->name,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     &result.additional_properties)) {
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetResult(result.ToValue().release());
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return true;
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordUserActionFunction::RunSync() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordUserAction::Params> params(
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordUserAction::Params::Create(*args_));
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RecordComputedAction(params->name);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MetricsHistogramHelperFunction::RecordValue(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& name,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::HistogramType type,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int min, int max, size_t buckets,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int sample) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure toxic values don't get to internal code.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fix for maximums
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  min = std::min(min, INT_MAX - 3);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  max = std::min(max, INT_MAX - 3);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buckets = std::min(buckets, kMaxBuckets);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fix for minimums.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  min = std::max(min, 1);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  max = std::max(max, min + 1);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buckets = std::max(buckets, static_cast<size_t>(3));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Trim buckets down to a maximum of the given range + over/underflow buckets
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (buckets > static_cast<size_t>(max - min + 2))
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    buckets = max - min + 2;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* counter;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type == base::LINEAR_HISTOGRAM) {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    counter = base::LinearHistogram::FactoryGet(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        name, min, max, buckets,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::HistogramBase::kUmaTargetedHistogramFlag);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    counter = base::Histogram::FactoryGet(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        name, min, max, buckets,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::HistogramBase::kUmaTargetedHistogramFlag);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The histogram can be NULL if it is constructed with bad arguments.  Ignore
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // that data for this API.  An error message will be logged.
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (counter)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    counter->Add(sample);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordValueFunction::RunSync() {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordValue::Params> params(RecordValue::Params::Create(*args_));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the histogram parameters from the metric type object.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string type = api::metrics_private::MetricType::ToString(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params->metric.type);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramType histogram_type(type == "histogram-linear" ?
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::LINEAR_HISTOGRAM : base::HISTOGRAM);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric.metric_name, histogram_type,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     params->metric.min, params->metric.max,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     params->metric.buckets, params->value);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordSparseValueFunction::RunSync() {
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<RecordSparseValue::Params> params(
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      RecordSparseValue::Params::Create(*args_));
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXTENSION_FUNCTION_VALIDATE(params.get());
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This particular UMA_HISTOGRAM_ macro is okay for
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // non-runtime-constant strings.
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  UMA_HISTOGRAM_SPARSE_SLOWLY(params->metric_name, params->value);
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return true;
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordPercentageFunction::RunSync() {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordPercentage::Params> params(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordPercentage::Params::Create(*args_));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::LINEAR_HISTOGRAM,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, 101, 102, params->value);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordCountFunction::RunSync() {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordCount::Params> params(RecordCount::Params::Create(*args_));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, 1000000, 50, params->value);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordSmallCountFunction::RunSync() {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordSmallCount::Params> params(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordSmallCount::Params::Create(*args_));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, 100, 50, params->value);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordMediumCountFunction::RunSync() {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordMediumCount::Params> params(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordMediumCount::Params::Create(*args_));
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, 10000, 50, params->value);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordTimeFunction::RunSync() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordTime::Params> params(RecordTime::Params::Create(*args_));
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const int kTenSecMs = 10 * 1000;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, kTenSecMs, 50, params->value);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordMediumTimeFunction::RunSync() {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordMediumTime::Params> params(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordMediumTime::Params::Create(*args_));
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const int kThreeMinMs = 3 * 60 * 1000;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, kThreeMinMs, 50, params->value);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool MetricsPrivateRecordLongTimeFunction::RunSync() {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecordLongTime::Params> params(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RecordLongTime::Params::Create(*args_));
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const int kOneHourMs = 60 * 60 * 1000;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RecordValue(params->metric_name, base::HISTOGRAM,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     1, kOneHourMs, 50, params->value);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions
197