|
1 | 1 | #include <storages/redis/impl/redis_stats.hpp>
|
2 | 2 |
|
| 3 | +#include <array> |
| 4 | + |
3 | 5 | #include <storages/redis/impl/command.hpp>
|
4 | 6 | #include <storages/redis/impl/redis.hpp>
|
5 | 7 | #include <userver/logging/log.hpp>
|
@@ -102,6 +104,34 @@ const std::string_view kCommandTypes[] = {
|
102 | 104 | "zscore",
|
103 | 105 | };
|
104 | 106 |
|
| 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 | + |
105 | 135 | } // namespace
|
106 | 136 |
|
107 | 137 | std::chrono::milliseconds MillisecondsSinceEpoch() {
|
@@ -239,19 +269,34 @@ void DumpMetric(utils::statistics::Writer& writer,
|
239 | 269 | DumpMetric(writer, stats.shard_group_total, false);
|
240 | 270 | writer["errors"].ValueWithLabels(stats.internal.redis_not_ready.load(),
|
241 | 271 | {"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) { |
244 | 276 | writer.ValueWithLabels(shard_stats, {{"redis_instance_type", "masters"},
|
245 | 277 | {"redis_shard", shard_name}});
|
246 | 278 | }
|
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) { |
248 | 287 | writer.ValueWithLabels(shard_stats, {{"redis_instance_type", "slaves"},
|
249 | 288 | {"redis_shard", shard_name}});
|
250 | 289 | }
|
| 290 | + conn_stat_slaves.Add(shard_stats); |
251 | 291 | }
|
| 292 | + writer.ValueWithLabels(conn_stat_slaves, {{"redis_instance_type", "slaves"}}); |
| 293 | + |
252 | 294 | if (stats.sentinel) {
|
253 | 295 | writer.ValueWithLabels(*stats.sentinel,
|
254 | 296 | {"redis_instance_type", "sentinels"});
|
| 297 | + ConnStateStatistic conn_stat; |
| 298 | + conn_stat.Add(stats.sentinel.value()); |
| 299 | + writer.ValueWithLabels(conn_stat, {{"redis_instance_type", "sentinels"}}); |
255 | 300 | }
|
256 | 301 | }
|
257 | 302 |
|
|
0 commit comments