Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
PrometheusRegistry.hpp
Go to the documentation of this file.
1#pragma once
2#include <string>
3#include <unordered_map>
4#include <mutex>
5#include <atomic>
6#include <vector>
7#include <chrono>
8
9namespace utils {
10
12public:
14 static PrometheusRegistry instance;
15 return instance;
16 }
17
18 // Metric Types
19 void inc_counter(const std::string& name, const std::string& labels = "", double value = 1.0);
20 void set_gauge(const std::string& name, const std::string& labels, double value);
21 void inc_gauge(const std::string& name, const std::string& labels = "", double value = 1.0);
22 void dec_gauge(const std::string& name, const std::string& labels = "", double value = 1.0);
23 void observe_histogram(const std::string& name, const std::string& labels, double value);
24
25 // Expose metrics in Prometheus text format
26 std::string expose() const;
27
28private:
29 PrometheusRegistry() = default;
30
31 struct Metric {
32 double value{0.0};
33
34 // For histogram
35 uint64_t count{0};
36 double sum{0.0};
37 std::vector<uint64_t> buckets; // Simplistic buckets
38 };
39
40 mutable std::mutex mutex_;
41
42 // name -> (labels -> Metric)
43 std::unordered_map<std::string, std::unordered_map<std::string, Metric>> counters_;
44 std::unordered_map<std::string, std::unordered_map<std::string, Metric>> gauges_;
45 std::unordered_map<std::string, std::unordered_map<std::string, Metric>> histograms_;
46
47 // Help and type strings
48 std::unordered_map<std::string, std::string> help_text_;
49 std::unordered_map<std::string, std::string> type_text_;
50};
51
53public:
54 MetricsTimer(const std::string& name, const std::string& labels)
55 : name_(name), labels_(labels), start_(std::chrono::high_resolution_clock::now()) {}
56
58 auto end = std::chrono::high_resolution_clock::now();
59 std::chrono::duration<double> duration = end - start_;
60 PrometheusRegistry::get_instance().observe_histogram(name_, labels_, duration.count());
61 }
62
63private:
64 std::string name_;
65 std::string labels_;
66 std::chrono::time_point<std::chrono::high_resolution_clock> start_;
67};
68
69} // namespace utils
Definition PrometheusRegistry.hpp:52
~MetricsTimer()
Definition PrometheusRegistry.hpp:57
MetricsTimer(const std::string &name, const std::string &labels)
Definition PrometheusRegistry.hpp:54
Definition PrometheusRegistry.hpp:11
static PrometheusRegistry & get_instance()
Definition PrometheusRegistry.hpp:13
void dec_gauge(const std::string &name, const std::string &labels="", double value=1.0)
Definition PrometheusRegistry.cpp:30
void inc_counter(const std::string &name, const std::string &labels="", double value=1.0)
Definition PrometheusRegistry.cpp:6
std::string expose() const
Definition PrometheusRegistry.cpp:45
void inc_gauge(const std::string &name, const std::string &labels="", double value=1.0)
Definition PrometheusRegistry.cpp:22
void set_gauge(const std::string &name, const std::string &labels, double value)
Definition PrometheusRegistry.cpp:14
void observe_histogram(const std::string &name, const std::string &labels, double value)
Definition PrometheusRegistry.cpp:35
Definition json.hpp:5363
Definition CaseInsensitive.hpp:7