summaryrefslogtreecommitdiff
path: root/chromium/components/reporting/metrics/metric_event_observer_manager.cc
blob: 301b9675c279965011f8d573ce5b04be3fe526af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright 2021 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 "components/reporting/metrics/metric_event_observer_manager.h"

#include "base/bind.h"
#include "base/logging.h"
#include "base/task/bind_post_task.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/time/time.h"
#include "components/reporting/metrics/metric_data_collector.h"
#include "components/reporting/metrics/metric_report_queue.h"
#include "components/reporting/metrics/metric_reporting_controller.h"
#include "components/reporting/metrics/reporting_settings.h"
#include "components/reporting/metrics/sampler.h"
#include "components/reporting/util/status.h"

namespace reporting {

MetricEventObserverManager::MetricEventObserverManager(
    std::unique_ptr<MetricEventObserver> event_observer,
    MetricReportQueue* metric_report_queue,
    ReportingSettings* reporting_settings,
    const std::string& enable_setting_path,
    bool setting_enabled_default_value,
    std::vector<Sampler*> additional_samplers)
    : event_observer_(std::move(event_observer)),
      metric_report_queue_(metric_report_queue),
      additional_samplers_collector_(
          std::make_unique<AdditionalSamplersCollector>(
              std::move(additional_samplers))) {
  CHECK(base::SequencedTaskRunnerHandle::IsSet());
  DETACH_FROM_SEQUENCE(sequence_checker_);

  auto on_event_observed_cb =
      base::BindRepeating(&MetricEventObserverManager::OnEventObserved,
                          weak_ptr_factory_.GetWeakPtr());
  event_observer_->SetOnEventObservedCallback(base::BindPostTask(
      base::SequencedTaskRunnerHandle::Get(), std::move(on_event_observed_cb)));

  reporting_controller_ = std::make_unique<MetricReportingController>(
      reporting_settings, enable_setting_path, setting_enabled_default_value,
      base::BindRepeating(&MetricEventObserverManager::SetReportingEnabled,
                          base::Unretained(this),
                          /*is_enabled=*/true),
      base::BindRepeating(&MetricEventObserverManager::SetReportingEnabled,
                          base::Unretained(this),
                          /*is_enabled=*/false));
}

MetricEventObserverManager::~MetricEventObserverManager() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}

void MetricEventObserverManager::SetReportingEnabled(bool is_enabled) {
  is_reporting_enabled_ = is_enabled;
  event_observer_->SetReportingEnabled(is_enabled);
}

void MetricEventObserverManager::OnEventObserved(MetricData metric_data) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  if (!is_reporting_enabled_) {
    return;
  }

  metric_data.set_timestamp_ms(base::Time::Now().ToJavaTime());

  additional_samplers_collector_->CollectAll(
      base::BindOnce(&MetricEventObserverManager::Report,
                     base::Unretained(this)),
      std::move(metric_data));
}

void MetricEventObserverManager::Report(MetricData metric_data) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

  auto enqueue_cb = base::BindOnce([](Status status) {
    if (!status.ok()) {
      DVLOG(1)
          << "Could not enqueue observed event to reporting queue because of: "
          << status;
    }
  });
  metric_report_queue_->Enqueue(metric_data, std::move(enqueue_cb));
}
}  // namespace reporting