// Copyright 2018 The Chromium OS 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 ML_METRICS_H_
#define ML_METRICS_H_

#include <memory>

#include <base/macros.h>
#include <base/process/process_metrics.h>
#include <metrics/cumulative_metrics.h>
#include <metrics/metrics_library.h>

namespace ml {

// Performs UMA metrics logging for the ML Service daemon.
// Periodically gathers some process metrics (e.g. memory) and cumulative
// metrics (e.g. peak memory) itself.
// Threading: Create and use on a single sequence.
class Metrics {
 public:
  // These values are persisted to logs. Entries should not be renumbered and
  // numeric values should never be reused.
  // `kMaxValue` must equal to the maximum value in this enum.
  enum class MojoConnectionEvent {
    kBootstrapRequested = 0,
    kBootstrapSucceeded = 1,
    kConnectionClosed = 2,
    kMaxValue = kConnectionClosed
  };

  Metrics();

  // Starts periodic sampling of process metrics.
  void StartCollectingProcessMetrics();

  // Immediately samples & updates cumulative process metrics (i.e. peak RAM).
  // This does not change how often metrics are reported, but might increase the
  // accuracy of reported metrics.
  // Clients can call this manually in contexts where they know that e.g. memory
  // usage may have just increased, to help capture short-lived spikes that
  // might be missed by periodic sampling.
  void UpdateCumulativeMetricsNow();

  void RecordMojoConnectionEvent(MojoConnectionEvent event);

 private:
  // Fetches process metrics (e.g. RAM) and updates `cumulative_metrics`.
  // If `record_current_metrics` is true, also logs current process metrics.
  void UpdateAndRecordMetrics(
      bool record_current_metrics,
      chromeos_metrics::CumulativeMetrics* cumulative_metrics);

  const std::unique_ptr<base::ProcessMetrics> process_metrics_;

  MetricsLibrary metrics_library_;

  // Accumulator of process metrics (even across restarts).
  std::unique_ptr<chromeos_metrics::CumulativeMetrics> cumulative_metrics_;

  DISALLOW_COPY_AND_ASSIGN(Metrics);
};

}  // namespace ml

#endif  // ML_METRICS_H_
