在上一篇文章中,我们理解了可观测性三大支柱的定义与演进。但知道"需要什么"和"怎么搭建"之间还有一条鸿沟。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 秒内启动一套完整的可观测性环境。