脚本执行
本功能为商业版功能。
概述
Script 事件处理器是一个强大的告警事件处理组件,允许您通过自定义脚本对告警事件进行灵活的处理和转换。该处理器会将告警事件以 JSON 格式传递给您的脚本,脚本处理后可以返回修改后的事件数据。
配置参数
超时时间(必填)
- 参数名称: 超时时间
- 单位: 毫秒 (ms)
- 默认值: 10000 (10秒)
- 说明: 脚本执行的最大时间限制。如果脚本执行时间超过此值,将被强制终止并返回原始事件。
脚本内容(必填)
- 参数名称: 脚本内容
- 格式: Shell 脚本
- 说明: 您要执行的自定义脚本代码,用于处理告警事件。
工作原理
- 事件输入: 处理器将当前告警事件转换为 JSON 格式,通过标准输入 (stdin) 传递给脚本
- 脚本处理: 您的脚本从 stdin 读取事件 JSON,进行自定义处理
- 结果输出: 脚本将处理后的事件 JSON 输出到标准输出 (stdout)
- 事件更新: 处理器解析脚本输出,更新原始事件
常见处理场景
- 修改告警级别
- 添加自定义标签
- 修改告警描述
注意事项
1. 脚本要求
- 脚本必须能够从 stdin 读取 JSON 数据
- 脚本必须向 stdout 输出有效的 JSON 格式
2. 错误处理
- 如果脚本执行失败或超时,将返回原始未处理的事件
- 如果脚本输出为空或无效 JSON,将返回原始事件
3. 性能考虑
- 合理设置超时时间,避免脚本执行时间过长影响告警处理性能
- 避免在脚本中执行过于复杂的操作
4. 安全建议
- 谨慎处理脚本中的外部输入
- 避免在脚本中执行不安全的系统命令
- 定期审查脚本内容
测试建议
- 使用测试功能: 在保存配置前,使用页面上的"测试"按钮验证脚本功能
- 本地测试: 可以在本地环境中模拟事件 JSON 进行脚本测试
- 逐步调试: 从简单的脚本开始,逐步增加复杂的处理逻辑
示例脚本
示例1:基础事件透传
#!/bin/bash
# 读取输入事件
event_json=$(cat)
echo "$event_json"
示例 2:根据标签升级告警级别
#!/bin/bash
event_json=$(cat)
# 用 jq 检查标签里有没有 critical
is_critical=$(echo "$event_json" | jq -r '.tags_map.env // empty')
if [ "$is_critical" = "prod" ]; then
# 把 prod 环境的告警级别提升到 1(S1)
echo "$event_json" | jq '.severity = 1'
else
echo "$event_json"
fi
示例 3:添加自定义标签
#!/bin/bash
event_json=$(cat)
echo "$event_json" | jq '.tags_map.processed_by = "ops-script-v2" | .tags_map.processed_at = (now | tostring)'
常见问题
Q1:脚本可以调用外部命令吗(curl / kubectl / aws-cli)?
A:可以 — 脚本运行环境是 n9e-server 所在主机的标准 Shell。前提:
- 所需命令已经装在 server 主机上;
- 脚本进程的用户权限够(n9e 默认用启动 server 的账号执行);
- 命令的网络可达(如 kubectl 需要 kubeconfig 配好)。
强烈建议单独装到 server 部署机,不要假设命令一定有。
Q2:脚本执行失败怎么调试?
A:
- 用页面上的「测试」按钮(输入样例事件 JSON);
- 看 工作流执行记录 里的 stderr 输出;
- 在脚本里加
echo "DEBUG: xxx" >&2输出调试信息到 stderr(不会影响 stdout 的 JSON); - 本地用
cat sample.json | bash your-script.sh模拟。
Q3:如果脚本输出的不是 JSON 或者损坏了,会怎样?
A:处理器会忽略脚本输出,使用原始事件继续后续流程。所以脚本损坏不会让告警丢失,但也意味着你的修改完全没生效。务必测试覆盖。
Q4:脚本支持 Python / Node.js 吗?
A:技术上可以,只要 shebang 行(如 #!/usr/bin/env python3)指向 server 主机上能执行的解释器。注意性能:每次告警都 fork 一次解释器开销不小,慢的话超时会导致脚本被 kill。简单逻辑首选 bash + jq。