3 Copyright (C) 2013-2020 Minetest core developers team
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "metricsbackend.h"
22 #include <prometheus/exposer.h>
23 #include <prometheus/registry.h>
24 #include <prometheus/counter.h>
25 #include <prometheus/gauge.h>
30 MetricCounterPtr
MetricsBackend::addCounter(
31 const std::string
&name
, const std::string
&help_str
)
33 return std::make_shared
<SimpleMetricCounter
>(name
, help_str
);
36 MetricGaugePtr
MetricsBackend::addGauge(
37 const std::string
&name
, const std::string
&help_str
)
39 return std::make_shared
<SimpleMetricGauge
>(name
, help_str
);
44 class PrometheusMetricCounter
: public MetricCounter
47 PrometheusMetricCounter() = delete;
49 PrometheusMetricCounter(const std::string
&name
, const std::string
&help_str
,
50 std::shared_ptr
<prometheus::Registry
> registry
) :
52 m_family(prometheus::BuildCounter()
55 .Register(*registry
)),
56 m_counter(m_family
.Add({}))
60 virtual ~PrometheusMetricCounter() {}
62 virtual void increment(double number
) { m_counter
.Increment(number
); }
63 virtual double get() const { return m_counter
.Value(); }
66 prometheus::Family
<prometheus::Counter
> &m_family
;
67 prometheus::Counter
&m_counter
;
70 class PrometheusMetricGauge
: public MetricGauge
73 PrometheusMetricGauge() = delete;
75 PrometheusMetricGauge(const std::string
&name
, const std::string
&help_str
,
76 std::shared_ptr
<prometheus::Registry
> registry
) :
78 m_family(prometheus::BuildGauge()
81 .Register(*registry
)),
82 m_gauge(m_family
.Add({}))
86 virtual ~PrometheusMetricGauge() {}
88 virtual void increment(double number
) { m_gauge
.Increment(number
); }
89 virtual void decrement(double number
) { m_gauge
.Decrement(number
); }
90 virtual void set(double number
) { m_gauge
.Set(number
); }
91 virtual double get() const { return m_gauge
.Value(); }
94 prometheus::Family
<prometheus::Gauge
> &m_family
;
95 prometheus::Gauge
&m_gauge
;
98 class PrometheusMetricsBackend
: public MetricsBackend
101 PrometheusMetricsBackend(const std::string
&addr
) :
102 MetricsBackend(), m_exposer(std::unique_ptr
<prometheus::Exposer
>(
103 new prometheus::Exposer(addr
))),
104 m_registry(std::make_shared
<prometheus::Registry
>())
106 m_exposer
->RegisterCollectable(m_registry
);
109 virtual ~PrometheusMetricsBackend() {}
111 virtual MetricCounterPtr
addCounter(
112 const std::string
&name
, const std::string
&help_str
);
113 virtual MetricGaugePtr
addGauge(
114 const std::string
&name
, const std::string
&help_str
);
117 std::unique_ptr
<prometheus::Exposer
> m_exposer
;
118 std::shared_ptr
<prometheus::Registry
> m_registry
;
121 MetricCounterPtr
PrometheusMetricsBackend::addCounter(
122 const std::string
&name
, const std::string
&help_str
)
124 return std::make_shared
<PrometheusMetricCounter
>(name
, help_str
, m_registry
);
127 MetricGaugePtr
PrometheusMetricsBackend::addGauge(
128 const std::string
&name
, const std::string
&help_str
)
130 return std::make_shared
<PrometheusMetricGauge
>(name
, help_str
, m_registry
);
133 MetricsBackend
*createPrometheusMetricsBackend()
136 g_settings
->getNoEx("prometheus_listener_address", addr
);
137 return new PrometheusMetricsBackend(addr
);