如何为 Pushgateway 和 prometheus 编写 Bash 脚本
How to write a Bash Script for Pushgateway and prometheus
我花了几天时间尝试为 Pushgateway 和 Prometheus 使用 bash 脚本..但是这个脚本不起作用..
实际上,我的树莓派上有 Pushgateway,另一个树莓派上有 Prometheus。所有工作正常,我测试了一个简单的 bash 脚本,这个脚本工作正常。
我的简单脚本 (test.sh) :
echo "metric 99" | curl --data-binary @- http://localhost:9091/metrics/job/some_job
现在我想写一个更复杂的脚本。此脚本必须将来自 CPU 用法的指标推送到 prometheus(与“$ps aux”命令相同或与“$top”命令相同)。但是这个脚本不起作用,我不知道如何修改它..
我的更复杂的脚本:
#!/bin/bash
z="ps aux"
while read -r $z
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\"}", $z}');
done <<< "$z"
curl -X POST -H "Content-type: text/plain" --data "$var" http://localhost:9091/metrics/job/top/instance/machine
如果有人能帮助我。非常感谢。
我也试试这个代码:
#!/bin/bash
z="ps aux"
while read -r "ps aux"
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\"}", $z}');
done <<< "$z"
curl -X POST -H "Content-type: text/plain" --data "$var" http://localhost:9091/metrics/job/top/instance/machine
但我不确定语法。怎么了?
我试试代码:
load=$(ps aux | awk '{ print "cpu_usage{ process=\"" "\",pid=\"" "\"}," }')
curl -X POST -H --data "$load" http://localhost:9091/metrics/job/top/instance/machine
但是没用。第一行没问题,但是当我 运行 这段代码时,我发现 curl 命令的错误消息:
curl: (3) URL using bad/illegal format or missing URL
========== 我的问题的解决方案是: ==========
ps aux | awk '>0 {print "cpu_usage"" """}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine
此命令可以将 % CPU > 0 的所有过程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...
如果您的问题太复杂,请将其分成更小、更易于管理的部分,看看它们的作用。从分析 awk 部分的输出开始。
AWK 可能有点少。
尝试更简单的方法:
ps aux | tr -s ' ' ',' | cut -d, -f2,11 |
while read pid process; do
req="cpu_usage{process=$process,pid=$pid}"
echo "Sending CURL Request with this data: $req"
curl -X POST -H "Content-type: text/plain" --data "$req" http://localhost:9091/metrics/job/top/instance/machine
done
您可能需要查看括号。我没有办法测试这个。
您似乎对基本 Bash 语法的几个细节感到困惑。
command <<<"string"
只是将文字 string
作为标准输入传递给 command
。您似乎正在寻找的语法是过程替换
command < <(other)
运行 other
并将其输出作为输入传递给 command
。但这也过于复杂了。你可能想要一个更简单的直线管道。
load=$(ps aux | awk '{ print "cpu_usage{ process=\"" "\",pid=\"" "\"}," }')
curl -X POST -H "Content-type: text/plain" --data "$load" http://localhost:9091/metrics/job/top/instance/machine
我不得不对您希望 Awk 脚本执行的操作进行一些疯狂的猜测。
此外,read
的参数是一个变量的名称,因此 read z
,而不是 read $z
(并且通常使用 read -r
,除非您特别需要奇数read
的遗留行为在其输入中带有反斜杠)。
最后,您基本上不想将命令存储在变量中;见 https://mywiki.wooledge.org/BashFAQ/050
展望未来,可能会先尝试 http://shellcheck.net/,然后再寻求人工帮助。
/!\ 我的问题的解决方案是: /!\
ps aux | awk '>0 {print "cpu_usage"" """}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine
此命令可以将 % CPU > 0 的所有过程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...
谢谢...
我花了几天时间尝试为 Pushgateway 和 Prometheus 使用 bash 脚本..但是这个脚本不起作用.. 实际上,我的树莓派上有 Pushgateway,另一个树莓派上有 Prometheus。所有工作正常,我测试了一个简单的 bash 脚本,这个脚本工作正常。 我的简单脚本 (test.sh) :
echo "metric 99" | curl --data-binary @- http://localhost:9091/metrics/job/some_job
现在我想写一个更复杂的脚本。此脚本必须将来自 CPU 用法的指标推送到 prometheus(与“$ps aux”命令相同或与“$top”命令相同)。但是这个脚本不起作用,我不知道如何修改它.. 我的更复杂的脚本:
#!/bin/bash
z="ps aux"
while read -r $z
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\"}", $z}');
done <<< "$z"
curl -X POST -H "Content-type: text/plain" --data "$var" http://localhost:9091/metrics/job/top/instance/machine
如果有人能帮助我。非常感谢。
我也试试这个代码:
#!/bin/bash
z="ps aux"
while read -r "ps aux"
do
var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\"}", $z}');
done <<< "$z"
curl -X POST -H "Content-type: text/plain" --data "$var" http://localhost:9091/metrics/job/top/instance/machine
但我不确定语法。怎么了?
我试试代码:
load=$(ps aux | awk '{ print "cpu_usage{ process=\"" "\",pid=\"" "\"}," }')
curl -X POST -H --data "$load" http://localhost:9091/metrics/job/top/instance/machine
但是没用。第一行没问题,但是当我 运行 这段代码时,我发现 curl 命令的错误消息:
curl: (3) URL using bad/illegal format or missing URL
========== 我的问题的解决方案是: ==========
ps aux | awk '>0 {print "cpu_usage"" """}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine
此命令可以将 % CPU > 0 的所有过程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...
如果您的问题太复杂,请将其分成更小、更易于管理的部分,看看它们的作用。从分析 awk 部分的输出开始。
AWK 可能有点少。
尝试更简单的方法:
ps aux | tr -s ' ' ',' | cut -d, -f2,11 |
while read pid process; do
req="cpu_usage{process=$process,pid=$pid}"
echo "Sending CURL Request with this data: $req"
curl -X POST -H "Content-type: text/plain" --data "$req" http://localhost:9091/metrics/job/top/instance/machine
done
您可能需要查看括号。我没有办法测试这个。
您似乎对基本 Bash 语法的几个细节感到困惑。
command <<<"string"
只是将文字 string
作为标准输入传递给 command
。您似乎正在寻找的语法是过程替换
command < <(other)
运行 other
并将其输出作为输入传递给 command
。但这也过于复杂了。你可能想要一个更简单的直线管道。
load=$(ps aux | awk '{ print "cpu_usage{ process=\"" "\",pid=\"" "\"}," }')
curl -X POST -H "Content-type: text/plain" --data "$load" http://localhost:9091/metrics/job/top/instance/machine
我不得不对您希望 Awk 脚本执行的操作进行一些疯狂的猜测。
此外,read
的参数是一个变量的名称,因此 read z
,而不是 read $z
(并且通常使用 read -r
,除非您特别需要奇数read
的遗留行为在其输入中带有反斜杠)。
最后,您基本上不想将命令存储在变量中;见 https://mywiki.wooledge.org/BashFAQ/050
展望未来,可能会先尝试 http://shellcheck.net/,然后再寻求人工帮助。
/!\ 我的问题的解决方案是: /!\
ps aux | awk '>0 {print "cpu_usage"" """}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine
此命令可以将 % CPU > 0 的所有过程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...
谢谢...