Graphite仪表盘无法显示一周前的数据点问题求助
这问题我碰过好多次,核心原因基本都是**Graphite的数据保留策略(Retention Policy)**在搞事情——docker-grafana-graphite这个镜像默认配置通常只保留最近7天的细粒度原始数据,超过这个时间的旧数据已经被自动轮转删除了,所以你查30天范围时只能拿到最近7天的结果。
下面给你一步步排查和解决的方法:
1. 先检查当前的存储保留配置
首先进入Graphite容器,查看核心配置文件storage-schemas.conf,它一般在/opt/graphite/conf/目录下。执行这条命令:
docker exec -it <你的Graphite容器名/ID> cat /opt/graphite/conf/storage-schemas.conf
默认配置大概率是这样的:
[default]
pattern = .*
retentions = 1m:7d,1h:30d,1d:1y
这段配置的意思是:1分钟粒度的原始数据保留7天,1小时粒度的汇总数据保留30天,1天粒度的汇总数据保留1年。但你查询时用的是summarize按1小时汇总,要是原始数据只留了7天,那Graphite根本没法生成7天之前的1小时汇总数据——巧妇难为无米之炊嘛。
2. 修改存储保留策略
编辑storage-schemas.conf文件,调整保留时长。你可以直接修改默认规则,或者给你的特定指标单独加一条优先级更高的规则:
方式一:修改全局默认规则
把默认的retentions改得更宽松,比如:
[default] pattern = .* retentions = 1m:90d,1h:1y,1d:5y
这样1分钟粒度的数据能保留90天,足够覆盖你的30天查询需求。
方式二:给你的指标单独配置
如果只想针对stats.counters.test-server.comp.counter.sms_messages这类指标调整,就加一条专属规则(注意正则匹配要准确):
[test-server-sms-metrics] pattern = ^stats\.counters\.test-server\.comp\.counter\.sms_messages\..* retentions = 1m:30d,1h:1y,1d:5y
修改完配置后,必须重启Graphite容器才能生效:
docker restart <你的Graphite容器名/ID>
3. 检查数据聚合规则(避免汇总出错)
有时候即使保留策略改对了,聚合规则不对也会导致数据异常。检查/opt/graphite/conf/storage-aggregation.conf,确保你的counter类型指标用了正确的聚合方式(比如sum):
[counters] pattern = \.count$ xFilesFactor = 0 aggregationMethod = sum
这个配置会让所有以.count结尾的指标在自动聚合时使用sum计算,和你查询里的summarize(..., 'sum')逻辑一致。
4. 重要提醒:历史数据无法恢复
要明确一点:修改配置只对未来产生的新数据生效,之前已经被删除的7天前的原始数据是找不回来的。如果需要完整的30天数据,你得等修改配置后让数据慢慢积累,或者如果之前有备份的话,可以把备份的whisper文件(存放在/opt/graphite/storage/whisper/目录下)恢复到容器里。
5. 验证修改是否生效
容器重启后,过几个小时再尝试查询30天的数据,或者先查最近8天的范围,看看能不能拿到超过7天的结果。另外,你可以用whisper-info工具查看单个指标的实际保留配置,确认修改是否生效:
docker exec -it <容器ID> whisper-info /opt/graphite/storage/whisper/stats/counters/test-server/comp/counter/sms_messages/count.wsp
执行后会显示该指标的各个粒度对应的保留时长,和你设置的对比一下就知道了。
内容的提问来源于stack exchange,提问作者Azik

