跳到主要内容

与 Grafana 配合

可视化继续用 Grafana:指向同一批存储,把告警交给夜莺。

这页办完你会得到:Grafana 里的大盘一个不动,夜莺在同一批存储上跑告警。 不需要迁数据,也不需要把面板重画一遍。

怎么分工​

这件事交给谁为什么
画图、临时探索Grafana你已经攒了几十上百个面板,重做不划算
告警判定夜莺规则带业务组归属、屏蔽、订阅,判定过程有执行记录
通知路由与降噪夜莺通知规则、媒介、模板、工作流是一整套
事件闭环夜莺活跃事件、历史事件、自愈动作在一个地方

这个分工成立的前提只有一条:两边看的是同一批数据。下面第 1 节和第 2 节是两个 方向,按你的存储在哪儿选一个。

1. 两边指向同一批存储​

指标已经在 Prometheus / VictoriaMetrics / Thanos 里的,这是最省事的做法:把 Grafana 数据源里那个查询地址,在夜莺里也注册一份。

集成中心 → 数据源 → 新增 → Prometheus,URL 填同一个地址,具体字段见 Prometheus。

两点提醒:

  • 两边的数据源名字不用一样。夜莺的告警规则按夜莺这边的名字选数据源。
  • Grafana 的 Prometheus 数据源如果用的是 Server(proxy)访问模式,那个地址是从 Grafana 所在机器发起的;夜莺所在机器也要能直连它,否则数据源测试就过不去。

2. 反过来:让 Grafana 查夜莺的内置时序库​

指标只存在夜莺的内置时序库里(Categraf 直接推给夜莺)的,Grafana 也能查它—— 内置库对外暴露的就是标准的 Prometheus 查询 API,地址是 http://<夜莺地址>:17000/prometheus。

但这个端点默认只接受本机请求。要让 Grafana 从别的机器查,先配一组 basic auth:

[EmbeddedTSDB]
Enable = true
BasicAuthUser = "grafana"
BasicAuthPass = "<换成你自己的>"

配上之后本机限制就解除了,自动注册的 embedded-tsdb 数据源地址也会从 127.0.0.1 换成探测到的本机 IP,并带上这组认证。重启夜莺生效。

然后在 Grafana 里新建一个 Prometheus 类型数据源:

URL http://<夜莺的 IP>:17000/prometheus
Auth Basic auth,用户名密码填上面那组

保存并测试,能查到 up 就通了。

这条路只适合小规模。内置库是单实例本地盘、大约 10 万活跃序列以内的方案, 边界见内置时序库与外部存储。规模上来换成外部时序库之后, 回到第 1 节,两边都指向外部库更简单。

3. 把告警搬到夜莺​

夜莺规则里写的 PromQL 和 Grafana 面板里的是同一套写法,区别只是阈值判定写进表达式 本身(... > 1)。

把 Grafana 大盘接进夜莺​

仪表盘列表页的 导入 里有四个 tab,其中两个和 Grafana 有关:

tab做什么
Grafana 仪表盘链接(推荐)不转换任何东西,建一个 iframe 模式的仪表盘,直接嵌你的 Grafana 页面。填名称、英文标识、分类标签和 Grafana 仪表盘链接
导入 Grafana 仪表盘(不推荐)Beta。把 Grafana 的 dashboard JSON 转成夜莺自己的模型

后者的限制界面上就写着:只支持 Prometheus 类型数据源的仪表盘,以及夜莺支持的 图表类型和功能。低于 v7 的 dashboard JSON 直接拒绝,v7 到 v8 之间会先警告再让你 选择继续。稍微复杂一点的大盘转过来都要手工收尾——「不推荐」不是客套话。

第三种做法是把整个 Grafana 挂成一个侧栏入口,见嵌入与被集成。

让 Grafana 允许被嵌入​

上面后两种做法都要 iframe,而 Grafana 默认是禁止被嵌的。改 grafana.ini:

[security]
allow_embedding = true

同域名部署到这里就够了。跨域名还得让 Grafana 的会话 Cookie 能在第三方上下文里 带上:

[security]
allow_embedding = true
cookie_secure = true ; 要求 HTTPS
cookie_samesite = none ; 允许跨站请求携带 cookie

cookie_secure = true 之后 Grafana 必须走 HTTPS;原来是 HTTP 的,在前面加一层带 证书的反向代理即可。不加这两行的典型现象是:外层夜莺已经登录了,iframe 里的 Grafana 却一直显示登录页。

不想让访客登录 Grafana 的,也可以开匿名只读:

[auth.anonymous]
enabled = true
org_name = Main Org.
org_role = Viewer

改完重启 Grafana 生效。

下一步​