prom 0.1.0
Client-independent C++23 Prometheus/OpenMetrics metric abstraction
Loading...
Searching...
No Matches
composite_adapter.hpp
Go to the documentation of this file.
1#pragma once
2
18
19#include <prom/adapter.hpp>
20#include <prom/fwd.hpp>
21#include <prom/labels.hpp>
22#include <prom/unit.hpp>
23
24#include <logman/logman.hpp>
25
26#include <algorithm>
27#include <cstddef>
28#include <initializer_list>
29#include <memory>
30#include <span>
31#include <string_view>
32#include <utility>
33#include <vector>
34
35namespace prom {
36
40class CompositeState final : public MetricState {
41public:
42 std::vector<MetricHandle> handles;
43};
44
51class CompositeAdapter final : public Adapter {
52public:
54 explicit CompositeAdapter(std::vector<AdapterPtr> adapters)
55 : logger_(logman::get("prom.composite")) {
56 adapters_.reserve(adapters.size());
57 for (auto& a : adapters) {
58 if (a) {
59 adapters_.push_back(std::move(a));
60 }
61 }
62 if (logger_) {
63 logger_->debug("composite backend created with {} adapter(s)", adapters_.size());
64 }
65 }
66
68 CompositeAdapter(const std::initializer_list<AdapterPtr> adapters)
69 : CompositeAdapter(std::vector<AdapterPtr>(adapters)) {}
70
72 [[nodiscard]] std::span<const AdapterPtr> adapters() const noexcept {
73 return adapters_;
74 }
75
76 [[nodiscard]] std::string_view backend_name() const noexcept override {
77 return "composite";
78 }
79
80 [[nodiscard]] MetricHandle register_metric(const MetricMeta& meta) noexcept override {
81 auto state = std::make_shared<CompositeState>();
82 state->handles.reserve(adapters_.size());
83 for (const auto& a : adapters_) {
84 state->handles.push_back(a->register_metric(meta));
85 }
86 return state;
87 }
88
89 [[nodiscard]] MetricHandle resolve(const MetricHandle& family,
90 const Labels& dynamic) noexcept override {
91 const auto* parent = dynamic_cast<CompositeState*>(family.get());
92 if (parent == nullptr || parent->handles.size() != adapters_.size()) {
93 return family; // Not one of ours — never hand back null.
94 }
95 auto state = std::make_shared<CompositeState>();
96 state->handles.reserve(adapters_.size());
97 for (std::size_t i = 0; i < adapters_.size(); ++i) {
98 state->handles.push_back(adapters_[i]->resolve(parent->handles[i], dynamic));
99 }
100 return state;
101 }
102
103 void inc(const MetricHandle& handle, const double amount) noexcept override {
104 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.inc(h, amount); });
105 }
106
107 void dec(const MetricHandle& handle, const double amount) noexcept override {
108 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.dec(h, amount); });
109 }
110
111 void set(const MetricHandle& handle, const double value) noexcept override {
112 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.set(h, value); });
113 }
114
115 void observe(const MetricHandle& handle, const double value) noexcept override {
116 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.observe(h, value); });
117 }
118
119 void set_info(const MetricHandle& handle,
120 const std::span<const Label> labels) noexcept override {
121 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.set_info(h, labels); });
122 }
123
124 void set_state(const MetricHandle& handle,
125 const std::string_view state,
126 const bool active) noexcept override {
127 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.set_state(h, state, active); });
128 }
129
130 void set_unit(const MetricHandle& handle, const Unit& unit) noexcept override {
131 fan_out(handle, [&](Adapter& a, const MetricHandle& h) { a.set_unit(h, unit); });
132 }
133
134private:
138 template <class Fn>
139 void fan_out(const MetricHandle& handle, Fn&& fn) noexcept {
140 auto* state = dynamic_cast<CompositeState*>(handle.get());
141 if (state == nullptr) {
142 return;
143 }
144 const std::size_t n = std::min(adapters_.size(), state->handles.size());
145 for (std::size_t i = 0; i < n; ++i) {
146 fn(*adapters_[i], state->handles[i]);
147 }
148 }
149
150 std::shared_ptr<spdlog::logger> logger_;
151 std::vector<AdapterPtr> adapters_;
152};
153
154} // namespace prom
The pluggable backend.
Definition adapter.hpp:62
virtual void set_unit(const MetricHandle &, const Unit &) noexcept
Late unit inference hook.
Definition adapter.hpp:102
virtual void observe(const MetricHandle &handle, double value) noexcept=0
Record an observation against handle (histogram/summary).
virtual void set_info(const MetricHandle &handle, std::span< const Label > labels) noexcept=0
Replace the label set carried by an info metric.
virtual void dec(const MetricHandle &handle, double amount) noexcept=0
Decrease the series behind handle by amount (gauge).
virtual void set_state(const MetricHandle &handle, std::string_view state, bool active) noexcept=0
Set the boolean value of one member of a state set.
virtual void inc(const MetricHandle &handle, double amount) noexcept=0
Increase the series behind handle by amount (counter/gauge).
virtual void set(const MetricHandle &handle, double value) noexcept=0
Set the series behind handle to value (gauge/untyped).
A backend that forwards every call to a fixed set of child adapters.
Definition composite_adapter.hpp:51
void set_state(const MetricHandle &handle, const std::string_view state, const bool active) noexcept override
Set the boolean value of one member of a state set.
Definition composite_adapter.hpp:124
CompositeAdapter(std::vector< AdapterPtr > adapters)
Construct from an explicit list of adapters. Null entries are ignored.
Definition composite_adapter.hpp:54
void set(const MetricHandle &handle, const double value) noexcept override
Set the series behind handle to value (gauge/untyped).
Definition composite_adapter.hpp:111
void observe(const MetricHandle &handle, const double value) noexcept override
Record an observation against handle (histogram/summary).
Definition composite_adapter.hpp:115
void dec(const MetricHandle &handle, const double amount) noexcept override
Decrease the series behind handle by amount (gauge).
Definition composite_adapter.hpp:107
void set_info(const MetricHandle &handle, const std::span< const Label > labels) noexcept override
Replace the label set carried by an info metric.
Definition composite_adapter.hpp:119
CompositeAdapter(const std::initializer_list< AdapterPtr > adapters)
Convenience constructor: CompositeAdapter{a, b, c}.
Definition composite_adapter.hpp:68
void inc(const MetricHandle &handle, const double amount) noexcept override
Increase the series behind handle by amount (counter/gauge).
Definition composite_adapter.hpp:103
std::string_view backend_name() const noexcept override
Stable identifier of the backend (e.g. "null", "prometheus-cpp").
Definition composite_adapter.hpp:76
std::span< const AdapterPtr > adapters() const noexcept
The wrapped adapters, in dispatch order (nulls already removed).
Definition composite_adapter.hpp:72
void set_unit(const MetricHandle &handle, const Unit &unit) noexcept override
Late unit inference hook.
Definition composite_adapter.hpp:130
MetricHandle resolve(const MetricHandle &family, const Labels &dynamic) noexcept override
Resolve the labeled child of family for the given dynamic labels, creating it on first request.
Definition composite_adapter.hpp:89
MetricHandle register_metric(const MetricMeta &meta) noexcept override
Register a metric family.
Definition composite_adapter.hpp:80
Backend state for a composite family or child: the index-aligned bundle of the handles each wrapped a...
Definition composite_adapter.hpp:40
std::vector< MetricHandle > handles
Per-child handles, child-index aligned.
Definition composite_adapter.hpp:42
An immutable-by-convention set of labels, kept sorted by name with duplicates collapsed last-wins.
Definition labels.hpp:55
Opaque backend state for a registered family or a labeled child.
Definition adapter.hpp:46
Forward declarations and shared_ptr aliases for the prom public API.
The backend boundary: MetricMeta, MetricState/MetricHandle, and the pure-virtual Adapter interface.
Label vocabulary: Label, the sorted/deduped Labels set, name validation, and an std::hash<Labels> spe...
Definition adapter.hpp:24
std::shared_ptr< Adapter > AdapterPtr
Shared ownership of an Adapter.
Definition fwd.hpp:38
std::shared_ptr< MetricState > MetricHandle
Opaque, backend-owned handle to a registered metric family or a labeled child series.
Definition fwd.hpp:34
The complete, backend-agnostic description of a metric family handed to Adapter::register_metric.
Definition adapter.hpp:31
OpenMetrics unit suffix plus optional dimensional metadata.
Definition unit.hpp:53
Metric kinds (MetricType) and the OpenMetrics Unit descriptor.