290 std::chrono::microseconds duration,
291 bool failed) noexcept;
302 LIGHTWEIGHT_API
void RecordRowsFetched(std::uint64_t rowCount,
bool wasBlockFetch) noexcept;
305 LIGHTWEIGHT_API
void RecordConnectionOpened() noexcept;
308 LIGHTWEIGHT_API
void RecordConnectionClosed() noexcept;
315 LIGHTWEIGHT_API
void RecordPoolAcquire(std::chrono::microseconds waitDuration,
bool reused,
bool waited) noexcept;
320 LIGHTWEIGHT_API
void RecordPoolRelease(
bool discarded) noexcept;
326 LIGHTWEIGHT_API
void RecordPoolOccupancy(std::uint64_t idle, std::uint64_t checkedOut) noexcept;
335 LIGHTWEIGHT_API
void Reset() noexcept;
340 LIGHTWEIGHT_API static
void Enable() noexcept;
344 LIGHTWEIGHT_API static
void Disable() noexcept;
350 [[nodiscard]] LIGHTWEIGHT_API static
bool IsEnabled() noexcept;
354 struct AtomicHistogram
356 std::array<std::atomic<std::uint64_t>, SqlLatencyHistogram::BucketCount> buckets {};
357 std::atomic<std::uint64_t> count {};
358 std::atomic<std::uint64_t> totalMicroseconds {};
359 std::atomic<std::uint64_t> minMicroseconds { (std::numeric_limits<std::uint64_t>::max)() };
360 std::atomic<std::uint64_t> maxMicroseconds {};
362 void Record(std::uint64_t microseconds)
noexcept;
364 void Reset()
noexcept;
368 struct AtomicOperation
370 std::atomic<std::uint64_t> succeeded {};
371 std::atomic<std::uint64_t> failed {};
372 std::atomic<std::uint64_t> retried {};
373 AtomicHistogram latency {};
376 std::array<AtomicOperation, static_cast<std::size_t>(SqlStatisticsOperation::Count)> _operations {};
378 std::atomic<std::uint64_t> _poolAcquired {};
379 std::atomic<std::uint64_t> _poolReused {};
380 std::atomic<std::uint64_t> _poolWaited {};
381 std::atomic<std::uint64_t> _poolReleased {};
382 std::atomic<std::uint64_t> _poolDiscarded {};
383 std::atomic<std::uint64_t> _poolIdle {};
384 std::atomic<std::uint64_t> _poolCheckedOut {};
385 AtomicHistogram _poolWaitLatency {};
387 std::atomic<std::uint64_t> _connectionsOpened {};
388 std::atomic<std::uint64_t> _connectionsClosed {};
389 std::atomic<std::uint64_t> _rowsFetched {};
390 std::atomic<std::uint64_t> _blockFetches {};
397 [[nodiscard]]
static std::atomic<bool>& EnabledFlag() noexcept;
417 _operation { operation },
418 _startedAt { std::chrono::steady_clock::now() },
419 _uncaughtOnEntry { std::uncaught_exceptions() }
423 SqlStatisticsScope(SqlStatisticsScope
const&) =
delete;
424 SqlStatisticsScope& operator=(SqlStatisticsScope
const&) =
delete;
425 SqlStatisticsScope(SqlStatisticsScope&&) =
delete;
426 SqlStatisticsScope& operator=(SqlStatisticsScope&&) =
delete;
428 ~SqlStatisticsScope()
431 std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - _startedAt);
435 auto const failed = _failed || std::uncaught_exceptions() > _uncaughtOnEntry;
436 SqlStatistics::Instance().RecordOperation(_operation, elapsed, failed);
448 SqlStatistics::Instance().RecordRetry(_operation);
453 std::chrono::steady_clock::time_point _startedAt;
454 int _uncaughtOnEntry;
455 bool _failed =
false;