提示:Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化,核心需要后端代码支持链路追踪以及展示日志格式
文章目录
- 前言
-
- [Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化 ------ 方案介绍](#Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化 —— 方案介绍)
- 方案整体架构说明
- 日志与链路追踪一体化能力
-
- [- 日志采集与展示](#- 日志采集与展示)
- [- 分布式链路追踪](#- 分布式链路追踪)
- [- 日志 ↔ Trace 关联分析](#- 日志 ↔ Trace 关联分析)
- 方案优势
- 适用场景
- 构建轻量级可观测性平台或作为企业可观测性体系的基础组件
- 一、环境需求
- 二、k8s集群安装
- 三、docker-compose安装loki
- 四、Grafana配置loki时区数据库
- 五、配置链路追踪
- 六、账号设置
- 总结
前言

Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化 ------ 方案介绍
在微服务与云原生架构下,系统规模不断扩大,服务之间调用关系复杂,仅依靠单一日志或单一监控手段已难以快速定位问题。为此,引入一套覆盖日志与链路追踪的一体化可观测性方案显得尤为重要。
本方案基于 Loki + Promtail + Tempo + Grafana,构建一套轻量级、云原生、易扩展的可观测性体系,实现日志集中采集、分布式链路追踪以及统一可视化分析。
方案整体架构说明
Promtail
作为日志采集 Agent,负责从应用容器标准输出或日志文件中采集日志,并按照标签(如应用名、环境、实例等)推送至 Loki。
Loki
作为日志存储与查询系统,仅对日志标签进行索引,日志内容按原始文本存储,在保证查询能力的同时大幅降低存储与维护成本。
Tempo
作为分布式链路追踪系统,接收应用通过 OpenTelemetry 等方式上报的 Trace 数据,记录请求在各服务间的调用链路、耗时及异常信息。
Grafana
作为统一可视化平台,接入 Loki 与 Tempo,实现日志查询、链路追踪展示,并支持通过 TraceID 在日志与链路之间进行快速跳转,提升问题排查效率。
日志与链路追踪一体化能力
- 日志采集与展示
应用日志通过 Promtail 统一采集,集中存储于 Loki,并在 Grafana 中进行多维度查询与分析。
- 分布式链路追踪
应用通过 OpenTelemetry 采集请求调用链路数据,上报至 Tempo,在 Grafana 中以调用拓扑和时间轴方式进行可视化。
- 日志 ↔ Trace 关联分析
通过 TraceID 作为关联纽带,实现:
- 从日志快速跳转到对应链路
- 从链路定位到具体服务日志
- 有效缩短问题定位时间。
方案优势
- 轻量级、低成本:相较传统 ELK + APM 方案,资源消耗更低,部署维护更简单
- 云原生友好:天然适配 Kubernetes 与容器化环境
- 高扩展性:可按需扩展 Metrics(如引入 Prometheus)
- 统一可观测入口:日志与链路在 Grafana 中集中展示,降低使用门槛
适用场景
- 微服务 / 容器化应用日志集中管理
- 接口性能分析与慢请求定位
- 分布式系统调用链问题排查
构建轻量级可观测性平台或作为企业可观测性体系的基础组件
提示:以下是本篇文章正文内容,下面案例可供参考
一、环境需求
| 公网IP | 内网IP | 服务器配置 | 服务 |
|---|---|---|---|
| 124.223.0.118 | 172.17.48.163 | 2C4G | MASTER |
| 49.235.49.161 | 172.17.48.219 | 2C4G | NODE1 |
| 49.235.49.161 | 172.17.48.155 | 2C4G | NODE2 |
| 110.42.255.108 | 172.17.48.3 | 4C16G | Grafana、Loki、Tempo |
二、k8s集群安装
bash
略、、、
三、docker-compose安装loki
3.1.docker、docker-compose安装
bash
略、、、
3.2.docker-compose安装loki、Tempo、Grafana
3.2.1、docker-compose安装loki
bash
[root@VM-48-3-centos ~]# mkdir -p /opt/docker/
[root@VM-48-3-centos docker]# vi docker-compose.yaml
services:
loki:
image: ccr.ccs.tencentyun.com/grapp/loki:3.4.2
container_name: loki
ports:
- "3100:3100"
volumes:
- /data/loki:/loki
- ./local-config.yaml:/etc/loki/local-config.yaml
restart: always
[root@VM-48-3-centos docker]# cat local-config.yaml
auth_enabled: false # 关闭身份认证,任何人都可以访问 Loki
server:
http_listen_port: 3100 # Loki 监听的 HTTP 端口
common:
instance_addr: 0.0.0.0 # 允许 Loki 监听所有网络接口
path_prefix: /loki # Loki 的数据存储路径前缀
storage:
filesystem:
chunks_directory: /loki/chunks # 存储日志 chunks(实际日志数据)
rules_directory: /loki/rules # 存储 Loki 规则文件
replication_factor: 1 # 复制因子,单实例部署时设为 1
ring:
kvstore:
store: inmemory # 使用内存存储集群元数据,适用于单实例 Loki
table_manager:
retention_deletes_enabled: true # 启用日志删除策略
retention_period: 40d # 保留日志 40 天,超时的数据自动删除
schema_config:
configs:
- from: 2020-10-24
store: tsdb # 使用 TSDB(时间序列数据库)存储数据
object_store: filesystem # 使用本地文件系统存储数据
schema: v13 # 使用 Loki v13 版本的 schema 结构
index:
prefix: index_ # Loki 创建的索引表前缀
period: 24h # 每 24 小时创建一个新的索引表
ruler:
alertmanager_url: http://localhost:9093 # 配置 Alertmanager 用于日志告警
# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
# reporting_enabled: false
[root@VM-48-3-centos docker]# chmod +x /data/loki/
[root@VM-48-3-centos docker]# docker compose up -d
3.2.2、docker-compose安装tempo
bash
[root@VM-48-3-centos ~]# mkdir -p /opt/tempo/
[root@VM-48-3-centos tempo]# cat docker-compose.yaml
services:
tempo:
image: ccr.ccs.tencentyun.com/grapp/tempo:2.8.1
container_name: tempo
ports:
- "3200:3200"
- "9980:9980"
- "4317:4317"
- "4318:4318"
command: [ "-config.file=/etc/tempo/tempo.yaml" ]
volumes:
- ./tempo-config.yaml:/etc/tempo/tempo.yaml
- /data/tempo:/data
[root@VM-48-3-centos tempo]# cat tempo-config.yaml
server:
http_listen_port: 3200
grpc_listen_port: 9095
distributor:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
storage:
trace:
backend: local
local:
path: /data
compactor:
compaction:
block_retention: 168h
[root@VM-48-3-centos tempo]# mkdir -p /data/tempo
[root@VM-48-3-centos tempo]# chmod +x /data/tempo
[root@VM-48-3-centos tempo]# docker compose up -d
3.2.3、docker-compose安装tempo
bash
[root@VM-48-3-centos ~]# mkdir -p /opt/grafana/
[root@VM-48-3-centos grafana]# cat docker-compose.yaml
version: '3'
services:
grafana:
image: ccr.ccs.tencentyun.com/grapp/grafana:10.2.2
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
# - /opt/grafana/defaults.ini:/usr/share/grafana/conf/defaults.ini 先注释
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
restart: always
volumes:
grafana_data:
[root@VM-48-3-centos grafana]# docker compose up -d
四、Grafana配置loki时区数据库
访问Grafana:http://110.42.255.108:3000/?orgId=1
4.1、添加loki时区数据库




4.2、添加配置日志面板






4.3、配置日志收集变量




4.3.1、配置app变量


4.3.2配置search变量


4.3.3、添加新变量env


4.3.4、添加新变量level


4.3.5、最后查看变量的顺序


4.4、配置日志展示柱状图

直接添加:
bash
sum(count_over_time({env=~"$env",app=~"$app"} |= "$search" | logfmt | detected_level =~ "$level" [$__interval]))

4.5、编辑日志展示

直接添加:
bash
{env=~"$env",app=~"$app"} |= "$search" | logfmt | detected_level =~ "$level"

最后保存面板

五、配置链路追踪
5.1、grafana配置tempo时区数据库




5.2、后端服务配置k8s里面secret变量
bash
## 自行跟上面的变量对比添加的东西自己在Base64解码查看
[root@master monitor-service]# cat billbear-secret.yaml
apiVersion: v1
data:
AGENT: LWphdmFhZ2VudDovYXBwL29wZW50ZWxlbWV0cnktamF2YWFnZW50Lmphcg==
APPLICATION_ENV: REVW
APPLICATION_SYSTEM: Q09SQUxfSU5URVJFU1RT
JAVA_OPS: LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRCAtLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsPUFMTC1VTk5BTUVEICAtRHVzZXIudGltZXpvbmU9R01UKzA4IC1EbG9nZ2luZy5jb25maWc9L2FwcC9sb2c0ajIueG1sIC1EbG9nZ2luZy5sZXZlbC5yb290PUlORk8gIC1Eb3RlbC5tZXRyaWNzLmV4cG9ydGVyPW5vbmUgLURvdGVsLmxvZ3MuZXhwb3J0ZXI9bm9uZSAtRG90ZWwuZXhwb3J0ZXIub3RscC5wcm90b2NvbD1ncnBjIC1Eb3RlbC5leHBvcnRlci5vdGxwLmVuZHBvaW50PWh0dHA6Ly8xMTAuNDIuMjU1LjEwODo0MzE3IC1EYmlsbGJlYXIubmFjb3MuY29uZmlnLm5hbWVzcGFjZT1kODM0OWMxZi0yYWRkLTQ4YWMtYmQxNS0wMDQzZTIwZTkzN2EgLURiaWxsYmVhci5uYWNvcy5jb25maWcuc2VydmVyLWFkZHI9MTEwLjQyLjI1NS4xMDggLURzZXJ2ZXIucG9ydD04ODQ4
LOKI_HOST: MTEwLjQyLjI1NS4xMDg=
kind: Secret
metadata:
name: billbear
type: Opaque
5.3、添加traceid变量
找到之前grafana的面板4个变量




5.4、修改柱状图sql语句

bash
sum(count_over_time({env=~"$env",app=~"$app",trace_id=~"$traceId"} |= "$search" | logfmt | detected_level =~ "$level" [$__interval]))

5.5、修改日志面板sql语句

bash
{env=~"$env",app=~"$app",trace_id=~"${traceId}.*"} |= "$search" | logfmt | detected_level =~ "$level"

5.6、验证查看日志是否打印出链路ID
5.6.1、登录后端pod查看
输入命令:curl --location --request POST 'http://127.0.0.1:8848/api/report/query/search/order-hotel-table'
查看错误日志,复制其中一个ID
5.6.2、查看链路追踪




以上证明成功
六、账号设置
由于给后端同事开通之账号所以不可以设置搜索下面配置第一个面板
6.1、添加一个面板
收缩日志面板



输入traces会自动跳出



如果看大图点击查看

至此安装配置全部完成
总结
通过 Loki + Promtail + Tempo + Grafana 的组合,本方案在不引入复杂指标系统的前提下,实现了日志与链路追踪的一体化可观测能力,为系统稳定性保障和问题快速定位提供了有力支撑,是当前云原生场景下高性价比的可观测性实践方案。