我正在使用Zabbix 3.2。我想根据程序名称计算网络接口的流量统计信息。
与获取总传入流量一样,我们使用net.if.in [if,],以同样的方式可以检索每个正在运行的进程所使用的流量,如Nethogs。如果是这样,请共享Item键。或者,如果有任何sh脚本也可以这样做。
提前致谢。
答案 0 :(得分:1)
您尚未指定操作系统,但问题标记为“unix”,并且您提到了nethogs和shell脚本 - 我将假设Linux。
监控所有进程的流量可能有点过多 - 可能有数百个进程,即使很多人不使用网络,但很多人都会在服务器系统上运行。
您希望如何构建数据也很重要。例如,您是要根据流程名称或每个流程拆分它吗?或者甚至可能是进程名称及其参数 - 如果在同一个盒子上运行多个Java JVM。您必须决定所有这些,因为它会影响数据收集。
在向Zabbix发送数据时,Zabbix方面最简单的方法是仅按进程名称进行监视,如果您知道所有您感兴趣的进程名称,则提前创建项目。如果您不了解它们,您将不得不使用Zabbix low level discovery在新流程出现时自动创建项目。
我们终于进入了数据收集部分。在这里,它确实可能是最容易使用的nethogs(请记住UDP is not supported)。您可以在“跟踪”模式下运行nethogs,这与top的“批处理”模式非常相似。在此模式下,输出只是打印到stdout。
nethogs -c 1 -d 60 -t
这里,参数意味着:
Nethogs还支持使用-v
标志设置流量输出类型。你必须决定如何想象这个:
使用Zabbix,您可能不希望使用模式1或3 - 最好以字节存储数据并允许Zabbix根据需要添加乘数。在KB / s模式(0)的情况下,可能值得添加项目乘数1024以字节存储数据并再次受益于Zabbix的自动单元应用程序。请注意,在任何情况下,您都希望背靠背运行nethog实例,以避免在不收集数据的情况下使用Windows。最小化任何窗口可能性的一种方法是不断运行nethogs(不提供-c
选项)并将输出重定向到文件。然后,脚本将解析文件并使用zabbix_sender将数据发送到Zabbix。
你不会将它作为普通的Zabbix user parameter运行,既不作为主动也不是被动检查 - 它会阻塞太长时间。考虑使用atd
(see this howto)或nohup
启动一个脚本,将数据发送到带有zabbix_sender的Zabbix。
请注意,您必须以root身份运行nethogs - 请使用sudo。
我不知道有任何现有的脚本,但以下内容可能会让您入门:
nethogs -c 1 -d 1 -t | awk 'BEGIN {FS="[[:space:]/]+"}; /Refreshing/,0 \
{if ($1 != "Refreshing:" && $1 != "unknown") {print $(NF-4), $(NF-1), $NF}}'
此处,awk
仅抓取程序行并打印出程序名称和已发送/已接收的流量。