#include "MetricsObserver.hpp" namespace matador::test { MetricsObserver::MetricsObserver(utils::message_bus& bus) { subscriptions.push_back(bus.subscribe([this](const sql::statement_lock_failed_event &ev) { std::lock_guard lock(mutex_); lock_failure_count_++; total_lock_wait_time_ += ev.duration; })); subscriptions.push_back(bus.subscribe([this](const sql::statement_execution_event &ev) { std::lock_guard lock(mutex_); execution_count_++; total_execution_time_ += ev.duration; })); } std::chrono::milliseconds MetricsObserver::get_average_lock_wait_time() const { std::lock_guard lock(mutex_); if (lock_failure_count_ == 0) { return std::chrono::milliseconds{0}; } const auto millis = std::chrono::duration_cast(total_lock_wait_time_); return std::chrono::milliseconds(millis.count() / lock_failure_count_); } std::chrono::milliseconds MetricsObserver::get_average_execution_time() const { std::lock_guard lock(mutex_); if (execution_count_ == 0) { return std::chrono::milliseconds{0}; } const auto millis = std::chrono::duration_cast(total_execution_time_); return std::chrono::milliseconds(millis.count() / execution_count_); } std::chrono::milliseconds MetricsObserver::get_total_lock_wait_time() const { std::lock_guard lock(mutex_); return std::chrono::duration_cast(total_lock_wait_time_); } std::chrono::milliseconds MetricsObserver::get_total_execution_time() const { std::lock_guard lock(mutex_); return std::chrono::duration_cast(total_execution_time_); } size_t MetricsObserver::get_lock_failure_count() const { std::lock_guard lock(mutex_); return lock_failure_count_; } }