提示: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集群安装

略、、、

三、docker-compose安装loki

3.1.docker、docker-compose安装

略、、、

3.2.docker-compose安装loki、Tempo、Grafana

3.2.1、docker-compose安装loki

[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

[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安装grafana

[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、配置日志展示柱状图

在这里插入图片描述
直接添加:

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

在这里插入图片描述

4.5、编辑日志展示

在这里插入图片描述
直接添加:

{env=~"$env",app=~"$app"} |= "$search" | logfmt | detected_level =~ "$level"

在这里插入图片描述
最后保存面板
在这里插入图片描述

五、配置链路追踪

5.1、grafana配置tempo时区数据库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2、后端服务配置k8s里面secret变量

## 自行跟上面的变量对比添加的东西自己在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语句

在这里插入图片描述

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

在这里插入图片描述

5.5、修改日志面板sql语句

在这里插入图片描述

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐