Grafana 数据源配置 #
数据源概述 #
数据源是 Grafana 获取数据的来源。Grafana 支持多种类型的数据源,包括时序数据库、关系型数据库、日志系统、云服务等。
text
┌─────────────────────────────────────────────────────────────┐
│ 支持的数据源类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 时序数据库: │
│ ├── Prometheus 最常用的监控数据源 │
│ ├── InfluxDB 高性能时序数据库 │
│ ├── Graphite 老牌时序数据库 │
│ └── TimescaleDB 基于 PostgreSQL 的时序扩展 │
│ │
│ 关系型数据库: │
│ ├── MySQL 最流行的开源数据库 │
│ ├── PostgreSQL 功能强大的开源数据库 │
│ ├── Microsoft SQL Server │
│ └── Oracle 企业级数据库 │
│ │
│ 日志系统: │
│ ├── Elasticsearch 全文搜索引擎 │
│ ├── Loki Grafana 出品的日志系统 │
│ └── Splunk 企业级日志平台 │
│ │
│ 云服务: │
│ ├── AWS CloudWatch │
│ ├── Azure Monitor │
│ ├── Google Cloud Monitoring │
│ └── Alibaba Cloud │
│ │
│ 追踪系统: │
│ ├── Jaeger 分布式追踪 │
│ ├── Tempo Grafana 出品的追踪系统 │
│ └── Zipkin 分布式追踪 │
│ │
└─────────────────────────────────────────────────────────────┘
添加数据源 #
通过 UI 添加 #
text
┌─────────────────────────────────────────────────────────────┐
│ 添加数据源步骤 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 进入 Configuration → Data sources │
│ │
│ 2. 点击 "Add data source" │
│ │
│ 3. 选择数据源类型 │
│ ├── 搜索数据源名称 │
│ └── 或从列表中选择 │
│ │
│ 4. 配置数据源参数 │
│ ├── 名称 │
│ ├── 连接地址 │
│ ├── 认证信息 │
│ └── 其他选项 │
│ │
│ 5. 点击 "Save & Test" 验证连接 │
│ │
└─────────────────────────────────────────────────────────────┘
通过 Provisioning 添加 #
创建配置文件 provisioning/datasources/datasources.yaml:
yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
Prometheus 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ Prometheus 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: Prometheus │
│ │
│ HTTP: │
│ ├── URL: http://prometheus:9090 │
│ ├── Access: Server (default) / Browser │
│ └── Whitelisted Cookies: (可选) │
│ │
│ Auth: │
│ ├── Basic auth: 用户名/密码认证 │
│ ├── TLS Client Auth: 证书认证 │
│ └── With CA Cert: CA 证书 │
│ │
│ Custom HTTP Headers: │
│ └── 自定义 HTTP 头 │
│ │
│ Misc: │
│ ├── Scrape interval: 抓取间隔 │
│ ├── Query timeout: 查询超时 │
│ └── HTTP method: GET / POST │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
basicAuth: true
basicAuthUser: admin
secureJsonData:
basicAuthPassword: admin123
isDefault: true
editable: false
jsonData:
httpMethod: POST
manageAlerts: true
prometheusType: Prometheus
prometheusVersion: "2.40.0"
cacheLevel: 'High'
PromQL 查询基础 #
text
┌─────────────────────────────────────────────────────────────┐
│ PromQL 基础语法 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 即时查询: │
│ node_cpu_seconds_total │
│ │
│ 范围查询: │
│ node_cpu_seconds_total[5m] │
│ │
│ 标签过滤: │
│ node_cpu_seconds_total{mode="idle"} │
│ node_cpu_seconds_total{mode!="idle"} │
│ node_cpu_seconds_total{mode=~"user|system"} │
│ │
│ 聚合函数: │
│ sum(node_cpu_seconds_total) │
│ avg(node_cpu_seconds_total) │
│ max(node_cpu_seconds_total) │
│ min(node_cpu_seconds_total) │
│ count(node_cpu_seconds_total) │
│ │
│ 按标签分组: │
│ sum by (instance) (node_cpu_seconds_total) │
│ sum by (job, instance) (node_cpu_seconds_total) │
│ │
│ 速率计算: │
│ rate(http_requests_total[5m]) │
│ irate(http_requests_total[5m]) │
│ increase(http_requests_total[1h]) │
│ │
│ 数学运算: │
│ node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes│
│ (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100│
│ │
└─────────────────────────────────────────────────────────────┘
常用查询示例 #
promql
rate(cpu_usage_total[5m]) * 100
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024
sum by (status) (rate(http_requests_total[5m]))
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
InfluxDB 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ InfluxDB 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: InfluxDB │
│ │
│ HTTP: │
│ ├── URL: http://influxdb:8086 │
│ └── Access: Server (default) │
│ │
│ Auth: │
│ ├── Basic auth │
│ └── Token (InfluxDB 2.x) │
│ │
│ InfluxDB Details: │
│ ├── Database: 数据库名称 │
│ ├── User: 用户名 │
│ ├── Password: 密码 │
│ └── Org / Token (InfluxDB 2.x) │
│ │
│ InfluxDB Version: │
│ ├── InfluxDB 1.x (Flux) │
│ └── InfluxDB 2.x │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: InfluxDB
type: influxdb
access: proxy
url: http://influxdb:8086
database: telegraf
user: admin
secureJsonData:
password: admin123
jsonData:
httpMode: POST
timeInterval: "10s"
InfluxQL 查询基础 #
sql
SELECT mean("value") FROM "cpu" WHERE time > now() - 1h GROUP BY time(1m)
SELECT "usage_user", "usage_system" FROM "cpu" WHERE "host" = 'server01'
SELECT count("value") FROM "memory" WHERE time > now() - 24h GROUP BY time(1h)
Flux 查询基础 #
flux
from(bucket: "telegraf")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "cpu")
|> filter(fn: (r) => r._field == "usage_user")
|> aggregateWindow(every: 1m, fn: mean)
MySQL 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ MySQL 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: MySQL │
│ │
│ MySQL Connection: │
│ ├── Host: mysql:3306 │
│ ├── Database: grafana │
│ ├── User: root │
│ └── Password: ****** │
│ │
│ MySQL details: │
│ ├── Max open: 最大连接数 │
│ ├── Max idle: 最大空闲连接 │
│ ├── Auto (IS NULL): 自动处理 NULL │
│ └── Allow cleartext passwords: 允许明文密码 │
│ │
│ TLS/SSL: │
│ └── 跳过验证 / 使用自定义 CA │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: MySQL
type: mysql
access: proxy
url: mysql:3306
database: grafana
user: root
secureJsonData:
password: root123
jsonData:
maxOpenConns: 10
maxIdleConns: 5
connMaxLifetime: 14400
SQL 查询示例 #
sql
SELECT
created_at AS time,
COUNT(*) AS value
FROM orders
WHERE created_at BETWEEN FROM_UNIXTIME($__from/1000) AND FROM_UNIXTIME($__to/1000)
GROUP BY created_at
ORDER BY created_at
SELECT
UNIX_TIMESTAMP(created_at) as time_sec,
amount as value,
product as metric
FROM sales
WHERE $__timeFilter(created_at)
ORDER BY created_at ASC
时间宏 #
text
┌─────────────────────────────────────────────────────────────┐
│ MySQL 时间宏 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $__timeFilter(column): │
│ WHERE column BETWEEN FROM_UNIXTIME($__from/1000) │
│ AND FROM_UNIXTIME($__to/1000) │
│ │
│ $__timeFrom(): │
│ FROM_UNIXTIME($__from/1000) │
│ │
│ $__timeTo(): │
│ FROM_UNIXTIME($__to/1000) │
│ │
│ $__unixEpochFilter(column): │
│ WHERE column >= $__from/1000 AND column <= $__to/1000 │
│ │
│ $__unixEpochFrom(): │
│ $__from/1000 │
│ │
│ $__unixEpochTo(): │
│ $__to/1000 │
│ │
└─────────────────────────────────────────────────────────────┘
PostgreSQL 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: PostgreSQL │
│ │
│ PostgreSQL Connection: │
│ ├── Host: postgres:5432 │
│ ├── Database: grafana │
│ ├── User: postgres │
│ ├── Password: ****** │
│ └── SSL Mode: disable / require / verify-ca / verify-full │
│ │
│ PostgreSQL details: │
│ ├── Max open: 最大连接数 │
│ ├── Max idle: 最大空闲连接 │
│ ├── Auto (IS NULL): 自动处理 NULL │
│ └── TimescaleDB: 启用 TimescaleDB 支持 │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: PostgreSQL
type: postgres
access: proxy
url: postgres:5432
database: grafana
user: postgres
secureJsonData:
password: postgres123
jsonData:
sslmode: disable
maxOpenConns: 10
maxIdleConns: 5
postgresVersion: 1400
timescaledb: false
SQL 查询示例 #
sql
SELECT
time_column AS time,
value_column AS value
FROM metrics
WHERE $__timeFilter(time_column)
ORDER BY time_column
SELECT
$__timeGroup(time_column, '5m') AS time,
avg(value) AS value
FROM metrics
WHERE $__timeFilter(time_column)
GROUP BY time
ORDER BY time
Elasticsearch 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ Elasticsearch 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: Elasticsearch │
│ │
│ HTTP: │
│ ├── URL: http://elasticsearch:9200 │
│ └── Access: Server (default) │
│ │
│ Elasticsearch details: │
│ ├── Index name: logstash-* / metricbeat-* │
│ ├── Pattern: Daily / Weekly / Monthly / None │
│ ├── Time field: @timestamp │
│ └── Max concurrent Shard Requests: 256 │
│ │
│ Auth: │
│ ├── Basic auth │
│ └── With CA Cert │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: Elasticsearch
type: elasticsearch
access: proxy
url: http://elasticsearch:9200
database: "logstash-*"
basicAuth: true
basicAuthUser: elastic
secureJsonData:
basicAuthPassword: elastic123
jsonData:
esVersion: "7.10.0"
timeField: "@timestamp"
interval: Daily
logMessageField: message
logLevelField: log.level
查询配置 #
text
┌─────────────────────────────────────────────────────────────┐
│ Elasticsearch 查询 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Query: │
│ ├── Lucene 查询语法 │
│ └── 示例: status:200 AND method:GET │
│ │
│ Metric: │
│ ├── Count: 文档计数 │
│ ├── Average: 平均值 │
│ ├── Sum: 总和 │
│ ├── Max: 最大值 │
│ └── Min: 最小值 │
│ │
│ Group by: │
│ ├── Terms: 按字段值分组 │
│ ├── Date Histogram: 按时间分组 │
│ └── Filters: 按过滤器分组 │
│ │
└─────────────────────────────────────────────────────────────┘
Loki 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ Loki 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: Loki │
│ │
│ HTTP: │
│ ├── URL: http://loki:3100 │
│ └── Access: Server (default) │
│ │
│ Loki Query Options: │
│ ├── Max lines: 最大返回行数 │
│ └── Derived fields: 派生字段 │
│ │
│ Auth: │
│ └── Basic auth / TLS │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
jsonData:
maxLines: 1000
derivedFields:
- name: 'TraceID'
matcherRegex: '"traceId":"(\w+)"'
url: '$${__value.raw}'
datasourceUid: 'tempo'
LogQL 查询基础 #
logql
{app="nginx"}
{app="nginx"} |= "error"
{app="nginx"} |~ "error|warning"
{app="nginx"} != "debug"
{app="nginx"} | json | level="error"
sum by (status) (count_over_time({app="nginx"} | json | __error__="" [5m]))
rate({app="nginx"} |= "error" [5m])
Jaeger 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ Jaeger 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: Jaeger │
│ │
│ HTTP: │
│ ├── URL: http://jaeger:16686 │
│ └── Access: Server (default) │
│ │
│ Jaeger Query Options: │
│ └── Trace to logs: 追踪到日志的关联配置 │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: Jaeger
type: jaeger
access: proxy
url: http://jaeger:16686
jsonData:
tracesToLogs:
datasourceUid: 'loki'
tags: ['job', 'instance', 'pod', 'namespace']
mappedTags: [{ key: 'service.name', value: 'service' }]
spanStartTimeShift: '-1h'
spanEndTimeShift: '1h'
filterByTraceID: true
filterBySpanID: false
CloudWatch 数据源 #
配置参数 #
text
┌─────────────────────────────────────────────────────────────┐
│ CloudWatch 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: CloudWatch │
│ │
│ Authentication: │
│ ├── Access Key ID │
│ ├── Secret Access Key │
│ └── Default Region │
│ │
│ Auth Provider: │
│ ├── AWS SDK Default │
│ ├── Credentials file │
│ └── Access & secret key │
│ │
│ Custom Metrics: │
│ └── 命名空间配置 │
│ │
└─────────────────────────────────────────────────────────────┘
Provisioning 配置 #
yaml
apiVersion: 1
datasources:
- name: CloudWatch
type: cloudwatch
access: proxy
jsonData:
authType: keys
defaultRegion: us-east-1
customMetricsNamespaces: 'MyApp/Custom'
secureJsonData:
accessKey: AKIAIOSFODNN7EXAMPLE
secretKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
数据源管理 #
设置默认数据源 #
text
┌─────────────────────────────────────────────────────────────┐
│ 默认数据源设置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 方式一:UI 设置 │
│ 1. 进入数据源配置页面 │
│ 2. 勾选 "Default" 选项 │
│ 3. 保存 │
│ │
│ 方式二:Provisioning 设置 │
│ isDefault: true │
│ │
│ 用途: │
│ ├── 新建面板时默认选择 │
│ └── 查询时使用 default 关键字 │
│ │
└─────────────────────────────────────────────────────────────┘
数据源权限 #
yaml
apiVersion: 1
datasources:
- name: Production DB
type: mysql
access: proxy
url: mysql-prod:3306
database: production
user: readonly
secureJsonData:
password: readonly123
readOnly: true
数据源测试 #
text
┌─────────────────────────────────────────────────────────────┐
│ 测试数据源连接 │
├─────────────────────────────────────────────────────────────┤
│ │
│ UI 测试: │
│ 1. 进入数据源配置页面 │
│ 2. 点击 "Save & Test" │
│ 3. 查看测试结果 │
│ │
│ API 测试: │
│ GET /api/datasources/{id}/health │
│ │
│ 常见错误: │
│ ├── Connection refused: 地址或端口错误 │
│ ├── Authentication failed: 认证信息错误 │
│ ├── Timeout: 网络问题 │
│ └── SSL error: 证书问题 │
│ │
└─────────────────────────────────────────────────────────────┘
跨数据源查询 #
Mixed 数据源 #
text
┌─────────────────────────────────────────────────────────────┐
│ Mixed 数据源查询 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 在面板查询中: │
│ 1. 添加多个查询 │
│ 2. 每个查询选择不同数据源 │
│ 3. 数据将合并显示在同一图表 │
│ │
│ 示例: │
│ Query A: Prometheus - CPU 使用率 │
│ Query B: MySQL - 订单数量 │
│ Query C: Elasticsearch - 错误日志数 │
│ │
└─────────────────────────────────────────────────────────────┘
使用变量切换数据源 #
yaml
Variables:
- Name: datasource
Type: Datasource
Datasource type: Prometheus
Multi-value: true
Include All: true
在查询中使用:
promql
${datasource}
rate(cpu_usage_total[5m])
最佳实践 #
安全配置 #
text
┌─────────────────────────────────────────────────────────────┐
│ 安全最佳实践 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 使用最小权限原则 │
│ └── 为 Grafana 创建专用只读账户 │
│ │
│ 2. 使用环境变量存储敏感信息 │
│ └── 密码、Token 等 │
│ │
│ 3. 启用 TLS 加密 │
│ └── 数据源连接使用 HTTPS │
│ │
│ 4. 限制网络访问 │
│ └── 仅允许 Grafana 访问数据源 │
│ │
│ 5. 定期轮换凭证 │
│ └── 定期更新密码和 Token │
│ │
└─────────────────────────────────────────────────────────────┘
性能优化 #
text
┌─────────────────────────────────────────────────────────────┐
│ 性能优化建议 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 合理设置查询超时 │
│ └── 避免长时间运行的查询 │
│ │
│ 2. 使用缓存 │
│ └── 对不常变化的数据启用缓存 │
│ │
│ 3. 限制返回数据量 │
│ └── 设置合理的 Max data points │
│ │
│ 4. 优化查询语句 │
│ └── 使用索引、避免全表扫描 │
│ │
│ 5. 连接池配置 │
│ └── 合理设置最大连接数 │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
掌握了数据源配置后,接下来学习 告警配置,了解如何设置监控告警!
最后更新:2026-03-29