blob: 55866056f5f8ceea27e3704c767aa91d0527eca5 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/metrics/structured/chrome_structured_metrics_recorder.h"
#include <stdint.h>
#include "base/no_destructor.h"
#include "base/task/sequenced_task_runner.h"
#include "components/metrics/structured/histogram_util.h"
#include "components/metrics/structured/recorder.h"
#include "components/metrics/structured/structured_metrics_features.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/browser_process.h" // nogncheck
#include "chrome/browser/metrics/structured/ash_structured_metrics_recorder.h" // nogncheck
#include "chrome/browser/metrics/structured/cros_events_processor.h" // nogncheck
#include "chrome/browser/metrics/structured/metadata_processor_ash.h" // nogncheck
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
#include "base/task/current_thread.h"
#include "chrome/browser/metrics/structured/lacros_structured_metrics_recorder.h" // nogncheck
#endif
namespace metrics::structured {
namespace {
// Platforms for which the StructuredMetricsClient will be initialized for.
enum class StructuredMetricsPlatform {
kUninitialized = 0,
kAshChrome = 1,
kLacrosChrome = 2,
};
// Logs initialization of Structured Metrics as a record.
void LogInitializationInStructuredMetrics(StructuredMetricsPlatform platform) {
events::v2::structured_metrics::Initialization()
.SetPlatform(static_cast<int64_t>(platform))
.Record();
}
} // namespace
ChromeStructuredMetricsRecorder::ChromeStructuredMetricsRecorder() {
// TODO(jongahn): Make a static factory class and pass it into ctor.
#if BUILDFLAG(IS_CHROMEOS_ASH)
delegate_ = std::make_unique<AshStructuredMetricsRecorder>();
StructuredMetricsClient::Get()->SetDelegate(this);
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
delegate_ = std::make_unique<LacrosStructuredMetricsRecorder>();
StructuredMetricsClient::Get()->SetDelegate(this);
#endif
}
ChromeStructuredMetricsRecorder::~ChromeStructuredMetricsRecorder() = default;
// static
ChromeStructuredMetricsRecorder* ChromeStructuredMetricsRecorder::Get() {
static base::NoDestructor<ChromeStructuredMetricsRecorder> chrome_recorder;
return chrome_recorder.get();
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
// static
void ChromeStructuredMetricsRecorder::RegisterLocalStatePrefs(
PrefRegistrySimple* registry) {
cros_event::CrOSEventsProcessor::RegisterLocalStatePrefs(registry);
}
#endif
void ChromeStructuredMetricsRecorder::Initialize() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
auto* ash_recorder =
static_cast<AshStructuredMetricsRecorder*>(delegate_.get());
ash_recorder->Initialize();
// Adds CrOSEvents processor if feature is enabled.
if (base::FeatureList::IsEnabled(kEventSequenceLogging)) {
Recorder::GetInstance()->AddEventsProcessor(
std::make_unique<cros_event::CrOSEventsProcessor>(
cros_event::kResetCounterPath));
}
Recorder::GetInstance()->AddEventsProcessor(
std::make_unique<MetadataProcessorAsh>());
LogInitializationInStructuredMetrics(StructuredMetricsPlatform::kAshChrome);
#elif BUILDFLAG(IS_CHROMEOS_LACROS)
auto* lacros_recorder =
static_cast<LacrosStructuredMetricsRecorder*>(delegate_.get());
// Ensure that the sequence is the ui thread.
DCHECK(base::CurrentUIThread::IsSet());
lacros_recorder->SetSequence(base::SequencedTaskRunner::GetCurrentDefault());
LogInitializationInStructuredMetrics(
StructuredMetricsPlatform::kLacrosChrome);
#endif
}
void ChromeStructuredMetricsRecorder::RecordEvent(Event&& event) {
DCHECK(IsReadyToRecord());
delegate_->RecordEvent(std::move(event));
}
bool ChromeStructuredMetricsRecorder::IsReadyToRecord() const {
return delegate_->IsReadyToRecord();
}
} // namespace metrics::structured