Graphite仅保留collectd Exec插件一周数据的问题求助
我来帮你排查这个问题!你遇到的情况是其他collectd数据都能按多周期保留,唯独Exec插件的自定义指标只留一周,大概率是这几个点出了问题,咱们一步步来解决:
第一步:确认目标数据库的保留策略是否生效
首先登录InfluxDB的命令行界面,执行以下命令查看collectd数据库的保留策略:
SHOW RETENTION POLICIES ON collectd;
重点看输出里的默认保留策略是不是你配置的default_rentions(注意你配置里的名字拼写成了rentions,只要名字一致就没问题)。如果默认策略只有7天的有效期,说明你的多周期策略没生效,可能是两个原因:
storage-schemas.conf的修改没生效,需要重启InfluxDB服务;- 这个
collectd数据库是之前创建的,已经绑定了旧的保留策略,新的schema配置不会自动更新已存在的数据库,得手动调整。
如果是后者,你可以手动创建并设置默认保留策略:
CREATE RETENTION POLICY "default_rentions" ON "collectd" DURATION 10y REPLICATION 1 DEFAULT;
这里DURATION 10y对应你配置里最长的保留周期,REPLICATION 1是单节点的配置,根据你的集群情况调整。
第二步:检查连续查询(CQ)是否缺失
你配置的retentions = 15s:7d,5m:30d,15m:10y是分层保留策略,意思是15秒粒度的数据存7天,5分钟粒度存30天,15分钟粒度存10年。但InfluxDB不会自动生成粗粒度的数据,得靠**连续查询(CQ)**把细粒度的数据汇总成粗粒度的。
其他collectd指标正常,大概率是因为官方插件自带了默认的CQ,而你的自定义指标没有对应的CQ。你需要为这些指标创建两个CQ:
创建5分钟粒度的CQ
CREATE CONTINUOUS QUERY "cq_5m_custom_metrics" ON "collectd" BEGIN SELECT mean(value) AS value INTO "default_rentions".:MEASUREMENT FROM /.*/ WHERE time > now() - 30d GROUP BY time(5m), * END
这个CQ会把所有指标的15秒数据汇总成5分钟的平均值,存到default_rentions策略下,保留30天。
创建15分钟粒度的CQ
CREATE CONTINUOUS QUERY "cq_15m_custom_metrics" ON "collectd" BEGIN SELECT mean(value) AS value INTO "default_rentions".:MEASUREMENT FROM /.*/ WHERE time > now() - 10y GROUP BY time(15m), * END
同理,这个CQ会生成15分钟粒度的数据,保留10年。
第三步:验证Exec插件的输出格式
确保你的site-benchmarks.pl脚本输出的是collectd标准格式,这样InfluxDB才能正确识别并处理。标准格式应该是这样的:
PUTVAL "<主机名>/<插件名>-<实例>/<类型>-<类型实例>" <时间戳>:<数值>
举个例子:
PUTVAL "localhost/site-benchmarks/response-time" interval=15s:23.4
如果格式不对,可能导致数据无法被CQ正确汇总,自然也就留不下长期数据。
第四步:重启服务并验证
修改完配置后,一定要重启InfluxDB让所有设置生效:
sudo systemctl restart influxdb
等待10-15分钟后,你可以查询粗粒度的数据确认是否生效:
SELECT * FROM "collectd"."default_rentions"."site-benchmarks" WHERE time > now() - 1h GROUP BY time(15m);
如果能查到数据,说明CQ已经在工作,后续数据就会按照你的保留策略长期存储了。
内容的提问来源于stack exchange,提问作者Alpha01

