varz.h
1 // Copyright 2020, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 #pragma once
5 
6 #include "absl/container/flat_hash_map.h"
7 #include "absl/strings/string_view.h"
8 #include "base/arena.h"
9 #include "util/stats/varz_node.h"
10 #include "util/uring/sliding_counter.h"
11 
12 #define DEFINE_VARZ(type, name) ::util::uring::type name(#name)
13 
14 namespace util {
15 namespace uring {
16 
17 class VarzQps : public VarzListNode {
18  public:
19  explicit VarzQps(const char* varname) : VarzListNode(varname) {
20  }
21 
22  void Init(ProactorPool* pp) {
23  val_.Init(pp);
24  }
25 
26  void Inc() {
27  val_.Inc();
28  }
29 
30  private:
31  virtual AnyValue GetData() const override;
32 
33  using Counter = SlidingCounter<7>;
34 
35  // 7-seconds window. We gather data based on the fully filled 6.
36  Counter val_;
37 };
38 
39 class VarzMapAverage : public VarzListNode {
41  using SumCnt = std::pair<Counter, Counter>;
42  using Map = absl::flat_hash_map<absl::string_view, SumCnt>;
43 
44  public:
45  explicit VarzMapAverage(const char* varname) : VarzListNode(varname) {
46  }
47  ~VarzMapAverage();
48 
49  void Init(ProactorPool* pp);
50 
51  void IncBy(absl::string_view key, int32_t delta) {
52  auto& map = avg_map_[ProactorThreadIndex()];
53  auto it = map.find(key);
54  if (it == map.end()) {
55  it = FindSlow(key);
56  }
57  Inc(delta, &it->second);
58  }
59 
60  private:
61  void Inc(int32_t delta, SumCnt* dest) {
62  dest->first.IncBy(delta);
63  dest->second.Inc();
64  }
65 
66  virtual AnyValue GetData() const override;
67  unsigned ProactorThreadIndex() const;
68  Map::iterator FindSlow(absl::string_view key);
69 
70  ProactorPool* pp_ = nullptr;
71  std::unique_ptr<Map[]> avg_map_;
72 };
73 
74 } // namespace uring
75 } // namespace util
Sliding window data structure that can aggregate moving statistics. It's implmented using ring-buffer...