Sensu Transport Handler配置Redis最大记录数与TTL方法咨询
搞定Sensu Redis传输Handler的指标存储限制问题
嘿,我来帮你解决这个Redis里指标越存越多的问题!咱们分两种需求来处理:给记录加自动过期的TTL,还有限制最大存储的记录数,下面一步步来:
一、给指标记录设置TTL(自动过期)
Sensu的Redis Handler本身就支持配置TTL,只要在你的Handler JSON声明里加个redis配置块,指定ttl参数就行。这样每条指标写入Redis时会自动带上过期时间,到点Redis就会自动删掉,根本不用手动清理。
给你个示例配置(你可以直接套进自己的Handler定义里调整):
{ "type": "handler", "api_version": "core/v2", "metadata": { "name": "redis-metrics-handler", "namespace": "default" }, "spec": { "type": "pipe", "command": "sensu-redis-handler", "timeout": 10, "filters": [], "runtime_assets": ["sensu-redis-handler"], "redis": { "host": "你的Redis地址", "port": 6379, "password": "你的Redis密码", "db": 0, "ttl": 86400 // 这里设的是24小时,单位是秒,按需改就行 } } }
划重点:ttl是整数秒数,比如设3600就是1小时,根据你需要保留指标的时长来调。这个配置是最省心的,直接让Redis自动管过期清理。
二、限制最大记录数
如果要控制Redis里最多存多少条指标,有两种实用方式:
方式1:直接给Redis设置内存上限和淘汰策略
这是最简单的办法,不用改Sensu的配置,直接在Redis的redis.conf里加两行:
maxmemory 1gb // 比如给Redis分配1GB内存,按需调整 maxmemory-policy allkeys-lru // 内存满了就删最近最少用的记录
适合场景:如果你的指标都是存在Redis键值对里,这种方式不用额外写脚本,Redis自己会帮你淘汰旧数据,非常省事。
方式2:自定义脚本配合Handler实现精细控制
要是你想针对特定前缀的指标做记录数限制(比如只限制sensu:metrics:开头的键),可以写个小脚本当中间层,在调用原Redis Handler前先检查记录数,超了就删最旧的。
比如写个bash脚本(命名成redis-metrics-limiter.sh):
#!/bin/bash # 自定义指标键前缀和最大记录数 METRIC_PREFIX="sensu:metrics:" MAX_RECORDS=10000 # 拿当前记录数 RECORD_COUNT=$(redis-cli keys "${METRIC_PREFIX}*" | wc -l) # 超过上限就删最旧的 if [ $RECORD_COUNT -gt $MAX_RECORDS ]; then # 找出闲置最久的键(按空闲时间排序) OLDEST_KEY=$(redis-cli keys "${METRIC_PREFIX}*" | xargs redis-cli object idletime | sort -n | tail -1 | awk '{print $2}') redis-cli del $OLDEST_KEY fi # 调用原Redis Handler exec sensu-redis-handler $@
然后把Handler里的command改成这个脚本的路径:
{ "spec": { "command": "/你放脚本的路径/redis-metrics-limiter.sh", // 其他配置比如redis块的ttl啥的都保留 } }
注意:如果你的指标量很大,keys命令可能有点卡,建议改成scan命令优化一下;还要确保Sensu用户能跑redis-cli哦。
小提醒
- 要是同时开了TTL和内存限制,Redis会先清过期的,内存还满才会触发淘汰策略。
- 确保你的
sensu-redis-handler是新版本,旧版本可能不支持ttl参数,实在不行就升级下~
内容的提问来源于stack exchange,提问作者Evgeny Makarov
相关产品推荐
相关产品推荐

