| 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..fcb819916b7e4ad2d0f8f90458468de5909f3aeb
|
| --- /dev/null
|
| +++ b/content/browser/bluetooth/bluetooth_metrics.cc
|
| @@ -0,0 +1,136 @@
|
| +// 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 <map>
|
| +#include <set>
|
| +#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;
|
| +
|
| +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
|
| +
|
| +void RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction function) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.FunctionCall.Count",
|
| + static_cast<int>(function),
|
| + static_cast<int>(UMAWebBluetoothFunction::COUNT));
|
| +}
|
| +
|
| +// requestDevice()
|
| +
|
| +void RecordRequestDeviceOutcome(UMARequestDeviceOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.RequestDevice.Outcome",
|
| + static_cast<int>(outcome),
|
| + static_cast<int>(UMARequestDeviceOutcome::COUNT));
|
| +}
|
| +
|
| +static void 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 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 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());
|
| +}
|
| +
|
| +void RecordRequestDeviceArguments(
|
| + const std::vector<content::BluetoothScanFilter>& filters,
|
| + const std::vector<device::BluetoothUUID>& optional_services) {
|
| + RecordRequestDeviceFilters(filters);
|
| + RecordRequestDeviceOptionalServices(optional_services);
|
| + RecordUnionOfServices(filters, optional_services);
|
| +}
|
| +
|
| +// connectGATT
|
| +
|
| +void RecordConnectGATTOutcome(UMAConnectGATTOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.ConnectGATT.Outcome",
|
| + static_cast<int>(outcome),
|
| + static_cast<int>(UMAConnectGATTOutcome::COUNT));
|
| +}
|
| +
|
| +void RecordConnectGATTTimeSuccess(const base::TimeDelta& duration) {
|
| + UMA_HISTOGRAM_MEDIUM_TIMES("Bluetooth.Web.ConnectGATT.TimeSuccess", duration);
|
| +}
|
| +
|
| +void RecordConnectGATTTimeFailed(const base::TimeDelta& duration) {
|
| + UMA_HISTOGRAM_MEDIUM_TIMES("Bluetooth.Web.ConnectGATT.TimeFailed", duration);
|
| +}
|
| +
|
| +// getPrimaryService
|
| +
|
| +void 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()));
|
| +}
|
| +
|
| +void RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome outcome) {
|
| + UMA_HISTOGRAM_ENUMERATION(
|
| + "Bluetooth.Web.GetPrimaryService.Outcome", static_cast<int>(outcome),
|
| + static_cast<int>(UMAGetPrimaryServiceOutcome::COUNT));
|
| +}
|
| +
|
| +// read/write characteristic
|
| +
|
| +void RecordGATTError(UMAGATTError error) {
|
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.GATTErrors", static_cast<int>(error),
|
| + static_cast<int>(UMAGATTError::MAX_ERROR));
|
| +}
|
| +
|
| +} // namespace content
|
|
|