夜莺监控(Nightingale)与 Grafana 深度整合

用 Keycloak 与 OIDC 打通夜莺监控和 Grafana:统一 SSO 登录,并将 Grafana 内嵌到夜莺,实现一个入口管理告警、通知和可视化大盘。

作者 flycat

夜莺适合管理告警规则、通知规则,新引入的 Pipeline 机制也很灵活,可以和公司内部 CMDB 等系统打通。但很多团队长期使用 Grafana 看图,Grafana 中已经积累了大量大盘配置,直接迁移到夜莺成本很高,而且 Grafana 在看图方面生态更成熟。

因此,更现实的方案不是替换,而是整合:用夜莺统一管告警和通知,用 Grafana 继续承载已有可视化大盘。

我司最终选择使用统一 SSO 解决夜莺和 Grafana 的登录问题,然后把 Grafana 内嵌到夜莺里。老版本夜莺使用 集成仪表盘 内嵌,新版本使用 集成中心-系统集成 内嵌。

本文方案的目标是:

  • 夜莺和 Grafana 都接入同一个 OIDC 单点登录系统。
  • 用户从夜莺登录后,可以在夜莺中访问内嵌的 Grafana。
  • Grafana 发现用户未登录时跳转到 SSO,因为用户已经在 SSO 登录过,所以会自动跳转回来。
  • 终端用户感知上,就像夜莺和 Grafana 共享了登录状态。

最终效果

最终效果

用户使用 SSO 登录夜莺,然后在夜莺里访问 Grafana,Grafana 发现当前用户没有登录(因为 iframe 无法共享外部的 jwt token 或 cookie),就会自动跳转到 SSO 登录页面,SSO 那边发现当前用户已经登录过了,又自动跳转回来,所以对终端用户而言,就像是夜莺和 Grafana 共享了登录信息一样。

下面介绍一下配置方式。

提前准备

开始前需要准备:

  • 最新版夜莺,并配置域名和 HTTPS。
  • 最新版 Grafana,并配置域名和 HTTPS。
  • 支持 OIDC 认证的单点登录系统。本文使用 Keycloak。

整体配置分三步:

  1. 在 Keycloak 中分别为夜莺和 Grafana 创建 Client。
  2. 在夜莺中配置 OIDC 单点登录。
  3. 在 Grafana 中启用 auth.generic_oauth,并允许 iframe 内嵌。

配置 Keycloak

在 Keycloak 中分别为夜莺和 Grafana 创建 Client ID 和 Secret。注意 Client Protocol 选择 openid-connect

下面是 Keycloak 中配置 Grafana 的截图,供参考:

分别将夜莺和 Grafana 的 Client ID 以及 Secret 保存,后面会用到。

配置夜莺

在夜莺的 系统配置-单点登录-OIDC 中修改 SSO 配置。示例配置如下:

Enable = true
DisplayName = 'SSO登录'
RedirectURL = 'https://xxx.com/callback' # 修改为夜莺地址
SsoAddr = 'https://xxx/auth/realms/xxx' # SSO地址
SsoLogoutAddr = 'https://xxx/auth/realms/xxx/protocol/openid-connect/logout' # SSO注销地址
ClientId = 'xxx' # 夜莺Client ID
ClientSecret = 'xxx' # 夜莺Client Secret
CoverAttributes = true
DefaultRoles = ['xxx']
Scopes = ['openid', 'profile', 'email', 'phone']
[Attributes]
Username = 'preferred_username'
Nickname = 'preferred_username'
Phone = 'phone_number'
Email = 'email'

保存后,先测试是否可以通过 SSO 登录夜莺。只有夜莺自身 SSO 登录正常,再继续配置 Grafana,排查时才不会混在一起。

配置 Grafana

修改 Grafana 配置文件。我的环境下,配置文件路径是 /etc/grafana/grafana.ini。需要修改的部分如下:

[auth.generic_oauth]
name = SSO
icon = signin
enabled = true
allow_sign_up = true
auto_login = true
client_id = xxx
client_secret = xxx
scopes = openid email profile offline_access
email_attribute_name = preferred_username
email_attribute_path = email
login_attribute_path = preferred_username
auth_url = https://xxx/auth/realms/xxx/protocol/openid-connect/auth
token_url = https://xxx/auth/realms/xxx/protocol/openid-connect/token
api_url = https://xxx/auth/realms/xxx/protocol/openid-connect/userinfo
skip_org_role_sync = true
role_attribute_path = grafana_role

[auth]
# Login cookie name
disable_signout_menu = false
auto_assign_org = true
auto_assign_org_role = Viewer

[security]
cookie_secure = true
cookie_samesite = none
allow_embedding = true
allow_embedding = true

[server]
domain = xxx
root_url = https://xxx.com/
enable_gzip = true

保存后重启 Grafana,测试是否可以通过 SSO 登录 Grafana。当然,在 Grafana 启用 SSO 之前,可以提前创建一个管理员,后续 SSO 登录的用户可由管理员分配权限。

配置要点说明

这套集成里有几个容易忽略的点:

  • 夜莺和 Grafana 都要有可访问的 HTTPS 域名。
  • Grafana 需要配置 allow_embedding = true,否则无法在夜莺 iframe 中嵌入。
  • cookie_samesite = nonecookie_secure = true 与跨站嵌入场景相关,配置不当会导致 iframe 登录态异常。
  • SSO Client ID 和 Secret 要分别保存,不要把夜莺和 Grafana 的 Client 混用。
  • 启用 SSO 前建议保留 Grafana 管理员账号,避免权限配置错误后无法管理用户。

FAQ

Q1:为什么夜莺登录后,Grafana 还会跳转到 SSO?

A:因为 iframe 无法直接共享夜莺外部的 JWT token 或 cookie。Grafana 需要走自己的 OIDC 登录流程,但由于用户已经在 SSO 登录过,SSO 会自动跳回 Grafana。

Q2:这是不是让夜莺和 Grafana 共用同一个账号体系?

A:是的,二者都接入同一个 OIDC 单点登录系统。账号来源统一,但夜莺和 Grafana 各自仍可以管理自己的权限。

Q3:夜莺和 Grafana 是否必须二选一?

A:不必。这个方案的价值就是让夜莺继续负责告警、通知、Pipeline 等能力,让 Grafana 继续负责已有大盘和可视化资产。

如上,就完成了夜莺和 Grafana 的 SSO 与内嵌集成配置。供大家参考。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 夜莺监控
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云