只读 API 查询指南:通过 Skill Gateway 列举与筛选静默规则)
Nightingale 告警屏蔽Alert Mutes只读 API 查询指南通过 Skill Gateway 列举与筛选静默规则【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingaleAlert Mutes又称 silences屏蔽规则/静默规则用于在配置的时间窗口内对标签tags命中规则匹配条件的告警事件抑制通知。本文是 Nightingale 中通过 Skill Gateway 调用其只读 API 查询告警屏蔽规则的完整实战指南覆盖两个查询端点的参数语义、AlertMute响应字段逐项释义、TagFilter/PeriodicMute子结构、可复制的调用脚本与响应校验方法并深入模型与路由源码说明每个字段的底层计算逻辑与权限边界。读完本文你将能够编写脚本安全、准确地列举任意业务组下的屏蔽规则并正确解析其时间窗口与匹配条件。前置知识Skill Gateway 调用协议查询 alert-mutes 属于读取 n9e 自身数据的网关调用遵循 n9e-api.md 中定义的统一规则调用前务必阅读该索引文件。关键约定如下Socket 地址从环境变量N9E_SKILL_GATEWAY获取 Unix socket 路径通过它收发换行分隔的 JSONNDJSON。请求格式{method:GET,path:/api/n9e/busi-groups/alert-mutes,query:{...}}\npath中必须始终包含/api/n9e前缀本文件列出的路径均位于/api/n9e之下。读取操作用GETPOST仅允许用于data-query的只读查询端点见 api/data-query.md其余写/删一律被拒绝。query映射中的值必须是字符串{gids:1,2}而非{gids:[1,2]}。响应包裹{ok:true,status:200,data:n9e body}或{ok:false,status:code,error:...}。其中data是 n9e 的响应信封{dat: payload, err: }始终读取data[dat]API 出错时err非空且无datHTTP 仍为 200。dat有两种形状每个资源文件会注明属于哪种Pattern A为分页结构{list:[...],total:N}用于事件/目标等大量数据端点Pattern B为裸数组[...]用于规则、看板、屏蔽、订阅等配置对象列表无服务端分页。alert-mutes 的两个端点均属 Pattern B裸数组一次返回全部。两个查询端点Path用途dat形状/busi-groups/alert-mutes跨所有你有权读取的业务组可选gids收窄Pattern BAlertMute裸数组/busi-group/:id/alert-mutes单个业务组的屏蔽规则:id在路径中Pattern BAlertMute裸数组这是典型的业务组作用域business-group scoping惯用法/busi-groups/resource跨组查询/busi-group/id/resource单组查询且:id必须写入路径。路由层对两个端点的定义见 router.go均要求登录rt.auth()、rt.user()且具备/alert-mutes查看权限rt.perm(/alert-mutes)单组端点还附加rt.bgro()该业务组只读权限校验。相关权限点在 center/cconf/ops.go 中注册为 Mutting Rule - View/Add/Modify/Delete。查询参数详解ParamTypeRequiredDefaultMeaningEndpointgidsstring逗号分隔的整数否你可读的所有组限定只查这些业务组 ID。空值 所有你有读权限的组管理员 所有组/busi-groups/alert-mutesprodsstring空格分隔否全部只保留prod在该列表中的屏蔽规则如metric anomaly loki/busi-group/:id/alert-mutesquerystring否无对cause字段的不区分大小写子串过滤。多个空格分隔的词按 AND 关系匹配每个词都必须命中/busi-group/:id/alert-mutesexpiredint否-1时间窗口过滤。-1 全部不过滤。1 仅已过期时间范围型mute_time_type0且etime now。0或除-1/1外的任意值 仅未过期时间范围型etime now加上所有周期型mute_time_type1/busi-group/:id/alert-mutes源码视角参数如何变成 SQL/busi-group/:id/alert-mutes的处理器 alertMuteGetsByBG 依次解析prods用strings.Fields按空格切分、query、expired然后调用模型层models.AlertMuteGets。该查询方法在 models/alert_mute.go 中逐项拼装条件group_id ?bgid 非 -1 时prod in (?)有 prods 时expired 1时追加mute_time_type 0 AND etime now否则其他值追加(mute_time_type 0 AND etime now) OR mute_time_type 1——这正是参数表中0或任意其他值 仅未过期的精确语义query被按空格拆成多个词每个词生成一个cause like %word%条件多个条件 AND 叠加实现每个词都必须命中。跨组端点 alertMuteGetsByGids 则先解析gids逗号分隔若指定了 gids 会逐个执行bgroCheck校验你对每个组的只读权限若gids为空管理员直接查所有组非管理员通过models.MyBusiGroupIds取自己可读的组列表无任何可读组时返回空数组。之后调用AlertMuteGetsByBGIdsmodels/alert_mute.go按group_id in (?)过滤结果统一按id desc排序。响应负载AlertMute 对象Pattern B 裸数组。每个元素是一个AlertMuteField (json)TypeMeaningidint64屏蔽规则 IDgroup_idint64所属业务组 IDnotestring自由文本备注/描述catestring屏蔽规则的分类/类别prodstring适用的产品/监控类型如metric、anomaly、lokidatasource_ids[]int64计算字段该屏蔽规则作用的数据源 ID。单一元素[0]表示所有数据源clusterstring生效集群空格分隔tagsTagFilter数组标签匹配器——仅当事件标签满足每个匹配器时才被屏蔽见下文TagFiltercausestring创建屏蔽的原因btimeint64开始时间Unix 秒mute_time_type0时使用etimeint64结束时间Unix 秒mute_time_type0时使用disabledint0 启用1 禁用activatedint计算字段当前是否生效1 此刻正处于屏蔽窗口内0 不在create_bystring创建者用户名update_bystring最后更新者用户名update_by_nicknamestring计算字段最后更新者的显示昵称create_atint64创建时间Unix 秒update_atint64最后更新时间Unix 秒mute_time_typeint窗口类型0 一次性时间范围btime/etime1 周期每周排程periodic_mutesperiodic_mutesarray计算字段周期排程条目mute_time_type1时使用。每个条目含enable_stime、enable_etime空格分隔的HH:MM列表与enable_days_of_week如0 1 2 3 4 5 6severities[]int计算字段该屏蔽适用的告警级别如1、2、3。空 所有级别计算字段的来源DB2FE字段表标注为计算字段的项并非数据库原始列而是在模型方法DB2FE()models/alert_mute.go中从存储形态转换而来datasource_ids/periodic_mutes/severities在库中分别以 JSON 字符串列datasource_ids、periodic_mutes、severities存储DB2FE()反序列化后填充给前端/API 使用activated依据mute_time_type实时计算0时调用IsWithinTimeRangebtime now etime1时调用IsWithinPeriodicMute按HH:MM与星期匹配命中即activated1。这也解释了为什么已过期与未生效在activated上表现不同查询接口的expired参数按etime过滤而activated反映的是此刻是否处于窗口内。TagFiltertags匹配器中的每个元素Field (json)TypeMeaningkeystring要匹配的标签键funcstring匹配操作符、!、~、!~、in或not in为空时服务端回退用opopstringfunc的遗留别名允许的操作符相同func已设置时通常为空valueany要比较的标签值。/!/~/!~时为字符串in/not in时为空格分隔的字符串或值数组模型层 models/alert_mute.go 中TagFilter.Verify()确认key不能为空func为空时回退到op合法操作符集合正是、!、~、!~、in、not in六种。解析阶段ParseTagFilter/GetTagFilter会把~/!~的值编译为正则表达式Regexp字段把in/not in的值拆解为集合Vset字段并兼容字符串、[]int、[]string、[]interface{}等多种 value 形态。PeriodicMute周期排程条目periodic_mutes数组的每个元素结构如下对应 models/alert_mute.go 的PeriodicMuteenable_stime开始时刻空格分隔的HH:MM列表如00:00 10:00 12:00enable_etime结束时刻同样为空格分隔的HH:MM列表enable_days_of_week生效的星期列表如0 1 2 3 4 5 60 表示周日。底层判断逻辑IsWithinPeriodicMutemodels/alert_mute.go支持全天生效起止时刻相等或00:00–23:59与跨午夜窗口enable_stime enable_etime时triggerTime stime || triggerTime etime两种特殊形态。可复制的调用示例原文档请求示例网关调用注意query必须为字符串映射{method:GET,path:/api/n9e/busi-groups/alert-mutes,query:{}}以下是一个可直接运行的 Python 示例标准库socket无需第三方依赖演示如何从N9E_SKILL_GATEWAY读取 socket、发送 NDJSON 请求并安全解析响应import json, os, socket def gateway_call(method, path, queryNone): req {method: method, path: path, query: query or {}} sock socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(os.environ[N9E_SKILL_GATEWAY]) sock.sendall((json.dumps(req) \n).encode()) buf b while True: chunk sock.recv(65536) if not chunk: break buf chunk if b\n in buf: break sock.close() return json.loads(buf.decode()) resp gateway_call(GET, /api/n9e/busi-groups/alert-mutes, {}) if not resp.get(ok) or not isinstance(resp.get(data), dict): raise RuntimeError(fgateway call failed: {str(resp)[:200]}) env resp[data] if env.get(err): raise RuntimeError(fn9e api error: {env[err]}) mutes env[dat] # Pattern B: bare array of AlertMute for m in mutes: print(m[id], m[group_id], m[prod], m[mute_time_type], m[activated], m[cause])响应示例已裁剪来自原文档{ ok: true, status: 200, data: { dat: [ { id: 12, group_id: 4, note: silence disk alerts during maintenance, cate: , prod: metric, datasource_ids: [0], cluster: , tags: [ {key: rulename, func: , op: , value: disk_full} ], cause: planned maintenance, btime: 1719800000, etime: 1719810000, disabled: 0, activated: 1, create_by: root, update_by: root, update_by_nickname: Administrator, create_at: 1719799000, update_at: 1719799000, mute_time_type: 0, periodic_mutes: [], severities: [1, 2, 3] } ], err: } }该示例演示了维护窗口屏蔽的典型形态mute_time_type0的一次性时间范围btime/etime标签匹配器按rulename disk_full精确匹配datasource_ids[0]表示作用于所有数据源activated1表明当前正处于屏蔽窗口内。必须校验每个响应错误路径会静默失败这是一个关键的实战陷阱未知路径不会返回 404。n9e 对任何未匹配路由都会返回 SPA 的index.html网关会把这段HTML 字符串放进data。因此拼错路径时脚本拿到的不是 JSON 而是 HTML通常以!-- ... Copyright ... Nightingale Team开头且ok仍可能为true。因此每次调用都要像上面的示例一样依次校验resp[ok]为 trueresp[data]是 dict而不是字符串——字符串即拼错了路径data[err]为空之后才使用data[dat]。不要凭类比猜路径不存在/alert-events、不存在裸/alert-rules、不存在/dashboards也没有裸/alert-mutes那是写接口与 service 接口的路径且不对外开放。全部路径必须以 n9e-api.md 各资源文件为准。若需要的端点未在文档中应请用户从浏览器开发者工具确认真实的/api/n9e/...请求而不是猜测。权限与安全边界两个查询端点都需要/alert-mutesMutting Rule - View权限单组端点还要求对应业务组的只读权限rt.bgro()。网关是只读 黑名单deny-list模式携带密钥的读取datasource 配置/datasource*、通知密钥/notify-channel*、用户/令牌/users、SSO/IdP/sso、代理/proxy/*等与一切写操作POST/PUT/DELETE除 contenteditable="false">【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考