include/ylt/metric/gauge.hpp (63 lines of code) (raw):
#pragma once
#include <atomic>
#include <chrono>
#include "counter.hpp"
#include "ylt/metric/metric.hpp"
namespace ylt::metric {
template <typename value_type>
class basic_static_gauge : public basic_static_counter<value_type> {
using metric_t::set_metric_type;
using basic_static_counter<value_type>::default_label_value_;
using metric_t::labels_value_;
using basic_static_counter<value_type>::dupli_count_;
using basic_static_counter<value_type>::has_change_;
public:
basic_static_gauge(std::string name, std::string help, size_t dupli_count = 2)
: basic_static_counter<value_type>(std::move(name), std::move(help),
dupli_count) {
set_metric_type(MetricType::Gauge);
}
basic_static_gauge(std::string name, std::string help,
std::map<std::string, std::string> labels,
size_t dupli_count = 2)
: basic_static_counter<value_type>(std::move(name), std::move(help),
std::move(labels), dupli_count) {
set_metric_type(MetricType::Gauge);
}
void dec(value_type value = 1) {
if (!has_change_) [[unlikely]] {
has_change_ = true;
}
default_label_value_.dec(value);
}
};
using gauge_t = basic_static_gauge<int64_t>;
using gauge_d = basic_static_gauge<double>;
template <typename value_type, uint8_t N>
class basic_dynamic_gauge : public basic_dynamic_counter<value_type, N> {
using metric_t::set_metric_type;
using Base = basic_dynamic_counter<value_type, N>;
public:
basic_dynamic_gauge(std::string name, std::string help,
std::array<std::string, N> labels_name)
: Base(std::move(name), std::move(help), std::move(labels_name)) {
set_metric_type(MetricType::Gauge);
}
void dec(const std::array<std::string, N>& labels_value,
value_type value = 1) {
detail::dec_impl(Base::try_emplace(labels_value).first->value, value);
}
};
using dynamic_gauge_1t = basic_dynamic_gauge<int64_t, 1>;
using dynamic_gauge_1d = basic_dynamic_gauge<double, 1>;
using dynamic_gauge_t = basic_dynamic_gauge<int64_t, 2>;
using dynamic_gauge_d = basic_dynamic_gauge<double, 2>;
using dynamic_gauge_2t = dynamic_gauge_t;
using dynamic_gauge_2d = dynamic_gauge_d;
using dynamic_gauge_3t = basic_dynamic_gauge<int64_t, 3>;
using dynamic_gauge_3d = basic_dynamic_gauge<double, 3>;
using dynamic_gauge_4t = basic_dynamic_gauge<int64_t, 4>;
using dynamic_gauge_4d = basic_dynamic_gauge<double, 4>;
using dynamic_gauge_5t = basic_dynamic_gauge<int64_t, 5>;
using dynamic_gauge_5d = basic_dynamic_gauge<double, 5>;
} // namespace ylt::metric