LogIt++
Header-only, macro-first C++ logging library
Loading...
Searching...
No Matches
PrometheusPayloadLogger.hpp
Go to the documentation of this file.
1#pragma once
2#ifndef LOGIT_CPP_HEADER_LOGIT_CPP_LOGIT_LOGGERS_PROMETHEUSPAYLOADLOGGER_HPP_INCLUDED
3#define LOGIT_CPP_HEADER_LOGIT_CPP_LOGIT_LOGGERS_PROMETHEUSPAYLOADLOGGER_HPP_INCLUDED
4
7
8#ifndef LOGIT_WITH_PROMETHEUS
9# error "PrometheusPayloadLogger requires LOGIT_WITH_PROMETHEUS=1. Enable LOGIT_WITH_PROMETHEUS in CMake."
10#endif
11
12#include "ILogger.hpp"
15
16#include <atomic>
17#include <cstdint>
18#include <functional>
19#include <mutex>
20#include <string>
21#include <vector>
22
23namespace logit {
24
33 class PrometheusPayloadLogger final : public ILogger {
34 public:
35 struct Config {
37 std::function<void(std::string)> on_payload;
38 std::function<void(std::vector<PrometheusMetricFamily>&)> on_collect;
39 bool emit_on_log = false;
40 bool emit_on_wait = true;
41 };
42
45
48 explicit PrometheusPayloadLogger(const Config& config)
49 : m_config(config) {}
50
51 ~PrometheusPayloadLogger() override = default;
52
55
59 void log(const LogRecord& record, const std::string& message) override {
60 (void)message;
62
64 try {
65 std::string payload = collect_payload();
66 m_config.on_payload(std::move(payload));
67 } catch (...) {
69 }
70 }
71 }
72
74 void wait() override {
76 try {
77 std::string payload = collect_payload();
78 m_config.on_payload(std::move(payload));
79 } catch (...) {
81 }
82 }
83 }
84
86 void shutdown() override {}
87
90 std::string collect_payload() {
91 std::vector<PrometheusMetricFamily> families;
92 {
93 std::lock_guard<std::mutex> lock(m_collect_mutex);
95 families, m_config.format, "prometheus_payload",
97 if (m_config.on_collect) {
98 try {
99 m_config.on_collect(families);
100 } catch (...) {
102 }
103 }
104 }
106 }
107
111 std::string get_string_param(const LoggerParam& param) const override {
112 switch (param) {
113 case LoggerParam::LastLogTimestamp: return std::to_string(m_metrics.last_log_ts());
115 case LoggerParam::DroppedLogCount: return std::to_string(m_metrics.dropped_count());
116 case LoggerParam::FailedExportCount: return std::to_string(m_metrics.failed_export_count());
117 default:
118 break;
119 }
120 return std::string();
121 }
122
137
141 double get_float_param(const LoggerParam& param) const override {
142 switch (param) {
144 return static_cast<double>(m_metrics.last_log_ts()) / 1000.0;
146 return static_cast<double>(m_metrics.time_since_last_log_ms(LOGIT_CURRENT_TIMESTAMP_MS())) / 1000.0;
148 return static_cast<double>(m_metrics.dropped_count());
150 return static_cast<double>(m_metrics.failed_export_count());
151 default:
152 break;
153 }
154 return 0.0;
155 }
156
159 void set_log_level(LogLevel level) override {
160 m_log_level = static_cast<int>(level);
161 }
162
165 LogLevel get_log_level() const override {
166 return static_cast<LogLevel>(m_log_level.load());
167 }
168
169 private:
171 std::mutex m_collect_mutex;
173
174 std::atomic<int> m_log_level = ATOMIC_VAR_INIT(static_cast<int>(LogLevel::LOG_LVL_TRACE));
175 };
176
177} // namespace logit
178
179#endif // LOGIT_CPP_HEADER_LOGIT_CPP_LOGIT_LOGGERS_PROMETHEUSPAYLOADLOGGER_HPP_INCLUDED
Defines the interface for loggers used in the logging system.
Shared built-in metrics state and serialization for Prometheus loggers.
Prometheus text exposition format serialization helpers.
Optional buffered snapshot access returns empty results by default.
Definition ILogger.hpp:47
Tracks log-record counters and builds built-in Prometheus metric families.
void add_failed_export(uint64_t count=1)
Increment failed export/collect counter.
uint64_t dropped_count() const
Total dropped log records.
int64_t last_log_ts() const
Last log timestamp (ms).
uint64_t failed_export_count() const
Total failed export/collect attempts.
static int64_t counter_to_int64(uint64_t value)
Safely convert uint64_t counter to int64_t (clamping on overflow).
int64_t time_since_last_log_ms(int64_t now_ms) const
Milliseconds since last log record (0 if none).
void build_builtin_metrics(std::vector< PrometheusMetricFamily > &families, const PrometheusTextFormatConfig &config, const std::string &logger_name, int64_t now_ms=0) const
Append the six built-in metric families to families.
void on_log(int64_t timestamp_ms)
Update metrics when a log record is processed.
Exposes log metrics as Prometheus text exposition format via user-provided callback.
PrometheusPayloadLogger & operator=(const PrometheusPayloadLogger &)=delete
std::string collect_payload()
Collects current metrics and returns serialized Prometheus text payload.
PrometheusPayloadLogger(const Config &config)
Constructs Prometheus payload logger with custom configuration.
void wait() override
If emit_on_wait, collects metrics and invokes on_payload callback.
PrometheusPayloadLogger(const PrometheusPayloadLogger &)=delete
void log(const LogRecord &record, const std::string &message) override
Updates internal metric counters for a log message.
std::string get_string_param(const LoggerParam &param) const override
Retrieves a string parameter from the logger.
~PrometheusPayloadLogger() override=default
PrometheusPayloadLogger()
Constructs Prometheus payload logger with default configuration.
void set_log_level(LogLevel level) override
Sets minimal log level for this logger.
double get_float_param(const LoggerParam &param) const override
Retrieves a floating-point parameter from the logger.
LogLevel get_log_level() const override
Gets minimal log level for this logger.
int64_t get_int_param(const LoggerParam &param) const override
Retrieves an integer parameter from the logger.
void shutdown() override
Stops the logger (no worker thread to drain for payload logger).
#define LOGIT_CURRENT_TIMESTAMP_MS()
Macro to get the current timestamp in milliseconds.
Definition config.hpp:84
The primary namespace for the LogIt++ library.
LogLevel
Logging levels.
Definition enums.hpp:15
@ LOG_LVL_TRACE
Trace level logging.
std::string build_prometheus_text_payload(const std::vector< PrometheusMetricFamily > &families, const PrometheusTextFormatConfig &config)
Builds a complete Prometheus text exposition format payload.
LoggerParam
Enumeration for different logger parameters that can be retrieved.
Definition enums.hpp:47
@ TimeSinceLastLog
The time elapsed since the last log in seconds.
@ LastLogTimestamp
The timestamp of the last log.
@ DroppedLogCount
Number of log records dropped by the backend.
@ FailedExportCount
Number of failed export attempts reported by the backend.
Stores log metadata and content.
Definition LogRecord.hpp:17
const int64_t timestamp_ms
Timestamp in milliseconds.
Definition LogRecord.hpp:19
std::function< void(std::string)> on_payload
std::function< void(std::vector< PrometheusMetricFamily > &)> on_collect
Configuration for Prometheus text exposition format output.