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