Netdata 系统监控工具

Netdata 系统监控工具

作为一个监控系统而言,Netdata 简单好上手,确实很不赖

参考信息

官网官方文档

GitHub - netdata/netdata: Monitor your servers, containers, and applications, in high-resolution and in real-time!

部署架构

Netdata 可用于监控各种基础设施,从独立的微型物联网设备到结合内部部署和云基础设施的复杂混合设置,混合裸机服务器,虚拟机和容器。

Netdata 生态系统有 3 个组成部分:

  1. Netdata Agents,用于监控基础设施的物理或虚拟节点,包括在其上运行的所有应用程序和容器。

  2. Netdata Parents,在您的基础设施中创建数据集中点,在您的生产系统中分担 Netdata Agents 的功能,提供数据的高可用性,增加数据保留时间和进行节点隔离。Netdata Parents 是通过 Netdata Agent 软件实现的。任何 Netdata Agent 都可以同时是一个节点的 Agent 和其他代理的 Parent。建议设置多个 Netdata Parent。它们都将通过 Netdata Cloud 无缝地集成到一个监控解决方案中。

  3. Netdata Cloud,Netdata 官方提供的 SaaS(得加钱),将您所有的基础设施,所有 Netdata Agent 和 Netdata Parent,整合到一个统一的、分布式的、可扩展的监控数据库中,提供先进的数据切片和切割功能,自定义仪表板,先进的故障排除工具,用户管理,集中式警报管理等。

Netdata Agent 是一款高度模块化的软件,通过众多插件、内部自带的时间序列数据库、查询引擎、健康监测和警报、机器学习和异常检测和将指标导出到第三方系统,来提供数据收集。尤其是这个指标导出到第三方系统,可以与我们自己的指标监控系统集成。

三种部署架构:

其实一般情况下,我们独立部署即可。需要进行集群监控的时候,才会需要使用多个 Netdata Agent + 一个 Netdata Parent 方案或者多个 Netdata Agent + 两个 Netdata Parent 方案。

时序数据库引擎

DBENGINE 是 Netdata 的时序数据库。相关设计

独立部署 Netdata Agent

其他部署方式后面用到再学习

安装 Netdata Agent

在线

https://learn.netdata.cloud/docs/installing/one-line-installer-for-all-linux-systems

一键安装

wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh

netdata-kickstart.sh 的各项参数:

https://learn.netdata.cloud/docs/installing/one-line-installer-for-all-linux-systems#optional-parameters-to-alter-your-installation

我们会经常用到这个脚本

离线

官方文档:offline-systems

官方文档中虽然提供了离线安装教程,但是,官方提供的脚本会从 Github 下载安装包,这对国内的网络环境来说不友好,因此我们可以直接访问 Releases · netdata/netdata-nightlies · GitHub 来下载与当前硬件对应的包,可以直接下载 .gz.run 结尾的包,

netdata-nightlies 这个仓库会将主仓库 netdata 每隔几天就打包发布一次,以提供最新的安装包

Linux 系统下的 .run 文件跟 Windows 系统下的 .exe 文件类似,是一个可执行的程序。一般用于制作安装包,关于如何制作 .run 文件,请参考:Linux 制作 run 格式安装包

run 安装包的使用方式如下:

  1. 打开终端并导航到 xxx.run 文件所在的目录。
  2. 运行以下命令来使 xxx.run 文件可执行:chmod a+rwx xxx.run
  3. 运行以下命令来安装 xxx.run 文件:./xxx.run

卸载 Netdata Agent

wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh --uninstall

其他安装方式

启动 Netdata Agent

其实当我们在安装 Netdata Agent 时,该客户端的守护进程就已经配置好了开机自启。这对于我们在页面上连续观察重启后的指标变化非常方便。

通常,我们需要重新启动 Netdata Agent 以加载新的或正在编辑的配置文件(configuration files)。运行状况配置文件(health configuration)是唯一的例外,因为可以在不重新启动整个代理的情况下重新加载它们。

停止或重新启动 Netdata Agent 将导致存储的指标出现间隔。

通常,我们推荐通过 systemctl 管理 Netdata Agent:

随便截几张图,都是贼炫酷,确实好用又好看。

除了有 Web 页面,我们还可以通过通过 rest 接口来查询指定指标或者 netdata 的相关信息,具体 API 列表,请看 swagger 页面

配置

启动之后,通过 http://localhost:19999/netdata.conf 可以看到 netdata 的所有配置,这个链接中的内容,对应着服务器上的 /etc/netdata/netdata.conf

关于 netdata.conf 的完整的默认内容,请看附录中的 默认的 netdata.conf 小节,官网文档的 这里,详细介绍了每一个配置项是什么意思。

配置文件所在的目录为 /etc/netdata

$ ll
total 20
-rwxr-xr-x. 1 root netdata 8860 Sep 23 08:32 edit-config
drwxr-xr-x. 2 root root       6 Sep 24 20:38 health.d
-rw-r--r--. 1 root root     619 Sep 23 08:26 netdata.conf
-rw-r--r--. 1 root root    1047 Sep 23 08:32 netdata-updater.conf
drwxr-xr-x. 2 root root       6 Sep 23 08:32 statsd.d

这里 介绍了这些文件夹都是什么意思

你可以通过这个目录下的 ./edit-config netdata.conf 工具,来编辑配置文件。

/etc/netdata/health.d 目录下的文件配置了告警和通知的规则,一个文件对应一个规则,注意,修改规则之后需要重新夹在 Netdata 的健康配置

netdatacli reload-health
#or if that command doesn't work on your installation, use:
killall -USR2 netdata

Netdata 的常用配置:

数据收集

当 Netdata 启动时,在没有配置的情况下,它会自动检测数千个数据源,并立即按秒的频率收集的指标。Netdata 可以立即从这些端点收集指标,这要归功于 300 多个收集器,这些收集器都是在安装 Netdata 时已经预装好了的。默认情况下,每次安装 Netdata 都会安装所有收集器。您不需要手动安装收集器来从新源收集指标。这真的很赞。在启动时,只要收集器和应用程序/服务都配置正确,Netdata 将自动检测任何具有收集器的应用程序或服务。如果你看不到应用对应的图表,则需要查看 收集器配置参考手册

什么是收集器

Netdata 使用收集器来帮助您从您最喜欢的应用程序和服务中收集指标,并在实时交互式图表中查看它们。

随着我们继续努力将所有收集器迁移到 Go,一些收集器同时具有 Go 和 Python 版本。在这些情况下,Netdata 总是优先考虑 Go 版本,我们强烈建议您使用 Go 版本以获得最佳体验。如果您想使用 Python 版本的收集器,则需要显式禁用 Go 版本,并启用 Python 版本。然后 Netdata 会跳过 Go 版本,并尝试加载 Python 版本及其附带的配置文件。

当前支持的收集器

https://learn.netdata.cloud/docs/data-collection/monitor-anything


进入每一个具体类型的收集器中,我们可以看到我们可以查看到的指标,比如在 APM 收集器中,点击 Java Spring Boot 2 applications 进入 Java Spring Boot 2 applications 收集器页面,在 java-spring-boot-2-applications 指标 小节中可以看到所有的指标

所有的指标名称都有一个 springboot2. 前缀

Metric Scope Dimensions Units
response_codes global 1xx, 2xx, 3xx, 4xx, 5xx requests/s
thread global daemon, total threads
heap global free, eden, survivor, old B
heap_eden global used, commited B
heap_survivor global used, commited B
heap_old global used, commited B
uptime global uptime seconds

自定义指标收集器

如果在 当前支持的收集器 中没有找到你想要监听的应用或者服务:

告警

https://learn.netdata.cloud/docs/alerting/

Netdata Agent 是监视系统、服务和应用程序的运行状况和性能的运行状况监视器。我们与 DevOps 工程师社区、SREs 和开发人员密切合作,定义了数百个不需要任何配置就可以工作的生产可用的报警规则。

Netdata Agent 的运行状况监视系统也是动态的,完全可定制的。你可以编写全新的报警规则,也可以调整社区配置的报警规则(报警规则针对的是特定的应用/服务的指标),或者屏蔽任何你不感兴趣的内容。您甚至可以根据您的指标运行统计算法来增强复杂的查找。

配置通知

https://learn.netdata.cloud/docs/alerting/notifications/netdata-agent-notifications/

Netdata 提供了以下两种方式来让用户接收外部平台上的警报通知。这些方法可以独立工作,也可以并行工作,这意味着您可以同时启用这两种方法,向任意数量的端点发送警报通知。这两种方法都使用节点的健康告警规则来生成警报通知的内容。

Netdata Cloud 通过电子邮件提供集中式警报通知,它利用已经从连接节点流式传输到 Netdata Cloud 的健康状态信息,向启用它们的用户发送通知。

Netdata Agent 有一个通知系统,支持十多种服务,如电子邮件,Slack, PagerDuty, Twilio,亚马逊 SNS, Discord 等等。这里我们主要学习 Netdata Agent 的方式

Netdata Agent

Netdata Agent 的 告警通知系统 在每个节点上运行,并根据配置的端点(端点就是通知的目的地)和角色分派通知。您可以在任何一个节点上启用多个端点,并在 Netdata Cloud 中并行使用 Agent 通知和集中式警报通知。

注意:如果希望在基础结构中启用来自多个节点的通知(每个节点都运行 Netdata Agent),则必须单独配置每个节点。

支持的通知端点(通知目的地):

告警通知系统

配置文件 netdata.conf 中 script to execute on alarm 这一行定义的是出现告警的时候,调用的外部脚本,这个脚本默认是 alarm-notify.sh,这个脚本的作用是:

而且此脚本也会考虑接收人的角色,使用告警配置的 to 行,将每个告警分配给一个或多个角色。

    alarm: ram_in_use
       on: system.ram
    class: Utilization
     type: System
component: Memory
       os: linux
    hosts: *
     calc: $used * 100 / ($used + $cached + $free + $buffers)
    units: %
    every: 10s
     warn: $this > (($status >= $WARNING)  ? (80) : (90))
     crit: $this > (($status == $CRITICAL) ? (90) : (98))
    delay: down 15m multiplier 1.5 max 1h
     info: system memory utilization
       to: sysadmin

注意,alarm-notify.sh 使用的是自己的配置文件 health_alarm_notify.conf,默认的在 /usr/lib/netdata/conf.d/etc/netdata 下,这两个目录下的 health_alarm_notify.conf 都会生效,不过默认情况下 /etc/netdata 下不存在 health_alarm_notify.conf

health_alarm_notify.conf 文件的底部会保存每个角色对应的接收者,以及其通知方法,我们配置告警主要就是修改这个文件,配置的方法也很简单

###############################################################################
# RECIPIENTS PER ROLE

# -----------------------------------------------------------------------------
# generic system alerts
# CPU, disks, network interfaces, entropy, etc

role_recipients_email[sysadmin]="[email protected] [email protected]"

一般建议通过 edit-config 来修改 health_alarm_notify.conf 文件,主要配置两个方面:

你还可以 测试告警通知

告警通知的全局配置项:

Email

文档:Email

ntfy

关于 ntfy 的搭建和相关使用,请看《ntfy 开源的消息推送平台》

文档:ntfy

Netdata Cloud

暂时不学习

配置告警

https://learn.netdata.cloud/docs/alerting/health-configuration-reference

Netdata 的健康监视器是高度可配置的,支持动态阈值、滞后、警报模板等。您可以根据基础设施的拓扑结构或特定的监控需求调整任何现有报警规则,或者创建新的报警实体。

您可以将运行状况警报与 Netdata 的任何收集器(请参阅 当前支持的收集器 小节)结合使用,实时监视系统、容器和应用程序的运行状况。

虽然您可以在本地仪表板和 Netdata Cloud 上看到活动警报,但所有健康警报都是通过单独的 Netdata Agent 在每个节点上配置的。如果要跨基础结构部署新警报,则必须使用相同的运行状况配置文件配置每个节点。

先看配置通知,TOOD

健康配置手册

数据导出

Netdata 允许您使用导出引擎将指标导出到外部时间序列数据库。该系统使用许多连接器来启动与 30 多个支持的数据库的连接,包括 InfluxDB、Prometheus、Graphite、ElasticSearch 等等。导出引擎以用户可配置的间隔重新采样 Netdata 的每秒数千个指标,并可以同时将指标导出到多个时间序列数据库。

根据您的需求和分配给外部时间序列数据库的资源,您可以配置导出指标的时间间隔,或者只导出带有过滤的特定图表。您还可以选择导出的指标是作为收集的、标准化的平均值,还是在配置的时间间隔内的指标值的总和/体积。

导出是 Netdata 努力与其他监控软件互操作的一个重要部分。您可以使用外部时间序列数据库进行长期指标保留、进一步分析或与其他工具(如应用程序跟踪)的关联。

用法

官方介绍 中提到的 Netdata 的用法

在实际的生产中,我们使用 netdata 采集数据,并导出到 prometheus 中,使用 prometheus 充当数据库缓存时序数据(可替换为其他时序数据库,由于 influxdb 更新变更太大,放弃它了)。使用 grafana 抓取 prometheus 中时序数据进行可视化。

参考教程:

https://www.yezhem.com/index.php/archives/76/

https://zhuanlan.zhihu.com/p/604041531?utm_id=0

netdata 一般不会单独使用,大部分的时候是作为数据的收集端来收集指标数据

实践

这篇文章只作为 Netdata 的学习文档,把 netdata 的能力,写一个大纲,记录下来。其实主要用也就三个方面,指标采集,配置告警规则,对接通知系统,就这三个,另外再写一篇博客记录一下咋用的即可

再写一篇文章,简单实践 SpringBoot 项目的指标收集,简单实践 Java 项目的指标收集,告警信息配置,然后通知,TODO

附录