63 while (wait_time_us < current_min &&
65 std::memory_order_relaxed)) {}
68 while (wait_time_us > current_max &&
70 std::memory_order_relaxed)) {}
80 timeouts.fetch_add(1, std::memory_order_relaxed);
88 uint64_t new_active =
current_active.fetch_add(delta, std::memory_order_relaxed) + delta;
91 uint64_t current_peak =
peak_active.load(std::memory_order_relaxed);
92 while (new_active > current_peak &&
93 !
peak_active.compare_exchange_weak(current_peak, new_active,
94 std::memory_order_relaxed)) {}
102 uint64_t new_queued =
current_queued.fetch_add(delta, std::memory_order_relaxed) + delta;
105 uint64_t current_peak =
peak_queued.load(std::memory_order_relaxed);
106 while (new_queued > current_peak &&
107 !
peak_queued.compare_exchange_weak(current_peak, new_queued,
108 std::memory_order_relaxed)) {}
117 if (removed_connections > 0) {
128 if (total == 0)
return 0.0;
131 return static_cast<double>(total_wait) /
static_cast<double>(total);
140 if (total == 0)
return 100.0;
143 return (
static_cast<double>(successful) /
static_cast<double>(total)) * 100.0;
153 timeouts.store(0, std::memory_order_relaxed);
168#ifdef USE_THREAD_SYSTEM
176template<
typename PriorityType>
177struct priority_metrics :
public pool_metrics {
178 using priority_type = PriorityType;
181 std::map<PriorityType, std::atomic<uint64_t>> acquisitions_by_priority;
182 std::map<PriorityType, std::atomic<uint64_t>> wait_time_by_priority;
184 mutable std::mutex map_mutex;
192 void record_acquisition_with_priority(PriorityType priority, uint64_t wait_time_us,
bool success) {
194 record_acquisition(wait_time_us, success);
198 std::lock_guard<std::mutex> lock(map_mutex);
201 if (acquisitions_by_priority.find(priority) == acquisitions_by_priority.end()) {
202 acquisitions_by_priority[priority].store(0, std::memory_order_relaxed);
203 wait_time_by_priority[priority].store(0, std::memory_order_relaxed);
206 acquisitions_by_priority[priority].fetch_add(1, std::memory_order_relaxed);
207 wait_time_by_priority[priority].fetch_add(wait_time_us, std::memory_order_relaxed);
216 double average_wait_time_for_priority(PriorityType priority)
const {
217 std::lock_guard<std::mutex> lock(map_mutex);
219 auto acq_it = acquisitions_by_priority.find(priority);
220 auto wait_it = wait_time_by_priority.find(priority);
222 if (acq_it == acquisitions_by_priority.end() || wait_it == wait_time_by_priority.end()) {
226 uint64_t count = acq_it->second.load(std::memory_order_relaxed);
227 if (count == 0)
return 0.0;
229 uint64_t total_wait = wait_it->second.load(std::memory_order_relaxed);
230 return static_cast<double>(total_wait) /
static_cast<double>(count);
237 pool_metrics::reset();
239 std::lock_guard<std::mutex> lock(map_mutex);
240 for (
auto& [priority, counter] : acquisitions_by_priority) {
241 counter.store(0, std::memory_order_relaxed);
243 for (
auto& [priority, wait_time] : wait_time_by_priority) {
244 wait_time.store(0, std::memory_order_relaxed);
Performance metrics for connection pools.
std::atomic< uint64_t > min_wait_time_us
void reset()
Reset all metrics.
std::atomic< uint64_t > current_queued
void update_active(int delta)
Update current active connection count.
std::atomic< uint64_t > peak_queued
std::atomic< uint64_t > total_wait_time_us
std::atomic< uint64_t > timeouts
std::atomic< uint64_t > current_active
std::atomic< uint64_t > max_wait_time_us
double average_wait_time_us() const
Calculate average wait time.
void update_queued(int delta)
Update current queued request count.
std::atomic< uint64_t > successful_acquisitions
std::atomic< uint64_t > total_acquisitions
void record_health_check(uint64_t removed_connections=0)
Record a health check operation.
std::atomic< uint64_t > peak_active
void record_timeout()
Record a timeout event.
std::atomic< uint64_t > failed_acquisitions
void record_acquisition(uint64_t wait_time_us, bool success)
Record a connection acquisition.
std::atomic< uint64_t > health_checks_performed
std::atomic< uint64_t > unhealthy_connections_removed
double success_rate() const
Calculate success rate.