44#include <kcenon/common/interfaces/logger_interface.h>
55#include <shared_mutex>
57#include <unordered_set>
63using log_level = common::interfaces::log_level;
73 enum class type : std::uint8_t {
179 auto now = std::chrono::system_clock::now();
185 if (entry.
level == log_level::error ||
186 entry.
level == log_level::fatal) {
200 (entry.
level == log_level::error ||
201 entry.
level == log_level::fatal)) {
221 patterns_.emplace_back(pattern, min_level);
233 return alert.pattern == pattern;
368 std::chrono::system_clock::time_point now) {
375 if (entry.
level == log_level::error ||
376 entry.
level == log_level::fatal) {
387 if (entry.
level == log_level::error ||
388 entry.
level == log_level::fatal) {
394 std::chrono::system_clock::time_point cutoff) {
395 while (!window.empty() && window.front().timestamp < cutoff) {
401 if (window.empty())
return 0.0;
403 auto duration = std::chrono::duration_cast<std::chrono::seconds>(
405 if (duration == 0) duration = 60;
407 return static_cast<double>(window.size()) * 60.0 / duration;
411 std::chrono::system_clock::time_point now) {
435 event.detected_at = now;
436 event.description =
"Error spike detected: " +
437 std::to_string(
static_cast<size_t>(current_rate)) +
438 " errors/minute (threshold: " +
440 event.current_count =
static_cast<size_t>(current_rate);
455 std::chrono::system_clock::time_point now) {
460 if (
static_cast<int>(entry.
level) <
static_cast<int>(alert.min_level)) {
465 if (std::regex_search(entry.
message, alert.compiled_pattern)) {
470 event.detected_at = now;
471 event.pattern = alert.pattern;
472 event.description =
"Pattern '" + alert.pattern +
473 "' matched in log message: " + entry.
message;
474 event.related_entries.push_back(entry);
504 event.detected_at = now;
505 event.description =
"High log rate detected: " +
506 std::to_string(
static_cast<size_t>(current_rate)) +
507 " logs/minute (threshold: " +
509 event.current_count =
static_cast<size_t>(current_rate);
521 event.detected_at = now;
522 event.description =
"Low log rate detected: " +
523 std::to_string(
static_cast<size_t>(current_rate)) +
524 " logs/minute (threshold: " +
526 event.current_count =
static_cast<size_t>(current_rate);
535 std::chrono::system_clock::time_point now) {
554 event.detected_at = now;
555 event.description =
"New error type detected: " + entry.
message;
556 event.related_entries.push_back(entry);
564 std::string normalized = std::regex_replace(message,
565 std::regex(R
"(\d+)"), "N");
568 normalized = std::regex_replace(normalized,
569 std::regex(R
"(0x[0-9a-fA-F]+)"), "HEX");
572 normalized = std::regex_replace(normalized,
573 std::regex(R
"([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})"),
580 const std::deque<timestamped_entry>& window)
const {
582 for (
auto it = window.rbegin();
585 event.related_entries.push_back(it->entry);
645 return std::make_unique<realtime_log_analyzer>();
652 static std::unique_ptr<realtime_log_analyzer>
create(
654 return std::make_unique<realtime_log_analyzer>(config);
663 size_t error_threshold = 50,
673 auto analyzer = std::make_unique<realtime_log_analyzer>(config);
675 analyzer->set_anomaly_callback(std::move(callback));
Factory for creating configured realtime log analyzers.
static std::unique_ptr< realtime_log_analyzer > create(const realtime_analysis_config &config)
Create a realtime analyzer with custom configuration.
static std::unique_ptr< realtime_log_analyzer > create_production(size_t error_threshold=50, realtime_log_analyzer::anomaly_callback callback=nullptr)
Create a production-ready analyzer with sensible defaults.
static std::unique_ptr< realtime_log_analyzer > create_basic()
Create a basic realtime analyzer with default settings.
Real-time log analyzer with anomaly detection.
bool remove_pattern_alert(const std::string &pattern)
Remove a pattern alert.
void collect_related_entries(anomaly_event &event, const std::deque< timestamped_entry > &window) const
std::deque< timestamped_entry > error_window_
std::chrono::system_clock::time_point last_rate_check_
double get_log_rate() const
Get current log rate (logs per minute)
std::atomic< size_t > total_errors_
std::deque< timestamped_entry > log_window_
void reset()
Reset all statistics and tracked state.
void check_rate_anomaly(std::chrono::system_clock::time_point now)
void set_config(const realtime_analysis_config &config)
Set the configuration.
double calculate_rate(const std::deque< timestamped_entry > &window) const
std::atomic< size_t > error_spikes_
double get_error_rate() const
Get current error rate (errors per minute)
realtime_log_analyzer(const realtime_analysis_config &config)
Constructor with configuration.
statistics get_statistics() const
std::shared_mutex window_mutex_
void set_error_spike_threshold(size_t errors_per_minute)
Set error spike threshold.
std::shared_mutex rate_limit_mutex_
std::unordered_set< std::string > known_errors_
std::shared_mutex stats_mutex_
std::atomic< size_t > anomalies_detected_
void clear_pattern_alerts()
Clear all pattern alerts.
void add_to_window(const analyzed_log_entry &entry, std::chrono::system_clock::time_point now)
void set_track_new_errors(bool enable)
Enable or disable new error tracking.
const realtime_analysis_config & get_config() const
Get the configuration.
std::atomic< size_t > pattern_matches_
std::atomic< size_t > total_analyzed_
anomaly_callback callback_
void check_pattern_alerts(const analyzed_log_entry &entry, std::chrono::system_clock::time_point now)
std::atomic< size_t > rate_anomalies_
static std::string normalize_error_message(const std::string &message)
realtime_analysis_config config_
void add_pattern_alert(const std::string &pattern, log_level min_level)
Add a pattern-based alert.
std::deque< double > baseline_rates_
std::atomic< size_t > new_error_types_
std::shared_mutex callback_mutex_
std::shared_mutex patterns_mutex_
void check_new_error_type(const analyzed_log_entry &entry, std::chrono::system_clock::time_point now)
realtime_log_analyzer()=default
Default constructor.
void check_error_spike(const analyzed_log_entry &entry, std::chrono::system_clock::time_point now)
void notify_anomaly(const anomaly_event &event)
void analyze(const analyzed_log_entry &entry)
Analyze a log entry in real-time.
std::function< void(const anomaly_event &)> anomaly_callback
Callback type for anomaly notifications.
std::shared_mutex errors_mutex_
void set_anomaly_callback(anomaly_callback cb)
Set the anomaly callback.
std::chrono::system_clock::time_point last_spike_alert_
std::vector< pattern_alert > patterns_
void set_rate_thresholds(size_t high_threshold, size_t low_threshold=0)
Set rate anomaly thresholds.
static void cleanup_window(std::deque< timestamped_entry > &window, std::chrono::system_clock::time_point cutoff)
Log analysis and metrics functionality.
common::interfaces::log_level log_level
Represents an anomaly event detected during real-time analysis.
std::vector< analyzed_log_entry > related_entries
Log entries related to this anomaly.
std::chrono::system_clock::time_point detected_at
When the anomaly was detected.
std::string description
Human-readable description.
type
Type of anomaly detected.
@ rate_anomaly
Unusual log rate (too high or too low)
@ error_spike
Sudden increase in errors.
@ pattern_match
Configured pattern detected.
@ new_error_type
Previously unseen error message.
size_t threshold
Threshold that was exceeded.
size_t current_count
Current count (for spike/rate anomalies)
std::string pattern
Pattern that triggered (for pattern_match)
type anomaly_type
Type of the anomaly.
Pattern alert configuration.
log_level min_level
Minimum log level to trigger.
std::regex compiled_pattern
Pre-compiled regex for efficiency.
std::string pattern
Regex pattern to match.
pattern_alert(const std::string &p, log_level level)
Configuration for real-time log analysis.
bool enable_rate_anomaly_detection
Enable rate anomaly detection.
size_t error_spike_threshold
Errors per minute to trigger spike alert.
size_t max_related_entries
Max entries to store per anomaly.
size_t rate_anomaly_low_threshold
Logs per minute considered low (0 = disabled)
double rate_deviation_factor
Factor for dynamic rate anomaly detection.
std::chrono::seconds baseline_duration
Duration for baseline rate calculation.
size_t rate_anomaly_high_threshold
Logs per minute considered high.
bool track_new_errors
Enable new error type detection.
std::chrono::seconds window_duration
Sliding window duration for rate calculation.
double current_error_rate
size_t anomalies_detected
std::chrono::system_clock::time_point timestamp