xref: /aosp_15_r20/external/pytorch/c10/util/Gauge.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #pragma once
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker #include <memory>
4*da0073e9SAndroid Build Coastguard Worker #include <string_view>
5*da0073e9SAndroid Build Coastguard Worker 
6*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Macros.h>
7*da0073e9SAndroid Build Coastguard Worker #include <c10/util/SmallVector.h>
8*da0073e9SAndroid Build Coastguard Worker 
9*da0073e9SAndroid Build Coastguard Worker namespace c10::monitor {
10*da0073e9SAndroid Build Coastguard Worker namespace detail {
11*da0073e9SAndroid Build Coastguard Worker 
12*da0073e9SAndroid Build Coastguard Worker class GaugeImpl;
13*da0073e9SAndroid Build Coastguard Worker 
14*da0073e9SAndroid Build Coastguard Worker class GaugeBackendIf {
15*da0073e9SAndroid Build Coastguard Worker  public:
16*da0073e9SAndroid Build Coastguard Worker   virtual ~GaugeBackendIf() = default;
17*da0073e9SAndroid Build Coastguard Worker   virtual void record(int64_t value) noexcept = 0;
18*da0073e9SAndroid Build Coastguard Worker };
19*da0073e9SAndroid Build Coastguard Worker 
20*da0073e9SAndroid Build Coastguard Worker class GaugeBackendFactoryIf {
21*da0073e9SAndroid Build Coastguard Worker  public:
22*da0073e9SAndroid Build Coastguard Worker   virtual ~GaugeBackendFactoryIf() = default;
23*da0073e9SAndroid Build Coastguard Worker 
24*da0073e9SAndroid Build Coastguard Worker   // May return nullptr if the gauge will be ignored by the given backend.
25*da0073e9SAndroid Build Coastguard Worker   virtual std::unique_ptr<GaugeBackendIf> create(
26*da0073e9SAndroid Build Coastguard Worker       std::string_view key) noexcept = 0;
27*da0073e9SAndroid Build Coastguard Worker };
28*da0073e9SAndroid Build Coastguard Worker 
29*da0073e9SAndroid Build Coastguard Worker void C10_API registerGaugeBackend(std::unique_ptr<GaugeBackendFactoryIf>);
30*da0073e9SAndroid Build Coastguard Worker } // namespace detail
31*da0073e9SAndroid Build Coastguard Worker 
32*da0073e9SAndroid Build Coastguard Worker // A handle to a Gauge.
33*da0073e9SAndroid Build Coastguard Worker class C10_API GaugeHandle {
34*da0073e9SAndroid Build Coastguard Worker  public:
35*da0073e9SAndroid Build Coastguard Worker   explicit GaugeHandle(std::string_view key);
36*da0073e9SAndroid Build Coastguard Worker   void record(int64_t value);
37*da0073e9SAndroid Build Coastguard Worker 
38*da0073e9SAndroid Build Coastguard Worker  private:
39*da0073e9SAndroid Build Coastguard Worker   detail::GaugeImpl& impl_;
40*da0073e9SAndroid Build Coastguard Worker };
41*da0073e9SAndroid Build Coastguard Worker 
42*da0073e9SAndroid Build Coastguard Worker } // namespace c10::monitor
43*da0073e9SAndroid Build Coastguard Worker 
44*da0073e9SAndroid Build Coastguard Worker #define STATIC_GAUGE(_key)                            \
45*da0073e9SAndroid Build Coastguard Worker   []() -> ::c10::monitor::GaugeHandle& {              \
46*da0073e9SAndroid Build Coastguard Worker     static ::c10::monitor::GaugeHandle handle(#_key); \
47*da0073e9SAndroid Build Coastguard Worker     return handle;                                    \
48*da0073e9SAndroid Build Coastguard Worker   }()
49