1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
#pragma once
#include <prometheus/family.h>
#include <prometheus/registry.h>
#include <prometheus/counter.h>
#include <prometheus/gauge.h>
#include <prometheus/benchmark.h>
#include <prometheus/registry.h>
#include <prometheus/save_to_file.h>
#include <thread>
#include <iostream>
#include <memory>
#include <functional>
namespace prometheus {
namespace simpleapi {
extern Registry& registry;
extern SaveToFile saver;
template <typename CustomWrapper>
class family_wrapper_t {
typename CustomWrapper::Family* family_{ nullptr };
public:
// make new family: family_t family {"family_name", "Family description"}
family_wrapper_t(const std::string& name, const std::string& description)
: family_(&CustomWrapper::Family::Build(registry, name, description)) {}
// make new metric into existing family: metric_t metric {family.Add({{"tag_name", "tag_value"}})}
CustomWrapper Add(const typename CustomWrapper::Family::Labels& labels) {
return CustomWrapper(family_, family_->Add(labels));
}
};
class counter_metric_t {
public:
using Metric = Counter<uint64_t>;
using Family = Metric::Family;
private:
Family* family_ { nullptr };
Metric* metric_ { nullptr };
friend family_wrapper_t<counter_metric_t>;
counter_metric_t(typename Metric::Family* family, Metric& metric)
: family_(family), metric_(&metric) {}
public:
// fake empty metric
counter_metric_t() = default;
// make new counter as simple metric without tags and with hidden family included: metric_t metric {"counter_name", "Counter description"}
counter_metric_t(const std::string& name, const std::string& description)
: family_(&Metric::Family::Build(registry, name, description)), metric_(&family_->Add({})) {}
void operator++ () { metric_->Increment(); }
void operator++ (int) { metric_->Increment(); }
void operator+= (typename Metric::Value val) { metric_->Increment(val); }
uint64_t value() const { return metric_->Get(); }
};
using counter_family_t = family_wrapper_t<counter_metric_t>;
class gauge_metric_t {
public:
using Metric = Gauge<int64_t>;
using Family = Metric::Family;
private:
Family* family_ { nullptr };
Metric* metric_ { nullptr };
friend family_wrapper_t<gauge_metric_t>;
gauge_metric_t(typename Metric::Family* family, Metric& metric)
: family_(family), metric_(&metric) {}
public:
// fake empty metric
gauge_metric_t() = default;
// make new gauge as simple metric without tags and with hidden family included: metric {"counter_name", "Counter description"}
gauge_metric_t(const std::string& name, const std::string& description)
: family_(&Metric::Family::Build(registry, name, description)), metric_(&family_->Add({})) {}
void operator++ () { metric_->Increment(); }
void operator++ (int) { metric_->Increment(); }
void operator+= (typename Metric::Value val) { metric_->Increment(val); }
void operator-- () { metric_->Decrement(); }
void operator-- (int) { metric_->Decrement(); }
void operator-= (typename Metric::Value val) { metric_->Decrement(val); }
void operator= (typename Metric::Value val) { metric_->Set(val); }
int64_t value() const { return metric_->Get(); }
};
using gauge_family_t = family_wrapper_t<gauge_metric_t>;
class benchmark_metric_t {
public:
using Metric = Benchmark;
using Family = Metric::Family;
private:
Family* family_ { nullptr };
Metric* metric_ { nullptr };
friend family_wrapper_t<benchmark_metric_t>;
benchmark_metric_t(typename Metric::Family* family, Metric& metric)
: family_(family), metric_(&metric) {}
public:
// fake empty metric
benchmark_metric_t() = default;
// make new benchmark as simple metric without tags and with hidden family included: metric {"counter_name", "Counter description"}
benchmark_metric_t(const std::string& name, const std::string& description)
: family_(&Metric::Family::Build(registry, name, description)), metric_(&family_->Add({})) {}
void start() { metric_->start(); }
void stop() { metric_->stop(); }
double value() const { return metric_->Get(); }
};
using benchmark_family_t = family_wrapper_t<benchmark_metric_t>;
}
}
|