ZeroTierOne/ext/prometheus-cpp-lite-1.0/simpleapi/include/prometheus/simpleapi.h
Grant Limberg 8e6e4ede6d
Add prometheus metrics for Central controllers (#1969)
* add header-only prometheus lib to ext

* rename folder

* Undo rename directory

* prometheus simpleapi included on mac & linux

* wip

* wire up some controller stats

* Get windows building with prometheus

* bsd build flags for prometheus

* Fix multiple network join from environment entrypoint.sh.release (#1961)

* _bond_m guards _bond, not _paths_m (#1965)

* Fix: warning: mutex '_aqm_m' is not held on every path through here [-Wthread-safety-analysis] (#1964)

* Serve prom metrics from /metrics endpoint

* Add prom metrics for Central controller specific things

* reorganize metric initialization

* testing out a labled gauge on Networks

* increment error counter on throw

* Consolidate metrics definitions

Put all metric definitions into node/Metrics.hpp.  Accessed as needed
from there.

* Revert "testing out a labled gauge on Networks"

This reverts commit 499ed6d95e.

* still blows up but adding to the record for completeness right now

* Fix runtime issues with metrics

* Add metrics files to visual studio project

* Missed an "extern"

* add copyright headers to new files

* Add metrics for sent/received bytes (total)

* put /metrics endpoint behind auth

* sendto returns int on Win32

---------

Co-authored-by: Leonardo Amaral <leleobhz@users.noreply.github.com>
Co-authored-by: Brenton Bostick <bostick@gmail.com>
2023-04-21 12:12:43 -07:00

157 lines
4.6 KiB
C++

#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>;
}
}