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"
21 #include "util/thread.h"
23 #include <prometheus/exposer.h>
24 #include <prometheus/registry.h>
25 #include <prometheus/counter.h>
26 #include <prometheus/gauge.h>
31 /* Plain implementation */
33 class SimpleMetricCounter : public MetricCounter
36 SimpleMetricCounter() : MetricCounter(), m_counter(0.0) {}
38 virtual ~SimpleMetricCounter() {}
40 void increment(double number) override
42 MutexAutoLock lock(m_mutex);
45 double get() const override
47 MutexAutoLock lock(m_mutex);
52 mutable std::mutex m_mutex;
56 class SimpleMetricGauge : public MetricGauge
59 SimpleMetricGauge() : MetricGauge(), m_gauge(0.0) {}
61 virtual ~SimpleMetricGauge() {}
63 void increment(double number) override
65 MutexAutoLock lock(m_mutex);
68 void decrement(double number) override
70 MutexAutoLock lock(m_mutex);
73 void set(double number) override
75 MutexAutoLock lock(m_mutex);
78 double get() const override
80 MutexAutoLock lock(m_mutex);
85 mutable std::mutex m_mutex;
89 MetricCounterPtr MetricsBackend::addCounter(
90 const std::string &name, const std::string &help_str, Labels labels)
92 return std::make_shared<SimpleMetricCounter>();
95 MetricGaugePtr MetricsBackend::addGauge(
96 const std::string &name, const std::string &help_str, Labels labels)
98 return std::make_shared<SimpleMetricGauge>();
101 /* Prometheus backend */
105 class PrometheusMetricCounter : public MetricCounter
108 PrometheusMetricCounter() = delete;
110 PrometheusMetricCounter(const std::string &name, const std::string &help_str,
111 MetricsBackend::Labels labels,
112 std::shared_ptr<prometheus::Registry> registry) :
114 m_family(prometheus::BuildCounter()
117 .Register(*registry)),
118 m_counter(m_family.Add(labels))
122 virtual ~PrometheusMetricCounter() {}
124 virtual void increment(double number) { m_counter.Increment(number); }
125 virtual double get() const { return m_counter.Value(); }
128 prometheus::Family<prometheus::Counter> &m_family;
129 prometheus::Counter &m_counter;
132 class PrometheusMetricGauge : public MetricGauge
135 PrometheusMetricGauge() = delete;
137 PrometheusMetricGauge(const std::string &name, const std::string &help_str,
138 MetricsBackend::Labels labels,
139 std::shared_ptr<prometheus::Registry> registry) :
141 m_family(prometheus::BuildGauge()
144 .Register(*registry)),
145 m_gauge(m_family.Add(labels))
149 virtual ~PrometheusMetricGauge() {}
151 virtual void increment(double number) { m_gauge.Increment(number); }
152 virtual void decrement(double number) { m_gauge.Decrement(number); }
153 virtual void set(double number) { m_gauge.Set(number); }
154 virtual double get() const { return m_gauge.Value(); }
157 prometheus::Family<prometheus::Gauge> &m_family;
158 prometheus::Gauge &m_gauge;
161 class PrometheusMetricsBackend : public MetricsBackend
164 PrometheusMetricsBackend(const std::string &addr) :
165 MetricsBackend(), m_exposer(std::make_unique<prometheus::Exposer>(addr)),
166 m_registry(std::make_shared<prometheus::Registry>())
168 m_exposer->RegisterCollectable(m_registry);
171 virtual ~PrometheusMetricsBackend() {}
173 MetricCounterPtr addCounter(
174 const std::string &name, const std::string &help_str,
175 Labels labels = {}) override;
176 MetricGaugePtr addGauge(
177 const std::string &name, const std::string &help_str,
178 Labels labels = {}) override;
181 std::unique_ptr<prometheus::Exposer> m_exposer;
182 std::shared_ptr<prometheus::Registry> m_registry;
185 MetricCounterPtr PrometheusMetricsBackend::addCounter(
186 const std::string &name, const std::string &help_str, Labels labels)
188 return std::make_shared<PrometheusMetricCounter>(name, help_str, labels, m_registry);
191 MetricGaugePtr PrometheusMetricsBackend::addGauge(
192 const std::string &name, const std::string &help_str, Labels labels)
194 return std::make_shared<PrometheusMetricGauge>(name, help_str, labels, m_registry);
197 MetricsBackend *createPrometheusMetricsBackend()
200 g_settings->getNoEx("prometheus_listener_address", addr);
201 return new PrometheusMetricsBackend(addr);