| Index: content/browser/bluetooth/bluetooth_metrics.cc
|
| diff --git a/content/browser/bluetooth/bluetooth_metrics.cc b/content/browser/bluetooth/bluetooth_metrics.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..af7216a81b765108afb1abcd057698f8099752f7
|
| --- /dev/null
|
| +++ b/content/browser/bluetooth/bluetooth_metrics.cc
|
| @@ -0,0 +1,151 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/bluetooth/bluetooth_metrics.h"
|
| +
|
| +#include "base/hash.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| +#include "base/metrics/sparse_histogram.h"
|
| +#include "content/common/bluetooth/bluetooth_scan_filter.h"
|
| +#include "device/bluetooth/bluetooth_uuid.h"
|
| +
|
| +using device::BluetoothUUID;
|
| +using UMAWebBluetoothFunction =
|
| + content::BluetoothMetrics::UMAWebBluetoothFunction;
|
| +using UMARequestDeviceOutcome =
|
| + content::BluetoothMetrics::UMARequestDeviceOutcome;
|
| +using UMAConnectGATTOutcome = content::BluetoothMetrics::UMAConnectGATTOutcome;
|
| +using UMAGetPrimaryServiceOutcome =
|
| + content::BluetoothMetrics::UMAGetPrimaryServiceOutcome;
|
| +using UMAGATTError = content::BluetoothMetrics::UMAGATTError;
|
| +
|
| +namespace {
|
| +// TODO(ortuno): Remove once we have a macro to histogram strings.
|
| +// http://crbug.com/520284
|
| +int HashUUID(const std::string& uuid) {
|
| + uint32 data = base::SuperFastHash(uuid.data(), uuid.size());
|
| +
|
| + // Strip off the signed bit because UMA doesn't support negative values,
|
| + // but takes a signed int as input.
|
| + return static_cast<int>(data & 0x7fffffff);
|
| +}
|
| +} // namespace
|
| +
|
| +namespace content {
|
| +
|
| +// General
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordWebBluetoothFunctionCall(
|
| + UMAWebBluetoothFunction function) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.FunctionCall.Count",
|
| + static_cast<int>(function),
|
| + static_cast<int>(UMAWebBluetoothFunction::COUNT));
|
| +}
|
| +
|
| +// requestDevice()
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordRequestDeviceOutcome(
|
| + UMARequestDeviceOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.RequestDevice.Outcome",
|
| + static_cast<int>(outcome),
|
| + static_cast<int>(UMARequestDeviceOutcome::COUNT));
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordRequestDeviceFilters(
|
| + const std::vector<content::BluetoothScanFilter>& filters) {
|
| + UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.Filters.Count",
|
| + filters.size());
|
| + for (const content::BluetoothScanFilter& filter : filters) {
|
| + UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.FilterSize",
|
| + filter.services.size());
|
| + for (const BluetoothUUID& service : filter.services) {
|
| + // TODO(ortuno): Use a macro to histogram strings.
|
| + // http://crbug.com/520284
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY(
|
| + "Bluetooth.Web.RequestDevice.Filters.Services",
|
| + HashUUID(service.canonical_value()));
|
| + }
|
| + }
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordRequestDeviceOptionalServices(
|
| + const std::vector<BluetoothUUID>& optional_services) {
|
| + UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.OptionalServices.Count",
|
| + optional_services.size());
|
| + for (const BluetoothUUID& service : optional_services) {
|
| + // TODO(ortuno): Use a macro to histogram strings.
|
| + // http://crbug.com/520284
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY(
|
| + "Bluetooth.Web.RequestDevice.OptionalServices.Services",
|
| + HashUUID(service.canonical_value()));
|
| + }
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordUnionOfServices(
|
| + const std::vector<content::BluetoothScanFilter>& filters,
|
| + const std::vector<BluetoothUUID>& optional_services) {
|
| + std::set<BluetoothUUID> union_of_services(optional_services.begin(),
|
| + optional_services.end());
|
| +
|
| + for (const content::BluetoothScanFilter& filter : filters)
|
| + union_of_services.insert(filter.services.begin(), filter.services.end());
|
| +
|
| + UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.UnionOfServices.Count",
|
| + union_of_services.size());
|
| +}
|
| +
|
| +// connectGATT
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordConnectGATTOutcome(UMAConnectGATTOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.ConnectGATT.Outcome",
|
| + static_cast<int>(outcome),
|
| + static_cast<int>(UMAConnectGATTOutcome::COUNT));
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordConnectGATTTimeSuccess(
|
| + const base::TimeDelta& duration) {
|
| + UMA_HISTOGRAM_MEDIUM_TIMES("Bluetooth.Web.ConnectGATT.TimeSuccess", duration);
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordConnectGATTTimeFailed(
|
| + const base::TimeDelta& duration) {
|
| + UMA_HISTOGRAM_MEDIUM_TIMES("Bluetooth.Web.ConnectGATT.TimeFailed", duration);
|
| +}
|
| +
|
| +// getPrimaryService
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordGetPrimaryServiceService(
|
| + const BluetoothUUID& service) {
|
| + // TODO(ortuno): Use a macro to histogram strings.
|
| + // http://crbug.com/520284
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY("Bluetooth.Web.GetPrimaryService.Services",
|
| + HashUUID(service.canonical_value()));
|
| +}
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordGetPrimaryServiceOutcome(
|
| + UMAGetPrimaryServiceOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "Bluetooth.Web.GetPrimaryService.Outcome", static_cast<int>(outcome),
|
| + static_cast<int>(UMAGetPrimaryServiceOutcome::COUNT));
|
| +}
|
| +
|
| +// read/write characteristic
|
| +
|
| +// static
|
| +void BluetoothMetrics::RecordGATTError(UMAGATTError error) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.GATTErrors", static_cast<int>(error),
|
| + static_cast<int>(UMAGATTError::MAX_ERROR));
|
| +}
|
| +
|
| +} // namespace content
|
|
|