// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef KUDU_TABLET_TABLET_METRICS_H
#define KUDU_TABLET_TABLET_METRICS_H

#include <cstddef>
#include <cstdint>

#include "kudu/gutil/ref_counted.h"
#include "kudu/util/metrics.h"

namespace kudu {

class Arena;

namespace tablet {

struct ProbeStats;

// Container for all metrics specific to a single tablet.
struct TabletMetrics {
  explicit TabletMetrics(const scoped_refptr<MetricEntity>& entity);

  // Add a batch of probe stats to the metrics.
  //
  // We use C-style array passing here since the call site allocates the
  // ProbeStats from an arena.
  //
  // This allocates temporary scratch space from work_arena.
  void AddProbeStats(const ProbeStats* stats_array, int len, Arena* work_arena);

  // Operation rates.
  scoped_refptr<Counter> rows_inserted;
  scoped_refptr<Counter> rows_upserted;
  scoped_refptr<Counter> rows_updated;
  scoped_refptr<Counter> rows_deleted;
  scoped_refptr<Counter> insert_ignore_errors;
  scoped_refptr<Counter> update_ignore_errors;
  scoped_refptr<Counter> delete_ignore_errors;
  scoped_refptr<Counter> insertions_failed_dup_key;
  scoped_refptr<Counter> upserts_as_updates;

  // Scanner metrics.
  scoped_refptr<Counter> scanner_rows_returned;
  scoped_refptr<Counter> scanner_cells_returned;
  scoped_refptr<Counter> scanner_bytes_returned;
  scoped_refptr<Counter> scanner_rows_scanned;
  scoped_refptr<Counter> scanner_cells_scanned_from_disk;
  scoped_refptr<Counter> scanner_bytes_scanned_from_disk;
  scoped_refptr<Counter> scanner_predicates_disabled;
  scoped_refptr<Counter> scans_started;
  scoped_refptr<AtomicGauge<size_t>> tablet_active_scanners;

  // Probe stats.
  scoped_refptr<Counter> bloom_lookups;
  scoped_refptr<Counter> key_file_lookups;
  scoped_refptr<Counter> delta_file_lookups;
  scoped_refptr<Counter> mrs_lookups;

  // Operation stats.
  scoped_refptr<Counter> bytes_flushed;
  scoped_refptr<Counter> deleted_rowset_gc_bytes_deleted;
  scoped_refptr<Counter> undo_delta_block_gc_bytes_deleted;

  scoped_refptr<Histogram> bloom_lookups_per_op;
  scoped_refptr<Histogram> key_file_lookups_per_op;
  scoped_refptr<Histogram> delta_file_lookups_per_op;

  scoped_refptr<Histogram> commit_wait_duration;
  scoped_refptr<Histogram> snapshot_read_inflight_wait_duration;
  scoped_refptr<Histogram> write_op_duration_client_propagated_consistency;
  scoped_refptr<Histogram> write_op_duration_commit_wait_consistency;

  scoped_refptr<AtomicGauge<uint32_t> > flush_dms_running;
  scoped_refptr<AtomicGauge<uint32_t> > flush_mrs_running;
  scoped_refptr<AtomicGauge<uint32_t> > compact_rs_running;
  scoped_refptr<AtomicGauge<int64_t> > deleted_rowset_estimated_retained_bytes;
  scoped_refptr<AtomicGauge<uint32_t> > deleted_rowset_gc_running;
  scoped_refptr<AtomicGauge<uint32_t> > delta_minor_compact_rs_running;
  scoped_refptr<AtomicGauge<uint32_t> > delta_major_compact_rs_running;
  scoped_refptr<AtomicGauge<uint32_t> > undo_delta_block_gc_running;
  scoped_refptr<AtomicGauge<int64_t> > undo_delta_block_estimated_retained_bytes;

  scoped_refptr<Histogram> flush_dms_duration;
  scoped_refptr<Histogram> flush_mrs_duration;
  scoped_refptr<Histogram> compact_rs_duration;
  scoped_refptr<Histogram> deleted_rowset_gc_duration;
  scoped_refptr<Histogram> delta_minor_compact_rs_duration;
  scoped_refptr<Histogram> delta_major_compact_rs_duration;
  scoped_refptr<Histogram> undo_delta_block_gc_init_duration;
  scoped_refptr<Histogram> undo_delta_block_gc_delete_duration;
  scoped_refptr<Histogram> undo_delta_block_gc_perform_duration;

  scoped_refptr<Counter> leader_memory_pressure_rejections;

  // Compaction metrics.
  scoped_refptr<MeanGauge> average_diskrowset_height;

  // Static metrics.
  scoped_refptr<AtomicGauge<size_t>> merged_entities_count_of_tablet;
};

} // namespace tablet
} // namespace kudu
#endif /* KUDU_TABLET_TABLET_METRICS_H */
