第二篇:《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 秒内启动一套完整的可观测性环境。

相关推荐
DylanlZhao5 天前
我想看看本地 LLM 给我省了多少钱,于是我监控了它
llm·grafana
天天喝旺仔7 天前
Prometheus + Grafana 监控告警体系搭建实战:从 Exporter 指标采集、PromQL 查询到 Alertmanager 告警落地
容器·kubernetes·grafana·prometheus·时序数据库
qq_4523962314 天前
第十二篇:《数据采集:Grafana Alloy、Fluent Bit、Vector 的选型与配置》
java·贪心算法·grafana
2601_9620973614 天前
可观测性实战:Prometheus+Grafana+OTel构建监控
grafana·prometheus·微服务架构·可观测性·opentelemetry
Joker-Full-stack14 天前
higress Grafana生产事故复盘:Loki 2.9 WAL 竞态 Bug 导致 5 天审计日志消失
bug·grafana·higress
IT界的老黄牛14 天前
Jenkins 监控一条龙:接入、看板 9964、11 条告警规则直接抄走
jenkins·grafana·prometheus·监控·ci-cd·告警规则
heimeiyingwang15 天前
【Prometheus·可视化篇】Grafana 集成:数据源配置与 Dashboard 设计原则
grafana·prometheus
2601_9620973616 天前
GraphQL,Grafana和Dash
python·grafana·数据可视化·graphql·dash
happymade18 天前
7000 台网络设备批量纳管 & 自动拓扑生成实战——MSRM3 完整操作流程与关键要点复盘
运维·服务器·网络·zabbix·grafana·msrm3
AAA@峥18 天前
从零搭建 Prometheus 完整监控告警体系|Linux 部署 + node_exporter+Grafana 可视化
云原生·grafana·prometheus