blob: acf309e5fbebfb9e2cfe4214227f8f314051c437 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync_device_info/device_count_metrics_provider.h"
#include <algorithm>
#include <numeric>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "base/metrics/histogram_functions.h"
#include "components/sync/protocol/sync_enums.pb.h"
#include "components/sync_device_info/device_info_tracker.h"
namespace syncer {
using DeviceType = DeviceInfo::FormFactor;
namespace {
struct MaxDeviceCounts {
int total = 0;
int desktop = 0;
int phone = 0;
int tablet = 0;
};
// Returns the count for the given |form_factor|, or 0 if not found.
int GetCount(const absl::flat_hash_map<DeviceInfo::FormFactor, int>& counts,
DeviceInfo::FormFactor form_factor) {
auto it = counts.find(form_factor);
return it != counts.end() ? it->second : 0;
}
void RecordDeviceCountMetric(const std::string& histogram_name, int count) {
base::UmaHistogramSparse(histogram_name, std::min(count, 100));
}
} // namespace
DeviceCountMetricsProvider::DeviceCountMetricsProvider(
const ProvideTrackersCallback& provide_trackers)
: provide_trackers_(provide_trackers) {}
DeviceCountMetricsProvider::~DeviceCountMetricsProvider() = default;
void DeviceCountMetricsProvider::ProvideCurrentSessionData(
metrics::ChromeUserMetricsExtension* uma_proto) {
std::vector<const DeviceInfoTracker*> trackers;
provide_trackers_.Run(&trackers);
MaxDeviceCounts max_counts;
for (const DeviceInfoTracker* tracker : trackers) {
absl::flat_hash_map<DeviceType, int> count_by_type =
tracker->CountActiveDevicesByType();
const int total_devices = std::accumulate(
count_by_type.begin(), count_by_type.end(), 0,
[](int sum, const auto& pair) { return sum + pair.second; });
max_counts.total = std::max(max_counts.total, total_devices);
max_counts.desktop =
std::max(max_counts.desktop,
GetCount(count_by_type, DeviceInfo::FormFactor::kDesktop));
max_counts.phone =
std::max(max_counts.phone,
GetCount(count_by_type, DeviceInfo::FormFactor::kPhone));
max_counts.tablet =
std::max(max_counts.tablet,
GetCount(count_by_type, DeviceInfo::FormFactor::kTablet));
}
RecordDeviceCountMetric("Sync.DeviceCount2", max_counts.total);
RecordDeviceCountMetric("Sync.DeviceCount2.Desktop", max_counts.desktop);
RecordDeviceCountMetric("Sync.DeviceCount2.Phone", max_counts.phone);
RecordDeviceCountMetric("Sync.DeviceCount2.Tablet", max_counts.tablet);
}
} // namespace syncer