blob: 09e4d7756e89f16a631d18173b2dce2e9d0d63ef [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COBALT_SRC_LOGGER_LOGGER_H_
#define COBALT_SRC_LOGGER_LOGGER_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "src/lib/util/clock.h"
#include "src/local_aggregation/event_aggregator.h"
#include "src/local_aggregation_1_1/local_aggregation.h"
#include "src/logger/encoder.h"
#include "src/logger/internal_metrics.h"
#include "src/logger/internal_metrics_config.cb.h"
#include "src/logger/logger_interface.h"
#include "src/logger/observation_writer.h"
#include "src/logger/project_context.h"
#include "src/logger/undated_event_manager.h"
namespace cobalt {
namespace internal {
class RealLoggerFactory;
} // namespace internal
namespace logger {
// Concrete implementation of LoggerInterface.
//
// After constructing a Logger use the Log*() methods to Log Events to Cobalt.
//
// There should be an instance of Logger for each client-side Project.
// On a Fuchsia system instances of Logger are created by the Cobalt FIDL
// service for each FIDL connection from a client project.
class Logger : public LoggerInterface {
public:
// Constructor for a Logger when the system clock is, and will remain, accurate.
//
// |project_context| The ProjectContext of the client-side project for which
// the Logger will log events. Must not be null.
//
// |encoder| The system's singleton instance of Encoder. This must remain
// valid as long as the Logger is being used. The Logger uses this to
// encode immediate Observations.
//
// |event_aggregator| The system's singleton instance of EventAggregator.
// This must remain valid as long as the Logger is being used. The Logger
// uses this to aggregate values derived from Events and to produce locally
// aggregated Observations.
//
// |local_aggregation| The system's singleton instance of LocalAggregation.
// This must remain valid as long as the Logger is being used. The Logger
// uses this to aggregate values derived from Cobalt 1.1 Events and to produce
// locally aggregated Observations.
//
// |observation_writer| An instance of ObservationWriter, used by the Logger
// to write immediate Observations to an ObservationStore. Must remain valid
// as long as the Logger is in use.
//
// |system_data| A pointer to a SystemDataInterface.
//
// |civil_time_converter| The system's singleton instance of CivilTimeConverterInterface.
// Must remain valid as long as the logger is used. The Logger uses this to convert
// absolute times to civil times for metrics with the OTHER_TIME_ZONE TimeZonePolicy.
//
// |experiment_ids| The set of all active experiments to be associated with
// this logger.
//
// |internal_metrics| An instance of InternalMetrics, used internally by the
// Logger to send metrics about Cobalt to Cobalt. If nullptr, no such internal
// logging will be performed by this Logger.
Logger(std::unique_ptr<ProjectContext> project_context, const Encoder& encoder,
local_aggregation::EventAggregator& event_aggregator,
local_aggregation::LocalAggregation* local_aggregation,
ObservationWriter* observation_writer, system_data::SystemDataInterface* system_data,
util::CivilTimeConverterInterface* civil_time_converter,
std::vector<uint32_t> experiment_ids, bool enable_replacement_metrics = false,
InternalMetrics* internal_metrics = nullptr);
// Constructor for a Logger when the clock is not yet accurate.
//
// |project_context| The ProjectContext of the client-side project for which
// the Logger will log events. Must not be null.
//
// |encoder| The system's singleton instance of Encoder. This must remain
// valid as long as the Logger is being used. The Logger uses this to
// encode immediate Observations.
//
// |event_aggregator| The system's singleton instance of EventAggregator.
// This must remain valid as long as the Logger is being used. The Logger
// uses this to aggregate values derived from Events and to produce locally
// aggregated Observations.
//
// |local_aggregation| The system's singleton instance of LocalAggregation.
// This must remain valid as long as the Logger is being used. The Logger
// uses this to aggregate values derived from Cobalt 1.1 Events and to produce
// locally aggregated Observations.
//
// |observation_writer| An instance of ObservationWriter, used by the Logger
// to write immediate Observations to an ObservationStore. Must remain valid
// as long as the Logger is in use.
//
// |system_data| A pointer to a SystemDataInterface.
//
// |validated_clock| An instance of a clock that refuses to provide the time if a quality
// condition is not satisfied.
//
// |civil_time_converter| The system's singleton instance of CivilTimeConverterInterface.
// Must remain valid as long as the logger is used. The Logger uses this to convert
// absolute times to civil times for metrics with the OTHER_TIME_ZONE TimeZonePolicy.
//
// |experiment_ids| The set of all active experiments to be associated with
// this logger.
//
// |undated_event_manager| An instance of UndatedEventManager to use to save events until the
// clock becomes accurate.
//
// |internal_metrics| An instance of InternalMetrics, used internally by the
// Logger to send metrics about Cobalt to Cobalt. If nullptr, no such internal
// logging will be performed by this Logger.
Logger(std::unique_ptr<ProjectContext> project_context, const Encoder& encoder,
local_aggregation::EventAggregator& event_aggregator,
local_aggregation::LocalAggregation* local_aggregation,
ObservationWriter* observation_writer, system_data::SystemDataInterface* system_data,
util::ValidatedClockInterface* validated_clock,
util::CivilTimeConverterInterface* civil_time_converter,
std::weak_ptr<UndatedEventManager> undated_event_manager,
std::vector<uint32_t> experiment_ids, bool enable_replacement_metrics = false,
InternalMetrics* internal_metrics = nullptr);
~Logger() override = default;
Status LogEvent(uint32_t metric_id, uint32_t event_code) override;
Status LogEventCount(uint32_t metric_id, const std::vector<uint32_t>& event_codes,
const std::string& component, int64_t period_duration_micros,
uint32_t count) override;
Status LogElapsedTime(uint32_t metric_id, const std::vector<uint32_t>& event_codes,
const std::string& component, int64_t elapsed_micros) override;
Status LogFrameRate(uint32_t metric_id, const std::vector<uint32_t>& event_codes,
const std::string& component, float fps) override;
Status LogMemoryUsage(uint32_t metric_id, const std::vector<uint32_t>& event_codes,
const std::string& component, int64_t bytes) override;
Status LogIntHistogram(uint32_t metric_id, const std::vector<uint32_t>& event_codes,
const std::string& component, HistogramPtr histogram) override;
// Cobalt 1.1 Methods
Status LogOccurrence(uint32_t metric_id, uint64_t count,
const std::vector<uint32_t>& event_codes) override;
Status LogInteger(uint32_t metric_id, int64_t value,
const std::vector<uint32_t>& event_codes) override;
Status LogIntegerHistogram(uint32_t metric_id, HistogramPtr histogram,
const std::vector<uint32_t>& event_codes) override;
Status LogString(uint32_t metric_id, const std::string& string_value,
const std::vector<uint32_t>& event_codes) override;
Status LogCustomEvent(uint32_t metric_id, EventValuesPtr event_values) override;
Status LogSerializedCustomEvent(uint32_t metric_id,
std::unique_ptr<std::string> serialized_proto) override;
// LoggerCalled (cobalt_internal::metrics::logger_calls_made_migrated) and
// (cobalt_internal::metrics::per_project_logger_calls_made_migrated) are logged
// for every call to Logger along with which method was called and the project
// that called it.
void RecordLoggerCall(
PerProjectLoggerCallsMadeMigratedMetricDimensionLoggerMethod method) override {
internal_metrics_.LoggerCalled(method, project_context_->project());
}
// Pauses Cobalt's internal metrics collection.
void PauseInternalLogging() override;
// Resumes Cobalt's internal metrics collection.
void ResumeInternalLogging() override;
private:
friend class LoggerTest;
friend class cobalt::internal::RealLoggerFactory;
// Constructs an appropriate event logger and sends it an |event_record| to log.
// All experiment IDs are added to the event_logger.
Status Log(uint32_t metric_id, MetricDefinition::MetricType metric_type,
std::unique_ptr<EventRecord> event_record);
// ProjectContext is shared as it is used in all created EventRecords, which can outlive the
// Logger class.
const std::shared_ptr<const ProjectContext> project_context_;
const Encoder& encoder_;
local_aggregation::EventAggregator& event_aggregator_;
local_aggregation::LocalAggregation* local_aggregation_;
const ObservationWriter* observation_writer_;
const system_data::SystemDataInterface* system_data_;
util::ValidatedClockInterface* validated_clock_;
std::unique_ptr<util::ValidatedClockInterface> local_validated_clock_;
util::CivilTimeConverterInterface* civil_time_converter_;
std::weak_ptr<UndatedEventManager> undated_event_manager_;
std::vector<uint32_t> experiment_ids_;
// Is this instance of Logger associated with Cobalt's own
// internal logging, a.k.a Cobalt-measuring-Cobalt.
bool is_internal_logger_;
const bool enable_replacement_metrics_;
InternalMetricsPauseWrapper internal_metrics_;
};
} // namespace logger
} // namespace cobalt
#endif // COBALT_SRC_LOGGER_LOGGER_H_