在 Pushgateway (Prometheus) 上使用 Curl 对 Cron 进行故障排除
Troubleshooting Cron with Curl on Pushgateway (Prometheus)
我正在沿着 Prometheus 测试 Pushgateway,使用 bash 脚本和 crontab 触发的 curl 每分钟推送有关我的 VM 服务的简单数据。
我有两个 bash 脚本。
第一个,cpu_usage.sh
,解析有关 ps -aux
命令的数据并将其发送到 pushgateway,通过 curl :
#!/usr/bin/env bash
z=$(ps aux)
while read -r z
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\", cpu=\"""\"}", z}');
done <<< "$z"
curl -X POST -H "Content-Type: text/plain" --data "$var
" http://localhost:9091/metrics/job/top/instance/machine
这台一切正常,我的 crontab 每分钟都会将格式化数据发送到 localhost:9091
,我的 pushgateway 实例。
现在,我正在尝试使用名为 services_list.sh
的脚本发送 service --status-all
命令的解析结果,这与我处理 cpu_usage.sh
脚本的方式完全相同:
#!/usr/bin/env bash
y=$(service --status-all)
while read -r y
do
varx=$varx$(awk '{print "services_list{service=\""$y"\"}", 1}');
done <<< "$y"
curl -X POST -H "Content-Type: text/plain" --data "$varx
" http://localhost:9091/metrics/job/top/instance/machine
当手动执行两个脚本时,如 ./cpu_usage.sh
和 ./services_list.sh
,一切正常,Pushgateway 成功地从两个脚本中检索数据。
但是当我通过 CRON 传递这些调用时,只有 cpu_usage.sh
正在向 pushgateway 发送数据(Pushgateway 上 services_list
方法上次推送的时间戳保持不变)。
我的 crontab 语法是这样的:* * * * * cd /path/ && ./script.sh
脚本在 777
/ root:root
,crontab 总是以 root 身份编辑。我试图将两个 scipts 连接在一个 bash 文件中,无论我放置它们的顺序如何,都不会对 services_list
方法进行 curl 调用(但是 cpu_usage
方法一切正常).
我有点迷茫,因为这两个脚本非常相似,而且 services_list.sh
上的手动调用工作正常。有什么想法吗 ?谢谢。
运行 在带有 Pushgateway 0.10 的 Debian 9 上。
Fixed :
无法从 crontab 调用命令 service
。从 cron 调用时,我必须提供 service
资源的完整路径,例如 /usr/sbin/service --options
.
在这种情况下,在我的 services_list.sh
脚本中用 y=$(/usr/sbin/service --status-all)
代替 y=$(service --status-all)
一切都 运行 没问题。
我正在沿着 Prometheus 测试 Pushgateway,使用 bash 脚本和 crontab 触发的 curl 每分钟推送有关我的 VM 服务的简单数据。
我有两个 bash 脚本。
第一个,cpu_usage.sh
,解析有关 ps -aux
命令的数据并将其发送到 pushgateway,通过 curl :
#!/usr/bin/env bash
z=$(ps aux)
while read -r z
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\", cpu=\"""\"}", z}');
done <<< "$z"
curl -X POST -H "Content-Type: text/plain" --data "$var
" http://localhost:9091/metrics/job/top/instance/machine
这台一切正常,我的 crontab 每分钟都会将格式化数据发送到 localhost:9091
,我的 pushgateway 实例。
现在,我正在尝试使用名为 services_list.sh
的脚本发送 service --status-all
命令的解析结果,这与我处理 cpu_usage.sh
脚本的方式完全相同:
#!/usr/bin/env bash
y=$(service --status-all)
while read -r y
do
varx=$varx$(awk '{print "services_list{service=\""$y"\"}", 1}');
done <<< "$y"
curl -X POST -H "Content-Type: text/plain" --data "$varx
" http://localhost:9091/metrics/job/top/instance/machine
当手动执行两个脚本时,如 ./cpu_usage.sh
和 ./services_list.sh
,一切正常,Pushgateway 成功地从两个脚本中检索数据。
但是当我通过 CRON 传递这些调用时,只有 cpu_usage.sh
正在向 pushgateway 发送数据(Pushgateway 上 services_list
方法上次推送的时间戳保持不变)。
我的 crontab 语法是这样的:* * * * * cd /path/ && ./script.sh
脚本在 777
/ root:root
,crontab 总是以 root 身份编辑。我试图将两个 scipts 连接在一个 bash 文件中,无论我放置它们的顺序如何,都不会对 services_list
方法进行 curl 调用(但是 cpu_usage
方法一切正常).
我有点迷茫,因为这两个脚本非常相似,而且 services_list.sh
上的手动调用工作正常。有什么想法吗 ?谢谢。
运行 在带有 Pushgateway 0.10 的 Debian 9 上。
Fixed :
无法从 crontab 调用命令 service
。从 cron 调用时,我必须提供 service
资源的完整路径,例如 /usr/sbin/service --options
.
在这种情况下,在我的 services_list.sh
脚本中用 y=$(/usr/sbin/service --status-all)
代替 y=$(service --status-all)
一切都 运行 没问题。