如何将Salt指标暴露至Grafana?SaltStack状态监控方案问询
可行的SaltStack监控与Grafana展示方案(无现成Exporter)
Hey there! Since you're working with Salt 2017.7.4 and Grafana 5.1 without a dedicated exporter, here are three practical, doable approaches to get your desired metrics into Grafana:
方案1:利用Salt Returners推送指标到InfluxDB
Salt本身自带influxdb returner,刚好能把state执行结果直接推送到InfluxDB(Grafana对InfluxDB的支持非常成熟),步骤如下:
- 先在Salt Master上安装InfluxDB依赖:
pip install python-influxdb(注意对应Python版本,2017.7.4适配Python 2.7或3.5+) - 编辑
/etc/salt/master,配置InfluxDB returner:returners: influxdb: influxdb_host: <你的InfluxDB地址> influxdb_port: 8086 influxdb_user: admin influxdb_password: yourpassword influxdb_db: salt_metrics influxdb_ssl: False - 重启Salt Master服务,之后执行state时可以通过
--return influxdb指定推送结果,或者设置master_job_cache: influxdb让所有任务结果自动推送 - 对于Minion数量、Master/Syndic分组统计:写个简单的Shell/Python脚本,定期执行
salt-run manage.status或salt-key -L,解析结果后用InfluxDB的API推送到数据库(比如用curl或者Python的influxdb库),可以用cron定时跑这个脚本 - 最后在Grafana中添加InfluxDB数据源,创建面板:
- 用折线图展示state成功率/失败率(按时间聚合)
- 用统计卡片展示各Master/Syndic下的Minion在线/离线数量
- 用柱状图展示state执行延迟(从InfluxDB的
duration字段提取)
方案2:自定义脚本收集指标并对接Prometheus
如果你的监控栈用Prometheus,自己写个轻量的脚本就能搞定:
- 脚本可以通过两种方式获取数据:
- 调用Salt命令行:比如
salt-run jobs.list_jobs获取历史任务结果,salt '*' test.ping --timeout=5测试Minion响应延迟 - 通过Salt API:如果启用了salt-api,用HTTP请求获取数据更安全
- 调用Salt命令行:比如
- 把收集到的指标格式化成Prometheus的metrics格式(比如
salt_state_success_total{minion="web01"} 1、salt_minion_online_count{master="master01"} 25) - 可以选择两种方式暴露指标:
- 让脚本启动一个简单的HTTP服务(比如用Python的Flask),暴露
/metrics端点,让Prometheus定期scrape - 把指标推送到Prometheus Pushgateway,适合定时收集的指标(比如Minion数量)
- 让脚本启动一个简单的HTTP服务(比如用Python的Flask),暴露
- 配置Grafana对接Prometheus数据源,创建对应的可视化面板即可
方案3:解析Salt日志实现监控
如果不想额外部署数据库,直接解析Salt日志也能拿到关键指标:
- 用日志收集工具(比如Filebeat)收集Salt Master的日志(默认路径
/var/log/salt/master) - 配置日志解析规则,提取state执行结果、耗时、Minion信息等字段
- 把解析后的日志发送到Elasticsearch(Grafana 5.1支持ES数据源)
- 在Grafana中基于ES的数据创建可视化,比如统计不同时间段的state失败次数,或者Minion的响应延迟分布
针对你的版本的注意事项
- Salt 2017.7.4的influxdb returner可能不支持部分新版本参数,比如
influxdb_retention_policy,建议参考对应版本的官方文档配置 - Grafana 5.1对Prometheus的支持已经很完善,但要注意数据源配置的URL格式
- 如果你用Syndic,收集Minion分组时要注意用
salt-run syndic.status来获取各Syndic下的Minion状态
内容的提问来源于stack exchange,提问作者Michael Koro
相关产品推荐
相关产品推荐

