123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #pragma once
- #include "prometheus/metric.h"
- #include "prometheus/family.h"
- #include <chrono>
- namespace prometheus {
- class Benchmark : public Metric {
- #ifndef NDEBUG
- bool already_started = false;
- #endif
- std::chrono::time_point<std::chrono::high_resolution_clock> start_;
- std::chrono::time_point<std::chrono::high_resolution_clock>::duration elapsed = std::chrono::time_point<std::chrono::high_resolution_clock>::duration::zero(); // elapsed time
- public:
- using Value = double;
- using Family = CustomFamily<Benchmark>;
- static const Metric::Type static_type = Metric::Type::Counter;
- Benchmark() : Metric(Metric::Type::Counter) {}
- void start() {
- #ifndef NDEBUG
- if (already_started)
- throw std::runtime_error("try to start already started counter");
- else
- already_started = true;
- #endif
- start_ = std::chrono::high_resolution_clock::now();
- }
- void stop() {
- #ifndef NDEBUG
- if (already_started == false)
- throw std::runtime_error("try to stop already stoped counter");
- #endif
- std::chrono::time_point<std::chrono::high_resolution_clock> stop;
- stop = std::chrono::high_resolution_clock::now();
- elapsed += stop - start_;
- #ifndef NDEBUG
- already_started = false;
- #endif
- }
- double Get() const {
- return std::chrono::duration_cast<std::chrono::duration<double>>(elapsed).count();
- }
- virtual ClientMetric Collect() const {
- ClientMetric metric;
- metric.counter.value = Get();
- return metric;
- }
- };
- } // namespace prometheus
|