如何为 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。小心特殊字符。如果结果命令是错误信息,可能是因为有特殊字符...

谢谢...