从 YAML Provision 数据源
在文件中而不是 UI 中定义数据源、凭据和自定义头。
数据源是每个仪表板和告警规则所依赖的第一样东西,所以它们是最先应当放进文件的东西。Grafana 在启动时读取 provisioning/datasources 文件夹中的 YAML,创建它找到的数据源,并更新已存在的那些。
一个基本文件
provisioning/datasources/datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
uid: prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
isDefault: true
editable: false
jsonData:
timeInterval: 15s
你可以在一个文件中放一个或多个数据源,也可以使用多个文件。Grafana 会加载该文件夹下的所有内容。
最重要的字段:
name是显示名称。uid是仪表板和告警规则引用的稳定标识符。如果省略它,Grafana 会生成一个,这会让所有引用它的内容变得脆弱。请始终设置它。type是插件 ID,例如prometheus、loki、tempo、postgres或elasticsearch。access: proxy表示由 Grafana 的服务器发出请求。这是正常的选择,能让凭据远离浏览器。isDefault标记新面板默认使用的数据源。每个组织只应有一个默认数据源。editable: false阻止在 UI 中更改,使文件保持权威。jsonData保存非机密设置,键取决于插件。secureJsonData保存密钥,Grafana 会在其数据库中加密它们。version在更新时被比较。当多个 Grafana 实例共享一个数据库时,只有当文件的版本与已存储的相同或更高时,某个实例才会更新数据源,所以更改文件时请提升它。
不提交凭据
Provisioning 文件支持在值(不包括键)中进行环境变量插值,使用 $VAR 或 ${VAR}。用 $$ 表示字面的美元符号:
apiVersion: 1
datasources:
- name: Postgres
uid: postgres-main
type: postgres
url: $POSTGRES_HOST:5432
user: $POSTGRES_USER
editable: false
jsonData:
database: app
sslmode: require
secureJsonData:
password: $POSTGRES_PASSWORD
从你的 secret 存储将 POSTGRES_PASSWORD 传入容器(参见密钥指南)。密码永远不会出现在仓库中,Grafana 加载后会将其加密存储。
自定义 HTTP 头
头的名称放在 jsonData 中,其值放在 secureJsonData 中,编号相互对应:
datasources:
- name: Mimir
uid: mimir
type: prometheus
access: proxy
url: https://mimir.example.com/prometheus
jsonData:
httpHeaderName1: X-Scope-OrgID
secureJsonData:
httpHeaderValue1: tenant-a
基本认证与 TLS
datasources:
- name: Internal Prometheus
uid: prom-internal
type: prometheus
access: proxy
url: https://prometheus.internal:9090
basicAuth: true
basicAuthUser: grafana
jsonData:
tlsAuthWithCACert: true
secureJsonData:
basicAuthPassword: $PROM_PASSWORD
tlsCACert: $PROM_CA_CERT
关联日志、指标和追踪
一些插件按 UID 将数据源相互链接,这是手动设置 UID 的另一个原因。例如,Loki 可以把日志字段变成指向 Tempo 中追踪的链接:
datasources:
- name: Loki
uid: loki
type: loki
access: proxy
url: http://loki:3100
jsonData:
derivedFields:
- name: TraceID
matcherRegex: 'trace_id=(\w+)'
url: '$${__value.raw}'
datasourceUid: tempo
特定于插件的 jsonData 键会因版本而异,所以请在数据源的文档中确认。一个发现它们的快捷方法是在临时实例中配置一次数据源,然后通过 API 读取结果(GET /api/datasources/uid/<uid>)。
删除与 prune
deleteDatasources 会在处理 datasources 之前移除数据源。当你要淘汰某个数据源时使用它:
apiVersion: 1
deleteDatasources:
- name: Old Graphite
orgId: 1
要让该文件夹成为完整的事实,请添加 prune: true(Grafana 11.1 或更新版本)。这样,不再位于任何文件中,或其文件已被删除的被 provision 的数据源,会在下次启动时被移除:
apiVersion: 1
prune: true
datasources:
- name: Prometheus
uid: prometheus
type: prometheus
url: http://prometheus:9090
只有被 provision 的数据源才会被 prune。在 UI 中手工创建的数据源不受影响。
应用与验证
数据源在启动时读取,所以请重启 Grafana,或使用管理员基本认证调用 reload 端点:
curl -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
http://localhost:3000/api/admin/provisioning/datasources/reload
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD \
http://localhost:3000/api/datasources | jq '.[] | {name, uid, type, readOnly}'
被 provision 的数据源会报告 readOnly: true。要在不使用 UI 的情况下确认连通性,请使用数据源健康端点:
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD \
http://localhost:3000/api/datasources/uid/prometheus/health
如果某个数据源没有加载,请检查 Grafana 的启动日志中来自 provisioning logger 的行,它们会指明文件和错误(通常是 YAML 缩进、未知字段或缺失的环境变量)。
热门指南
-
将 Grafana 作为代码运维:全景图 哪些可以放在文件里,哪些需要 API,以及各部分如何组合在一起。 -
使用 grafana.ini 和环境变量配置 Grafana 服务器 了解配置文件的位置、覆盖的顺序,以及如何将设置保存在 Git 中。 -
从 JSON 文件 Provision 仪表板 从磁盘加载仪表板,从目录映射文件夹,并在不丢失变更的前提下创作仪表板。 -
Provision 告警规则、联系点与通知策略 用 YAML 定义整条告警管线,使其像代码一样被审查和版本化。 -
使用 Helm 和 Provisioning Values 在 Kubernetes 上部署 Grafana 通过 Helm chart 运行 Grafana,数据源、仪表板和设置都来自 values 文件。 -
从命令行重新加载、验证并排查 Provisioning 问题 找出 Grafana 加载了什么,无需重启即可重新加载,并修复常见的 provisioning 错误。