| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package redis |
| 4 | |
| 5 | import "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi" |
| 6 | |
| 7 | const ( |
| 8 | prioConnections = collectorapi.Priority + iota |
| 9 | prioClients |
| 10 | |
| 11 | prioPingLatency |
| 12 | prioCommands |
| 13 | prioKeyLookupHitRate |
| 14 | |
| 15 | prioMemory |
| 16 | prioMemoryFragmentationRatio |
| 17 | prioKeyEviction |
| 18 | |
| 19 | prioNet |
| 20 | |
| 21 | prioConnectedReplicas |
| 22 | prioMasterLinkStatus |
| 23 | prioMasterLastIOSinceTime |
| 24 | prioMasterLinkDownSinceTime |
| 25 | |
| 26 | prioPersistenceRDBChanges |
| 27 | prioPersistenceRDBBgSaveNow |
| 28 | prioPersistenceRDBBgSaveHealth |
| 29 | prioPersistenceRDBBgSaveLastSaveSinceTime |
| 30 | prioPersistenceAOFSize |
| 31 | |
| 32 | prioCommandsCalls |
| 33 | prioCommandsUsec |
| 34 | prioCommandsUsecPerSec |
| 35 | |
| 36 | prioKeyExpiration |
| 37 | prioKeys |
| 38 | prioExpiresKeys |
| 39 | |
| 40 | prioUptime |
| 41 | ) |
| 42 | |
| 43 | var redisCharts = collectorapi.Charts{ |
| 44 | chartConnections.Copy(), |
| 45 | chartClients.Copy(), |
| 46 | |
| 47 | pingLatencyCommands.Copy(), |
| 48 | chartCommands.Copy(), |
| 49 | chartKeyLookupHitRate.Copy(), |
| 50 | |
| 51 | chartMemory.Copy(), |
| 52 | chartMemoryFragmentationRatio.Copy(), |
| 53 | chartKeyEviction.Copy(), |
| 54 | |
| 55 | chartNet.Copy(), |
| 56 | |
| 57 | chartConnectedReplicas.Copy(), |
| 58 | |
| 59 | chartPersistenceRDBChanges.Copy(), |
| 60 | chartPersistenceRDBBgSaveNow.Copy(), |
| 61 | chartPersistenceRDBBgSaveHealth.Copy(), |
| 62 | chartPersistenceRDBLastSaveSinceTime.Copy(), |
| 63 | |
| 64 | chartCommandsCalls.Copy(), |
| 65 | chartCommandsUsec.Copy(), |
| 66 | chartCommandsUsecPerSec.Copy(), |
| 67 | |
| 68 | chartKeyExpiration.Copy(), |
| 69 | chartKeys.Copy(), |
| 70 | chartExpiresKeys.Copy(), |
| 71 | |
| 72 | chartUptime.Copy(), |
| 73 | } |
| 74 | |
| 75 | var ( |
| 76 | chartConnections = collectorapi.Chart{ |
| 77 | ID: "connections", |
| 78 | Title: "Accepted and rejected (maxclients limit) connections", |
| 79 | Units: "connections/s", |
| 80 | Fam: "connections", |
| 81 | Ctx: "redis.connections", |
| 82 | Priority: prioConnections, |
| 83 | Dims: collectorapi.Dims{ |
| 84 | {ID: "total_connections_received", Name: "accepted", Algo: collectorapi.Incremental}, |
| 85 | {ID: "rejected_connections", Name: "rejected", Algo: collectorapi.Incremental}, |
| 86 | }, |
| 87 | } |
| 88 | chartClients = collectorapi.Chart{ |
| 89 | ID: "clients", |
| 90 | Title: "Clients", |
| 91 | Units: "clients", |
| 92 | Fam: "connections", |
| 93 | Ctx: "redis.clients", |
| 94 | Priority: prioClients, |
| 95 | Dims: collectorapi.Dims{ |
| 96 | {ID: "connected_clients", Name: "connected"}, |
| 97 | {ID: "blocked_clients", Name: "blocked"}, |
| 98 | {ID: "tracking_clients", Name: "tracking"}, |
| 99 | {ID: "clients_in_timeout_table", Name: "in_timeout_table"}, |
| 100 | }, |
| 101 | } |
| 102 | ) |
| 103 | |
| 104 | var ( |
| 105 | pingLatencyCommands = collectorapi.Chart{ |
| 106 | ID: "ping_latency", |
| 107 | Title: "Ping latency", |
| 108 | Units: "seconds", |
| 109 | Fam: "performance", |
| 110 | Ctx: "redis.ping_latency", |
| 111 | Priority: prioPingLatency, |
| 112 | Type: collectorapi.Area, |
| 113 | Dims: collectorapi.Dims{ |
| 114 | {ID: "ping_latency_min", Name: "min", Div: 1e6}, |
| 115 | {ID: "ping_latency_max", Name: "max", Div: 1e6}, |
| 116 | {ID: "ping_latency_avg", Name: "avg", Div: 1e6}, |
| 117 | }, |
| 118 | } |
| 119 | chartCommands = collectorapi.Chart{ |
| 120 | ID: "commands", |
| 121 | Title: "Processed commands", |
| 122 | Units: "commands/s", |
| 123 | Fam: "performance", |
| 124 | Ctx: "redis.commands", |
| 125 | Priority: prioCommands, |
| 126 | Dims: collectorapi.Dims{ |
| 127 | {ID: "total_commands_processed", Name: "processed", Algo: collectorapi.Incremental}, |
| 128 | }, |
| 129 | } |
| 130 | chartKeyLookupHitRate = collectorapi.Chart{ |
| 131 | ID: "key_lookup_hit_rate", |
| 132 | Title: "Keys lookup hit rate", |
| 133 | Units: "percentage", |
| 134 | Fam: "performance", |
| 135 | Ctx: "redis.keyspace_lookup_hit_rate", |
| 136 | Priority: prioKeyLookupHitRate, |
| 137 | Dims: collectorapi.Dims{ |
| 138 | {ID: "keyspace_hit_rate", Name: "lookup_hit_rate", Div: precision}, |
| 139 | }, |
| 140 | } |
| 141 | ) |
| 142 | |
| 143 | var ( |
| 144 | chartMemory = collectorapi.Chart{ |
| 145 | ID: "memory", |
| 146 | Title: "Memory usage", |
| 147 | Units: "bytes", |
| 148 | Fam: "memory", |
| 149 | Ctx: "redis.memory", |
| 150 | Type: collectorapi.Area, |
| 151 | Priority: prioMemory, |
| 152 | Dims: collectorapi.Dims{ |
| 153 | {ID: "maxmemory", Name: "max"}, |
| 154 | {ID: "used_memory", Name: "used"}, |
| 155 | {ID: "used_memory_rss", Name: "rss"}, |
| 156 | {ID: "used_memory_peak", Name: "peak"}, |
| 157 | {ID: "used_memory_dataset", Name: "dataset"}, |
| 158 | {ID: "used_memory_lua", Name: "lua"}, |
| 159 | {ID: "used_memory_scripts", Name: "scripts"}, |
| 160 | }, |
| 161 | } |
| 162 | chartMemoryFragmentationRatio = collectorapi.Chart{ |
| 163 | ID: "mem_fragmentation_ratio", |
| 164 | Title: "Ratio between used_memory_rss and used_memory", |
| 165 | Units: "ratio", |
| 166 | Fam: "memory", |
| 167 | Ctx: "redis.mem_fragmentation_ratio", |
| 168 | Priority: prioMemoryFragmentationRatio, |
| 169 | Dims: collectorapi.Dims{ |
| 170 | {ID: "mem_fragmentation_ratio", Name: "mem_fragmentation", Div: precision}, |
| 171 | }, |
| 172 | } |
| 173 | chartKeyEviction = collectorapi.Chart{ |
| 174 | ID: "key_eviction_events", |
| 175 | Title: "Evicted keys due to maxmemory limit", |
| 176 | Units: "keys/s", |
| 177 | Fam: "memory", |
| 178 | Ctx: "redis.key_eviction_events", |
| 179 | Priority: prioKeyEviction, |
| 180 | Dims: collectorapi.Dims{ |
| 181 | {ID: "evicted_keys", Name: "evicted", Algo: collectorapi.Incremental}, |
| 182 | }, |
| 183 | } |
| 184 | ) |
| 185 | |
| 186 | var ( |
| 187 | chartNet = collectorapi.Chart{ |
| 188 | ID: "net", |
| 189 | Title: "Bandwidth", |
| 190 | Units: "kilobits/s", |
| 191 | Fam: "network", |
| 192 | Ctx: "redis.net", |
| 193 | Type: collectorapi.Area, |
| 194 | Priority: prioNet, |
| 195 | Dims: collectorapi.Dims{ |
| 196 | {ID: "total_net_input_bytes", Name: "received", Mul: 8, Div: 1024, Algo: collectorapi.Incremental}, |
| 197 | {ID: "total_net_output_bytes", Name: "sent", Mul: -8, Div: 1024, Algo: collectorapi.Incremental}, |
| 198 | }, |
| 199 | } |
| 200 | ) |
| 201 | |
| 202 | var ( |
| 203 | chartPersistenceRDBChanges = collectorapi.Chart{ |
| 204 | ID: "persistence", |
| 205 | Title: "Operations that produced changes since the last SAVE or BGSAVE", |
| 206 | Units: "operations", |
| 207 | Fam: "persistence", |
| 208 | Ctx: "redis.rdb_changes", |
| 209 | Priority: prioPersistenceRDBChanges, |
| 210 | Dims: collectorapi.Dims{ |
| 211 | {ID: "rdb_changes_since_last_save", Name: "changes"}, |
| 212 | }, |
| 213 | } |
| 214 | chartPersistenceRDBBgSaveNow = collectorapi.Chart{ |
| 215 | ID: "bgsave_now", |
| 216 | Title: "Duration of the on-going RDB save operation if any", |
| 217 | Units: "seconds", |
| 218 | Fam: "persistence", |
| 219 | Ctx: "redis.bgsave_now", |
| 220 | Priority: prioPersistenceRDBBgSaveNow, |
| 221 | Dims: collectorapi.Dims{ |
| 222 | {ID: "rdb_current_bgsave_time_sec", Name: "current_bgsave_time"}, |
| 223 | }, |
| 224 | } |
| 225 | chartPersistenceRDBBgSaveHealth = collectorapi.Chart{ |
| 226 | ID: "bgsave_health", |
| 227 | Title: "Status of the last RDB save operation (0: ok, 1: err)", |
| 228 | Units: "status", |
| 229 | Fam: "persistence", |
| 230 | Ctx: "redis.bgsave_health", |
| 231 | Priority: prioPersistenceRDBBgSaveHealth, |
| 232 | Dims: collectorapi.Dims{ |
| 233 | {ID: "rdb_last_bgsave_status", Name: "last_bgsave"}, |
| 234 | }, |
| 235 | } |
| 236 | chartPersistenceRDBLastSaveSinceTime = collectorapi.Chart{ |
| 237 | ID: "bgsave_last_rdb_save_since_time", |
| 238 | Title: "Time elapsed since the last successful RDB save", |
| 239 | Units: "seconds", |
| 240 | Fam: "persistence", |
| 241 | Ctx: "redis.bgsave_last_rdb_save_since_time", |
| 242 | Priority: prioPersistenceRDBBgSaveLastSaveSinceTime, |
| 243 | Dims: collectorapi.Dims{ |
| 244 | {ID: "rdb_last_save_time", Name: "last_bgsave_time"}, |
| 245 | }, |
| 246 | } |
| 247 | |
| 248 | chartPersistenceAOFSize = collectorapi.Chart{ |
| 249 | ID: "persistence_aof_size", |
| 250 | Title: "AOF file size", |
| 251 | Units: "bytes", |
| 252 | Fam: "persistence", |
| 253 | Ctx: "redis.aof_file_size", |
| 254 | Priority: prioPersistenceAOFSize, |
| 255 | Dims: collectorapi.Dims{ |
| 256 | {ID: "aof_current_size", Name: "current"}, |
| 257 | {ID: "aof_base_size", Name: "base"}, |
| 258 | }, |
| 259 | } |
| 260 | ) |
| 261 | |
| 262 | var ( |
| 263 | chartCommandsCalls = collectorapi.Chart{ |
| 264 | ID: "commands_calls", |
| 265 | Title: "Calls per command", |
| 266 | Units: "calls/s", |
| 267 | Fam: "commands", |
| 268 | Ctx: "redis.commands_calls", |
| 269 | Type: collectorapi.Stacked, |
| 270 | Priority: prioCommandsCalls, |
| 271 | } |
| 272 | chartCommandsUsec = collectorapi.Chart{ |
| 273 | ID: "commands_usec", |
| 274 | Title: "Total CPU time consumed by the commands", |
| 275 | Units: "microseconds", |
| 276 | Fam: "commands", |
| 277 | Ctx: "redis.commands_usec", |
| 278 | Type: collectorapi.Stacked, |
| 279 | Priority: prioCommandsUsec, |
| 280 | } |
| 281 | chartCommandsUsecPerSec = collectorapi.Chart{ |
| 282 | ID: "commands_usec_per_sec", |
| 283 | Title: "Average CPU consumed per command execution", |
| 284 | Units: "microseconds/s", |
| 285 | Fam: "commands", |
| 286 | Ctx: "redis.commands_usec_per_sec", |
| 287 | Priority: prioCommandsUsecPerSec, |
| 288 | } |
| 289 | ) |
| 290 | |
| 291 | var ( |
| 292 | chartKeyExpiration = collectorapi.Chart{ |
| 293 | ID: "key_expiration_events", |
| 294 | Title: "Expired keys", |
| 295 | Units: "keys/s", |
| 296 | Fam: "keyspace", |
| 297 | Ctx: "redis.key_expiration_events", |
| 298 | Priority: prioKeyExpiration, |
| 299 | Dims: collectorapi.Dims{ |
| 300 | {ID: "expired_keys", Name: "expired", Algo: collectorapi.Incremental}, |
| 301 | }, |
| 302 | } |
| 303 | chartKeys = collectorapi.Chart{ |
| 304 | ID: "keys", |
| 305 | Title: "Keys per database", |
| 306 | Units: "keys", |
| 307 | Fam: "keyspace", |
| 308 | Ctx: "redis.database_keys", |
| 309 | Type: collectorapi.Stacked, |
| 310 | Priority: prioKeys, |
| 311 | } |
| 312 | chartExpiresKeys = collectorapi.Chart{ |
| 313 | ID: "expires_keys", |
| 314 | Title: "Keys with an expiration per database", |
| 315 | Units: "keys", |
| 316 | Fam: "keyspace", |
| 317 | Ctx: "redis.database_expires_keys", |
| 318 | Type: collectorapi.Stacked, |
| 319 | Priority: prioExpiresKeys, |
| 320 | } |
| 321 | ) |
| 322 | |
| 323 | var ( |
| 324 | chartConnectedReplicas = collectorapi.Chart{ |
| 325 | ID: "connected_replicas", |
| 326 | Title: "Connected replicas", |
| 327 | Units: "replicas", |
| 328 | Fam: "replication", |
| 329 | Ctx: "redis.connected_replicas", |
| 330 | Priority: prioConnectedReplicas, |
| 331 | Dims: collectorapi.Dims{ |
| 332 | {ID: "connected_slaves", Name: "connected"}, |
| 333 | }, |
| 334 | } |
| 335 | masterLinkStatusChart = collectorapi.Chart{ |
| 336 | ID: "master_last_status", |
| 337 | Title: "Master link status", |
| 338 | Units: "status", |
| 339 | Fam: "replication", |
| 340 | Ctx: "redis.master_link_status", |
| 341 | Priority: prioMasterLinkStatus, |
| 342 | Dims: collectorapi.Dims{ |
| 343 | {ID: "master_link_status_up", Name: "up"}, |
| 344 | {ID: "master_link_status_down", Name: "down"}, |
| 345 | }, |
| 346 | } |
| 347 | masterLastIOSinceTimeChart = collectorapi.Chart{ |
| 348 | ID: "master_last_io_since_time", |
| 349 | Title: "Time elapsed since the last interaction with master", |
| 350 | Units: "seconds", |
| 351 | Fam: "replication", |
| 352 | Ctx: "redis.master_last_io_since_time", |
| 353 | Priority: prioMasterLastIOSinceTime, |
| 354 | Dims: collectorapi.Dims{ |
| 355 | {ID: "master_last_io_seconds_ago", Name: "time"}, |
| 356 | }, |
| 357 | } |
| 358 | masterLinkDownSinceTimeChart = collectorapi.Chart{ |
| 359 | ID: "master_link_down_since_stime", |
| 360 | Title: "Time elapsed since the link between master and slave is down", |
| 361 | Units: "seconds", |
| 362 | Fam: "replication", |
| 363 | Ctx: "redis.master_link_down_since_time", |
| 364 | Priority: prioMasterLinkDownSinceTime, |
| 365 | Dims: collectorapi.Dims{ |
| 366 | {ID: "master_link_down_since_seconds", Name: "time"}, |
| 367 | }, |
| 368 | } |
| 369 | ) |
| 370 | |
| 371 | var ( |
| 372 | chartUptime = collectorapi.Chart{ |
| 373 | ID: "uptime", |
| 374 | Title: "Uptime", |
| 375 | Units: "seconds", |
| 376 | Fam: "uptime", |
| 377 | Ctx: "redis.uptime", |
| 378 | Priority: prioUptime, |
| 379 | Dims: collectorapi.Dims{ |
| 380 | {ID: "uptime_in_seconds", Name: "uptime"}, |
| 381 | }, |
| 382 | } |
| 383 | ) |