Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
monitoring_interface.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
15#include <string>
16#include <unordered_map>
17#include <vector>
18#include <chrono>
19#include <atomic>
21
22namespace kcenon::logger {
23
27enum class health_status {
28 healthy,
29 degraded,
30 unhealthy,
31 unknown
32};
33
37enum class metric_type {
38 counter,
39 gauge,
40 histogram,
41 summary
42};
43
48 std::string name;
49 double value;
51 std::chrono::system_clock::time_point timestamp;
52 std::unordered_map<std::string, std::string> labels;
53
55 timestamp(std::chrono::system_clock::now()) {}
56
57 metric_value(const std::string& n, double v, metric_type t = metric_type::gauge)
58 : name(n), value(v), type(t),
59 timestamp(std::chrono::system_clock::now()) {}
60};
61
66private:
67 std::vector<metric_value> metrics_;
68 std::chrono::system_clock::time_point collection_time_;
69
70public:
71 monitoring_data() : collection_time_(std::chrono::system_clock::now()) {}
72
79 void add_metric(const std::string& name, double value,
81 metrics_.emplace_back(name, value, type);
82 }
83
88 void add_metric(const metric_value& metric) {
89 metrics_.push_back(metric);
90 }
91
96 const std::vector<metric_value>& get_metrics() const {
97 return metrics_;
98 }
99
104 std::chrono::system_clock::time_point get_collection_time() const {
105 return collection_time_;
106 }
107
111 void clear() {
112 metrics_.clear();
113 }
114
119 size_t size() const {
120 return metrics_.size();
121 }
122};
123
128private:
130 std::string message_;
131 std::vector<std::string> issues_;
132 std::chrono::system_clock::time_point check_time_;
133
134public:
135 health_check_result(health_status status = health_status::healthy)
136 : status_(status), check_time_(std::chrono::system_clock::now()) {}
137
143 status_ = status;
144 }
145
151 return status_;
152 }
153
158 void add_issue(const std::string& issue) {
159 issues_.push_back(issue);
160 // Automatically degrade status when issues are added
161 if (status_ == health_status::healthy) {
162 status_ = health_status::degraded;
163 }
164 }
165
170 const std::vector<std::string>& get_issues() const {
171 return issues_;
172 }
173
178 void set_message(const std::string& message) {
179 message_ = message;
180 }
181
186 const std::string& get_message() const {
187 return message_;
188 }
189
194 bool is_healthy() const {
195 return status_ == health_status::healthy;
196 }
197
202 std::chrono::system_clock::time_point get_check_time() const {
203 return check_time_;
204 }
205};
206
214public:
218 virtual ~monitoring_interface() = default;
219
225
231
237
243 virtual common::VoidResult set_enabled(bool enable) = 0;
244
249 virtual bool is_enabled() const = 0;
250
255 virtual std::string get_backend_name() const = 0;
256
262 virtual void increment_counter(const std::string& name, double value = 1.0) = 0;
263
269 virtual void update_gauge(const std::string& name, double value) = 0;
270
276 virtual void record_histogram(const std::string& name, double value) = 0;
277};
278
284inline std::string health_status_to_string(health_status status) {
285 switch (status) {
286 case health_status::healthy:
287 return "healthy";
288 case health_status::degraded:
289 return "degraded";
290 case health_status::unhealthy:
291 return "unhealthy";
292 case health_status::unknown:
293 return "unknown";
294 default:
295 return "unknown";
296 }
297}
298
304inline std::string metric_type_to_string(metric_type type) {
305 switch (type) {
307 return "counter";
309 return "gauge";
311 return "histogram";
313 return "summary";
314 default:
315 return "unknown";
316 }
317}
318
319} // namespace kcenon::logger
void set_status(health_status status)
Set health status.
bool is_healthy() const
Check if healthy.
void set_message(const std::string &message)
Set status message.
const std::string & get_message() const
Get status message.
const std::vector< std::string > & get_issues() const
Get all issues.
health_status get_status() const
Get health status.
std::chrono::system_clock::time_point check_time_
void add_issue(const std::string &issue)
Add an issue.
health_check_result(health_status status=health_status::healthy)
std::chrono::system_clock::time_point get_check_time() const
Get check timestamp.
size_t size() const
Get number of metrics.
const std::vector< metric_value > & get_metrics() const
Get all metrics.
std::chrono::system_clock::time_point get_collection_time() const
Get collection timestamp.
std::vector< metric_value > metrics_
void add_metric(const std::string &name, double value, metric_type type=metric_type::gauge)
Add a metric to the collection.
std::chrono::system_clock::time_point collection_time_
void add_metric(const metric_value &metric)
Add a pre-built metric.
virtual result< monitoring_data > collect_metrics() const =0
Collect current metrics.
virtual result< health_check_result > check_health() const =0
Perform health check.
virtual std::string get_backend_name() const =0
Get monitoring backend name.
virtual void increment_counter(const std::string &name, double value=1.0)=0
Record a counter increment.
virtual ~monitoring_interface()=default
Virtual destructor.
virtual common::VoidResult set_enabled(bool enable)=0
Enable or disable metric collection.
virtual void record_histogram(const std::string &name, double value)=0
Record a value in a histogram.
virtual common::VoidResult reset_metrics()=0
Reset all metrics.
virtual bool is_enabled() const =0
Check if monitoring is enabled.
virtual void update_gauge(const std::string &name, double value)=0
Update a gauge value.
Error codes specific to the logger system.
health_status
Health status levels.
@ healthy
Everything is working normally.
@ degraded
Some issues but still operational.
@ unknown
Status cannot be determined.
@ unhealthy
Major issues, may not be operational.
std::string metric_type_to_string(metric_type type)
Convert metric type to string.
metric_type
Types of metrics that can be recorded by the logger.
Definition logger.h:98
@ gauge
A metric that can go up or down (e.g., queue depth).
@ counter
A monotonically increasing metric (e.g., total messages).
@ summary
Statistical summary.
@ histogram
A distribution of values (e.g., processing latency).
std::string health_status_to_string(health_status status)
Convert health status to string.
Single metric value with metadata.
metric_value(const std::string &n, double v, metric_type t=metric_type::gauge)
std::chrono::system_clock::time_point timestamp
std::unordered_map< std::string, std::string > labels