Skip to content

Commit 976245d

Browse files
author
leonidlazarev
committed
feat redis: add common statistic of states for instances at cluster level
Tests: протестировано в тестинге
1 parent 5994315 commit 976245d

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

redis/functional_tests/metrics/tests/static/metrics_values.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,19 @@ redis.state: redis_database=metrics_test, redis_instance=127.0.0.1:00000, redis_
286286
redis.state: redis_database=metrics_test, redis_instance=127.0.0.1:00000, redis_instance_state=init_error, redis_instance_type=masters, redis_shard=test_master0 GAUGE 0
287287
redis.state: redis_database=metrics_test, redis_instance=127.0.0.1:00000, redis_instance_state=init_error, redis_instance_type=sentinels GAUGE 0
288288

289+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=connected, redis_instance_type=masters GAUGE 0
290+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=connected, redis_instance_type=sentinels GAUGE 0
291+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnect_error, redis_instance_type=masters GAUGE 0
292+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnect_error, redis_instance_type=sentinels GAUGE 0
293+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnected, redis_instance_type=masters GAUGE 0
294+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnected, redis_instance_type=sentinels GAUGE 0
295+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnecting, redis_instance_type=masters GAUGE 0
296+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=disconnecting, redis_instance_type=sentinels GAUGE 0
297+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=init, redis_instance_type=masters GAUGE 0
298+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=init, redis_instance_type=sentinels GAUGE 0
299+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=init_error, redis_instance_type=masters GAUGE 0
300+
redis.cluster_states: redis_database=metrics_test, redis_instance_state=init_error, redis_instance_type=sentinels GAUGE 0
301+
289302
redis.timings: percentile=p0, redis_database=metrics_test GAUGE 0
290303
redis.timings: percentile=p0, redis_database=metrics_test, redis_instance=127.0.0.1:00000, redis_instance_type=masters, redis_shard=test_master0 GAUGE 0
291304
redis.timings: percentile=p0, redis_database=metrics_test, redis_instance=127.0.0.1:00000, redis_instance_type=sentinels GAUGE 0

redis/src/storages/redis/impl/redis_stats.cpp

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include <storages/redis/impl/redis_stats.hpp>
22

3+
#include <array>
4+
35
#include <storages/redis/impl/command.hpp>
46
#include <storages/redis/impl/redis.hpp>
57
#include <userver/logging/log.hpp>
@@ -102,6 +104,34 @@ const std::string_view kCommandTypes[] = {
102104
"zscore",
103105
};
104106

107+
struct ConnStateStatistic {
108+
std::array<size_t, static_cast<size_t>(Redis::State::kDisconnectError) + 1>
109+
statistic{};
110+
111+
void Add(const ShardStatistics& shard_stats) {
112+
for (const auto& [_, stats] : shard_stats.instances) {
113+
UASSERT(stats.state <= Redis::State::kDisconnectError);
114+
statistic.at(static_cast<size_t>(stats.state))++;
115+
}
116+
}
117+
118+
size_t Get(Redis::State state) const {
119+
UASSERT(state <= Redis::State::kDisconnectError);
120+
return statistic.at(static_cast<size_t>(state));
121+
}
122+
};
123+
124+
void DumpMetric(utils::statistics::Writer& writer,
125+
const ConnStateStatistic& stats) {
126+
for (size_t i = 0; i <= static_cast<int>(Redis::State::kDisconnectError);
127+
++i) {
128+
const auto state = static_cast<Redis::State>(i);
129+
writer["cluster_states"].ValueWithLabels(
130+
stats.Get(state),
131+
{"redis_instance_state", redis::Redis::StateToString(state)});
132+
}
133+
}
134+
105135
} // namespace
106136

107137
std::chrono::milliseconds MillisecondsSinceEpoch() {
@@ -239,19 +269,34 @@ void DumpMetric(utils::statistics::Writer& writer,
239269
DumpMetric(writer, stats.shard_group_total, false);
240270
writer["errors"].ValueWithLabels(stats.internal.redis_not_ready.load(),
241271
{"redis_error", "redis_not_ready"});
242-
if (settings.GetMetricsLevel() >= MetricsSettings::Level::kShard) {
243-
for (const auto& [shard_name, shard_stats] : stats.masters) {
272+
273+
ConnStateStatistic conn_stat_masters;
274+
for (const auto& [shard_name, shard_stats] : stats.masters) {
275+
if (settings.GetMetricsLevel() >= MetricsSettings::Level::kShard) {
244276
writer.ValueWithLabels(shard_stats, {{"redis_instance_type", "masters"},
245277
{"redis_shard", shard_name}});
246278
}
247-
for (const auto& [shard_name, shard_stats] : stats.slaves) {
279+
conn_stat_masters.Add(shard_stats);
280+
}
281+
writer.ValueWithLabels(conn_stat_masters,
282+
{{"redis_instance_type", "masters"}});
283+
284+
ConnStateStatistic conn_stat_slaves;
285+
for (const auto& [shard_name, shard_stats] : stats.slaves) {
286+
if (settings.GetMetricsLevel() >= MetricsSettings::Level::kShard) {
248287
writer.ValueWithLabels(shard_stats, {{"redis_instance_type", "slaves"},
249288
{"redis_shard", shard_name}});
250289
}
290+
conn_stat_slaves.Add(shard_stats);
251291
}
292+
writer.ValueWithLabels(conn_stat_slaves, {{"redis_instance_type", "slaves"}});
293+
252294
if (stats.sentinel) {
253295
writer.ValueWithLabels(*stats.sentinel,
254296
{"redis_instance_type", "sentinels"});
297+
ConnStateStatistic conn_stat;
298+
conn_stat.Add(stats.sentinel.value());
299+
writer.ValueWithLabels(conn_stat, {{"redis_instance_type", "sentinels"}});
255300
}
256301
}
257302

0 commit comments

Comments
 (0)