使用 OpenMetadata Grafana 连接器导入仪表盘与面板:连接配置指南与源码解析
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
本指南以 OpenMetadata 仓库中 Grafana Dashboard 连接器的配置文档(openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Grafana.md)为主体,讲解如何配置 Grafana 实例连接、完成认证并导入仪表盘与面板元数据。读完本文,你将掌握 Grafana 连接器的全部连接参数含义与推荐取值、Service Account Token 认证细节,并了解连接测试、分页拉取、面板与血缘提取在源码层面的完整实现链路。
一、前置要求:认证方式与权限
要将 Grafana 中的仪表盘(Dashboard)和面板(Panel)导入 OpenMetadata,你需要对 Grafana 实例拥有合适的访问权限,并准备正确的认证凭据。
使用 Service Account Token 认证:OpenMetadata 通过 Grafana HTTP API 拉取元数据,认证方式为 Bearer Token。当前仓库推荐使用 Service Account Token,其格式通常以glsa_开头(例如glsa_xxxxx)。
Token 必须具备读取权限:该 Token 需要拥有读取仪表盘(dashboards)、文件夹(folders)和数据源(datasources)的权限。为覆盖全部元数据,官方文档建议直接使用Admin 角色的 Token,这是实现完整元数据提取的推荐做法。
关于这一认证约定,可以从源码中得到印证。在 client.py 的GrafanaApiClient.__init__中,客户端会对 Token 前缀做一次非阻塞校验——若 Token 不以glsa_开头,会输出一条 warning 日志,提示“Legacy API keys are no longer supported by Grafana as of January 2025, please create a Service Account Token in Grafana”,即旧版 API Key 自 2025 年 1 月起已被 Grafana 官方弃用,请改用 Service Account Token:
if not api_key.startswith("glsa_"): logger.warning( "Token does not appear to be a Service Account Token (should start with 'glsa_'). " "Legacy API keys are no longer supported by Grafana as of January 2025. " "Please create a Service Account Token in Grafana." )二、连接配置项详解(Connection Details)
Grafana 连接器在 OpenMetadata UI 的“Add Service → Dashboard → Grafana”表单中提供以下配置项,其定义与默认值以 grafanaConnection.json 中的 JSON Schema 为准。
1. Host and Port(hostPort)
Grafana 实例的基础 URL(Base URL),即连接器的访问入口。
示例取值:
- Grafana Cloud:
https://<your-org>.grafana.net - 自托管(Self-hosted):
https://grafana.company.com - 本地开发:
http://localhost:3000
容器环境注意事项:如果你以 Docker 方式运行 OpenMetadata ingestion,而 Grafana 实例部署在本机localhost,则应将主机名改为host.docker.internal(例如http://host.docker.internal:3000),以便容器内进程访问宿主机服务。
在 JSON Schema 中,该字段为uri格式的必填字符串。底层客户端在 client.py 中会先对传入 URL 做rstrip("/")处理,再拼接/api前缀发起请求,因此 URL 尾部是否带斜杠不影响请求正确性。
2. Service Account Token(apiKey)
用于调用 Grafana API 的 Service Account Token,即上节所述的glsa_前缀令牌。在 Schema 中该字段以password格式存储,属于必填项,OpenMetadata 在展示与日志中会对其做脱敏处理。
关键要点:
- 优先使用 Service Account Token(格式如
glsa_xxxxx); - Grafana 自 2025 年 1 月起不再支持 Legacy API Keys,请勿继续使用旧式 API Key;
- 自托管实例与 Grafana Cloud 均支持;
- 推荐使用 Admin 角色以获得完整元数据提取能力。
3. Verify SSL(verifySSL)
控制连接 Grafana 时是否校验 SSL 证书:
- 默认值:
true(开启证书校验); - 仅在开发或测试等非生产环境中,且确认网络链路可信时,才建议关闭。
该布尔值在 connection.py 中被透传给 HTTP 客户端:verify_ssl=(self.service_connection.verifySSL if self.service_connection.verifySSL is not None else True),并最终设置为 requests Session 的session.verify属性。对应地,单元测试 test_grafana_client.py 中专门验证了verify_ssl=False时session.verify为False。
4. Page Size(pageSize)
分页请求 Grafana API 时每页返回的记录条数:
- 默认值:
100; - 当实例中的仪表盘数量较多时,可适当增大该值以减少 API 调用次数;Schema 中约束最小值为
1。
分页逻辑在 client.py 的get_folders与search_dashboards中实现:客户端从page = 1开始循环请求,携带{"page": page, "limit": self.page_size}参数,当返回条数小于page_size或返回空列表时停止翻页。单元测试 test_grafana_client.py 通过 mock 两页数据验证了该翻页逻辑(page_size=2时共发起 2 次请求)。
配置参数速查表
| 参数 | 字段名 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| Host and Port | hostPort | 是 | 无 | Grafana 实例基础 URL,Docker 环境可用host.docker.internal |
| Service Account Token | apiKey | 是 | 无 | glsa_前缀 Token,Admin 角色推荐 |
| Verify SSL | verifySSL | 否 | true | 是否校验 SSL 证书,仅开发/测试可关闭 |
| Page Size | pageSize | 否 | 100 | 分页大小,仪表盘多时可调大以减少 API 调用 |
除上述四项外,Schema 还定义了dashboardFilterPattern(按正则过滤仪表盘)、chartFilterPattern(按正则过滤图表)与supportsMetadataExtraction字段,并在required中声明hostPort与apiKey为必填项。
三、连接构建与连接测试的源码实现
Grafana 连接器在 Python 侧的模块结构为:
- connection.py:连接构建与连通性测试;
- client.py:Grafana HTTP API 客户端;
- metadata.py:元数据提取主流程;
- models.py:Grafana API 响应的 Pydantic 模型;
- service_spec.py:将
GrafanaSource与GrafanaConnection组装为服务规格。
在GrafanaConnection._get_client中,四个配置参数被逐一映射到GrafanaApiClient构造函数:host_port、api_key(通过get_secret_value()解密)、verify_ssl(为空时回退为True)、page_size(为空时回退为100)。
连接测试流程(test_connection)调用client.test_connection(),其底层请求 Grafana 的GET /api/org接口——能成功返回组织信息即视为连通。该探测逻辑在 test_grafana_client.py 中有对应断言(URL 为https://grafana.example.com/api/org)。因此,用于连接测试的 Token 至少需要具备访问org接口的权限,这进一步印证了推荐使用具备完整读权限(Admin)角色的必要性。
四、从连接参数到元数据导入的完整链路
配置好上述参数后,Grafana 连接器会依次完成以下元数据提取步骤(对应 metadata.py):
- 准备阶段(
prepare):调用get_datasources()(GET /api/datasources)拉取全部数据源,并按 UID 与名称双重建索引,供后续血缘解析使用; - 仪表盘列表(
get_dashboards_list):调用search_dashboards()(GET /api/search,携带type=dash-db与分页参数)获取仪表盘列表,每个条目以 UID 作为 OpenMetadata 中的实体名称; - 仪表盘详情(
get_dashboard_details):对每个 UID 调用GET /api/dashboards/uid/{uid}获取完整定义(标题、描述、标签、面板、URL 等),并通过createdBy尝试匹配 OpenMetadata 中的用户作为 Owner; - 面板提取(
yield_dashboard_chart):遍历仪表盘panels数组,跳过row(行容器)与text类型面板,将每个面板映射为 Chart 实体。需要注意,面板 ID 仅在单个仪表盘内唯一,因此图表名称采用dashboard_uid + "_" + panel_id的组合以保证全局唯一。折叠行(collapsed row)中的子面板会通过_flatten_panels递归展开后再处理; - 面板类型映射(
_map_panel_type_to_chart_type):将 Grafana 面板类型映射为标准图表类型,例如timeseries/graph→ Line、table→ Table、gauge→ Gauge、piechart→ Pie、heatmap→ Heatmap、geomap→ Map、logs→ Table 等,未匹配的类型回退为 Other; - 血缘提取(
yield_dashboard_lineage_details):从面板的targets中提取查询语句(优先读取rawSql/rawSQL字段,兼容 Trino、Athena 等不同 SQL 插件的字段命名差异),跳过 Prometheus、Elasticsearch 等非 SQL 数据源类型(见NON_SQL_DATASOURCE_TYPES),随后通过LineageParser解析 SQL 中的源表,再结合db_service_prefix前缀过滤与 OpenMetadata 搜索匹配表实体,建立“表 → 仪表盘”的血缘关系。
这些流程均以配置小节中的hostPort、apiKey、verifySSL、pageSize为基础运行,其中pageSize直接影响第 1、2 步的分页请求次数。
五、错误处理与故障排查要点
从 client.py 的_make_request可以提炼出以下排查依据:
- 401 / 403(权限不足):客户端会记录 warning 日志“Permission denied for …”,并跳过该接口继续后续处理,不会中断整个工作流。若发现仪表盘或数据源导入不完整,请优先检查 Token 权限是否覆盖 dashboards、folders、datasources 读取(Admin 角色为最稳妥选择);
- 其他 HTTP 错误与网络异常:记录 error 日志后返回空结果,对应接口的数据会被跳过;
- Token 格式告警:Token 不以
glsa_开头时会输出 warning,提示使用 Service Account Token——注意这与 401/403 是两类独立问题:格式正确但权限不足会触发前者,格式不合法则可能在 Grafana 侧直接鉴权失败。
上述错误分支在 test_grafana_client.py 中均有覆盖(401 返回空列表、403 返回None、500 返回空列表、通用异常返回空列表),可以作为排查行为的参考依据。
六、相关代码与测试索引
如需深入阅读或二次开发,可在仓库中定位以下文件:
- 连接配置文档:openmetadata-ui/src/main/resources/ui/public/locales/en-US/Dashboard/Grafana.md
- 连接配置 JSON Schema:openmetadata-spec/src/main/resources/json/schema/entity/services/connections/dashboard/grafanaConnection.json
- 连接构建与测试:ingestion/src/metadata/ingestion/source/dashboard/grafana/connection.py
- API 客户端:ingestion/src/metadata/ingestion/source/dashboard/grafana/client.py
- 元数据提取主流程:ingestion/src/metadata/ingestion/source/dashboard/grafana/metadata.py
- API 响应模型:ingestion/src/metadata/ingestion/source/dashboard/grafana/models.py
- 单元测试:ingestion/tests/unit/topology/dashboard/test_grafana_client.py、ingestion/tests/unit/topology/dashboard/test_grafana.py、ingestion/tests/unit/topology/dashboard/test_grafana_lineage.py、ingestion/tests/unit/topology/dashboard/test_grafana_simple.py、ingestion/tests/unit/source/dashboard/grafana/test_connection.py
七、小结
Grafana 连接器的配置核心可以归结为四点:正确的主机地址(含 Docker 场景的host.docker.internal特例)、glsa_前缀的 Service Account Token(推荐 Admin 角色)、按环境取舍的 SSL 校验开关、以及按仪表盘规模调优的分页大小。理解这四个参数在 JSON Schema 与 Python 客户端中的映射关系,再结合连接测试(GET /api/org)、分页拉取(page/limit)与 401/403 告警等源码行为,即可在 OpenMetadata 中快速、稳定地完成 Grafana 仪表盘与面板的元数据导入。
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考