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 89 90 91 92 93 94
|
// Copyright 2019 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/metrics/structured/recorder.h"
#include <utility>
#include "base/no_destructor.h"
#include "base/task/current_thread.h"
#include "base/task/sequenced_task_runner.h"
#include "components/metrics/structured/histogram_util.h"
#include "components/metrics/structured/lib/histogram_util.h"
#include "components/metrics/structured/structured_metrics_features.h"
namespace metrics::structured {
Recorder::Recorder() = default;
Recorder::~Recorder() = default;
Recorder* Recorder::GetInstance() {
static base::NoDestructor<Recorder> recorder;
return recorder.get();
}
void Recorder::RecordEvent(Event&& event) {
// If the recorder is null, this doesn't need to be run on the same sequence.
if (recorder_ == nullptr) {
// Other values of EventRecordingState are recorded in
// StructuredMetricsProvider::OnRecord.
LogEventRecordingState(EventRecordingState::kProviderMissing);
return;
}
// All calls to StructuredMetricsProvider (the observer) must be on the UI
// sequence, so re-call Record if needed. If a UI task runner hasn't been set
// yet, ignore this Record.
if (!ui_task_runner_) {
LogInternalError(StructuredMetricsError::kUninitializedClient);
return;
}
if (!ui_task_runner_->RunsTasksInCurrentSequence()) {
ui_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&Recorder::RecordEvent,
base::Unretained(this), std::move(event)));
return;
}
DCHECK(base::CurrentUIThread::IsSet());
delegating_events_processor_.OnEventsRecord(&event);
recorder_->OnEventRecord(event);
}
void Recorder::OnSystemProfileInitialized() {
if (recorder_) {
recorder_->OnSystemProfileInitialized();
}
}
void Recorder::SetUiTaskRunner(
const scoped_refptr<base::SequencedTaskRunner> ui_task_runner) {
ui_task_runner_ = ui_task_runner;
}
void Recorder::SetRecorder(RecorderImpl* recorder) {
recorder_ = recorder;
}
void Recorder::UnsetRecorder(RecorderImpl* recorder) {
// Only reset if this is the same recorder. Otherwise, changing the recorder
// isn't needed.
if (recorder_ == recorder) {
recorder_ = nullptr;
}
}
void Recorder::AddEventsProcessor(
std::unique_ptr<EventsProcessorInterface> events_processor) {
delegating_events_processor_.AddEventsProcessor(std::move(events_processor));
}
void Recorder::OnProvideIndependentMetrics(
ChromeUserMetricsExtension* uma_proto) {
delegating_events_processor_.OnProvideIndependentMetrics(uma_proto);
}
void Recorder::OnEventRecorded(StructuredEventProto* event) {
delegating_events_processor_.OnEventRecorded(event);
}
} // namespace metrics::structured
|