[logger] Don't log metrics whose max_release_stage is too low

Change-Id: I4f0b13bd84c9f792d96755db33a44df8c901ff99
diff --git a/logger/logger.cc b/logger/logger.cc
index afbcec1..ba89831 100644
--- a/logger/logger.cc
+++ b/logger/logger.cc
@@ -264,10 +264,19 @@
                const Encoder* encoder, EventAggregator* event_aggregator,
                ObservationWriter* observation_writer,
                LoggerInterface* internal_logger)
+    : Logger(std::move(project_context), encoder, event_aggregator,
+             observation_writer, nullptr, internal_logger) {}
+
+Logger::Logger(std::unique_ptr<ProjectContext> project_context,
+               const Encoder* encoder, EventAggregator* event_aggregator,
+               ObservationWriter* observation_writer,
+               encoder::SystemDataInterface* system_data,
+               LoggerInterface* internal_logger)
     : project_context_(std::move(project_context)),
       encoder_(encoder),
       event_aggregator_(event_aggregator),
       observation_writer_(observation_writer),
+      system_data_(system_data),
       clock_(new SystemClock()) {
   CHECK(project_context_);
   CHECK(encoder_);
@@ -524,8 +533,21 @@
                         EventRecord* event_record) {
   TRACE_DURATION("cobalt_core", "EventLogger::Log", "metric_id", metric_id);
 
-  // TODO(rudominer) Check the ReleaseStage of the Metric against the
-  // ReleaseStage of the project.
+  if (logger_->system_data_) {
+    if (logger_->system_data_->release_stage() >
+        event_record->metric->meta_data().max_release_stage()) {
+      // Quietly ignore this metric.
+      LOG_FIRST_N(INFO, 10)
+          << "Not logging metric `"
+          << project_context()->FullMetricName(*event_record->metric)
+          << "` because its max_release_stage ("
+          << event_record->metric->meta_data().max_release_stage()
+          << ") is lower than the device's current release_stage: "
+          << logger_->system_data_->release_stage();
+      return kOK;
+    }
+  }
+
   auto status = FinalizeEvent(metric_id, expected_metric_type, event_record);
   if (status != kOK) {
     return status;
diff --git a/logger/logger.h b/logger/logger.h
index ca55dfa..a9bf26f 100644
--- a/logger/logger.h
+++ b/logger/logger.h
@@ -57,12 +57,21 @@
   // 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.
+  //
   // |internal_logger| An instance of LoggerInterface, 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, EventAggregator* event_aggregator,
          ObservationWriter* observation_writer,
+         encoder::SystemDataInterface* system_data,
+         LoggerInterface* internal_logger = nullptr);
+
+  // DEPRECATED Constructor
+  Logger(std::unique_ptr<ProjectContext> project_context,
+         const Encoder* encoder, EventAggregator* event_aggregator,
+         ObservationWriter* observation_writer,
          LoggerInterface* internal_logger = nullptr);
 
   virtual ~Logger() = default;
@@ -138,6 +147,7 @@
   const Encoder* encoder_;
   EventAggregator* event_aggregator_;
   const ObservationWriter* observation_writer_;
+  const encoder::SystemDataInterface* system_data_;
   std::unique_ptr<util::ClockInterface> clock_;
 
   std::unique_ptr<InternalMetrics> internal_metrics_;