控制台中的可怜人监视或服务器监视

欢迎所有亲爱的读者。 在本文中,我将向您介绍我的“自行车”,在该自行车上我无需离开控制台就可以监视各种情况。

我曾经遇到过很多项目和服务器繁育起来的情况,而我的双手却无法设置常规监控。

在现代世界中,“正确”的监视意味着部署了整个软件,以及整个软件的配置。 好吧,您知道那里...码头工人,弹性栈,然后就走了。 对我来说,这是一笔很大的开销。 我想生产一两个。

我在python上看了看Simple Monitor ,它在精神上最接近我,但是它缺少很多功能。 同时我也想学习Go ...好吧,总的来说,您自己知道一切开始的频率。

因此我进行了Go 焊接 ,并组装了这辆自行车

Cli Monitoring用Go编写,是一组二进制文件,每个二进制文件从stdin接收数据,执行一些特定的任务并在stdout中显示结果。

总共有四种类型的二进制: 度量处理器过滤器输出

顾名思义, 指标收集任何数据,通常排在链的最前面。
处理器位于中间,以某种方式更改数据或执行其他实用程序功能。
过滤器几乎类似于处理器,但与过滤器不同,它们会根据情况跳过或不跳过数据。
输出位于链的出口,用于向各种服务发送通知。

整个命令链通常具有以下形式:

some_metric | processor_1 | processor_2 ... | cm_p_message | output_1 | output_2 ...

该链的任何部分都可以是任何Linux命令,只要它在stdin中接收数据并将其发送到stdout而不进行缓冲即可。 只有一个与换行符有关的小BUT,但稍后会介绍更多。

二进制文件的名称形成为cm_ {type} _ {name} ,其中type是以下三种之一: m,p,f或o ,name是命令的名称。

例如,cm_m_cpu是一个指标,以json格式将处理器的统计信息输出到stdout。

cm_p_debounce文件是一个处理器,它每次仅以给定的时间间隔发出一条消息。

在第一个输出之前必须有一个特殊的cm_p_message处理器。 它创建所需格式的消息,以便通过其输出进行后续处理。

为了在控制台和各种条件下处理json,我使用了jq实用程序。 这就像sed一样,仅适用于json。

例如,这就是最终CPU监视的样子。

 cm_m_cpu | cm_p_eot2nl | jq -cM --unbuffered 'if .LoadAvg1 > 1 then .LoadAvg1 else false end' | cm_p_nl2eot | cm_f_regex -e '\d+' | cm_p_debounce -i 60 | cm_p_message -m 'Load average is {stdin}' | cm_o_telegram 

因此,监视RabbitMQ队列中的消息数

 while true; do rabbitmqctl list_queues -p queue_name | grep -Po --line-buffered '\d+'; sleep 60; done | jq -cM '. > 10000' --unbuffered | cm_p_nl2eot | cm_f_true | cm_p_message -m 'There are more than 10000 tasks in rabbit queue' | cm_o_opsgenie 

因此,您可以在10秒内监视什么都没有写入文件

 tail -f out.log | cm_p_nl2eot | cm_p_watchdog -i 10 | cm_p_debounce -i 3600 | cm_p_message -m 'No write to out.log for 10 seconds' -s 'alert' | cm_o_telegram 

不要急于关闭屏幕,现在我们将在第一个示例中分析这里发生的情况。

1)指标cm_m_cpu每秒以json格式显示一次字符串(由-i参数指定,默认情况下为每秒)。 例如,{“ LoadAvg1”:2.0332031,“ LoadAvg2”:1.9018555,“ LoadAvg3”:1.8623047}

2) cm_p_nl2eot是将EOT字符转换为LF字符的实用程序命令之一。 事实是,为了避免换行问题,我决定确保我的所有二进制文件都读取直到ascii字符EOT(传输结束)为止的数据。 这使您可以在团队之间安全地传输多行数据。

因此,在调用任何其他命令时,应将它们包含在以下形式中:
cm_p_eot2nl | 其他团队| cm_p_nl2eot。

3)接下来是对jq实用程序的调用,该实用程序将检查LoadAvg1字段,如果该字段大于1,则进一步显示该字段;如果小于,则显示false

4)接下来,我们需要从链中抛出整个错误消息。 为此,我们应用cm_f_regex过滤器,该过滤器将字符串作为输入,并将其与正则表达式进行匹配,如果匹配,则将其进一步显示。 否则,字符串将被简单丢弃

可以使用普通的grep,但是首先它缓冲输出,并且完整语法变得更长一些(grep --line-buffered),其次cm_f_regex使得显示组匹配非常容易。 例如:

cm_f_regex -e '(\d+)-(\d+)' -o '{1}/{2}'

将123-345行转换为123/345行

5)在这种情况下, cm_p_debounce处理器获取我们的LoadAvg1值,并仅每60秒一次将其显示在链的更下方。 为了避免自己发垃圾邮件,这是必要的。 您可以设置任何其他间隔。

6)几乎一切都准备就绪。 它仅保留以形成消息并将其发送给电报。 该消息是由特殊的cm_p_message命令生成的。 它只是接受一个字符串作为输入,使用Severity,Message和其他字段创建json,然后将其输出以进行输出处理。 如果我们没有将-m选项传递给它,则stdin将是消息,即 小米编号是我们的LoadAvg1。 这不是非常有用。

7) cm_o_telegram 团队只是将接收到的消息发送到电报。 电报设置存储在ini文件中。

构型


可以在ini文件中指定所有接受二进制文件的参数。 命令行参数指定的参数优先于ini文件。

初始化文件格式为:

[global]
host_name=override host name for this machine

[telegram]
cid=....
token=....

[opsgenie]
apiToken=...
apiEndpoint=...
......

[debounce]
i=3600


按以下顺序选择ini文件本身:

1)当前工作目录中的文件cm.config.ini
2)如果未找到第1项中的文件,则文件为/etc/cm/config.ini

生产量


在真实服务器上,我创建了一个文件,例如cpu.sh,其中写入了所有必要的命令链。 然后在王冠上开这样的东西:

*/5 * * * * flock -n /etc/cm/cpu.lock /etc/cm/cpu.sh > /dev/null

如果有东西掉落,羊群将重新引发命令。 仅此而已! 我并没有那么简单。

这是一个这样的工具,也许有人会发现它很方便。 对我来说,方便之处在于,无需监视很多不必要的事情就可以做很多不必要的事情。 而且配置都很方便:它克隆了存储库,将路径添加到$ PATH中的二进制文件,仅此而已。

请不要严格判断。 该工具是为我自己编写的,命令集还不大。 但我很高兴收到任何反馈和建议。 谢谢大家的关注。

Source: https://habr.com/ru/post/zh-CN454674/


All Articles