Coverage Report

Created: 2026-09-28 17:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/cloud/src/common/bvars.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <aws/core/external/cjson/cJSON.h>
21
#include <bthread/bthread.h>
22
#include <bthread/condition_variable.h>
23
#include <bthread/mutex.h>
24
#include <bthread/unstable.h>
25
#include <bvar/bvar.h>
26
#include <bvar/latency_recorder.h>
27
#include <bvar/multi_dimension.h>
28
#include <bvar/passive_status.h>
29
#include <bvar/reducer.h>
30
#include <bvar/status.h>
31
#include <cpp/sync_point.h>
32
#include <gmock/gmock-actions.h>
33
34
#include <cstdint>
35
#include <initializer_list>
36
#include <map>
37
#include <memory>
38
#include <mutex>
39
#include <string>
40
#include <type_traits>
41
#include <utility>
42
#include <vector>
43
44
#include "common/logging.h"
45
46
/**
47
 * Manage bvars that with similar names (identical prefix)
48
 * ${module}_${name}_${tag}
49
 * where `tag` is added automatically when calling `get` or `put`
50
 */
51
template <typename Bvar, bool is_status = false>
52
class BvarWithTag {
53
public:
54
    BvarWithTag(std::string module, std::string name)
55
3.64k
            : module_(std::move(module)), name_(std::move(name)) {}
_ZN11BvarWithTagIN4bvar15LatencyRecorderELb0EEC2ENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_
Line
Count
Source
55
2.52k
            : module_(std::move(module)), name_(std::move(name)) {}
_ZN11BvarWithTagIN4bvar6StatusIlvEELb1EEC2ENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_
Line
Count
Source
55
1.12k
            : module_(std::move(module)), name_(std::move(name)) {}
56
57
    template <typename ValType>
58
        requires std::is_integral_v<ValType>
59
197k
    void put(const std::string& tag, ValType value) {
60
197k
        std::shared_ptr<Bvar> instance = nullptr;
61
197k
        {
62
197k
            std::lock_guard<bthread::Mutex> l(mutex_);
63
197k
            auto it = bvar_map_.find(tag);
64
197k
            if (it == bvar_map_.end()) {
65
1.38k
                instance = std::make_shared<Bvar>(module_, name_ + "_" + tag, ValType());
66
1.38k
                bvar_map_[tag] = instance;
67
195k
            } else {
68
195k
                instance = it->second;
69
195k
            }
70
197k
        }
71
        // FIXME(gavin): check bvar::Adder and more
72
197k
        if constexpr (std::is_same_v<Bvar, bvar::LatencyRecorder>) {
73
196k
            (*instance) << value;
74
196k
        } else if constexpr (is_status) {
75
312
            instance->set_value(value);
76
        } else {
77
            // This branch mean to be unreachable, add an assert(false) here to
78
            // prevent missing branch match.
79
            // Postpone deduction of static_assert by evaluating sizeof(T)
80
            static_assert(!sizeof(Bvar), "all types must be matched with if constexpr");
81
        }
82
197k
    }
_ZN11BvarWithTagIN4bvar15LatencyRecorderELb0EE3putIlQsr3stdE13is_integral_vITL0__EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_
Line
Count
Source
59
196k
    void put(const std::string& tag, ValType value) {
60
196k
        std::shared_ptr<Bvar> instance = nullptr;
61
196k
        {
62
196k
            std::lock_guard<bthread::Mutex> l(mutex_);
63
196k
            auto it = bvar_map_.find(tag);
64
196k
            if (it == bvar_map_.end()) {
65
1.20k
                instance = std::make_shared<Bvar>(module_, name_ + "_" + tag, ValType());
66
1.20k
                bvar_map_[tag] = instance;
67
195k
            } else {
68
195k
                instance = it->second;
69
195k
            }
70
196k
        }
71
        // FIXME(gavin): check bvar::Adder and more
72
196k
        if constexpr (std::is_same_v<Bvar, bvar::LatencyRecorder>) {
73
196k
            (*instance) << value;
74
        } else if constexpr (is_status) {
75
            instance->set_value(value);
76
        } else {
77
            // This branch mean to be unreachable, add an assert(false) here to
78
            // prevent missing branch match.
79
            // Postpone deduction of static_assert by evaluating sizeof(T)
80
            static_assert(!sizeof(Bvar), "all types must be matched with if constexpr");
81
        }
82
196k
    }
_ZN11BvarWithTagIN4bvar6StatusIlvEELb1EE3putIlQsr3stdE13is_integral_vITL0__EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_
Line
Count
Source
59
277
    void put(const std::string& tag, ValType value) {
60
277
        std::shared_ptr<Bvar> instance = nullptr;
61
277
        {
62
277
            std::lock_guard<bthread::Mutex> l(mutex_);
63
277
            auto it = bvar_map_.find(tag);
64
277
            if (it == bvar_map_.end()) {
65
164
                instance = std::make_shared<Bvar>(module_, name_ + "_" + tag, ValType());
66
164
                bvar_map_[tag] = instance;
67
164
            } else {
68
113
                instance = it->second;
69
113
            }
70
277
        }
71
        // FIXME(gavin): check bvar::Adder and more
72
        if constexpr (std::is_same_v<Bvar, bvar::LatencyRecorder>) {
73
            (*instance) << value;
74
277
        } else if constexpr (is_status) {
75
277
            instance->set_value(value);
76
        } else {
77
            // This branch mean to be unreachable, add an assert(false) here to
78
            // prevent missing branch match.
79
            // Postpone deduction of static_assert by evaluating sizeof(T)
80
            static_assert(!sizeof(Bvar), "all types must be matched with if constexpr");
81
        }
82
277
    }
_ZN11BvarWithTagIN4bvar6StatusIlvEELb1EE3putImQsr3stdE13is_integral_vITL0__EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_
Line
Count
Source
59
11
    void put(const std::string& tag, ValType value) {
60
11
        std::shared_ptr<Bvar> instance = nullptr;
61
11
        {
62
11
            std::lock_guard<bthread::Mutex> l(mutex_);
63
11
            auto it = bvar_map_.find(tag);
64
11
            if (it == bvar_map_.end()) {
65
11
                instance = std::make_shared<Bvar>(module_, name_ + "_" + tag, ValType());
66
11
                bvar_map_[tag] = instance;
67
11
            } else {
68
0
                instance = it->second;
69
0
            }
70
11
        }
71
        // FIXME(gavin): check bvar::Adder and more
72
        if constexpr (std::is_same_v<Bvar, bvar::LatencyRecorder>) {
73
            (*instance) << value;
74
11
        } else if constexpr (is_status) {
75
11
            instance->set_value(value);
76
        } else {
77
            // This branch mean to be unreachable, add an assert(false) here to
78
            // prevent missing branch match.
79
            // Postpone deduction of static_assert by evaluating sizeof(T)
80
            static_assert(!sizeof(Bvar), "all types must be matched with if constexpr");
81
        }
82
11
    }
_ZN11BvarWithTagIN4bvar6StatusIlvEELb1EE3putIiQsr3stdE13is_integral_vITL0__EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_
Line
Count
Source
59
24
    void put(const std::string& tag, ValType value) {
60
24
        std::shared_ptr<Bvar> instance = nullptr;
61
24
        {
62
24
            std::lock_guard<bthread::Mutex> l(mutex_);
63
24
            auto it = bvar_map_.find(tag);
64
24
            if (it == bvar_map_.end()) {
65
8
                instance = std::make_shared<Bvar>(module_, name_ + "_" + tag, ValType());
66
8
                bvar_map_[tag] = instance;
67
16
            } else {
68
16
                instance = it->second;
69
16
            }
70
24
        }
71
        // FIXME(gavin): check bvar::Adder and more
72
        if constexpr (std::is_same_v<Bvar, bvar::LatencyRecorder>) {
73
            (*instance) << value;
74
24
        } else if constexpr (is_status) {
75
24
            instance->set_value(value);
76
        } else {
77
            // This branch mean to be unreachable, add an assert(false) here to
78
            // prevent missing branch match.
79
            // Postpone deduction of static_assert by evaluating sizeof(T)
80
            static_assert(!sizeof(Bvar), "all types must be matched with if constexpr");
81
        }
82
24
    }
83
84
1.00k
    std::shared_ptr<Bvar> get(const std::string& tag) {
85
1.00k
        std::shared_ptr<Bvar> instance = nullptr;
86
1.00k
        std::lock_guard<bthread::Mutex> l(mutex_);
87
88
1.00k
        auto it = bvar_map_.find(tag);
89
1.00k
        if (it == bvar_map_.end()) {
90
1
            instance = std::make_shared<Bvar>(module_, name_ + "_" + tag);
91
1
            bvar_map_[tag] = instance;
92
1
            return instance;
93
1
        }
94
1.00k
        return it->second;
95
1.00k
    }
96
97
    void remove(const std::string& tag) {
98
        std::lock_guard<bthread::Mutex> l(mutex_);
99
        bvar_map_.erase(tag);
100
    }
101
102
private:
103
    bthread::Mutex mutex_;
104
    std::string module_;
105
    std::string name_;
106
    std::map<std::string, std::shared_ptr<Bvar>> bvar_map_;
107
};
108
109
using BvarLatencyRecorderWithTag = BvarWithTag<bvar::LatencyRecorder>;
110
111
template <typename T>
112
    requires std::is_integral_v<T>
113
using BvarStatusWithTag = BvarWithTag<bvar::Status<T>, true>;
114
115
/**
116
@brief: A wrapper class for multidimensional bvar metrics.
117
This template class provides a convenient interface for managing multidimensional
118
bvar metrics. It supports various bvar types including Adder, IntRecorder,
119
LatencyRecorder, Maxer, and Status.
120
@param: BvarType The type of bvar metric to use (must be one of the supported types)
121
@output: Based on the bvar multidimensional counter implementation,
122
the metrics output format would typically follow this structure:
123
{metric_name}{dimension1="value1",dimension2="value2",...} value
124
@example: Basic usage with an Adder:
125
// Create a 2-dimensional counter with dimensions "region" and "service"
126
mBvarWrapper<bvar::Adder<int>> request_counter("xxx_request_count", {"region", "service"});
127
// Increment the counter for specific dimension values
128
request_counter.put({"east", "login"}, 1);
129
request_counter.put({"west", "search"}, 1);
130
request_counter.put({"east", "login"}, 1); // Now east/login has value 2
131
// the output of above metrics:
132
xxx_request_count{region="east",service="login"} 2
133
xxx_request_count{region="west",service="search"} 1
134
@note: The dimensions provided in the constructor and the values provided to
135
put() and get() methods must match in count. Also, all supported bvar types
136
have different behaviors for how values are processed and retrieved.
137
*/
138
139
template <typename T>
140
struct is_valid_bvar_type : std::false_type {};
141
template <typename T>
142
struct is_valid_bvar_type<bvar::Adder<T>> : std::true_type {};
143
template <>
144
struct is_valid_bvar_type<bvar::IntRecorder> : std::true_type {};
145
template <typename T>
146
struct is_valid_bvar_type<bvar::Maxer<T>> : std::true_type {};
147
template <typename T>
148
struct is_valid_bvar_type<bvar::Status<T>> : std::true_type {};
149
template <>
150
struct is_valid_bvar_type<bvar::LatencyRecorder> : std::true_type {};
151
template <typename T>
152
struct is_bvar_status : std::false_type {};
153
template <typename T>
154
struct is_bvar_status<bvar::Status<T>> : std::true_type {};
155
156
template <typename BvarType>
157
class mBvarWrapper {
158
public:
159
    mBvarWrapper(const std::string& metric_name,
160
                 const std::initializer_list<std::string>& dim_names)
161
9.88k
            : counter_(metric_name, std::list<std::string>(dim_names)) {
162
9.88k
        static_assert(is_valid_bvar_type<BvarType>::value,
163
9.88k
                      "BvarType must be one of the supported bvar types (Adder, IntRecorder, "
164
9.88k
                      "LatencyRecorder, Maxer, Status)");
165
9.88k
    }
_ZN12mBvarWrapperIN4bvar5AdderIiEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt16initializer_listIS9_E
Line
Count
Source
161
384
            : counter_(metric_name, std::list<std::string>(dim_names)) {
162
384
        static_assert(is_valid_bvar_type<BvarType>::value,
163
384
                      "BvarType must be one of the supported bvar types (Adder, IntRecorder, "
164
384
                      "LatencyRecorder, Maxer, Status)");
165
384
    }
_ZN12mBvarWrapperIN4bvar6StatusIlvEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt16initializer_listIS9_E
Line
Count
Source
161
640
            : counter_(metric_name, std::list<std::string>(dim_names)) {
162
640
        static_assert(is_valid_bvar_type<BvarType>::value,
163
640
                      "BvarType must be one of the supported bvar types (Adder, IntRecorder, "
164
640
                      "LatencyRecorder, Maxer, Status)");
165
640
    }
_ZN12mBvarWrapperIN4bvar6StatusIdvEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt16initializer_listIS9_E
Line
Count
Source
161
160
            : counter_(metric_name, std::list<std::string>(dim_names)) {
162
160
        static_assert(is_valid_bvar_type<BvarType>::value,
163
160
                      "BvarType must be one of the supported bvar types (Adder, IntRecorder, "
164
160
                      "LatencyRecorder, Maxer, Status)");
165
160
    }
_ZN12mBvarWrapperIN4bvar5AdderIlEEEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt16initializer_listIS9_E
Line
Count
Source
161
8.70k
            : counter_(metric_name, std::list<std::string>(dim_names)) {
162
8.70k
        static_assert(is_valid_bvar_type<BvarType>::value,
163
8.70k
                      "BvarType must be one of the supported bvar types (Adder, IntRecorder, "
164
8.70k
                      "LatencyRecorder, Maxer, Status)");
165
8.70k
    }
166
167
    template <typename ValType>
168
935k
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
935k
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
935k
        if (stats) {
171
935k
            if constexpr (is_bvar_status<BvarType>::value) {
172
4.75k
                stats->set_value(value);
173
931k
            } else {
174
931k
                *stats << value;
175
931k
            }
176
935k
        }
177
935k
    }
_ZN12mBvarWrapperIN4bvar5AdderIlEEE3putImEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
6
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
6
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
6
        if (stats) {
171
            if constexpr (is_bvar_status<BvarType>::value) {
172
                stats->set_value(value);
173
6
            } else {
174
6
                *stats << value;
175
6
            }
176
6
        }
177
6
    }
_ZN12mBvarWrapperIN4bvar5AdderIlEEE3putIlEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
929k
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
929k
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
929k
        if (stats) {
171
            if constexpr (is_bvar_status<BvarType>::value) {
172
                stats->set_value(value);
173
929k
            } else {
174
929k
                *stats << value;
175
929k
            }
176
929k
        }
177
929k
    }
_ZN12mBvarWrapperIN4bvar6StatusIdvEEE3putIdEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
2.23k
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
2.23k
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
2.23k
        if (stats) {
171
2.23k
            if constexpr (is_bvar_status<BvarType>::value) {
172
2.23k
                stats->set_value(value);
173
            } else {
174
                *stats << value;
175
            }
176
2.23k
        }
177
2.23k
    }
_ZN12mBvarWrapperIN4bvar5AdderIiEEE3putIiEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
732
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
732
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
732
        if (stats) {
171
            if constexpr (is_bvar_status<BvarType>::value) {
172
                stats->set_value(value);
173
732
            } else {
174
732
                *stats << value;
175
732
            }
176
732
        }
177
732
    }
_ZN12mBvarWrapperIN4bvar5AdderIlEEE3putIyEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
550
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
550
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
550
        if (stats) {
171
            if constexpr (is_bvar_status<BvarType>::value) {
172
                stats->set_value(value);
173
550
            } else {
174
550
                *stats << value;
175
550
            }
176
550
        }
177
550
    }
_ZN12mBvarWrapperIN4bvar6StatusIlvEEE3putIyEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
2.19k
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
2.19k
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
2.19k
        if (stats) {
171
2.19k
            if constexpr (is_bvar_status<BvarType>::value) {
172
2.19k
                stats->set_value(value);
173
            } else {
174
                *stats << value;
175
            }
176
2.19k
        }
177
2.19k
    }
_ZN12mBvarWrapperIN4bvar6StatusIlvEEE3putIlEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
330
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
330
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
330
        if (stats) {
171
330
            if constexpr (is_bvar_status<BvarType>::value) {
172
330
                stats->set_value(value);
173
            } else {
174
                *stats << value;
175
            }
176
330
        }
177
330
    }
_ZN12mBvarWrapperIN4bvar5AdderIiEEE3putIlEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
Line
Count
Source
168
224
    void put(const std::initializer_list<std::string>& dim_values, ValType value) {
169
224
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
170
224
        if (stats) {
171
            if constexpr (is_bvar_status<BvarType>::value) {
172
                stats->set_value(value);
173
224
            } else {
174
224
                *stats << value;
175
224
            }
176
224
        }
177
224
    }
Unexecuted instantiation: _ZN12mBvarWrapperIN4bvar6StatusIlvEEE3putImEEvRKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_
178
179
338
    auto get(const std::initializer_list<std::string>& dim_values) {
180
338
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
181
338
        using ReturnType = decltype(stats->get_value());
182
338
        if (stats) {
183
338
            return stats->get_value();
184
338
        }
185
0
        return ReturnType {};
186
338
    }
_ZN12mBvarWrapperIN4bvar6StatusIlvEEE3getERKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE
Line
Count
Source
179
5
    auto get(const std::initializer_list<std::string>& dim_values) {
180
5
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
181
5
        using ReturnType = decltype(stats->get_value());
182
5
        if (stats) {
183
5
            return stats->get_value();
184
5
        }
185
0
        return ReturnType {};
186
5
    }
_ZN12mBvarWrapperIN4bvar5AdderIlEEE3getERKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE
Line
Count
Source
179
270
    auto get(const std::initializer_list<std::string>& dim_values) {
180
270
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
181
270
        using ReturnType = decltype(stats->get_value());
182
270
        if (stats) {
183
270
            return stats->get_value();
184
270
        }
185
0
        return ReturnType {};
186
270
    }
_ZN12mBvarWrapperIN4bvar6StatusIdvEEE3getERKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE
Line
Count
Source
179
58
    auto get(const std::initializer_list<std::string>& dim_values) {
180
58
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
181
58
        using ReturnType = decltype(stats->get_value());
182
58
        if (stats) {
183
58
            return stats->get_value();
184
58
        }
185
0
        return ReturnType {};
186
58
    }
_ZN12mBvarWrapperIN4bvar5AdderIiEEE3getERKSt16initializer_listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE
Line
Count
Source
179
5
    auto get(const std::initializer_list<std::string>& dim_values) {
180
5
        BvarType* stats = counter_.get_stats(std::list<std::string>(dim_values));
181
5
        using ReturnType = decltype(stats->get_value());
182
5
        if (stats) {
183
5
            return stats->get_value();
184
5
        }
185
0
        return ReturnType {};
186
5
    }
187
188
private:
189
    bvar::MultiDimension<BvarType> counter_;
190
};
191
/**
192
 * @class BvarLatencyRecorderWithStatus
193
 * @brief A latency recorder with auto-exposed max and average metrics
194
 *
195
 * This class wraps a bvar::LatencyRecorder and automatically creates two
196
 * additional PassiveStatus metrics to expose the maximum and average latency.
197
 * This makes it convenient to track these key metrics in monitoring systems.
198
 * 
199
 * @tparam N Window size in seconds for the latency recorder, defaults to 60 seconds
200
 *
201
 * @note Unlike mBvarLatencyRecorderWithStatus, this class doesn't support multi-dimensional
202
 * metrics and doesn't use a timer to update status. It uses PassiveStatus to calculate
203
 * statistics in real-time when queried.
204
 *
205
 * @example Basic usage:
206
 *   // Create a latency recorder
207
 *   BvarLatencyRecorderWithStatus<> my_latency("my_service_latency");
208
 *   // Record a latency value (in microseconds)
209
 *   my_latency << 1500;  // or my_latency.put(1500);
210
 *   // This will create three metrics:
211
 *   // - The original latency recorder (hidden)
212
 *   // - my_service_latency_max (showing maximum latency)
213
 *   // - my_service_latency_avg (showing average latency)
214
 */
215
template <int N = 60>
216
class BvarLatencyRecorderWithStatus {
217
public:
218
    /**
219
     * @brief Constructor
220
     * @param metric_name Base name for the metrics, _max and _avg suffixes will be added
221
     */
222
    BvarLatencyRecorderWithStatus(const std::string& metric_name)
223
64
            : recorder_(N),
224
64
              max_status_(metric_name + "_max", get_max_latency, this),
225
64
              avg_status_(metric_name + "_avg", get_avg_latency, this),
226
64
              count_status_(metric_name + "_count", get_count_latency, this) {
227
64
        recorder_.hide();
228
64
    }
229
230
    /**
231
     * @brief Constructor with prefix
232
     * @param prefix Prefix for the metric name
233
     * @param metric_name Base name for the metrics
234
     */
235
    BvarLatencyRecorderWithStatus(const std::string& prefix, const std::string& metric_name)
236
64
            : BvarLatencyRecorderWithStatus(prefix + "_" + metric_name) {}
237
238
    /**
239
     * @brief Record a latency value
240
     * @param value Latency value to record (in microseconds)
241
     */
242
    void put(int64_t value) { recorder_ << value; }
243
244
    /**
245
     * @brief Stream operator for recording latency values
246
     * @param value Latency value to record (in microseconds)
247
     */
248
1.05k
    void operator<<(int64_t value) { recorder_ << value; }
249
250
    int64_t max() const { return recorder_.max_latency(); }
251
252
    int64_t avg() const { return recorder_.latency(); }
253
254
    int64_t count() const { return recorder_.count(); }
255
256
private:
257
    bvar::LatencyRecorder recorder_;            // The underlying latency recorder
258
    bvar::PassiveStatus<int64_t> max_status_;   // Passive status for maximum latency
259
    bvar::PassiveStatus<int64_t> avg_status_;   // Passive status for average latency
260
    bvar::PassiveStatus<int64_t> count_status_; // Passive status for count latency
261
262
    /**
263
     * @brief Callback function to get maximum latency
264
     * @param arg Pointer to the BvarLatencyRecorderWithStatus instance
265
     * @return Maximum latency value, or 0 if negative
266
     */
267
1.87k
    static int64_t get_max_latency(void* arg) {
268
1.87k
        auto* self = static_cast<BvarLatencyRecorderWithStatus*>(arg);
269
1.87k
        int64_t value = self->recorder_.max_latency();
270
1.87k
        return value >= 0 ? value : 0;
271
1.87k
    }
272
273
    /**
274
     * @brief Callback function to get average latency
275
     * @param arg Pointer to the BvarLatencyRecorderWithStatus instance
276
     * @return Average latency value, or 0 if negative
277
     */
278
1.87k
    static int64_t get_avg_latency(void* arg) {
279
1.87k
        auto* self = static_cast<BvarLatencyRecorderWithStatus*>(arg);
280
1.87k
        int64_t value = self->recorder_.latency();
281
1.87k
        return value >= 0 ? value : 0;
282
1.87k
    }
283
284
    /**
285
     * @brief Callback function to get count latency
286
     * @param arg Pointer to the BvarLatencyRecorderWithStatus instance
287
     * @return Count latency value, or 0 if negative
288
     */
289
1.87k
    static int64_t get_count_latency(void* arg) {
290
1.87k
        auto* self = static_cast<BvarLatencyRecorderWithStatus*>(arg);
291
1.87k
        int64_t value = self->recorder_.count();
292
1.87k
        return value >= 0 ? value : 0;
293
1.87k
    }
294
};
295
296
/**
297
 * @class MBvarLatencyRecorderWithStatus
298
 * @brief A multi-dimensional latency recorder with status metrics
299
 * 
300
 * This class provides a way to record latency metrics across multiple dimensions and
301
 * automatically update status metrics (max and average) at regular intervals.
302
 * It leverages bvar's MultiDimension capability to track metrics per dimension combination.
303
 * 
304
 * @tparam N Window size in seconds for the latency recorder (default: 60)
305
 */
306
template <int N = 60>
307
class MBvarLatencyRecorderWithStatus {
308
private:
309
    /**
310
    * @class ScheduledLatencyUpdater
311
    * @brief A helper class to schedule deferred execution of tasks using bthread timer.
312
    * 
313
    * This class provides a way to execute a callback function after a specified time interval.
314
    * It takes care of safely managing the lifecycle of the timer and ensures the callback
315
    * is only executed if the timer and its arguments are still valid.
316
    * 
317
    * @note This class requires bthread to be initialized before use. If bthread is not
318
    * initialized, timer creation will fail.
319
    */
320
    class ScheduledLatencyUpdater : public bvar::LatencyRecorder {
321
    public:
322
        /**
323
        * @brief Constructor for ScheduledLatencyUpdater
324
        * 
325
        * @param interval_s The time interval in seconds after which the callback should be executed
326
        * @param arg Optional argument to pass to the callback function
327
        */
328
        ScheduledLatencyUpdater(size_t interval_s, void* arg = nullptr)
329
333
                : bvar::LatencyRecorder(interval_s), _interval_s(interval_s), _arg(arg) {
330
333
            hide();
331
333
        }
332
333
        /**
334
        * @brief Destructor
335
        * 
336
        * Stops the timer if it's still running to prevent any callbacks after destruction
337
        */
338
201
        ~ScheduledLatencyUpdater() { stop(); }
339
340
        /**
341
        * @brief Start the timer
342
        * 
343
        * Schedules the callback function to be executed after the specified interval.
344
        * Does nothing if the timer has already been started.
345
        * 
346
        * @return true if the timer was successfully started, false otherwise
347
        */
348
41.0k
        bool start() {
349
41.0k
            std::lock_guard<bthread::Mutex> l(lifecycle_mutex_);
350
41.0k
            if (_started) {
351
40.7k
                return true;
352
40.7k
            }
353
354
306
            _started = true;
355
306
            if (!schedule_locked()) {
356
0
                _started = false;
357
0
                return false;
358
0
            }
359
306
            return true;
360
306
        }
361
362
        /*** @brief Reschedule the timer
363
        * 
364
        * Scheduling a one-time task.
365
        * This is useful if you want to reset the timer interval.
366
        */
367
        // lifecycle_mutex_ must be held so stop() cannot race with replacing _timer.
368
761
        bool schedule_locked() {
369
761
            if (bthread_timer_add(&_timer, butil::seconds_from_now(_interval_s), update, this) !=
370
761
                0) {
371
0
                LOG(WARNING) << "Failed to add bthread timer for ScheduledLatencyUpdater";
372
0
                return false;
373
0
            }
374
761
            _callback_pending = true;
375
761
            return true;
376
761
        }
377
378
        /**
379
        * @brief Background update function
380
        * 
381
        * This function is called periodically by the timer to update the status metrics
382
        * with the current values from the latency recorders.
383
        * 
384
        * @param arg Pointer to the mBvarLatencyRecorderWithStatus instance
385
        */
386
429
        static void update(void* arg) {
387
429
            auto* latency_updater = static_cast<ScheduledLatencyUpdater*>(arg);
388
429
            CHECK(latency_updater != nullptr);
389
429
            if (!latency_updater->begin_callback()) {
390
0
                return;
391
0
            }
392
393
429
            VLOG_DEBUG << "Timer triggered for ScheduledLatencyUpdater, interval: "
394
0
                       << latency_updater->_interval_s << "s";
395
396
429
            auto* parent = static_cast<MBvarLatencyRecorderWithStatus*>(latency_updater->_arg);
397
429
            if (!parent) {
398
0
                LOG(WARNING) << "Invalid parent container in timer callback";
399
429
            } else {
400
429
                std::list<std::string> current_dim_list;
401
429
                {
402
429
                    std::lock_guard<bthread::Mutex> l(parent->recorder_mutex_);
403
20.2k
                    for (const auto& it : parent->recorder_) {
404
20.2k
                        if (it.second.get() == latency_updater) {
405
429
                            current_dim_list = it.first;
406
429
                            break;
407
429
                        }
408
20.2k
                    }
409
429
                }
410
411
429
                if (current_dim_list.empty()) {
412
0
                    LOG(WARNING) << "Could not find dimension for ScheduledLatencyUpdater";
413
429
                } else {
414
429
                    std::lock_guard<bthread::Mutex> l(parent->timer_mutex_);
415
416
429
                    bvar::Status<int64_t>* max_status =
417
429
                            parent->max_status_.get_stats(current_dim_list);
418
429
                    bvar::Status<int64_t>* avg_status =
419
429
                            parent->avg_status_.get_stats(current_dim_list);
420
429
                    bvar::Status<int64_t>* count_status =
421
429
                            parent->count_status_.get_stats(current_dim_list);
422
423
429
                    VLOG_DEBUG << "Updating latency recorder status for dimension, "
424
0
                               << "max_latency: " << latency_updater->max_latency()
425
0
                               << ", avg_latency: " << latency_updater->latency();
426
429
                    TEST_SYNC_POINT("mBvarLatencyRecorderWithStatus::update");
427
428
429
                    if (max_status) {
429
429
                        max_status->set_value(latency_updater->max_latency());
430
429
                    }
431
429
                    if (avg_status) {
432
429
                        avg_status->set_value(latency_updater->latency());
433
429
                    }
434
429
                    if (count_status) {
435
429
                        count_status->set_value(latency_updater->count());
436
429
                    }
437
429
                }
438
429
            }
439
440
429
            latency_updater->finish_callback();
441
429
        }
442
443
        /**
444
        * @brief Stop the timer
445
        * 
446
        * Cancels the timer if it's running and marks arguments as invalid to prevent
447
        * any pending callbacks from accessing potentially freed resources.
448
        */
449
402
        void stop() {
450
402
            std::unique_lock<bthread::Mutex> l(lifecycle_mutex_);
451
402
            if (!_started && !_callback_pending) {
452
201
                return;
453
201
            }
454
455
            // Prevent a running callback from scheduling the next timer before trying to
456
            // cancel the current one. bthread_timer_del() returns 1 when the callback is
457
            // already running; in that case the updater and its parent must stay alive until
458
            // finish_callback() signals that the callback no longer accesses either object.
459
201
            _started = false;
460
201
            if (!_callback_pending) {
461
0
                return;
462
0
            }
463
464
201
            const int timer_state = bthread_timer_del(_timer);
465
201
            if (timer_state == 0) {
466
200
                _callback_pending = false;
467
200
                return;
468
200
            }
469
470
201
            CHECK_EQ(1, timer_state);
471
1
            TEST_SYNC_POINT("mBvarLatencyRecorderWithStatus::stop");
472
2
            while (_callback_pending) {
473
1
                callback_finished_.wait(l);
474
1
            }
475
1
        }
476
477
    private:
478
429
        bool begin_callback() {
479
429
            std::lock_guard<bthread::Mutex> l(lifecycle_mutex_);
480
429
            if (_started) {
481
429
                return true;
482
429
            }
483
484
            // stop() may observe the timer as running before this function acquires the
485
            // lifecycle mutex. Acknowledge the canceled callback so stop() can finish.
486
0
            _callback_pending = false;
487
0
            callback_finished_.notify_all();
488
0
            return false;
489
429
        }
490
491
429
        void finish_callback() {
492
429
            std::lock_guard<bthread::Mutex> l(lifecycle_mutex_);
493
429
            _callback_pending = false;
494
429
            if (_started && !schedule_locked()) {
495
0
                LOG(WARNING) << "Failed to reschedule timer for ScheduledLatencyUpdater";
496
0
                _started = false;
497
0
            }
498
429
            callback_finished_.notify_all();
499
429
        }
500
501
        int _interval_s;                // Timer interval in seconds
502
        void* _arg;                     // Argument to pass to the callback
503
        bthread_timer_t _timer;         // The bthread timer handle
504
        bool _started = false;          // Whether callbacks should keep running
505
        bool _callback_pending = false; // A timer callback is scheduled or running
506
        bthread::Mutex lifecycle_mutex_;
507
        bthread::ConditionVariable callback_finished_;
508
    };
509
510
public:
511
    /**
512
     * @brief Constructor
513
     * 
514
     * @param metric_name Base name for the metrics
515
     * @param dim_names List of dimension names
516
     */
517
    MBvarLatencyRecorderWithStatus(const std::string& metric_name,
518
                                   const std::initializer_list<std::string>& dim_names)
519
67
            : _metric_name(metric_name),
520
67
              max_status_(metric_name + "_max", std::list<std::string>(dim_names)),
521
67
              avg_status_(metric_name + "_avg", std::list<std::string>(dim_names)),
522
67
              count_status_(metric_name + "_count", std::list<std::string>(dim_names)) {}
523
524
    MBvarLatencyRecorderWithStatus(const std::string& prefix, const std::string& metric_name,
525
                                   const std::initializer_list<std::string>& dim_names)
526
64
            : MBvarLatencyRecorderWithStatus(prefix + "_" + metric_name, dim_names) {}
527
528
5
    ~MBvarLatencyRecorderWithStatus() {
529
        // Members are destroyed in reverse declaration order, so recorder_ (which owns the
530
        // timer callbacks) would otherwise be destroyed after the status bvars and mutexes
531
        // used by those callbacks. Stop and drain every callback while all parent members are
532
        // still alive.
533
5
        std::vector<std::shared_ptr<ScheduledLatencyUpdater>> latency_updaters;
534
5
        {
535
5
            std::lock_guard<bthread::Mutex> l(recorder_mutex_);
536
5
            latency_updaters.reserve(recorder_.size());
537
201
            for (const auto& entry : recorder_) {
538
201
                latency_updaters.push_back(entry.second);
539
201
            }
540
5
        }
541
201
        for (const auto& latency_updater : latency_updaters) {
542
201
            latency_updater->stop();
543
201
        }
544
5
    }
545
546
    /**
547
     * @brief Record a latency value
548
     * 
549
     * @param dim_values List of dimension values (must match the number of dimensions)
550
     * @param value The latency value to record
551
     */
552
40.9k
    void put(const std::initializer_list<std::string>& dim_values, int64_t value) {
553
40.9k
        std::list<std::string> dim_list(dim_values);
554
40.9k
        std::shared_ptr<ScheduledLatencyUpdater> latency = nullptr;
555
40.9k
        {
556
40.9k
            std::lock_guard<bthread::Mutex> l(recorder_mutex_);
557
40.9k
            auto it = recorder_.find(dim_list);
558
40.9k
            if (it == recorder_.end()) {
559
333
                int inteval_s = N;
560
333
                TEST_SYNC_POINT_CALLBACK("mBvarLatencyRecorderWithStatus::put", &inteval_s);
561
333
                latency = std::make_shared<ScheduledLatencyUpdater>(inteval_s, this);
562
333
                recorder_[dim_list] = latency;
563
40.6k
            } else {
564
40.6k
                latency = it->second;
565
40.6k
            }
566
40.9k
        }
567
568
40.9k
        auto* latency_ptr = latency.get();
569
40.9k
        latency->start();
570
40.9k
        *latency_ptr << value;
571
40.9k
    }
572
573
39.6k
    int64_t get_max(const std::initializer_list<std::string>& dim_values) {
574
39.6k
        return max_status_.get_stats(std::list<std::string>(dim_values))->get_value();
575
39.6k
    }
576
577
39.6k
    int64_t get_avg(const std::initializer_list<std::string>& dim_values) {
578
39.6k
        return avg_status_.get_stats(std::list<std::string>(dim_values))->get_value();
579
39.6k
    }
580
581
39.7k
    int64_t get_count(const std::initializer_list<std::string>& dim_values) {
582
39.7k
        return count_status_.get_stats(std::list<std::string>(dim_values))->get_value();
583
39.7k
    }
584
585
private:
586
    std::string _metric_name;
587
    // dim_names -> recorder
588
    std::map<std::list<std::string>, std::shared_ptr<ScheduledLatencyUpdater>> recorder_;
589
    bvar::MultiDimension<bvar::Status<int64_t>> max_status_;
590
    bvar::MultiDimension<bvar::Status<int64_t>> avg_status_;
591
    bvar::MultiDimension<bvar::Status<int64_t>> count_status_;
592
    bthread::Mutex recorder_mutex_; // Mutex for recorder_
593
    bthread::Mutex timer_mutex_;    // Mutex for timer_map_
594
};
595
596
using mBvarIntAdder = mBvarWrapper<bvar::Adder<int>>;
597
using mBvarInt64Adder = mBvarWrapper<bvar::Adder<int64_t>>;
598
using mBvarDoubleAdder = mBvarWrapper<bvar::Adder<double>>;
599
using mBvarIntRecorder = mBvarWrapper<bvar::IntRecorder>;
600
using mBvarLatencyRecorder = mBvarWrapper<bvar::LatencyRecorder>;
601
using mBvarIntMaxer = mBvarWrapper<bvar::Maxer<int>>;
602
using mBvarDoubleMaxer = mBvarWrapper<bvar::Maxer<double>>;
603
template <typename T>
604
using mBvarStatus = mBvarWrapper<bvar::Status<T>>;
605
606
// meta-service's bvars
607
extern BvarLatencyRecorderWithTag g_bvar_ms_begin_txn;
608
extern BvarLatencyRecorderWithTag g_bvar_ms_precommit_txn;
609
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_txn;
610
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_txn_eventually;
611
extern BvarLatencyRecorderWithTag g_bvar_ms_abort_txn;
612
extern BvarLatencyRecorderWithTag g_bvar_ms_get_txn;
613
extern BvarLatencyRecorderWithTag g_bvar_ms_get_current_max_txn_id;
614
extern BvarLatencyRecorderWithTag g_bvar_ms_create_meta_sync_point;
615
extern BvarLatencyRecorderWithTag g_bvar_ms_check_txn_conflict;
616
extern BvarLatencyRecorderWithTag g_bvar_ms_abort_txn_with_coordinator;
617
extern BvarLatencyRecorderWithTag g_bvar_ms_get_prepare_txn_by_coordinator;
618
extern BvarLatencyRecorderWithTag g_bvar_ms_begin_sub_txn;
619
extern BvarLatencyRecorderWithTag g_bvar_ms_abort_sub_txn;
620
extern BvarLatencyRecorderWithTag g_bvar_ms_clean_txn_label;
621
extern BvarLatencyRecorderWithTag g_bvar_ms_get_version;
622
extern BvarLatencyRecorderWithTag g_bvar_ms_batch_get_version;
623
extern BvarLatencyRecorderWithTag g_bvar_ms_create_tablets;
624
extern BvarLatencyRecorderWithTag g_bvar_ms_update_tablet;
625
extern BvarLatencyRecorderWithTag g_bvar_ms_get_tablet;
626
extern BvarLatencyRecorderWithTag g_bvar_ms_prepare_rowset;
627
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_rowset;
628
extern BvarLatencyRecorderWithTag g_bvar_ms_update_tmp_rowset;
629
extern BvarLatencyRecorderWithTag g_bvar_ms_get_rowset;
630
extern BvarLatencyRecorderWithTag g_bvar_ms_drop_index;
631
extern BvarLatencyRecorderWithTag g_bvar_ms_prepare_index;
632
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_index;
633
extern BvarLatencyRecorderWithTag g_bvar_ms_prepare_partition;
634
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_partition;
635
extern BvarLatencyRecorderWithTag g_bvar_ms_drop_partition;
636
extern BvarLatencyRecorderWithTag g_bvar_ms_prepare_restore_job;
637
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_restore_job;
638
extern BvarLatencyRecorderWithTag g_bvar_ms_finish_restore_job;
639
extern BvarLatencyRecorderWithTag g_bvar_ms_get_tablet_stats;
640
extern BvarLatencyRecorderWithTag g_bvar_ms_get_obj_store_info;
641
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_obj_store_info;
642
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_storage_vault;
643
extern BvarLatencyRecorderWithTag g_bvar_ms_create_instance;
644
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_instance;
645
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_cluster;
646
extern BvarLatencyRecorderWithTag g_bvar_ms_get_cluster;
647
extern BvarLatencyRecorderWithTag g_bvar_ms_create_stage;
648
extern BvarLatencyRecorderWithTag g_bvar_ms_get_stage;
649
extern BvarLatencyRecorderWithTag g_bvar_ms_drop_stage;
650
extern BvarLatencyRecorderWithTag g_bvar_ms_get_iam;
651
extern BvarLatencyRecorderWithTag g_bvar_ms_update_ak_sk;
652
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_iam;
653
extern BvarLatencyRecorderWithTag g_bvar_ms_alter_ram_user;
654
extern BvarLatencyRecorderWithTag g_bvar_ms_begin_copy;
655
extern BvarLatencyRecorderWithTag g_bvar_ms_finish_copy;
656
extern BvarLatencyRecorderWithTag g_bvar_ms_get_copy_job;
657
extern BvarLatencyRecorderWithTag g_bvar_ms_get_copy_files;
658
extern BvarLatencyRecorderWithTag g_bvar_ms_filter_copy_files;
659
extern BvarLatencyRecorderWithTag g_bvar_ms_start_tablet_job;
660
extern BvarLatencyRecorderWithTag g_bvar_ms_finish_tablet_job;
661
extern BvarLatencyRecorderWithTag g_bvar_ms_update_delete_bitmap;
662
extern BvarLatencyRecorderWithTag g_bvar_ms_get_delete_bitmap;
663
extern BvarLatencyRecorderWithTag g_bvar_ms_get_delete_bitmap_update_lock;
664
extern BvarLatencyRecorderWithTag g_bvar_ms_remove_delete_bitmap;
665
extern BvarLatencyRecorderWithTag g_bvar_ms_remove_delete_bitmap_update_lock;
666
extern BvarLatencyRecorderWithTag g_bvar_ms_get_cluster_status;
667
extern BvarLatencyRecorderWithTag g_bvar_ms_set_cluster_status;
668
extern BvarLatencyRecorderWithTag g_bvar_ms_get_instance;
669
extern BvarLatencyRecorderWithTag g_bvar_ms_get_rl_task_commit_attach;
670
extern BvarLatencyRecorderWithTag g_bvar_ms_get_streaming_task_commit_attach;
671
extern BvarLatencyRecorderWithTag g_bvar_ms_delete_streaming_job;
672
extern BvarLatencyRecorderWithTag g_bvar_ms_reset_streaming_job_offset;
673
extern BvarLatencyRecorderWithTag g_bvar_ms_reset_rl_progress;
674
extern BvarLatencyRecorderWithTag g_bvar_ms_get_txn_id;
675
extern BvarLatencyRecorderWithTag g_bvar_ms_check_kv;
676
extern BvarLatencyRecorderWithTag g_bvar_ms_get_schema_dict;
677
extern BvarLatencyRecorderWithTag g_bvar_ms_begin_snapshot;
678
extern BvarLatencyRecorderWithTag g_bvar_ms_update_snapshot;
679
extern BvarLatencyRecorderWithTag g_bvar_ms_commit_snapshot;
680
extern BvarLatencyRecorderWithTag g_bvar_ms_abort_snapshot;
681
extern BvarLatencyRecorderWithTag g_bvar_ms_drop_snapshot;
682
extern BvarLatencyRecorderWithTag g_bvar_ms_list_snapshot;
683
extern BvarLatencyRecorderWithTag g_bvar_ms_clone_instance;
684
extern BvarLatencyRecorderWithTag g_bvar_ms_compact_snapshot;
685
extern BvarLatencyRecorderWithTag g_bvar_ms_update_packed_file_info;
686
extern bvar::Adder<int64_t> g_bvar_ms_rate_limit_trigger_fdb_cluster;
687
extern bvar::Adder<int64_t> g_bvar_ms_rate_limit_trigger_fdb_client_thread;
688
extern bvar::Adder<int64_t> g_bvar_ms_rate_limit_trigger_ms_resource;
689
extern bvar::Adder<int64_t> g_bvar_ms_rate_limit_trigger_test_injection;
690
extern bvar::Adder<int64_t> g_bvar_ms_repair_tablet_index;
691
extern bvar::Status<int64_t> g_bvar_ms_cpu_usage_percent;
692
extern bvar::Status<int64_t> g_bvar_ms_memory_usage_percent;
693
extern bvar::Adder<int64_t> g_bvar_update_delete_bitmap_fail_counter;
694
extern bvar::Adder<int64_t> g_bvar_get_delete_bitmap_fail_counter;
695
extern BvarLatencyRecorderWithStatus<60> g_bvar_ms_txn_commit_with_tablet_count;
696
extern BvarLatencyRecorderWithStatus<60> g_bvar_ms_txn_commit_with_partition_count;
697
extern MBvarLatencyRecorderWithStatus<60> g_bvar_instance_txn_commit_with_partition_count;
698
extern MBvarLatencyRecorderWithStatus<60> g_bvar_instance_txn_commit_with_tablet_count;
699
extern bvar::LatencyRecorder g_bvar_ms_scan_instance_update;
700
extern bvar::LatencyRecorder g_bvar_txn_lazy_committer_waiting_duration;
701
extern bvar::LatencyRecorder g_bvar_txn_lazy_committer_committing_duration;
702
extern bvar::LatencyRecorder g_bvar_txn_lazy_committer_commit_partition_duration;
703
extern bvar::Adder<int64_t> g_bvar_txn_lazy_committer_submitted;
704
extern bvar::Adder<int64_t> g_bvar_txn_lazy_committer_finished;
705
706
// recycler's bvars
707
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_index_earlest_ts;
708
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_partition_earlest_ts;
709
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_rowset_earlest_ts;
710
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_tmp_rowset_earlest_ts;
711
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_expired_txn_label_earlest_ts;
712
extern BvarStatusWithTag<int64_t> g_bvar_recycler_recycle_restore_job_earlest_ts;
713
714
// recycler's mbvars
715
extern bvar::Status<int64_t> g_bvar_recycler_task_max_concurrency;
716
extern mBvarIntAdder g_bvar_recycler_instance_recycle_task_status;
717
extern mBvarStatus<int64_t> g_bvar_recycler_instance_last_round_recycle_duration;
718
extern mBvarStatus<int64_t> g_bvar_recycler_instance_next_ts;
719
extern mBvarStatus<int64_t> g_bvar_recycler_instance_recycle_start_ts;
720
extern mBvarStatus<int64_t> g_bvar_recycler_instance_recycle_end_ts;
721
extern mBvarStatus<int64_t> g_bvar_recycler_instance_recycle_last_success_ts;
722
723
extern mBvarIntAdder g_bvar_recycler_vault_recycle_task_status;
724
extern mBvarStatus<int64_t> g_bvar_recycler_instance_last_round_recycled_num;
725
extern mBvarStatus<int64_t> g_bvar_recycler_instance_last_round_to_recycle_num;
726
extern mBvarStatus<int64_t> g_bvar_recycler_instance_last_round_recycled_bytes;
727
extern mBvarStatus<int64_t> g_bvar_recycler_instance_last_round_to_recycle_bytes;
728
extern mBvarStatus<double> g_bvar_recycler_instance_last_round_recycle_elpased_ts;
729
extern mBvarInt64Adder g_bvar_recycler_instance_recycle_total_num_since_started;
730
extern mBvarInt64Adder g_bvar_recycler_instance_recycle_total_bytes_since_started;
731
extern mBvarIntAdder g_bvar_recycler_instance_recycle_round;
732
extern mBvarStatus<double> g_bvar_recycler_instance_recycle_time_per_resource;
733
extern mBvarStatus<double> g_bvar_recycler_instance_recycle_bytes_per_ms;
734
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_recycled_kv_num;
735
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_recycled_kv_bytes;
736
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_recycle_cost_ms;
737
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_scanned_kv_num;
738
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_corrected_kv_num;
739
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_recycled_object_num;
740
741
extern BvarStatusWithTag<int64_t> g_bvar_recycler_batch_delete_rowset_plan_count;
742
extern BvarStatusWithTag<int64_t> g_bvar_recycler_batch_delete_failures;
743
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_bytes_object_deleted;
744
extern BvarStatusWithTag<int64_t> g_bvar_recycler_packed_file_rowset_scanned_num;
745
746
// Operation Log Recycler BVars
747
// Note: generic metrics (last_round_to_recycle_num/bytes, last_round_recycled_num/bytes, etc.)
748
// are reported by RecyclerMetricsContext with operation_type = "recycle_operation_logs".
749
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_total_num;
750
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_not_recycled_num;
751
extern mBvarIntAdder g_bvar_recycler_oplog_recycle_failed_num;
752
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_commit_partition_num;
753
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_drop_partition_num;
754
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_commit_index_num;
755
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_drop_index_num;
756
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_update_tablet_num;
757
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_compaction_num;
758
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_schema_change_num;
759
extern mBvarStatus<int64_t> g_bvar_recycler_oplog_last_round_recycled_commit_txn_num;
760
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_commit_partition_num;
761
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_drop_partition_num;
762
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_commit_index_num;
763
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_drop_index_num;
764
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_update_tablet_num;
765
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_compaction_num;
766
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_schema_change_num;
767
extern mBvarIntAdder g_bvar_recycler_oplog_recycled_commit_txn_num;
768
769
// txn_kv's bvars
770
extern bvar::LatencyRecorder g_bvar_txn_kv_get;
771
extern bvar::LatencyRecorder g_bvar_txn_kv_range_get;
772
extern bvar::LatencyRecorder g_bvar_txn_kv_put;
773
extern bvar::LatencyRecorder g_bvar_txn_kv_commit;
774
extern bvar::LatencyRecorder g_bvar_txn_kv_watch_key;
775
extern bvar::LatencyRecorder g_bvar_txn_kv_atomic_set_ver_key;
776
extern bvar::LatencyRecorder g_bvar_txn_kv_atomic_set_ver_value;
777
extern bvar::LatencyRecorder g_bvar_txn_kv_atomic_add;
778
extern bvar::LatencyRecorder g_bvar_txn_kv_remove;
779
extern bvar::LatencyRecorder g_bvar_txn_kv_range_remove;
780
extern bvar::LatencyRecorder g_bvar_txn_kv_get_read_version;
781
extern bvar::LatencyRecorder g_bvar_txn_kv_get_committed_version;
782
extern bvar::LatencyRecorder g_bvar_txn_kv_batch_get;
783
784
extern bvar::Adder<int64_t> g_bvar_txn_kv_commit_error_counter;
785
extern bvar::Adder<int64_t> g_bvar_txn_kv_commit_conflict_counter;
786
extern bvar::Adder<int64_t> g_bvar_txn_kv_get_count_normalized;
787
788
extern bvar::Adder<int64_t> g_bvar_delete_bitmap_lock_txn_put_conflict_counter;
789
extern bvar::Adder<int64_t> g_bvar_delete_bitmap_lock_txn_remove_conflict_by_fail_counter;
790
extern bvar::Adder<int64_t> g_bvar_delete_bitmap_lock_txn_remove_conflict_by_load_counter;
791
extern bvar::Adder<int64_t>
792
        g_bvar_delete_bitmap_lock_txn_remove_conflict_by_compaction_commit_counter;
793
extern bvar::Adder<int64_t>
794
        g_bvar_delete_bitmap_lock_txn_remove_conflict_by_compaction_lease_counter;
795
extern bvar::Adder<int64_t>
796
        g_bvar_delete_bitmap_lock_txn_remove_conflict_by_compaction_abort_counter;
797
798
extern const int64_t BVAR_FDB_INVALID_VALUE;
799
extern bvar::Status<int64_t> g_bvar_fdb_client_count;
800
extern bvar::Status<int64_t> g_bvar_fdb_configuration_coordinators_count;
801
extern bvar::Status<int64_t> g_bvar_fdb_configuration_usable_regions;
802
extern bvar::Status<int64_t> g_bvar_fdb_coordinators_unreachable_count;
803
extern bvar::Status<int64_t> g_bvar_fdb_fault_tolerance_count;
804
extern bvar::Status<int64_t> g_bvar_fdb_data_average_partition_size_bytes;
805
extern bvar::Status<int64_t> g_bvar_fdb_data_log_server_space_bytes;
806
extern bvar::Status<int64_t> g_bvar_fdb_data_moving_data_highest_priority;
807
extern bvar::Status<int64_t> g_bvar_fdb_data_moving_data_in_flight_bytes;
808
extern bvar::Status<int64_t> g_bvar_fdb_data_moving_data_in_queue_bytes;
809
extern bvar::Status<int64_t> g_bvar_fdb_data_moving_total_written_bytes;
810
extern bvar::Status<int64_t> g_bvar_fdb_data_partition_count;
811
extern bvar::Status<int64_t> g_bvar_fdb_data_storage_server_space_bytes;
812
extern bvar::Status<int64_t> g_bvar_fdb_data_state_min_replicas_remaining;
813
extern bvar::Status<int64_t> g_bvar_fdb_data_total_kv_size_bytes;
814
extern bvar::Status<int64_t> g_bvar_fdb_data_total_disk_used_bytes;
815
extern bvar::Status<int64_t> g_bvar_fdb_generation;
816
extern bvar::Status<int64_t> g_bvar_fdb_incompatible_connections;
817
extern bvar::Status<int64_t> g_bvar_fdb_latency_probe_transaction_start_ns;
818
extern bvar::Status<int64_t> g_bvar_fdb_latency_probe_commit_ns;
819
extern bvar::Status<int64_t> g_bvar_fdb_latency_probe_read_ns;
820
extern bvar::Status<int64_t> g_bvar_fdb_performance_limited_by_name;
821
extern bvar::Status<int64_t> g_bvar_fdb_machines_count;
822
extern bvar::Status<int64_t> g_bvar_fdb_process_count;
823
extern bvar::Status<int64_t> g_bvar_fdb_qos_worst_data_lag_storage_server_ns;
824
extern bvar::Status<int64_t> g_bvar_fdb_qos_worst_durability_lag_storage_server_ns;
825
extern bvar::Status<int64_t> g_bvar_fdb_qos_worst_log_server_queue_bytes;
826
extern bvar::Status<int64_t> g_bvar_fdb_qos_worst_storage_server_queue_bytes;
827
extern bvar::Status<int64_t> g_bvar_fdb_client_thread_busyness_percent;
828
extern mBvarStatus<double> g_bvar_fdb_cluster_processes;
829
extern mBvarStatus<double> g_bvar_fdb_cluster_workload;
830
831
// checker
832
extern BvarStatusWithTag<long> g_bvar_checker_num_scanned;
833
extern BvarStatusWithTag<long> g_bvar_checker_num_scanned_with_segment;
834
extern BvarStatusWithTag<long> g_bvar_checker_num_check_failed;
835
extern BvarStatusWithTag<long> g_bvar_checker_check_cost_s;
836
extern BvarStatusWithTag<long> g_bvar_checker_enqueue_cost_s;
837
extern BvarStatusWithTag<long> g_bvar_checker_last_success_time_ms;
838
extern BvarStatusWithTag<long> g_bvar_checker_instance_volume;
839
extern BvarStatusWithTag<long> g_bvar_inverted_checker_num_scanned;
840
extern BvarStatusWithTag<long> g_bvar_inverted_checker_num_check_failed;
841
842
extern BvarStatusWithTag<int64_t> g_bvar_inverted_checker_leaked_delete_bitmaps;
843
extern BvarStatusWithTag<int64_t> g_bvar_inverted_checker_abnormal_delete_bitmaps;
844
extern BvarStatusWithTag<int64_t> g_bvar_inverted_checker_delete_bitmaps_scanned;
845
extern BvarStatusWithTag<int64_t> g_bvar_max_rowsets_with_useless_delete_bitmap_version;
846
847
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_prepared_state;
848
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_committed_state;
849
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_dropped_state;
850
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_completed_state;
851
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_recycling_state;
852
extern BvarStatusWithTag<int64_t> g_bvar_checker_restore_job_cost_many_time;
853
854
// rpc kv
855
extern mBvarInt64Adder g_bvar_rpc_kv_get_rowset_get_counter;
856
extern mBvarInt64Adder g_bvar_rpc_kv_get_version_get_counter;
857
extern mBvarInt64Adder g_bvar_rpc_kv_get_schema_dict_get_counter;
858
extern mBvarInt64Adder g_bvar_rpc_kv_create_tablets_get_counter;
859
extern mBvarInt64Adder g_bvar_rpc_kv_create_tablets_put_counter;
860
extern mBvarInt64Adder g_bvar_rpc_kv_update_tablet_get_counter;
861
extern mBvarInt64Adder g_bvar_rpc_kv_update_tablet_put_counter;
862
extern mBvarInt64Adder g_bvar_rpc_kv_get_tablet_get_counter;
863
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_rowset_get_counter;
864
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_rowset_put_counter;
865
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_get_counter;
866
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_put_counter;
867
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_del_counter;
868
extern mBvarInt64Adder g_bvar_rpc_kv_update_tmp_rowset_get_counter;
869
extern mBvarInt64Adder g_bvar_rpc_kv_update_tmp_rowset_put_counter;
870
extern mBvarInt64Adder g_bvar_rpc_kv_get_tablet_stats_get_counter;
871
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_get_counter;
872
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_put_counter;
873
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_del_counter;
874
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_get_counter;
875
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_get_counter;
876
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_put_counter;
877
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_del_counter;
878
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_get_counter;
879
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_put_counter;
880
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_del_counter;
881
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_del_counter;
882
extern mBvarInt64Adder g_bvar_rpc_kv_start_tablet_job_get_counter;
883
extern mBvarInt64Adder g_bvar_rpc_kv_start_tablet_job_put_counter;
884
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_get_counter;
885
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_put_counter;
886
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_del_counter;
887
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_index_get_counter;
888
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_index_put_counter;
889
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_get_counter;
890
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_put_counter;
891
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_del_counter;
892
extern mBvarInt64Adder g_bvar_rpc_kv_drop_index_get_counter;
893
extern mBvarInt64Adder g_bvar_rpc_kv_drop_index_put_counter;
894
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_partition_get_counter;
895
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_partition_put_counter;
896
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_get_counter;
897
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_put_counter;
898
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_del_counter;
899
extern mBvarInt64Adder g_bvar_rpc_kv_drop_partition_get_counter;
900
extern mBvarInt64Adder g_bvar_rpc_kv_drop_partition_put_counter;
901
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_restore_job_get_counter;
902
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_restore_job_put_counter;
903
extern mBvarInt64Adder g_bvar_rpc_kv_commit_restore_job_get_counter;
904
extern mBvarInt64Adder g_bvar_rpc_kv_commit_restore_job_put_counter;
905
extern mBvarInt64Adder g_bvar_rpc_kv_finish_restore_job_get_counter;
906
extern mBvarInt64Adder g_bvar_rpc_kv_finish_restore_job_put_counter;
907
extern mBvarInt64Adder g_bvar_rpc_kv_check_kv_get_counter;
908
extern mBvarInt64Adder g_bvar_rpc_kv_get_obj_store_info_get_counter;
909
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_get_counter;
910
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_put_counter;
911
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_del_counter;
912
extern mBvarInt64Adder g_bvar_rpc_kv_alter_obj_store_info_get_counter;
913
extern mBvarInt64Adder g_bvar_rpc_kv_alter_obj_store_info_put_counter;
914
extern mBvarInt64Adder g_bvar_rpc_kv_update_ak_sk_get_counter;
915
extern mBvarInt64Adder g_bvar_rpc_kv_update_ak_sk_put_counter;
916
extern mBvarInt64Adder g_bvar_rpc_kv_create_instance_get_counter;
917
extern mBvarInt64Adder g_bvar_rpc_kv_create_instance_put_counter;
918
extern mBvarInt64Adder g_bvar_rpc_kv_get_instance_get_counter;
919
extern mBvarInt64Adder g_bvar_rpc_kv_alter_cluster_get_counter;
920
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_get_counter;
921
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_put_counter;
922
extern mBvarInt64Adder g_bvar_rpc_kv_create_stage_get_counter;
923
extern mBvarInt64Adder g_bvar_rpc_kv_create_stage_put_counter;
924
extern mBvarInt64Adder g_bvar_rpc_kv_get_stage_get_counter;
925
extern mBvarInt64Adder g_bvar_rpc_kv_get_iam_get_counter;
926
extern mBvarInt64Adder g_bvar_rpc_kv_alter_iam_get_counter;
927
extern mBvarInt64Adder g_bvar_rpc_kv_alter_iam_put_counter;
928
extern mBvarInt64Adder g_bvar_rpc_kv_alter_ram_user_get_counter;
929
extern mBvarInt64Adder g_bvar_rpc_kv_alter_ram_user_put_counter;
930
extern mBvarInt64Adder g_bvar_rpc_kv_begin_copy_get_counter;
931
extern mBvarInt64Adder g_bvar_rpc_kv_begin_copy_put_counter;
932
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_get_counter;
933
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_put_counter;
934
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_del_counter;
935
extern mBvarInt64Adder g_bvar_rpc_kv_get_copy_job_get_counter;
936
extern mBvarInt64Adder g_bvar_rpc_kv_get_copy_files_get_counter;
937
extern mBvarInt64Adder g_bvar_rpc_kv_filter_copy_files_get_counter;
938
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_status_get_counter;
939
extern mBvarInt64Adder g_bvar_rpc_kv_begin_txn_get_counter;
940
extern mBvarInt64Adder g_bvar_rpc_kv_begin_txn_put_counter;
941
extern mBvarInt64Adder g_bvar_rpc_kv_precommit_txn_get_counter;
942
extern mBvarInt64Adder g_bvar_rpc_kv_precommit_txn_put_counter;
943
extern mBvarInt64Adder g_bvar_rpc_kv_get_rl_task_commit_attach_get_counter;
944
extern mBvarInt64Adder g_bvar_rpc_kv_get_streaming_task_commit_attach_get_counter;
945
extern mBvarInt64Adder g_bvar_rpc_kv_delete_streaming_job_del_counter;
946
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_get_counter;
947
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_put_counter;
948
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_del_counter;
949
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_get_counter;
950
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_put_counter;
951
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_del_counter;
952
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_get_counter;
953
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_put_counter;
954
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_del_counter;
955
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_get_counter;
956
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_put_counter;
957
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_del_counter;
958
extern mBvarInt64Adder g_bvar_rpc_kv_get_txn_get_counter;
959
extern mBvarInt64Adder g_bvar_rpc_kv_get_current_max_txn_id_get_counter;
960
extern mBvarInt64Adder g_bvar_rpc_kv_create_meta_sync_point_del_counter;
961
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_get_counter;
962
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_put_counter;
963
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_del_counter;
964
extern mBvarInt64Adder g_bvar_rpc_kv_abort_sub_txn_get_counter;
965
extern mBvarInt64Adder g_bvar_rpc_kv_abort_sub_txn_put_counter;
966
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_with_coordinator_get_counter;
967
extern mBvarInt64Adder g_bvar_rpc_kv_get_prepare_txn_by_coordinator_get_counter;
968
extern mBvarInt64Adder g_bvar_rpc_kv_check_txn_conflict_get_counter;
969
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_get_counter;
970
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_put_counter;
971
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_del_counter;
972
extern mBvarInt64Adder g_bvar_rpc_kv_get_txn_id_get_counter;
973
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_get_counter;
974
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_put_counter;
975
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_del_counter;
976
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_get_counter;
977
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_put_counter;
978
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_del_counter;
979
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_get_counter;
980
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_put_counter;
981
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_del_counter;
982
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_get_counter;
983
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_put_counter;
984
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_del_counter;
985
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_get_counter;
986
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_put_counter;
987
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_del_counter;
988
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_get_counter;
989
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_put_counter;
990
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_del_counter;
991
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_get_counter;
992
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_put_counter;
993
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_del_counter;
994
extern mBvarInt64Adder g_bvar_rpc_kv_compact_snapshot_get_counter;
995
extern mBvarInt64Adder g_bvar_rpc_kv_compact_snapshot_put_counter;
996
997
extern mBvarInt64Adder g_bvar_rpc_kv_get_rowset_get_bytes;
998
extern mBvarInt64Adder g_bvar_rpc_kv_get_version_get_bytes;
999
extern mBvarInt64Adder g_bvar_rpc_kv_get_schema_dict_get_bytes;
1000
extern mBvarInt64Adder g_bvar_rpc_kv_create_tablets_get_bytes;
1001
extern mBvarInt64Adder g_bvar_rpc_kv_create_tablets_put_bytes;
1002
extern mBvarInt64Adder g_bvar_rpc_kv_update_tablet_get_bytes;
1003
extern mBvarInt64Adder g_bvar_rpc_kv_update_tablet_put_bytes;
1004
extern mBvarInt64Adder g_bvar_rpc_kv_get_tablet_get_bytes;
1005
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_rowset_get_bytes;
1006
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_rowset_put_bytes;
1007
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_get_bytes;
1008
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_put_bytes;
1009
extern mBvarInt64Adder g_bvar_rpc_kv_commit_rowset_del_bytes;
1010
extern mBvarInt64Adder g_bvar_rpc_kv_update_tmp_rowset_get_bytes;
1011
extern mBvarInt64Adder g_bvar_rpc_kv_update_tmp_rowset_put_bytes;
1012
extern mBvarInt64Adder g_bvar_rpc_kv_get_tablet_stats_get_bytes;
1013
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_get_bytes;
1014
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_put_bytes;
1015
extern mBvarInt64Adder g_bvar_rpc_kv_update_delete_bitmap_del_bytes;
1016
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_get_bytes;
1017
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_get_bytes;
1018
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_put_bytes;
1019
extern mBvarInt64Adder g_bvar_rpc_kv_get_delete_bitmap_update_lock_del_bytes;
1020
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_get_bytes;
1021
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_put_bytes;
1022
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_update_lock_del_bytes;
1023
extern mBvarInt64Adder g_bvar_rpc_kv_remove_delete_bitmap_del_bytes;
1024
extern mBvarInt64Adder g_bvar_rpc_kv_start_tablet_job_get_bytes;
1025
extern mBvarInt64Adder g_bvar_rpc_kv_start_tablet_job_put_bytes;
1026
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_get_bytes;
1027
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_put_bytes;
1028
extern mBvarInt64Adder g_bvar_rpc_kv_finish_tablet_job_del_bytes;
1029
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_index_get_bytes;
1030
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_index_put_bytes;
1031
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_get_bytes;
1032
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_put_bytes;
1033
extern mBvarInt64Adder g_bvar_rpc_kv_commit_index_del_bytes;
1034
extern mBvarInt64Adder g_bvar_rpc_kv_drop_index_get_bytes;
1035
extern mBvarInt64Adder g_bvar_rpc_kv_drop_index_put_bytes;
1036
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_partition_get_bytes;
1037
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_partition_put_bytes;
1038
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_get_bytes;
1039
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_put_bytes;
1040
extern mBvarInt64Adder g_bvar_rpc_kv_commit_partition_del_bytes;
1041
extern mBvarInt64Adder g_bvar_rpc_kv_drop_partition_get_bytes;
1042
extern mBvarInt64Adder g_bvar_rpc_kv_drop_partition_put_bytes;
1043
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_restore_job_get_bytes;
1044
extern mBvarInt64Adder g_bvar_rpc_kv_prepare_restore_job_put_bytes;
1045
extern mBvarInt64Adder g_bvar_rpc_kv_commit_restore_job_get_bytes;
1046
extern mBvarInt64Adder g_bvar_rpc_kv_commit_restore_job_put_bytes;
1047
extern mBvarInt64Adder g_bvar_rpc_kv_finish_restore_job_get_bytes;
1048
extern mBvarInt64Adder g_bvar_rpc_kv_finish_restore_job_put_bytes;
1049
extern mBvarInt64Adder g_bvar_rpc_kv_check_kv_get_bytes;
1050
extern mBvarInt64Adder g_bvar_rpc_kv_get_obj_store_info_get_bytes;
1051
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_get_bytes;
1052
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_put_bytes;
1053
extern mBvarInt64Adder g_bvar_rpc_kv_alter_storage_vault_del_bytes;
1054
extern mBvarInt64Adder g_bvar_rpc_kv_alter_obj_store_info_get_bytes;
1055
extern mBvarInt64Adder g_bvar_rpc_kv_alter_obj_store_info_put_bytes;
1056
extern mBvarInt64Adder g_bvar_rpc_kv_update_ak_sk_get_bytes;
1057
extern mBvarInt64Adder g_bvar_rpc_kv_update_ak_sk_put_bytes;
1058
extern mBvarInt64Adder g_bvar_rpc_kv_create_instance_get_bytes;
1059
extern mBvarInt64Adder g_bvar_rpc_kv_create_instance_put_bytes;
1060
extern mBvarInt64Adder g_bvar_rpc_kv_get_instance_get_bytes;
1061
extern mBvarInt64Adder g_bvar_rpc_kv_alter_cluster_get_bytes;
1062
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_get_bytes;
1063
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_put_bytes;
1064
extern mBvarInt64Adder g_bvar_rpc_kv_create_stage_get_bytes;
1065
extern mBvarInt64Adder g_bvar_rpc_kv_create_stage_put_bytes;
1066
extern mBvarInt64Adder g_bvar_rpc_kv_get_stage_get_bytes;
1067
extern mBvarInt64Adder g_bvar_rpc_kv_get_iam_get_bytes;
1068
extern mBvarInt64Adder g_bvar_rpc_kv_alter_iam_get_bytes;
1069
extern mBvarInt64Adder g_bvar_rpc_kv_alter_iam_put_bytes;
1070
extern mBvarInt64Adder g_bvar_rpc_kv_alter_ram_user_get_bytes;
1071
extern mBvarInt64Adder g_bvar_rpc_kv_alter_ram_user_put_bytes;
1072
extern mBvarInt64Adder g_bvar_rpc_kv_begin_copy_get_bytes;
1073
extern mBvarInt64Adder g_bvar_rpc_kv_begin_copy_put_bytes;
1074
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_get_bytes;
1075
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_put_bytes;
1076
extern mBvarInt64Adder g_bvar_rpc_kv_finish_copy_del_bytes;
1077
extern mBvarInt64Adder g_bvar_rpc_kv_get_copy_job_get_bytes;
1078
extern mBvarInt64Adder g_bvar_rpc_kv_get_copy_files_get_bytes;
1079
extern mBvarInt64Adder g_bvar_rpc_kv_filter_copy_files_get_bytes;
1080
extern mBvarInt64Adder g_bvar_rpc_kv_get_cluster_status_get_bytes;
1081
extern mBvarInt64Adder g_bvar_rpc_kv_begin_txn_get_bytes;
1082
extern mBvarInt64Adder g_bvar_rpc_kv_begin_txn_put_bytes;
1083
extern mBvarInt64Adder g_bvar_rpc_kv_precommit_txn_get_bytes;
1084
extern mBvarInt64Adder g_bvar_rpc_kv_precommit_txn_put_bytes;
1085
extern mBvarInt64Adder g_bvar_rpc_kv_get_rl_task_commit_attach_get_bytes;
1086
extern mBvarInt64Adder g_bvar_rpc_kv_get_streaming_task_commit_attach_get_bytes;
1087
extern mBvarInt64Adder g_bvar_rpc_kv_delete_streaming_job_del_bytes;
1088
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_get_bytes;
1089
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_put_bytes;
1090
extern mBvarInt64Adder g_bvar_rpc_kv_reset_streaming_job_offset_del_bytes;
1091
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_get_bytes;
1092
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_put_bytes;
1093
extern mBvarInt64Adder g_bvar_rpc_kv_reset_rl_progress_del_bytes;
1094
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_get_bytes;
1095
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_put_bytes;
1096
extern mBvarInt64Adder g_bvar_rpc_kv_commit_txn_del_bytes;
1097
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_get_bytes;
1098
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_put_bytes;
1099
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_del_bytes;
1100
extern mBvarInt64Adder g_bvar_rpc_kv_get_txn_get_bytes;
1101
extern mBvarInt64Adder g_bvar_rpc_kv_get_current_max_txn_id_get_bytes;
1102
extern mBvarInt64Adder g_bvar_rpc_kv_create_meta_sync_point_del_bytes;
1103
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_get_bytes;
1104
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_put_bytes;
1105
extern mBvarInt64Adder g_bvar_rpc_kv_begin_sub_txn_del_bytes;
1106
extern mBvarInt64Adder g_bvar_rpc_kv_abort_sub_txn_get_bytes;
1107
extern mBvarInt64Adder g_bvar_rpc_kv_abort_sub_txn_put_bytes;
1108
extern mBvarInt64Adder g_bvar_rpc_kv_abort_txn_with_coordinator_get_bytes;
1109
extern mBvarInt64Adder g_bvar_rpc_kv_get_prepare_txn_by_coordinator_get_bytes;
1110
extern mBvarInt64Adder g_bvar_rpc_kv_check_txn_conflict_get_bytes;
1111
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_get_bytes;
1112
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_put_bytes;
1113
extern mBvarInt64Adder g_bvar_rpc_kv_clean_txn_label_del_bytes;
1114
extern mBvarInt64Adder g_bvar_rpc_kv_get_txn_id_get_bytes;
1115
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_get_bytes;
1116
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_put_bytes;
1117
extern mBvarInt64Adder g_bvar_rpc_kv_begin_snapshot_del_bytes;
1118
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_get_bytes;
1119
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_put_bytes;
1120
extern mBvarInt64Adder g_bvar_rpc_kv_update_snapshot_del_bytes;
1121
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_get_bytes;
1122
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_put_bytes;
1123
extern mBvarInt64Adder g_bvar_rpc_kv_commit_snapshot_del_bytes;
1124
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_get_bytes;
1125
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_put_bytes;
1126
extern mBvarInt64Adder g_bvar_rpc_kv_abort_snapshot_del_bytes;
1127
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_get_bytes;
1128
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_put_bytes;
1129
extern mBvarInt64Adder g_bvar_rpc_kv_drop_snapshot_del_bytes;
1130
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_get_bytes;
1131
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_put_bytes;
1132
extern mBvarInt64Adder g_bvar_rpc_kv_list_snapshot_del_bytes;
1133
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_get_bytes;
1134
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_put_bytes;
1135
extern mBvarInt64Adder g_bvar_rpc_kv_clone_instance_del_bytes;
1136
extern mBvarInt64Adder g_bvar_rpc_kv_compact_snapshot_get_bytes;
1137
extern mBvarInt64Adder g_bvar_rpc_kv_compact_snapshot_put_bytes;
1138
1139
// meta ranges
1140
extern mBvarStatus<int64_t> g_bvar_fdb_kv_ranges_count;