DataHub Grafana 采集连接器:图表血缘、列级血缘与看板所有权提取实践
2026/9/18 10:57:54 网站建设 项目流程

DataHub Grafana 采集连接器:图表血缘、列级血缘与看板所有权提取实践

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

本篇围绕 DataHub 摄取框架中的 Grafana 源(type: grafana)展开,聚焦其两大核心能力——图表与数据源之间的血缘提取(含 SQL 列级血缘)和看板所有权提取。读完本文,你将掌握include_lineageinclude_column_lineageconnection_to_platform_mapingest_ownersremove_email_suffix等关键参数的配置方法与默认行为,并理解底层如何通过 Grafana REST API 和模板变量清洗实现 SQL 血缘解析,从而为生产环境编写可复制、可验证的 Grafana 摄取配置。

连接器能力总览

Grafana 源在代码中以GrafanaSource实现,支持状态(GA)标记与多项默认启用的能力声明,见 GrafanaSource:

  • PLATFORM_INSTANCEDELETION_DETECTION(状态化陈旧实体删除)、LINEAGE_COARSE(数据集级血缘)、LINEAGE_FINE(列级血缘)、OWNERSHIPTAGS均默认开启。
  • 采集结果的概念映射关系(Folder → Container、Dashboard → Container、Panel → Chart、Data Source → Dataset、Dashboard Owner → Corp User、Tags → Tag)可参考 README 中的 Concept Mapping 表格。

一个完整的最小可运行配置示例来自仓库自带的 grafana_recipe.yml:

source: type: grafana config: # Coordinates platform_instance: production # optional env: PROD # optional url: https://grafana.company.com service_account_token: ${GRAFANA_SERVICE_ACCOUNT_TOKEN} # SSL verification for HTTPS connections verify_ssl: true # optional, default is true # Ownership configuration ingest_owners: true # optional, default is true - extract dashboard ownership remove_email_suffix: true # optional, default is true - remove email suffix like @acryl.io # Source type mapping for lineage connection_to_platform_map: postgres: platform: postgres database: grafana # optional database_schema: grafana # optional platform_instance: database_2 # optional env: PROD # optional mysql_uid_1: # Grafana datasource UID platform: mysql platform_instance: database_1 # optional database: my_database # optional sink: # sink configs

血缘提取配置

Grafana 源可以从面板(Panel)引用的 SQL 查询和数据源配置中提取血缘,分为数据集级与列级两个层次。相关配置项定义在 GrafanaSourceConfig 中:

source: type: grafana config: url: "https://grafana.company.com" service_account_token: "your_token" # 血缘提取开关(默认: true) include_lineage: true # 来自 SQL 查询的列级血缘(默认: true) # 仅在 include_lineage 为 true 时生效 include_column_lineage: true # 血缘提取的平台映射 connection_to_platform_map: postgres_datasource_uid: platform: postgres platform_instance: my_postgres env: PROD database: analytics database_schema: public

各参数的默认值与含义(来自 grafana_config.py 的 Pydantic 字段定义):

参数默认值说明
include_lineagetrue是否提取图表与数据源之间的血缘。开启后源会解析面板 SQL 查询与数据源配置来构建血缘关系
include_column_lineagetrue是否从 SQL 查询提取字段级血缘,仅当include_lineagetrue时生效
connection_to_platform_map空字典Grafana 数据源类型/UID 到平台连接配置的映射,用于把血缘落点到正确的 DataHub 平台

血缘能力涵盖四个方面:

  • 数据集级血缘:将图表链接到其底层数据源;
  • 列级血缘:从 SQL 查询中提取字段到字段的关系;
  • 平台映射:将 Grafana 数据源映射到其真实平台,保证血缘 URN 指向正确的数据集;
  • SQL 解析:支持解析面板中的 SQL 查询以获得更细粒度的血缘。

性能提示:当不需要血缘信息时,可设置include_lineage: false关闭血缘提取以提升摄取性能。从源码看,GrafanaSource.init中只有当config.include_lineage为真时才会实例化LineageExtractor,因此关闭后不会执行任何 SQL 解析开销。

connection_to_platform_map 参数详解

connection_to_platform_map的每个条目对应 PlatformConnectionConfig,字段如下:

字段必填说明
platform平台名,如postgresmysqlsnowflake
database默认数据库名
database_schema默认 schema 名
platform_instance继承自PlatformInstanceConfigMixin
env继承自EnvConfigMixin

映射的键既可以是数据源类型名(如postgres),也可以是具体数据源的 UID(如mysql_uid_1),以便对同一类型的多个数据源分别指定不同的库和实例。

列级血缘的底层实现:SQL 模板变量清洗

列级血缘依赖对面板 SQL 的解析,而 Grafana 面板中的 SQL 常包含会破坏 SQL 解析器的模板语法。仓库中的 lineage.py 提供了_clean_grafana_template_variables函数,在解析前做清洗,处理策略如下:

  • 带参数的时间/过滤宏(如$__timeFilter(column)$__timeGroup(...))替换为布尔表达式TRUE
  • 独立出现的时间/过滤宏(如WHERE event_timestamp $__timeFilter)替换为合法谓词> TIMESTAMP '2000-01-01'
  • 其他通用宏($__interval$__range等)替换为数值1
  • 废弃的[[variable]]语法替换为合法标识符grafana_identifier
  • 现代语法${variable}${variable:format}替换为字符串字面量'grafana_var'
  • 简单$variable(不在引号内)替换为'grafana_var',而引号内的'$status'保持原样。

清洗后的 SQL 交给 DataHub 的 sqlglot 血缘解析器(create_lineage_sql_parsed_result),最终生成FineGrainedLineage等 MCP 消息。相关行为可用单测 test_grafana_lineage.py 与 test_grafana_query_extraction.py 验证。

优化列级血缘的建议(来自 grafana_pre.md):

  • 在数据源连接配置中配好 database/schema 信息;
  • 设置connection_to_platform_map使其覆盖所有需要血缘的数据源。

所有权提取配置

Grafana 源从看板的创建者(dashboard creator)提取所有权,并将其指定为 Technical Owner。配置如下:

source: type: grafana config: url: "https://grafana.company.com" service_account_token: "your_token" # 所有权提取(默认: true) ingest_owners: true # 去除邮箱后缀,如 @acryl.io(默认: true) remove_email_suffix: true

对应的所有权能力:

  • Technical Owner 分配:看板创建者自动被指定为 Technical Owner;
  • 邮箱后缀控制:通过remove_email_suffix控制 Grafana 用户邮箱如何转换为 DataHub 用户 URN——默认去除@domain后缀,仅用本地部分作为用户标识;
  • 禁用所有权:设置ingest_owners: false可完全跳过所有权提取。

这两个字段的定义见 grafana_config.py:ingest_owners默认trueremove_email_suffix默认true(描述示例为@acryl.io)。

提取模式与其他可用参数

原文档提到的能力均依赖增强模式(Enhanced Mode)下的 API 访问。Grafana 源支持两种提取模式(详见 grafana_pre.md):

  • 增强模式(默认):需要Admin 权限的服务账号 token,可读取看板/文件夹详情、数据源配置、用户信息与面板配置,从而获得完整的层级、面板与血缘数据;
  • 基础模式basic_mode: true,仅需Viewer 权限,通过/api/search端点提取看板实体,不含文件夹层级、面板详情、血缘或 schema 元数据,用于向后兼容受限权限场景。

除本文档重点参数外,GrafanaSourceConfig 还定义了以下与运行行为直接相关的字段,可按需补充到 recipe 中:

参数默认值说明
url必填Grafana 地址,形如http://your-grafana-instance,无尾部斜杠(字段校验器会自动去除)
service_account_token必填服务账号 token,以SecretStr存储
verify_ssltrueHTTPS 连接是否校验 SSL 证书
page_size100分页遍历文件夹与看板时每页条数
basic_modefalse启用受限权限的基础提取模式
dashboard_pattern/folder_pattern允许全部用正则(AllowDenyPattern)过滤要摄取的看板/文件夹
ingest_tagstrue是否摄取看板与图表标签(支持普通标签与 key:value 标签)
skip_text_panelsfalse是否跳过 text 面板(无数据可视化,对血缘无意义)
platform_instance/env平台实例与环境标注
stateful_ingestionnull状态化陈旧实体删除配置

增强模式下的摄取流程按阶段划分并输出报告,阶段常量定义于 grafana_source.py:Grafana Basic Dashboard ExtractionGrafana Folder ExtractionGrafana Dashboard ExtractionGrafana Panel Extraction,报告结构见 report.py。

限制与故障排查

限制

模块行为受源 API、权限和平台暴露的元数据范围约束;不支持或条件性功能应参考上文能力说明(如基础模式不含血缘与面板详情)。

故障排查建议

若摄取失败,建议按以下顺序排查:

  1. 凭证:确认service_account_token有效,且权限级别匹配所选模式(增强模式需 Admin,基础模式需 Viewer);
  2. 权限与连通性:确认 token 可读看板/文件夹、数据源配置(/api/search等端点可达),url无尾部斜杠、verify_ssl与内网证书环境一致;
  3. 范围过滤:检查dashboard_patternfolder_pattern是否意外排除了目标内容;
  4. 日志:审查摄取报告中的 source-specific 错误(如基础模式的 "Dashboard Search Error" 报告项,见 grafana_source.py),并据此调整配置。

测试与验证路径

如需自行验证本连接器的行为,仓库提供了分层测试:

  • 单元测试:tests/unit/grafana/ 下的test_grafana_source.pytest_grafana_lineage.pytest_grafana_api.pytest_grafana_entity_mcp_builder.pytest_grafana_field_utils.pytest_grafana_models.pytest_grafana_report.pytest_grafana_validation.py等;
  • 集成测试:tests/integration/grafana/ 提供含 Postgres 初始化数据(init.sql)、看板与数据源 provision 配置(provisioning/)的完整 docker-compose 环境,以及 golden 文件 grafana_mcps_golden.json(增强模式)与 grafana_basic_mcps_golden.json(基础模式),可用于比对 MCP 输出是否与预期一致。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询