mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-26 14:00:05 +00:00
* 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 499ed6d95e11452019cdf48e32ed4cd878c2705b. * 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>
157 lines
4.6 KiB
C++
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>;
|
|
|
|
}
|
|
}
|