text: // 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.
  
  #pragma once
  
  #include <stdint.h>
  
  #include <cobalt-client/cpp/collector.h>
  #include <cobalt-client/cpp/histogram.h>
  
  namespace fs {
  // Vnode related histograms.
  struct VnodeMetrics {
      // Number of buckets used for the vnode metrics.
      static constexpr uint32_t kHistogramBuckets = 10;
  
      VnodeMetrics(cobalt_client::Collector* collector, const fbl::String& fs_name,
                   bool local_metrics);
  
      cobalt_client::Histogram<kHistogramBuckets> close;
      cobalt_client::Histogram<kHistogramBuckets> read;
      cobalt_client::Histogram<kHistogramBuckets> write;
      cobalt_client::Histogram<kHistogramBuckets> append;
      cobalt_client::Histogram<kHistogramBuckets> truncate;
      cobalt_client::Histogram<kHistogramBuckets> set_attr;
      cobalt_client::Histogram<kHistogramBuckets> get_attr;
      cobalt_client::Histogram<kHistogramBuckets> sync;
      cobalt_client::Histogram<kHistogramBuckets> read_dir;
      cobalt_client::Histogram<kHistogramBuckets> look_up;
      cobalt_client::Histogram<kHistogramBuckets> create;
      cobalt_client::Histogram<kHistogramBuckets> unlink;
      cobalt_client::Histogram<kHistogramBuckets> link;
  
      // Mirrors |Metrics::IsEnabled|, such that |VnodeMetrics| is self sufficient
      // to determine whether metrics should be logged or not.
      bool metrics_enabled = false;
  };
  
  // Provides a base class for collecting metrics in FS implementations. This is optional, but
  // provides a source of truth of how data is collected for filesystems. Specific filesystem
  // implementations with custom APIs can extend and collect more data, but for basic operations, this
  // class provides the base infrastructure.
  //
  // TODO(gevalentino): Define the |event_code| per metric. Currently is ignored.
  class Metrics {
  public:
      Metrics() = delete;
      Metrics(cobalt_client::CollectorOptions collector_options, bool local_metrics,
              const fbl::String& fs_name);
      Metrics(const Metrics&) = delete;
      Metrics(Metrics&&) = delete;
      Metrics& operator=(const Metrics&) = delete;
      Metrics& operator=(Metrics&&) = delete;
      virtual ~Metrics() = default;
  
      // Sets metric collection status to |should_collect|.
      void EnableMetrics(bool should_enable);
  
      // Returns true if the Logger is collecting.
      bool IsEnabled() const;
  
      // Returns the collector.
      const cobalt_client::Collector& collector() const { return collector_; }
  
      // Returns the collector.
      cobalt_client::Collector* mutable_collector() { return &collector_; }
  
      const VnodeMetrics& vnode_metrics() const;
      VnodeMetrics* mutable_vnode_metrics();
  
  protected:
      cobalt_client::Collector collector_;
  
      VnodeMetrics vnode_metrics_;
  
      bool is_enabled_ = false;
  };
  
  } // namespace fs
  