第二篇:《LGTM 栈全景:Loki、Grafana、Tempo、Mimir 的协同作战》

在上一篇文章中,我们理解了可观测性三大支柱的定义与演进。但知道"需要什么"和"怎么搭建"之间还有一条鸿沟。LGTM 栈正是填平这条鸿沟的答案------它由 Grafana Labs 打造,是开源可观测性领域唯一一个覆盖日志、指标、链路追踪三大支柱的一体化解决方案。本文从 LGTM 栈的定位出发,深入剖析 Loki、Tempo、Mimir 三大后端存储的设计哲学,以及 Grafana 作为统一查询入口的集成能力,并通过 Docker Compose 实战带你亲手搭建一套完整的可观测性平台。

一、LGTM 栈是什么?

LGTM 是 Loki + Grafana + Tempo + Mimir 的首字母缩写。它由 Grafana Labs 主导开发,是一套开源、云原生、高度集成的可观测性解决方案:

这四个组件共同构成了一个覆盖 Metrics、Logs、Traces 全数据类型的可观测性平台,且全部开源、无供应商锁定。

LGTM 栈的核心价值在于"一体化"------数据从采集到存储到查询,全链路打通。你不再需要在 Prometheus、Elasticsearch、Jaeger 之间来回切换,所有数据在 Grafana 中统一关联和查询。

二、Loki:像管理 Prometheus 指标一样管理日志

Loki 是受 Prometheus 启发的水平可扩展、高可用、多租户的日志聚合系统。它的设计理念可以用一句话概括:只索引标签,不索引日志内容。

2.1 为什么 Loki 比 Elasticsearch 便宜?

传统日志系统(如 ELK 中的 Elasticsearch)对日志内容建立全文倒排索引。索引让搜索变快,但也带来了巨大的存储和计算开销------索引数据的大小通常是原始日志的 3-5 倍。

Loki 走了一条完全不同的路:它只对日志流的标签(Labels)建立索引,日志内容本身不索引,以压缩格式存储在对象存储中。这意味着:

存储成本降低 10-50 倍:在京东智联云的实践中,将日志服务底层从 ES 替换为 Loki 后,存储成本大幅下降

索引极小:只索引元数据,不索引内容

查询时解析:搜索日志内容时,通过标签过滤出日志流,再对少量日志进行内容匹配

2.2 Loki 的核心架构

一个典型的 Loki 部署由三个主要组件构成:

Loki(主服务) :接收日志、存储和查询日志。Loki 本身不收集日志,而是接收来自客户端的日志数据

Agent(采集器) :负责从各种来源收集日志并发送给 Loki。Grafana 官方推荐的 Agent 是 Grafana Alloy

存储后端:日志数据存储在对象存储中(S3、GCS、MinIO 等),实现低成本持久化

Loki 支持多租户隔离,通过 shuffle-sharding 等技术实现租户间的资源隔离。

三、Tempo:低成本、大规模的分布式追踪后端

Tempo 是一个为高吞吐量 Trace 采集和大规模查询而设计的分布式追踪后端。它的核心设计理念是:放弃昂贵的索引数据库,将 Trace 直接存储在对象存储中。

3.1 Tempo 的设计哲学

传统的追踪系统(如 Jaeger 使用 Cassandra/Elasticsearch)需要维护复杂的索引来支持 Trace 搜索。Tempo 的答案更简单:不建索引,直接用对象存储。

Tempo 将 Trace 数据以 Apache Parquet 列式格式存储在对象存储中,查询时按需读取。这种方式使得 Tempo 的运维成本远低于传统追踪系统------你只需要一个对象存储桶,不需要维护任何数据库。

3.2 Tempo 3.0 的新架构

Tempo 3.0 引入了代号为 Project Rhythm 的新架构,核心变化包括:

移除 RF3 要求:此前 Tempo 需要 3 副本保证数据持久性,新架构通过 Kafka 作为持久缓冲区,将副本数降为 1(RF1) ,直接降低对象存储成本

读写路径分离:Distributor 将数据写入 Kafka,Block-builder 消费 Kafka 构建块并写入对象存储,Live-store 为近期数据查询提供服务

TraceQL Metrics GA:直接从 Trace 生成指标,无需额外存储

Tempo 的核心组件包括:

Distributor:接收 Jaeger、OpenTelemetry、Zipkin 等多种格式的 Span,按 traceID 分片后写入 Kafka

Block-builder:从 Kafka 消费数据,按时间窗口构建 Parquet 块并发送到对象存储

Live-store:为最近 30 分钟到 1 小时的数据提供查询服务

四、Mimir:Prometheus 的长期存储与横向扩展

Mimir 是一个开源、横向可扩展、高可用、多租户的时序数据库,专门为 Prometheus 指标提供长期存储。它是 Cortex 项目的继任者,由 Grafana Labs 于 2022 年发布。

4.1 Mimir 解决什么问题?

Prometheus 自带的本地存储有两大局限:

存储容量有限:受限于本地磁盘

查询范围受限:无法跨多个 Prometheus 实例进行全局查询

Mimir 通过 remote_write API 接收 Prometheus 的数据,将它们统一存储到对象存储中(S3、GCS、Azure Blob Storage 等),并提供全局查询能力------你可以用一套 PromQL 查询所有 Prometheus 实例的数据。

4.2 Mimir 的核心能力

4.3 Mimir 的工作流程

Prometheus 通过 remote write API 将指标推送到 Mimir。Mimir 的 Distributor 组件接收写入请求,将数据复制到多个 Ingester,Ingester 将数据写入本地 WAL 并最终刷新到对象存储的 TSDB 块中。查询时,Querier 组件从对象存储中读取数据并执行 PromQL 查询。

五、Grafana:三大支柱的统一查询入口

在 LGTM 栈中,Grafana 的角色是统一的数据探索与可视化平台。它通过数据源插件连接 Loki、Tempo、Mimir,让你在同一个界面中完成:

Metrics 查询:通过 PromQL 查询 Mimir 中的指标数据

Logs 查询:通过 LogQL 查询 Loki 中的日志数据

Traces 查询:通过 TraceQL 查询 Tempo 中的 Trace 数据

数据关联:从 Metrics 跳转到 Traces,从 Traces 跳转到 Logs

六、OpenTelemetry Collector:LGTM 栈的数据入口

LGTM 栈本身不采集数据,它需要一个"数据入口"来接收来自应用的遥测数据。OpenTelemetry Collector 扮演了这个角色。

典型的数据流向:

text

应用(OTel 插桩)→ OpenTelemetry Collector → LGTM 栈

├─ Loki(日志)

├─ Tempo(Trace)

└─ Mimir(Metrics)

OpenTelemetry Collector 作为中央枢纽,将三种类型的遥测数据分别路由到对应的后端。Grafana 官方提供了一个名为 grafana/otel-lgtm 的 Docker 镜像,将 OpenTelemetry Collector 与 LGTM 栈打包在一起,能在 5 秒内启动一套完整的可观测性环境。

七、LGTM 栈的优势

STCLab 的实践表明,从商业 APM 迁移到 LGTM 栈后,可观测性成本降低了 72%,APM 追踪覆盖率从 5% 提升到了 100%。

八、实战:Docker Compose 一键启动 LGTM 栈

以下是一个最小化的 LGTM 栈部署示例,使用官方 grafana/otel-lgtm 镜像。

8.1 docker-compose.yml

yaml 复制代码
version: '3'
services:
  lgtm:
    image: grafana/otel-lgtm:latest
    container_name: lgtm
    ports:
      - "3000:3000"   # Grafana UI
      - "4317:4317"   # OTLP gRPC
      - "4318:4318"   # OTLP HTTP
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    volumes:
      - lgtm-data:/data
volumes:
  lgtm-data:

8.2 启动与验证

bash 复制代码
# 启动 LGTM 栈
docker-compose up -d

# 验证各组件是否就绪
curl http://localhost:3100/ready   # Loki[reference:62]
curl http://localhost:9009/ready   # Mimir[reference:63]

访问 http://localhost:3000 即可进入 Grafana。Loki、Tempo、Mimir 的数据源已经预配置完成。

8.3 发送测试数据

发送日志到 Loki:

bash 复制代码
curl -X POST http://localhost:3100/loki/api/v1/push \
  -H "Content-Type: application/json" \
  -d '{"streams":[{"stream":{"app":"test"},"values":[["'$(date +%s)000000000'","Hello from Loki"]]}]}'

发送 Trace 到 Tempo(通过 OTLP HTTP):

bash 复制代码
# 需要将应用通过 OTLP 协议发送 Trace 数据到 localhost:4318

在 Grafana 中,你可以分别通过 Loki 数据源查询日志,通过 Tempo 数据源查询 Trace,通过 Mimir 数据源查询指标------所有数据在同一个界面中完成探索。

九、小结

LGTM 栈由 Loki(日志)、Grafana(可视化)、Tempo(追踪)、Mimir(指标)组成,是开源可观测性领域唯一的一体化解决方案。

Loki 只索引标签不索引内容,存储成本比 Elasticsearch 低 10-50 倍。

Tempo 将 Trace 以 Parquet 列式格式存储在对象存储中,Tempo 3.0 通过 Kafka 架构将副本数降为 1,直接降低 TCO。

Mimir 是 Prometheus 的长期存储方案,支持 10 亿级活动系列和全局查询。

Grafana 提供统一的可视化与数据关联能力,三大支柱在同一界面中无缝切换。

OpenTelemetry Collector 作为数据入口,将遥测数据分别路由到 LGTM 的三个后端。

实战:使用 grafana/otel-lgtm 镜像可在 5 秒内启动一套完整的可观测性环境。

相关推荐
白鲸开源9 小时前
DolphinScheduler 挂了你不知道?Prometheus + Grafana 监控兜底方案,亲测可用
开源·grafana·监控
mmsy10243 天前
Grafana 使用文档
grafana
SamChan906 天前
用Prometheus+Grafana搭建PDF翻译服务监控看板:指标采集与告警实战
python·ai·pdf·grafana·prometheus·机器翻译
DolphinDB智臾科技8 天前
从数据到仪表盘——DolphinDB + Grafana 搭建工业物联网实时监控
物联网·grafana
川石课堂软件测试8 天前
自动化测试常见的异常处理
python·jmeter·mysql·docker·容器·单元测试·grafana
烛影摇红透纱窗8 天前
hiveserver2加入promethus+grafana的监控
grafana
虎王物联8 天前
Docker Compose一键部署物联网平台:EMQX+InfluxDB+Grafana完整方案
物联网·docker·grafana·emqx
行者-全栈开发9 天前
JMeter + InfluxDB + Grafana:搭建生产级压测实时监控与告警体系
jmeter·grafana·时序数据库·influxdb·实时监控·backendlistener·告警性能测试
玉&心10 天前
在grafana中引入prometheus的数据监控
grafana·prometheus