第九章:Grafana 集成
学习如何在 Grafana 中配置和使用 Loki 数据源。
最后更新: 2024-01-23
页面目录
Grafana 集成
Grafana 是 Loki 的原生可视化平台,提供强大的日志查询和仪表板功能。
数据源配置
添加 Loki 数据源
# 通过 API 配置
curl -X POST http://admin:admin@localhost:3000/api/datasources \
-H 'Content-Type: application/json' \
-d '{
"name": "Loki",
"type": "loki",
"url": "http://loki:3100",
"access": "proxy",
"isDefault": true
}'
配置文件
# /etc/grafana/provisioning/datasources/loki.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
jsonData:
maxLines: 5000
derivedFields:
- name: TraceID
matcherRegex: "trace_id=(\\w+)"
url: "http://tempo:3100/api/traces/${1}"
datasourceUid: tempo
Explore 面板
基本查询
# 基础日志查询
{job="nginx"}
过滤查询
# 错误日志
{job="nginx"} |= "error"
# 特定状态码
{job="api"} | json | status >= 500
格式化输出
# 格式化日志行
{job="api"} | json | line_format "[{{.status}}] {{.message}}"
日志面板配置
面板选项
| 选项 | 说明 |
|---|---|
max lines |
最大显示行数 |
wrap |
自动换行 |
prettify JSON |
格式化 JSON |
show time |
显示时间戳 |
show labels |
显示标签 |
deduplicate |
去重 |
显示设置
# Grafana 面板 JSON
{
"type": "logs",
"options": {
"showLabels": true,
"showCommonLabels": false,
"showTime": true,
"wrapLogMessage": true,
"prettifyLogMessage": true,
"enableLogDetails": true,
"sortOrder": "Descending",
"dedupStrategy": "none"
}
}
日志与指标关联
Derived Fields
# 添加派生字段
jsonData:
derivedFields:
- name: trace_id
matcherRegex: "trace_id=([a-zA-Z0-9]+)"
url: "http://tempo:3100/api/traces/${1}"
datasourceUid: tempo
- name: user_id
matcherRegex: "user_id=(\\d+)"
url: "http://user-service:8080/users/${1}"
日志链接
# 从指标跳转到日志
grafana变量:
- name: job
query: label_values({__name__=~".*"}, job)
仪表板模板
应用日志仪表板
{
"title": "Application Logs",
"panels": [
{
"title": "Error Logs",
"type": "logs",
"gridPos": {"h": 10, "w": 24},
"options": {
"showLabels": true,
"showTime": true,
"wrapLogMessage": true
},
"targets": [
{
"expr": "{job=\"myapp\"} |= \"error\"",
"refId": "A"
}
]
},
{
"title": "Error Rate",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12},
"targets": [
{
"expr": "sum by (job) (rate({job=\"myapp\"} |= \"error\"[5m]))",
"refId": "A"
}
]
},
{
"title": "Log Volume",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12},
"targets": [
{
"expr": "sum by (job) (rate({job=\"myapp\"}[5m]))",
"refId": "A"
}
]
}
]
}
告警仪表板
{
"title": "Alert Status",
"panels": [
{
"title": "Firing Alerts",
"type": "stat",
"targets": [
{
"expr": "count(ALERTS{alertstate=\"firing\"})",
"refId": "A"
}
],
"options": {
"colorMode": "background",
"colorScheme": "thresholds"
},
"fieldConfig": {
"defaults": {
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "green", "value": null},
{"color": "yellow", "value": 1},
{"color": "red", "value": 5}
]
}
}
}
},
{
"title": "Alert Details",
"type": "table",
"targets": [
{
"expr": "ALERTS{alertstate=\"firing\"}",
"refId": "A",
"format": "table"
}
]
}
]
}
Loki Explore 功能
日志统计
# 显示日志统计
{job="nginx"} | json | stats
# 显示标签统计
{job="nginx"} | json | label_format service="{{.service}}" | stats
日志流
# 查看日志流
{job="nginx"} | json | stream
# 按标签分组
{job="nginx"} | json | stream | group_by(level)
变量模板
变量配置
{
"name": "job",
"type": "query",
"datasource": "Loki",
"query": "label_values({job=~\".+\"}, job)",
"refresh": 2,
"sort": 1
}
使用变量
{job="$job"}
{job="$job", namespace="$namespace"}
{job=~"$job", env=~"$env"}
下一步
接下来让我们学习集群部署。
👉 集群部署