如何将Bash脚本输出自动接入Prometheus并在Grafana可视化?
问题
我在Kubernetes主节点上运行一个每周执行一次的Bash脚本,它会生成如下格式的输出并保存为CSV文件,原本是通过邮件发送给相关人员:
12/21/2022: 300 19/12/2022: 450
同一服务器上的Prometheus是以Kubernetes Pod形式运行在独立命名空间的,而Grafana部署在中心化服务器上。我想替换掉邮件发送的方式,把这些CSV数据在Grafana里做成可视化图表,方便团队查看并关联其他监控数据。目前我找到了手动导入谷歌表格的方法,但想知道有没有办法通过脚本自动把结果推送到Prometheus,再以Prometheus为数据源在Grafana创建仪表盘?
解决方案
完全可以实现自动推送数据到Prometheus并在Grafana可视化,最适合这种批处理任务的方式是用Prometheus Pushgateway,下面是具体步骤:
1. 部署并配置Pushgateway
Pushgateway是Prometheus生态里专门用来接收临时、批处理或定时任务产生的指标的组件,Prometheus会定期从它这里拉取数据。
- 在Kubernetes里部署Pushgateway:用Deployment+Service的方式部署(和Prometheus同命名空间或单独命名空间都可),确保Prometheus能访问到它的Service地址。
- 配置Prometheus的Scrape Job:在Prometheus配置中添加针对Pushgateway的抓取任务,示例配置如下:
配置完成后,Prometheus会定期拉取Pushgateway上的指标。scrape_configs: - job_name: 'pushgateway' static_configs: - targets: ['pushgateway-service:9091']
2. 修改Bash脚本,推送数据到Pushgateway
需要把脚本输出的CSV格式转换成Prometheus能识别的指标格式,再用curl推送到Pushgateway。
- 先清理Pushgateway中对应任务的旧数据(避免重复推送导致数据混乱),再逐行处理CSV内容,把日期转换成Unix时间戳(注意你的日期格式是
DD/MM/YYYY,需要调整转换逻辑),构造符合Prometheus规范的指标行。 - 示例脚本片段:
其中# 假设脚本输出已保存到output.csv文件 # 清理Pushgateway中对应任务的旧数据 curl -X DELETE http://pushgateway-service:9091/metrics/job/weekly_data_task # 逐行处理CSV并推送指标 while IFS=": " read -r date_str metric_value; do # 将DD/MM/YYYY格式转换为MM/DD/YYYY后生成Unix时间戳 formatted_date=$(echo "$date_str" | awk -F/ '{print $2"/"$1"/"$3}') timestamp=$(date -d "$formatted_date" +%s) # 构造Prometheus指标(自定义指标名和标签) echo "weekly_business_metric{task=\"weekly_data_export\"} $metric_value $timestamp" done < output.csv | curl --data-binary @- http://pushgateway-service:9091/metrics/job/weekly_data_taskweekly_business_metric是自定义的指标名,标签可以根据业务需求添加(比如环境、任务类型等)。
3. 在Grafana创建可视化仪表盘
- 确保Grafana已配置Prometheus作为数据源。
- 创建新面板,选择折线图或柱状图,在查询编辑器中输入你的指标名(比如
weekly_business_metric),即可看到每周推送的数据。 - 可以调整面板的时间范围(比如设置为“最近90天”),并把X轴的时间格式设置为日期,方便对应数据点的查看。
其他可选方案
如果你的Prometheus配置了远程写(比如对接Thanos、Mimir等),也可以直接把指标推送到远程写端点,但这种方式复杂度更高,不如Pushgateway适合这类定时批处理任务。
内容的提问来源于stack exchange,提问作者Manoj Janardhan
相关产品推荐
相关产品推荐

