Metrics system scaffold
This commit is contained in:
64
src/metric.cpp
Normal file
64
src/metric.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "metric.hpp"
|
||||
#include <mutex>
|
||||
#include <string_view>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace metric {
|
||||
struct Counter::State {};
|
||||
struct Gauge::State {};
|
||||
struct Histogram::State {};
|
||||
struct Metric {
|
||||
|
||||
static std::mutex mutex;
|
||||
|
||||
struct MetricKey {
|
||||
std::string_view name;
|
||||
std::vector<std::pair<std::string, std::string>> labels;
|
||||
};
|
||||
|
||||
struct PerThreadState {
|
||||
std::unordered_map<MetricKey, Counter::State> counters;
|
||||
std::unordered_map<MetricKey, Histogram::State> histograms;
|
||||
};
|
||||
|
||||
static std::unordered_map<std::thread::id, PerThreadState> perThreadState;
|
||||
|
||||
struct ThreadInit {
|
||||
ThreadInit() {
|
||||
std::unique_lock<std::mutex> _{mutex};
|
||||
perThreadState[std::this_thread::get_id()] = {};
|
||||
}
|
||||
~ThreadInit() {
|
||||
std::unique_lock<std::mutex> _{mutex};
|
||||
perThreadState.erase(std::this_thread::get_id());
|
||||
}
|
||||
};
|
||||
static thread_local ThreadInit thread_init;
|
||||
};
|
||||
|
||||
void Counter::inc(double x) {}
|
||||
void Gauge::inc(double x) {}
|
||||
void Gauge::dec(double x) {}
|
||||
void Gauge::set(double x) {}
|
||||
void Histogram::observe(double x) {}
|
||||
|
||||
template <>
|
||||
Counter Family<Counter>::create(
|
||||
std::initializer_list<std::pair<std::string_view, std::string_view>>) {}
|
||||
template <>
|
||||
Gauge Family<Gauge>::create(
|
||||
std::initializer_list<std::pair<std::string_view, std::string_view>>) {}
|
||||
template <>
|
||||
Histogram Family<Histogram>::create(
|
||||
std::initializer_list<std::pair<std::string_view, std::string_view>>) {}
|
||||
|
||||
Family<Counter> create_counter(std::string_view name, std::string_view help) {}
|
||||
Family<Gauge> create_gauge(std::string_view name, std::string_view help) {}
|
||||
Family<Histogram> create_histogram(std::string_view name, std::string_view help,
|
||||
std::initializer_list<double> buckets) {}
|
||||
|
||||
std::span<std::string_view> render(ArenaAllocator &) {}
|
||||
|
||||
} // namespace metric
|
||||
63
src/metric.hpp
Normal file
63
src/metric.hpp
Normal file
@@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include "arena_allocator.hpp"
|
||||
#include <initializer_list>
|
||||
#include <span>
|
||||
#include <string_view>
|
||||
#include <type_traits>
|
||||
|
||||
namespace metric {
|
||||
|
||||
struct Counter {
|
||||
void inc(double = 1.0);
|
||||
|
||||
private:
|
||||
Counter();
|
||||
friend struct Metric;
|
||||
struct State;
|
||||
State *p;
|
||||
};
|
||||
|
||||
struct Gauge {
|
||||
void inc(double = 1.0);
|
||||
void dec(double = 1.0);
|
||||
void set(double);
|
||||
|
||||
private:
|
||||
Gauge();
|
||||
friend struct Metric;
|
||||
struct State;
|
||||
State *p;
|
||||
};
|
||||
|
||||
struct Histogram {
|
||||
void observe(double);
|
||||
|
||||
private:
|
||||
Histogram();
|
||||
friend struct Metric;
|
||||
struct State;
|
||||
State *p;
|
||||
};
|
||||
|
||||
template <class T> struct Family {
|
||||
static_assert(std::is_same_v<T, Counter> || std::is_same_v<T, Gauge> ||
|
||||
std::is_same_v<T, Histogram>);
|
||||
T create(
|
||||
std::initializer_list<std::pair<std::string_view, std::string_view>>);
|
||||
|
||||
private:
|
||||
friend struct Metric;
|
||||
std::string_view name;
|
||||
std::string_view help;
|
||||
};
|
||||
|
||||
// All std::string_view's should point to static memory
|
||||
Family<Counter> create_counter(std::string_view name, std::string_view help);
|
||||
Family<Gauge> create_gauge(std::string_view name, std::string_view help);
|
||||
Family<Histogram> create_histogram(std::string_view name, std::string_view help,
|
||||
std::initializer_list<double> buckets);
|
||||
|
||||
std::span<std::string_view> render(ArenaAllocator &);
|
||||
|
||||
} // namespace metric
|
||||
Reference in New Issue
Block a user