DataHub Grafana 采集连接器:图表血缘、列级血缘与看板所有权提取实践
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本篇围绕 DataHub 摄取框架中的 Grafana 源(type: grafana)展开,聚焦其两大核心能力——图表与数据源之间的血缘提取(含 SQL 列级血缘)和看板所有权提取。读完本文,你将掌握include_lineage、include_column_lineage、connection_to_platform_map、ingest_owners、remove_email_suffix等关键参数的配置方法与默认行为,并理解底层如何通过 Grafana REST API 和模板变量清洗实现 SQL 血缘解析,从而为生产环境编写可复制、可验证的 Grafana 摄取配置。
连接器能力总览
Grafana 源在代码中以GrafanaSource实现,支持状态(GA)标记与多项默认启用的能力声明,见 GrafanaSource:
PLATFORM_INSTANCE、DELETION_DETECTION(状态化陈旧实体删除)、LINEAGE_COARSE(数据集级血缘)、LINEAGE_FINE(列级血缘)、OWNERSHIP、TAGS均默认开启。- 采集结果的概念映射关系(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_lineage | true | 是否提取图表与数据源之间的血缘。开启后源会解析面板 SQL 查询与数据源配置来构建血缘关系 |
include_column_lineage | true | 是否从 SQL 查询提取字段级血缘,仅当include_lineage为true时生效 |
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 | 是 | 平台名,如postgres、mysql、snowflake |
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默认true,remove_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_ssl | true | HTTPS 连接是否校验 SSL 证书 |
page_size | 100 | 分页遍历文件夹与看板时每页条数 |
basic_mode | false | 启用受限权限的基础提取模式 |
dashboard_pattern/folder_pattern | 允许全部 | 用正则(AllowDenyPattern)过滤要摄取的看板/文件夹 |
ingest_tags | true | 是否摄取看板与图表标签(支持普通标签与 key:value 标签) |
skip_text_panels | false | 是否跳过 text 面板(无数据可视化,对血缘无意义) |
platform_instance/env | 无 | 平台实例与环境标注 |
stateful_ingestion | null | 状态化陈旧实体删除配置 |
增强模式下的摄取流程按阶段划分并输出报告,阶段常量定义于 grafana_source.py:Grafana Basic Dashboard Extraction、Grafana Folder Extraction、Grafana Dashboard Extraction、Grafana Panel Extraction,报告结构见 report.py。
限制与故障排查
限制
模块行为受源 API、权限和平台暴露的元数据范围约束;不支持或条件性功能应参考上文能力说明(如基础模式不含血缘与面板详情)。
故障排查建议
若摄取失败,建议按以下顺序排查:
- 凭证:确认
service_account_token有效,且权限级别匹配所选模式(增强模式需 Admin,基础模式需 Viewer); - 权限与连通性:确认 token 可读看板/文件夹、数据源配置(
/api/search等端点可达),url无尾部斜杠、verify_ssl与内网证书环境一致; - 范围过滤:检查
dashboard_pattern、folder_pattern是否意外排除了目标内容; - 日志:审查摄取报告中的 source-specific 错误(如基础模式的 "Dashboard Search Error" 报告项,见 grafana_source.py),并据此调整配置。
测试与验证路径
如需自行验证本连接器的行为,仓库提供了分层测试:
- 单元测试:tests/unit/grafana/ 下的
test_grafana_source.py、test_grafana_lineage.py、test_grafana_api.py、test_grafana_entity_mcp_builder.py、test_grafana_field_utils.py、test_grafana_models.py、test_grafana_report.py、test_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),仅供参考