ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Glances 事件动作(Actions):基于 Mustache 模板的告警自动化配置完全指南

Glances 事件动作(Actions):基于 Mustache 模板的告警自动化配置完全指南 指标监控监控大盘CLI告警MCP 服务【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址https://gitcode.com/gh_mirrors/gl/glances点击查看免费下载导读Glances 的 Actions 机制允许在监控指标达到 warning / critical 阈值时自动执行任意 shell 命令行是构建阈值触发即响应自动化运维的核心能力。本文基于 docs/aoa/actions.rst 展开结合 glances/actions.py、glances/secure.py、glances/plugins/plugin/model.py 等源码与 tests/test_actions_sanitize.py 测试完整讲解动作的配置语法、Mustache 变量、重复执行、参数化与命令注入防护读完即可写出安全可用的告警动作。Glances 在检测到某个指标越过阈值时会进入对应的告警状态CAREFUL / WARNING / CRITICAL。Actions 机制进一步把告警升级为自动处置你可以在配置文件中为每个阈值挂一条命令行当阈值被触发时由 Glances 代为执行。所有动作都运行在后台参见 glances/actions.py 中GlancesActions.run()的实现不会阻塞监控主循环。一、Actions 是什么从告警到自动响应的桥梁Glances 对每个插件维护一套四级阈值语义见 docs/aoa/index.rst 中的状态色约定状态含义OK指标正常CAREFUL值得留意WARNING警告CRITICAL严重当指标越过阈值时Glances 除了在界面上变色、写入事件日志外还可以执行动作action。这里的动作指的是任意一条 shell 命令行。例如当最近 5 分钟系统负载达到 critical 时执行一个 Python 脚本foo.py。只需在 Glances 配置文件中给[load]插件加一行_action配置[load] critical5.0 critical_actionpython /path/to/foo.py动作由告警状态criticality与插件/指标名共同决定。从 glances/plugins/plugin/model.py 的get_limit_action()可以看到动作配置的查找顺序stat_name _ criticality _action最精确含指标头如network_wlan0_rx_critical_actionstat_name _ criticality _action_repeatplugin_name _ criticality _action插件级如load_critical_actionplugin_name _ criticality _action_repeat找到第一条已定义的键即生效。其中_action表示触发一次去重后只执行一次_action_repeat表示持续重复执行见下文第五节。二、Mustache 模板把统计值注入命令行动作命令行支持 Mustache 模板语法渲染引擎使用 Chevron。也就是说你可以在命令行中直接引用当前插件暴露的所有统计字段Glances 在触发动作时会把真实数值填充进去。除当前插件的全部统计值外动作模板还额外提供四个内置变量变量含义{{time}}当前时间ISO 格式源码中由datetime.now().isoformat()生成见 glances/plugins/plugin/model.py{{critical}}该指标的 critical 阈值{{warning}}该指标的 warning 阈值{{careful}}该指标的 careful 阈值典型的用法是向动作脚本传递上下文。例如当文件系统空间使用率触发 warning 时把挂载点、已用空间、总空间写入日志文件[fs] warning70 warning_actionpython /path/to/fs-warning.py {{mnt_point}} {{used}} {{size}}2.1 从源码看模板字典的构造glances/plugins/plugin/model.py 的manage_action()展示了触发动作的完整流程通过get_limit_action()取得命令行与是否重复的标记深拷贝当前插件的统计值get_stats_action()默认返回self.stats向模板字典注入critical、warning、careful三个阈值与time时间戳对于以字典列表形式保存统计的插件如fs每个挂载点是一个元素会按action_key默认等于 header即挂载点/设备名挑选出与触发告警的那一项对应的字典作为渲染上下文调用self.actions.run(...)执行动作其中mustache_dict即渲染数据。因此{{mnt_point}}、{{device_name}}、{{percent}}这类字段名均来自对应插件真实的统计键名以 conf/glances.conf 中 fs 插件注释示例可见{{mnt_point}}、{{percent}}的用法。2.2 内置配置示例中的变量用法仓库自带的 conf/glances.conf 中保留了多组动作示例可直接参考变量命名习惯# [cpu] 部分 #user_critical_actionecho {{time}} User CPU {{user}} higher than {{critical}} /tmp/cpu.alert # [mem] 部分 #critical_action_repeatecho {{time}} {{percent}} higher than {{critical}} /tmp/memory.alert # [network] 部分按接口细分注意键名含接口名 #wlan0_rx_critical_actionecho {{time}} {{interface_name}} RX {{bytes_recv_rate_per_sec}}Bps /tmp/network.alert # [fs] 部分 #/_critical_actionecho {{time}} {{mnt_point}} filesystem space {{percent}}% higher than {{critical}}% /tmp/fs.alert # [sensors] 部分 #temperature_core_Ambient_critical_actionecho {{time}} {{label}} temperature {{value}}{{unit}} higher than {{critical}}{{unit}} /tmp/temperature.alert注意fs的示例键名是/_critical_action斜杠/_是根挂载点的 header 前缀说明动作键名可以细化到具体的统计项而不只是插件级。这正是get_limit_action()中先查stat_name header、再退回插件级的查找逻辑在配置层面的体现。三、完整实战磁盘空间 critical 时写日志并邮件告警原文档给出一个端到端案例当某个设备的总磁盘空间使用率达到 critical 时把告警写入本地文件并通过邮件通知管理员。第一步创建 shell 脚本/etc/glances/actions.d/fs-critical.sh注意文件需可执行#!/bin/bash # Usage: fs-critical.sh time device_name percent echo $1 $2 $3 /tmp/fs.alert python /etc/glances/actions.d/fs-critical.py第二步在配置文件中引用该脚本并把 Mustache 变量按脚本参数顺序传入[fs] critical90 critical_action_repeat/etc/glances/actions.d/fs-critical.sh {{time}} {{device_name}} {{percent}}第三步Python 脚本读取告警文件、组装邮件正文并发送/etc/glances/actions.d/fs-critical.pyimport subprocess from requests import get fs_alert open(/tmp/fs.alert, r).readline().strip().split( ) device fs_alert[0] percent fs_alert[1] system subprocess.check_output([uname, -rn]).decode(utf-8).strip() ip get(https://api.ipify.org).text body Used user disk space for device is at percent %.\nPlease cleanup the filesystem to clear the alert.\nServer: str(system) .\nIP address: ip ps subprocess.Popen((echo, -e, body), stdoutsubprocess.PIPE) subprocess.call([mail, -s, CRITICAL: disk usage above 90%, -r, postmasterexample.com, glancesexample.com], stdinps.stdout)该示例中动作模板可用的统计字段与当前插件暴露的统计键一一对应。Glances RESTful API 输出的字段与动作模板字段同源实践中可通过glances -w的 JSON 输出确认某个插件的确切字段名。四、参数化与安全模型为什么字段值永远是一个参数这是 Actions 机制中最容易被误解、也最关键的部分。命令行在 Mustache 字段渲染之前就被切分成了参数先分词、后渲染。每个字段渲染后始终恰好产生一个参数——无论其值包含空格、引号还是 shell 操作符都不可能把自己拆成多个参数也无法向被调用的进程注入新参数。以script.sh {{mnt_point}}为例即使mnt_point的值是My Documents含空格它也会作为一个整体参数传给脚本。由此产生两个直接后果给 Mustache 字段加引号是不必要的。script.sh {{mnt_point}}与script.sh {{mnt_point}}效果相同引号无害但多余。一个 Mustache section 必须在同一个参数内开闭。{{#cmdline}}{{.}},{{/cmdline}}合法而{{#cmdline}}{{.}} {{/cmdline}}因 section 横跨两个参数而不合法——此时该动作不会被执行错误会被记入日志。此外渲染为空字符串的字段仍会产出一个空参数。这意味着某个字段为空时不会造成后续位置参数错位——脚本拿到的参数位置始终稳定。4.1 防御纵深统计值会被消毒作为第二道防线Mustache 渲染出的值还会经过一次字符消毒、|、、会被替换为空格。从 glances/actions.py 的源码可以看到消毒逻辑_sanitize_value()是递归的字符串逐一替换_SHELL_OPERATORS (, |, , , )中的操作符为空格含单独防止两个相邻渲染值在字段边界处拼接出列表 / 元组 / 字典递归进入每个元素消毒确保嵌套的攻击者可控数据如进程cmdline列表同样被覆盖其他类型int、float、bool、None原样保留。4.2 你仍然可以在命令行本身中使用 shell 操作符注意消毒只作用于Mustache 渲染出来的值不影响你手写在命令行里的操作符。管道、重定向、命令链在配置的命令行里照常工作。因此如果动作逻辑需要由统计值驱动的 shell 操作符正确做法是写一个 shell 脚本把统计值作为参数传给它然后在脚本内部使用操作符。例如把foo /tmp/out 21这类逻辑放进/etc/glances/actions.d/xxx.sh动作配置只写xxx.sh {{mnt_point}}。4.3 源码级的安全链路安全模型在三个文件中层层递进tests/test_actions_sanitize.py 对其中的关键行为有完整覆盖该测试在 POSIX 上运行环节文件职责先分词后渲染glances/secure.py__split_args()命令先按空格引号内除外切分为参数列表渲染器只对已定界的参数逐段应用参数级渲染glances/secure.pysecure_popen()收到render回调后逐参数渲染值永远落在恰好一个 argv 槽位值消毒glances/actions.py_sanitize_mustache_dict()递归替换 shell 操作符模板错误兜底glances/actions.pysection 跨参数等 Chevron 模板错误被捕获拒绝执行并记录日志而不是回退到整行渲染那会重新打开注入面测试中还验证了secure_popen对命令链、|管道、重定向的解析以及Mustache 字段恰好占据一个 argv 槽位这一核心不变量。此外GlancesActions内部还有一层去重状态self.status与启动缓冲定时器args.time * 2避免 Glances 刚启动的瞬间就误触发动作见 glances/actions.py。五、重复执行_action_repeat与刷新节奏的权衡默认的_action动作在告警持续期间只执行一次GlancesActions.run()中会先检查self.get(stat_name) criticality and not repeat若同一状态已触发过且非 repeat则直接跳过glances/actions.py。而_action_repeat让动作在告警解除之前持续重复执行[load] critical5.0 critical_action_repeat/home/myhome/bin/bipper.sh但请务必记住命令行每个刷新周期都会被执行一次。Glances 默认每 2 秒刷新一次可通过-t参数调整这意味着bipper.sh会以每秒一次的频率反复运行直到负载回落到阈值以下。因此原文档明确警告use with caution——重复动作适合 bipper提示音、发通知这类轻量操作绝不要在里面放重量级脚本或会自我叠加副作用的命令。同样地conf/glances.conf 中内存告警的示例使用了critical_action_repeat配合追加写日志#critical_action_repeatecho {{time}} {{percent}} higher than {{critical}} /tmp/memory.alert这里把直接写在命令行里而非 Mustache 值中正是上一节手写操作符不受影响的实践示范。六、告警触发流程与阈值配置速查动作只是get_alert()的众多副作用之一。从 glances/plugins/plugin/model.py 可以看到每次指标刷新都会经历完整链路计算百分比 → 与 careful/warning/critical 阈值比较 → 可选写事件日志_log→ 更新阈值视图manage_threshold→ 触发动作manage_action。状态机遵循一旦 CRITICAL 不回退到 WARNING的原则见 glances/event.py 中事件更新的注释。配置动作前请先确认插件阈值已就位。各插件的默认阈值定义在配置文件中例如 conf/glances.conf[mem] careful50 warning70 critical90 [load] # 负载阈值 数值 × 核数 careful0.7 warning1.0 critical5.0动作配置与阈值配置在同一个[插件名]section 内键名规则即阈值键名 _action或阈值键名 _action_repeat可精确到插件 header级别如/_critical_action仅针对根挂载点。七、适用前提与限制依赖chevronMustache 渲染需要 Python 的chevron库。若环境中未安装GlancesActions会记录 debug 日志并关闭渲染能力见 glances/actions.py带模板的动作将无法正常展开。动作在后台执行GlancesActions.run()会为每条命令调用secure_popen并立即返回输出不阻塞监控主循环动作自身的 stdout/stderr 会由子进程捕获。可配合--disable-config-exec加固当用户通过命令行参数禁用配置文件来源的命令执行时allow_operators()返回 Falsesecure_popen将整条命令作为单个进程运行、|、全部按字面参数传递、不再解释见 glances/actions.py 与 glances/secure.py。建议的动作组织方式把复杂逻辑含 shell 操作符、重定向封装为独立脚本Glances 侧只保留脚本 参数的简单调用脚本可统一放在/etc/glances/actions.d/之类的目录中便于审计。总结Glances Actions 把监控到阈值与执行处置直接绑定配合 Mustache 模板可以精确传递时间戳、阈值和当前插件的任意统计字段。理解先分词、后渲染 值消毒的安全模型是写出既强大又安全的动作脚本的关键统计值永远是参数而非代码shell 操作符永远写在命令行自身。从触发一次的_action到每刷新周期执行的_action_repeatGlances 都通过 glances/actions.py 中的去重与缓冲机制给出了可控的行为边界——实践时只需遵循简单动作直接写、复杂逻辑进脚本、重复动作保持轻量三条原则即可将告警自动化安全地落地到生产环境。赞分享指标监控监控大盘CLI告警MCP 服务【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址https://gitcode.com/gh_mirrors/gl/glances点击查看免费下载相关推荐Glances高级配置终极指南自定义阈值告警和自动化操作完全攻略 Glances高级配置终极指南自定义阈值告警和自动化操作完全攻略 Glances是一款强大的跨平台系统监控工具它提供了比传统的top命令更丰富的信息和指标监控监控大盘CLI告警MCP 服务TreeFrog Framework核心功能详解MVC架构与ORM技术的完美结合TreeFrog Framework核心功能详解MVC架构与ORM技术的完美结合 TreeFrog Framework是一款高性能C MVC Web应用框后端软件架构DataHub Actions 实战指南基于元数据变更事件的事件驱动自动化框架DataHub Actions 实战指南基于元数据变更事件的事件驱动自动化框架 DataHub Actions 是 DataHub 生态中面向实时元数据变更的数据目录数据治理数据血缘后端前端数据工程数据集成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表