资讯详情

如何覆盖 Netdata 的内置告警定义?

📅 2026/9/10 15:54:04 | 华诺云谱 👁 阅读
如何覆盖 Netdata 的内置告警定义?
如何覆盖 Netdata 的内置告警定义【免费下载链接】netdataThe fastest path to AI-powered full stack observability, even for lean teams.项目地址: https://gitcode.com/GitHub_Trending/ne/netdataNetdata 的 Agent 自带一套内置stock告警例如磁盘空间不足、CPU 利用率过高等。当这些默认阈值不符合你的环境时——比如某块数据盘允许跑得更满、或想彻底关掉某个噪音告警——直接修改内置配置文件是行不通的内置配置目录在升级时会被整体替换。正确做法是在用户配置目录下创建同名告警定义来覆盖内置定义用户配置会保留到下一次升级这也是 Netdata 官方文档推荐的方式。本文适用于已安装 Netdata Agent 的 Linux 系统Windows 的路径差异会在对应位置说明。读完你可以完成三类操作用模板覆盖某类实例的全局阈值、用告警覆盖单个实例的阈值、彻底禁用或静默某个内置告警并通过 API 验证覆盖是否生效。先理解覆盖机制同名定义、优先级、文件遮蔽Netdata 的告警分两种类型参见 Alert Configuration Ordering类型on:匹配对象作用范围template模板context如disk.space该上下文下的所有实例所有磁盘、所有 CPU 等alarm告警chart ID如disk_space._mnt_data单个具体实例内置告警大多是 template。覆盖规则只有两条同名优先为你的覆盖定义使用与内置告警完全相同的名字告警名区分大小写。用户定义先于内置定义处理先匹配到的定义创建告警同名的后续定义对该实例被跳过。文件遮蔽shadowing如果用户目录和内置目录存在同名文件Netdata 只加载用户文件内置文件被完全忽略。类型与来源组合后的完整优先级如下数字越小越优先见 Alert Configuration Ordering优先级类型来源1最高Alarm用户配置2Alarm内置配置3Template用户配置4最低Template内置配置一个需要注意的特例通过仪表盘 UI 或 API 编辑告警会创建动态配置它会替换同名文件定义——这是唯一定义可以互相覆盖的情况。如果之后发现文件配置不生效先检查是否有人在 UI 里改过该告警。定位你的用户配置目录覆盖文件必须放在 Netdata 配置目录下的health.d/子目录中。内置配置目录存放 Netdata 自带告警升级时被替换用户配置目录下的文件则保留。多数 Linux 系统的配置目录是/etc/netdata/部分发行版使用/opt/netdata/etc/netdata/。不确定时用浏览器访问http://NODE:19999/netdata.confNODE替换为节点 IP 或主机名找到# config directory 一行即为实际位置也可以查看netdata.conf的[directories]段其中health config和stock health config两个键分别给出用户与内置 health 配置的确切路径。编辑文件时使用配置目录自带的edit-config脚本它会自动把内置文件复制到用户目录再打开编辑器文件已存在时直接编辑支持容器化部署。例如# 进入你的 Netdata 配置目录后执行 sudo ./edit-config health.d/my-overrides.confedit-config需要可写用户配置目录并依赖$EDITOR、editor或vi之一作为编辑器。覆盖所有实例用同名模板修改全局阈值如果你的目标是调整某类告警在所有实例上的阈值就创建一个与内置告警同名的 template。以调整 CPU steal 时间告警为例。内置的20min_steal_cpu定义在内置目录的cpu.conf中以下为文档示例template: 20min_steal_cpu on: system.cpu class: Latency type: System component: CPU host labels: _oslinux lookup: average -20m unaligned of steal units: % every: 5m warn: $this (($status $WARNING) ? (5) : (10)) delay: down 1h multiplier 1.5 max 2h summary: System CPU steal time info: Average CPU steal time over the last 20 minutes to: silent你的覆盖版本用sudo ./edit-config health.d/my-overrides.conf创建只需提高warn阈值其余字段保持原样template: 20min_steal_cpu on: system.cpu class: Latency type: System component: CPU host labels: _oslinux lookup: average -20m unaligned of steal units: % every: 5m warn: $this (($status $WARNING) ? (10) : (20)) delay: down 1h multiplier 1.5 max 2h summary: System CPU steal time info: Average CPU steal time over the last 20 minutes to: silent它能生效的原因同名 同一 context。你的模板先被处理并创建告警内置模板随后被跳过。覆盖必须是完整定义不是补丁。你的定义会取代整个内置告警漏写的字段lookup、calc、warn、crit、units等会回落到默认值而不是沿用内置告警的值。最稳妥的做法是先查看内置定义原文再基于它修改# 列出内置告警文件默认内置目录其他安装前缀请替换 ls /usr/lib/netdata/conf.d/health.d/ # 查看某个内置告警的完整定义 cat /usr/lib/netdata/conf.d/health.d/cpu.conf也可以不依赖路径直接用 API 列出所有已加载的告警名curl -s http://localhost:19999/api/v1/alarms?all | jq .alarms | to_entries[].value.name | sort -u一个边界情况少数内置告警是 alarm 而非 template。如果内置定义是 alarm你必须用 alarm 覆盖它——alarm 始终先于 template 处理用 template 覆盖不掉。覆盖单个实例用同名告警指定 chart ID如果只想让某一块磁盘使用不同的阈值、其余磁盘保持内置标准就创建一个同名的 alarmon:指向具体实例的 chart ID。内置模板对所有磁盘生效文档示例template: disk_space_usage on: disk.space lookup: max -1m percentage of avail warn: $this 20 crit: $this 10你的覆盖用sudo ./edit-config health.d/my-overrides.conf创建目标实例是挂载在/mnt/data的磁盘alarm: disk_space_usage on: disk_space._mnt_data lookup: max -1m percentage of avail warn: $this 5 crit: $this 2生效逻辑两者同名你的 alarm 针对 chart IDdisk_space._mnt_dataalarm 优先于 template 处理。结果是/mnt/data使用你的阈值5%/2%其余所有磁盘照常使用内置模板的阈值20%/10%。如何找到 chart IDchart ID 是实例在 Netdata 中的唯一标识可以通过 API 查询curl -s http://localhost:19999/api/v1/charts | grep -o id:disk_space[^]*也可以在仪表盘上点击目标图表URL 中显示的就是 chart ID。替代方式用 chart labels 匹配当 chart ID 动态变化、或你要覆盖的多个实例共享某个标签时可以改用 chart labels 匹配仍建议保持与内置告警同名以便覆盖template: disk_space_usage on: disk.space chart labels: mount_point/mnt/data lookup: max -1m percentage of avail warn: $this 5 crit: $this 2覆盖多个特定实例时可以按实例各写一个 alarm如disk_space._mnt_data和disk_space._mnt_backup或当实例共享标签时用一个带chart labels的 template 一次匹配多个。覆盖一整个内置文件复制法如果要修改某个内置文件如cpu.conf里的多个告警可以把整个文件复制到用户目录# 在你的 Netdata 配置目录中执行脚本会先把内置 cpu.conf 复制到用户目录再打开编辑 sudo ./edit-config health.d/cpu.conf这里触发的是文件遮蔽同名文件同时存在于两个目录时Netdata 只加载用户文件内置cpu.conf被完全忽略。因此复制出来的文件必须保留你希望保留的全部告警不能只留要改的那几条——删掉的部分会一起失效。彻底禁用或静默内置告警按禁用程度由强到弱有三个选项选项 A在 netdata.conf 中按名字禁用编辑netdata.confsudo ./edit-config netdata.conf在[health]段用enabled alarms排除指定告警其余照常加载[health] enabled alarms !20min_steal_cpu !disk_space_usage *所有!排除项必须写在最前面末尾只跟一个*不要写成!alert1 * !alert2 *这种形式——模式按顺序求值、首次匹配即生效。反向的白名单写法末尾不加*如enabled alarms oom_kill disk_space_usage只加载列出的告警其余全部禁用升级新增的告警也默认保持禁用详见 Health Configuration Reference。注意这是netdata.conf的改动必须重启 Agent才生效netdatacli reload-health只重新加载health.d/*.conf不重载netdata.conf。选项 B创建永不匹配的覆盖在用户health.d/下建一个同名但永不匹配的定义template: 20min_steal_cpu on: system.cpu host labels: _hostname!*!*是 health 配置解析器识别的特殊禁用快捷方式直接禁用该告警。选项 C只静默通知保留监控告警继续产生、仍在仪表盘显示只是不发通知——把to:设为silenttemplate: 20min_steal_cpu on: system.cpu lookup: average -20m unaligned of steal units: % every: 5m warn: $this (($status $WARNING) ? (5) : (10)) to: silent应用变更并验证修改health.d/*.conf文件后重载 health 配置即可无需重启 Agent也不会在监控上产生空档sudo netdatacli reload-health如果netdatacli在你的系统上不可用替代方案是给 Netdata 进程发SIGUSR2信号同样只重载 health 配置。Windows 上对应命令为 C:\Program Files\Netdata\usr\bin\netdatacli.exe reload-health通过 API 确认覆盖已生效curl -s http://localhost:19999/api/v1/alarms?all | jq .alarms | to_entries[] | select(.value.name 20min_steal_cpu) | .value重点核对以下字段source当前生效的是哪个配置文件你的覆盖文件还是内置文件lookup_*数据查询参数warn、crit阈值表达式是否已换成你的值。也可以在仪表盘的 Alerts 标签页点击该告警直接查看它当前的配置。覆盖不生效时按什么顺序查确认已重载sudo netdatacli reload-health改了netdata.conf的则需重启 Agent。核对名字是否完全一致告警名区分大小写拼写差一个字符就是两条不同告警覆盖不成立。检查文件权限Netdata 进程必须能读取你的配置文件。查日志找语法错误# systemd journal多数 Linux 发行版 journalctl --namespace netdata -g health --no-pager | tail -20 # journal 不可用时查日志文件 grep -i health /var/log/netdata/error.log | tail -20文档指出的三个常见原因即配置语法错误、告警名不匹配、文件权限导致读不到配置。内置告警和覆盖告警同时出现当两者的匹配条件范围不一致时会各建各的告警。例如你的覆盖带了host labels: production而内置告警没有主机标签限制于是带标签的主机走你的定义、其余主机走内置定义——这不是故障而是匹配范围不同。要真正覆盖你的定义至少要覆盖内置告警相同的匹配范围。UI 编辑顶掉了文件配置在仪表盘里编辑告警会产生动态配置替换同名文件定义这是设计行为方便免 SSH 快速调整。想恢复文件控制就在 UI 中把该告警重置为默认或通过 API 删除这条动态配置。限制与后续升级用户配置目录中的覆盖文件在 Agent 升级后保留内置文件会被替换。如果新版本把某个内置告警改名或删除你的覆盖不会报错只是不再覆盖到任何目标变成一条孤立定义。想新增告警而不是覆盖用与内置告警不同的名字即可两者独立共存。不同主机要用不同阈值时用host labels区分如environmentproduction与environmentdevelopment两条同名定义分别匹配各自的主机同名多条规则必须各自独立完整合法。同名告警的多条定义建议放在同一个文件里同一目录内的文件加载顺序取决于文件系统、不确定分散在不同文件里会产生意外。health 告警是按节点配置的在多个 Agent 上部署同一告警需要给每个节点配置相同的 health 配置文件。更多字段语法delay、lookup、动态阈值表达式等参见 Health Configuration Reference覆盖机制的完整概念说明见 Alert Configuration Ordering原始指南见 Overriding Stock Alerts。【免费下载链接】netdataThe fastest path to AI-powered full stack observability, even for lean teams.项目地址: https://gitcode.com/GitHub_Trending/ne/netdata创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。