25#include <unordered_map>
34namespace kcenon {
namespace monitoring {
54 size_t total_log_count{0};
55 size_t logs_per_second{0};
56 std::unordered_map<log_level, size_t> logs_by_level;
59 size_t buffer_size_bytes{0};
60 size_t buffer_capacity_bytes{0};
61 double buffer_usage_percent{0.0};
62 size_t dropped_logs{0};
65 double average_log_latency_us{0.0};
66 double max_log_latency_us{0.0};
67 double min_log_latency_us{0.0};
71 size_t total_bytes_written{0};
72 size_t write_operations{0};
73 double average_write_size_bytes{0.0};
76 size_t write_errors{0};
77 size_t format_errors{0};
78 size_t rotation_errors{0};
81 size_t rotations_performed{0};
82 size_t archived_files{0};
83 size_t total_archive_size_bytes{0};
89struct log_pattern_analysis {
92 size_t occurrences{0};
93 double frequency_per_minute{0.0};
94 log_level most_common_level{log_level::info};
95 std::vector<std::string> sample_messages;
98 std::vector<pattern> detected_patterns;
99 std::unordered_map<std::string, size_t> error_categories;
100 std::unordered_map<std::string, size_t> component_frequencies;
101 std::chrono::steady_clock::time_point analysis_time;
108class logger_system_collector :
public collector_plugin {
110 logger_system_collector();
111 ~logger_system_collector()
override;
114 auto name() const -> std::string_view
override {
return "logger_system"; }
115 auto collect() -> std::vector<metric>
override;
116 auto interval() const -> std::chrono::milliseconds
override {
return std::chrono::seconds(10); }
117 auto is_available() const ->
bool override {
return true; }
118 auto get_metric_types() const -> std::vector<std::
string> override;
120 auto get_metadata() const -> plugin_metadata
override {
121 return plugin_metadata{
123 .description =
"Logger system metrics and log pattern analysis",
124 .category = plugin_category::system,
127 .requires_platform_support =
false
131 auto initialize(
const config_map& config) ->
bool override;
132 void shutdown()
override {}
133 auto get_statistics() const -> stats_map override;
139 void set_logger_system_adapter(std::shared_ptr<logger_system_adapter> adapter);
146 void register_log_source(const std::
string& source_name,
147 std::function<logging_stats()> stats_provider);
153 void unregister_log_source(const std::
string& source_name);
160 std::optional<logging_stats> get_source_stats(const std::
string& source_name) const;
167 void set_pattern_analysis(
bool enable,
size_t sample_size = 1000);
173 std::optional<log_pattern_analysis> get_pattern_analysis() const;
179 void set_level_distribution_tracking(
bool enable);
186 std::unordered_map<log_level,
size_t> get_level_distribution(
size_t window_seconds = 60) const;
190 std::shared_ptr<logger_system_adapter> logger_adapter_;
191 std::shared_ptr<event_bus> event_bus_;
194 mutable std::mutex sources_mutex_;
195 std::unordered_map<std::
string, std::function<logging_stats()>> source_providers_;
196 std::unordered_map<std::
string, logging_stats> last_source_stats_;
199 bool enable_pattern_analysis_{
false};
200 size_t pattern_sample_size_{1000};
201 bool track_level_distribution_{
true};
202 bool use_event_bus_{
true};
205 mutable std::mutex pattern_mutex_;
206 log_pattern_analysis last_pattern_analysis_;
207 std::chrono::steady_clock::time_point last_analysis_time_;
212 std::chrono::steady_clock::time_point timestamp;
214 mutable std::mutex distribution_mutex_;
215 std::deque<level_entry> level_history_;
216 const size_t max_history_size_{10000};
219 mutable std::mutex stats_mutex_;
220 std::atomic<size_t> collection_count_{0};
221 std::atomic<size_t> collection_errors_{0};
222 std::atomic<bool> is_healthy_{
true};
223 std::chrono::steady_clock::time_point init_time_;
226 struct throughput_tracker {
227 std::chrono::steady_clock::time_point window_start;
228 size_t logs_in_window{0};
229 double current_throughput{0.0};
231 std::unordered_map<std::string, throughput_tracker> throughput_trackers_;
234 std::vector<metric> collect_from_adapter();
235 std::vector<metric> collect_from_sources();
236 void add_source_metrics(std::vector<metric>& metrics,
const std::string& source_name,
237 const logging_stats& stats);
238 void perform_pattern_analysis();
239 void update_level_distribution(
const logging_stats& stats);
240 void update_throughput_tracking(
const std::string& source_name,
const logging_stats& stats);
241 metric create_metric(
const std::string& name,
double value,
const std::string& source_name,
242 const std::string& unit =
"")
const;
243 void subscribe_to_events();
244 void handle_logging_event(
const logging_metric_event& event);
251class log_anomaly_detector {
253 enum class anomaly_type {
259 performance_degradation
264 std::string description;
265 double severity_score{0.0};
266 std::unordered_map<std::string, std::string> details;
267 std::chrono::steady_clock::time_point detected_at;
270 struct detection_config {
272 double volume_spike_threshold{2.0};
273 double volume_drop_threshold{0.1};
274 size_t volume_window_seconds{300};
277 double error_spike_threshold{3.0};
278 size_t error_window_seconds{60};
281 bool enable_pattern_detection{
true};
282 double pattern_confidence_threshold{0.8};
285 double latency_spike_threshold{2.0};
288 explicit log_anomaly_detector(
const detection_config& config = {});
296 std::vector<anomaly> detect_anomalies(
const logging_stats& stats,
const std::string& source_name);
303 void train(
const logging_stats& stats,
const std::string& source_name);
309 void update_config(
const detection_config& config);
315 detection_config get_config()
const;
323 std::vector<anomaly> get_anomaly_history(
const std::optional<std::string>& source_name = std::nullopt,
324 size_t max_count = 100)
const;
332 mutable std::mutex config_mutex_;
333 detection_config config_;
336 struct baseline_stats {
337 double average_volume{0.0};
338 double volume_std_dev{0.0};
339 double average_error_rate{0.0};
340 double error_rate_std_dev{0.0};
341 double average_latency{0.0};
342 double latency_std_dev{0.0};
343 size_t sample_count{0};
345 mutable std::mutex baseline_mutex_;
346 std::unordered_map<std::string, baseline_stats> baselines_;
349 struct historical_point {
351 std::chrono::steady_clock::time_point timestamp;
353 mutable std::mutex history_mutex_;
354 std::unordered_map<std::string, std::deque<historical_point>> source_histories_;
355 const size_t max_history_points_{1000};
358 std::vector<anomaly> anomaly_history_;
359 const size_t max_anomaly_history_{1000};
362 void detect_volume_anomalies(std::vector<anomaly>& anomalies,
const logging_stats& stats,
363 const std::string& source_name);
364 void detect_error_anomalies(std::vector<anomaly>& anomalies,
const logging_stats& stats,
365 const std::string& source_name);
366 void detect_performance_anomalies(std::vector<anomaly>& anomalies,
const logging_stats& stats,
367 const std::string& source_name);
368 void update_baseline(baseline_stats& baseline,
const logging_stats& stats);
369 double calculate_zscore(
double value,
double mean,
double std_dev)
const;
376class log_storage_optimizer {
378 struct storage_config {
380 std::unordered_map<log_level, std::chrono::hours> retention_by_level{
381 {log_level::trace, std::chrono::hours(1)},
382 {log_level::debug, std::chrono::hours(24)},
383 {log_level::info, std::chrono::hours(24 * 7)},
384 {log_level::warning, std::chrono::hours(24 * 30)},
385 {log_level::error, std::chrono::hours(24 * 90)},
386 {log_level::critical, std::chrono::hours(24 * 365)},
387 {log_level::fatal, std::chrono::hours(24 * 365)}
391 bool enable_compression{
true};
392 size_t compression_threshold_bytes{1024 * 1024};
396 bool enable_archival{
true};
397 std::chrono::hours archive_after_hours{24};
398 std::string archive_location{
"/var/log/archive"};
401 size_t max_storage_bytes{1024 * 1024 * 1024};
402 double storage_warn_threshold{0.8};
405 struct optimization_recommendation {
408 double expected_savings_bytes{0.0};
409 double priority_score{0.0};
412 explicit log_storage_optimizer(
const storage_config& config = {});
419 std::vector<optimization_recommendation> analyze_storage(
const logging_stats& stats);
427 std::unordered_map<log_level, std::chrono::hours> calculate_optimal_retention(
428 const std::unordered_map<log_level, size_t>& level_distribution,
429 size_t available_storage);
437 size_t estimate_storage_requirements(
const logging_stats& stats,
size_t forecast_days);
443 void update_config(
const storage_config& config);
449 storage_config get_config()
const;
452 mutable std::mutex config_mutex_;
453 storage_config config_;
455 double calculate_compression_ratio(
const logging_stats& stats)
const;
456 size_t calculate_retention_size(log_level level,
size_t daily_volume, std::chrono::hours retention)
const;
457 double calculate_priority_score(
size_t savings_bytes,
double urgency)
const;
Plugin interface for metric collectors.
Lightweight event bus implementation for monitoring system.
Common event type definitions for monitoring system.
Consolidated logger system adapters for monitoring_system.
compression_algorithm
Compression algorithms.
@ warning
Warning condition, may require attention.
@ info
Informational, no action required.