metric_report_queue.cc 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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_report_queue.h"
  5. #include "base/bind.h"
  6. #include "base/logging.h"
  7. #include "components/reporting/metrics/metric_rate_controller.h"
  8. #include "components/reporting/metrics/reporting_settings.h"
  9. #include "components/reporting/proto/synced/metric_data.pb.h"
  10. #include "components/reporting/util/status.h"
  11. namespace reporting {
  12. MetricReportQueue::MetricReportQueue(
  13. std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter> report_queue,
  14. Priority priority)
  15. : report_queue_(std::move(report_queue)), priority_(priority) {}
  16. MetricReportQueue::MetricReportQueue(
  17. std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter> report_queue,
  18. Priority priority,
  19. ReportingSettings* reporting_settings,
  20. const std::string& rate_setting_path,
  21. base::TimeDelta default_rate,
  22. int rate_unit_to_ms)
  23. : MetricReportQueue(std::move(report_queue), priority) {
  24. rate_controller_ = std::make_unique<MetricRateController>(
  25. base::BindRepeating(&MetricReportQueue::Flush, base::Unretained(this)),
  26. reporting_settings, rate_setting_path, default_rate, rate_unit_to_ms);
  27. rate_controller_->Start();
  28. }
  29. MetricReportQueue::~MetricReportQueue() = default;
  30. void MetricReportQueue::Enqueue(std::unique_ptr<const MetricData> metric_data,
  31. ReportQueue::EnqueueCallback callback) {
  32. report_queue_->Enqueue(std::move(metric_data), priority_,
  33. std::move(callback));
  34. }
  35. void MetricReportQueue::Upload() {
  36. Flush();
  37. // Restart timer if the metric report queue flush is rate controlled.
  38. if (rate_controller_) {
  39. rate_controller_->Stop();
  40. rate_controller_->Start();
  41. }
  42. }
  43. void MetricReportQueue::Flush() {
  44. report_queue_->Flush(
  45. priority_, base::BindOnce([](Status status) {
  46. if (!status.ok()) {
  47. DVLOG(1) << "Could not upload metric data records because of: "
  48. << status;
  49. }
  50. }));
  51. }
  52. } // namespace reporting