metric_event_observer_manager.cc 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/reporting/metrics/metric_event_observer_manager.h"
  5. #include "base/bind.h"
  6. #include "base/logging.h"
  7. #include "base/task/bind_post_task.h"
  8. #include "base/threading/sequenced_task_runner_handle.h"
  9. #include "base/time/time.h"
  10. #include "components/reporting/metrics/metric_data_collector.h"
  11. #include "components/reporting/metrics/metric_report_queue.h"
  12. #include "components/reporting/metrics/metric_reporting_controller.h"
  13. #include "components/reporting/metrics/reporting_settings.h"
  14. #include "components/reporting/metrics/sampler.h"
  15. #include "components/reporting/util/status.h"
  16. namespace reporting {
  17. MetricEventObserverManager::MetricEventObserverManager(
  18. std::unique_ptr<MetricEventObserver> event_observer,
  19. MetricReportQueue* metric_report_queue,
  20. ReportingSettings* reporting_settings,
  21. const std::string& enable_setting_path,
  22. bool setting_enabled_default_value,
  23. std::vector<Sampler*> additional_samplers)
  24. : event_observer_(std::move(event_observer)),
  25. metric_report_queue_(metric_report_queue),
  26. additional_samplers_collector_(
  27. std::make_unique<AdditionalSamplersCollector>(
  28. std::move(additional_samplers))) {
  29. CHECK(base::SequencedTaskRunnerHandle::IsSet());
  30. DETACH_FROM_SEQUENCE(sequence_checker_);
  31. auto on_event_observed_cb =
  32. base::BindRepeating(&MetricEventObserverManager::OnEventObserved,
  33. weak_ptr_factory_.GetWeakPtr());
  34. event_observer_->SetOnEventObservedCallback(base::BindPostTask(
  35. base::SequencedTaskRunnerHandle::Get(), std::move(on_event_observed_cb)));
  36. reporting_controller_ = std::make_unique<MetricReportingController>(
  37. reporting_settings, enable_setting_path, setting_enabled_default_value,
  38. base::BindRepeating(&MetricEventObserverManager::SetReportingEnabled,
  39. base::Unretained(this),
  40. /*is_enabled=*/true),
  41. base::BindRepeating(&MetricEventObserverManager::SetReportingEnabled,
  42. base::Unretained(this),
  43. /*is_enabled=*/false));
  44. }
  45. MetricEventObserverManager::~MetricEventObserverManager() {
  46. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  47. }
  48. void MetricEventObserverManager::SetReportingEnabled(bool is_enabled) {
  49. is_reporting_enabled_ = is_enabled;
  50. event_observer_->SetReportingEnabled(is_enabled);
  51. }
  52. void MetricEventObserverManager::OnEventObserved(MetricData metric_data) {
  53. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  54. if (!is_reporting_enabled_) {
  55. return;
  56. }
  57. metric_data.set_timestamp_ms(base::Time::Now().ToJavaTime());
  58. additional_samplers_collector_->CollectAll(
  59. base::BindOnce(&MetricEventObserverManager::Report,
  60. base::Unretained(this)),
  61. std::move(metric_data));
  62. }
  63. void MetricEventObserverManager::Report(
  64. absl::optional<MetricData> metric_data) {
  65. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  66. if (!metric_data.has_value()) {
  67. NOTREACHED() << "Reporting requested for empty metric data.";
  68. return;
  69. }
  70. auto enqueue_cb = base::BindOnce([](Status status) {
  71. if (!status.ok()) {
  72. DVLOG(1)
  73. << "Could not enqueue observed event to reporting queue because of: "
  74. << status;
  75. }
  76. });
  77. metric_report_queue_->Enqueue(
  78. std::make_unique<MetricData>(std::move(metric_data.value())),
  79. std::move(enqueue_cb));
  80. }
  81. } // namespace reporting