5 #include "util/stats/varz_stats.h" 7 #include "base/walltime.h" 8 #include "strings/strcat.h" 9 #include "strings/stringprintf.h" 12 using strings::AsString;
16 auto VarzMapCount::ReadLockAndFindOrInsert(StringPiece key) -> Map::iterator {
17 rw_spinlock_.lock_shared();
18 auto it = map_counts_.find(key);
19 if (it != map_counts_.end())
22 rw_spinlock_.unlock_shared();
25 auto res = map_counts_.emplace(key, base::atomic_wrapper<long>(0));
26 rw_spinlock_.unlock_and_lock_shared();
30 void VarzMapCount::IncBy(StringPiece key, int32 delta) {
32 LOG(DFATAL) <<
"Empty varz key";
40 auto it = ReadLockAndFindOrInsert(key);
41 it->second.fetch_add(delta, std::memory_order_relaxed);
42 rw_spinlock_.unlock_shared();
45 void VarzMapCount::Set(StringPiece key, int32 value) {
47 LOG(DFATAL) <<
"Empty varz key";
51 auto it = ReadLockAndFindOrInsert(key);
52 it->second.store(value, std::memory_order_relaxed);
53 rw_spinlock_.unlock_shared();
56 VarzValue VarzMapCount::GetData()
const {
58 rw_spinlock_.lock_shared();
59 for (
const auto& k_v : map_counts_) {
60 result.emplace_back(AsString(k_v.first), VarzValue::FromInt(k_v.second));
62 rw_spinlock_.unlock_shared();
63 typedef AnyValue::Map::value_type vt;
64 std::sort(result.begin(), result.end(),
65 [](
const vt& l,
const vt& r) {
return l.first < r.first; });
67 return AnyValue{std::move(result)};
70 VarzValue VarzMapAverage5m::GetData()
const {
71 std::lock_guard<std::mutex> lock(mutex_);
74 for (
const auto& k_v : avg_) {
76 int64 count = k_v.second.second.Sum();
77 int64 sum = k_v.second.first.Sum();
78 items.emplace_back(
"count", VarzValue::FromInt(count));
79 items.emplace_back(
"sum", VarzValue::FromInt(sum));
81 double avg = count > 0 ? double(sum) / count : 0;
82 items.emplace_back(
"average", VarzValue::FromDouble(avg));
84 result.emplace_back(AsString(k_v.first), AnyValue(items));
87 return AnyValue{std::move(result)};
90 void VarzMapAverage5m::IncBy(StringPiece key, int32 delta) {
91 std::lock_guard<std::mutex> lock(mutex_);
92 auto& val = avg_[key];
93 val.first.IncBy(delta);
97 VarzValue VarzCount::GetData()
const {
98 return VarzValue::FromInt(val_.load());
101 VarzValue VarzQps::GetData()
const {
102 return VarzValue::FromInt(val_.Get());
105 VarzValue VarzFunction::GetData()
const {
106 AnyValue::Map result = cb_();
107 return AnyValue(result);