Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化

提示:Loki + Promtail + Tempo + Grafana 实现日志与链路追踪一体化,核心需要后端代码支持链路追踪以及展示日志格式

文章目录


前言

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 的组合,本方案在不引入复杂指标系统的前提下,实现了日志与链路追踪的一体化可观测能力,为系统稳定性保障和问题快速定位提供了有力支撑,是当前云原生场景下高性价比的可观测性实践方案。

相关推荐
我爱学习好爱好爱3 小时前
Docker Compose 一键部署 Prometheus + Alertmanager + Grafana 完整监控方案
docker·grafana·prometheus
无心水4 小时前
【神经风格迁移:性能】24、神经风格迁移全链路监控实战:基于Prometheus+Grafana的性能调优指南
数据库·人工智能·深度学习·机器学习·grafana·prometheus·神经风格迁移:性能
BullSmall4 小时前
Grafana 如何提供7*24小时的监控
产品运营·grafana
我爱学习好爱好爱15 小时前
Prometheus监控栈 监控数据库mysql
docker·grafana·prometheus
我爱学习好爱好爱1 天前
Prometheus监控栈 监控Linux操作系统
linux·grafana·prometheus
yunson_Liu1 天前
grafana限制普通view角色用户查看默认的Dashboard
grafana·prometheus
我爱学习好爱好爱1 天前
Prometheus监控栈 监控redis和mongodb
redis·grafana·prometheus
为什么要内卷,摆烂不香吗3 天前
Grafana 12.2.0导入仪表盘
运维·grafana
家乡的落日4 天前
微服务监控和简单日志系统搭建grafana+prometheus+node_exporter+promtail+loki
微服务·grafana·prometheus