-1

我花了几天时间尝试为 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=\""$11"\", pid=\""$2"\"}", $3$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=\""$11"\", pid=\""$2"\"}", $3$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=\"" $11 "\",pid=\"" $2 "\"}," $3 }')
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 '$3>0 {print "cpu_usage"$2" "$3""}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine

此命令可以将 % CPU > 0 的所有进程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...

4

3 回答 3

2

如果您的问题太复杂,请将其分成更小、更易于管理的部分,然后看看它们做了什么。首先分析 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

您可能需要查看括号。我没有办法对此进行测试。

于 2021-09-10T15:34:21.887 回答
0

您似乎对基本 Bash 语法的几个细节感到困惑。

command <<<"string"

只需将文字string作为标准输入传递给command. 您似乎正在寻找的语法是进程替换

command < <(other)

它运行other并将其输出作为输入传递给command. 但这也过于复杂了。你可能想要一个更简单的直线管道。

load=$(ps aux | awk '{ print "cpu_usage{ process=\"" $11 "\",pid=\"" $2 "\"}," $3 }')
curl -X POST -H "Content-type: text/plain" --data "$load" http://localhost:9091/metrics/job/top/instance/machine

我不得不对你希望 awk 脚本应该做什么进行一些疯狂的猜测。

此外, to 的参数read是变量的名称,因此read z,不是read $z(并且通常使用,除非您特别需要在其输入中带有反斜杠read -r的奇怪传统行为)。read

最后,您基本上永远不想将命令存储在变量中;见https://mywiki.wooledge.org/BashFAQ/050

展望未来,在寻求人工帮助之前,可能会尝试http://shellcheck.net/ 。

于 2021-09-10T15:52:52.063 回答
0

/!\我的问题的解决方案是: /!\

ps aux | awk '$3>0 {print "cpu_usage"$2" "$3""}' | curl --data-binary @- http://localhost:9091/metrics/job/top/instance/machine

此命令可以将 % CPU > 0 的所有进程数据传输到 pushgateway。在这一行中,$3 = %CPU,$2 = PID。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...

谢谢...

于 2021-10-05T14:59:01.410 回答