Grafana Stack 深入:Loki、Tempo、Mimir 构建统一可观测性平台

Grafana Stack 深入:Loki、Tempo、Mimir 构建统一可观测性平台

Grafana 不只是一个可视化工具,它正在演变为一个统一的可观测性平台(Grafana Stack),通过集成 Loki(日志)、Tempo(追踪)、Mimir(指标存储),实现了 Metrics、Logs、Traces 三大支柱的深度融合。

本文将深入详解这三个核心组件,帮助你构建一个端到端、可关联、可扩展的现代可观测性系统。


一、Grafana Stack 架构概览

graph LR
    A[Applications] -->|Metrics| B(Prometheus/Mimir)
    A -->|Logs| C(Loki)
    A -->|Traces| D(Tempo)
    B --> E(Grafana)
    C --> E
    D --> E
    E --> F[统一 Dashboard]
    F --> G[点击跳转]
    G --> H[Metrics → Logs → Traces]

“三位一体”:Grafana 作为统一入口,实现 M-L-T 联动。


二、1. Loki:日志聚合系统

Loki 是由 Grafana Labs 开发的水平可扩展、高可用、多租户日志聚合系统,专为 Prometheus 和 Grafana 设计。

2.1 核心设计理念

特点说明
无索引日志不对日志内容建立全文索引,仅索引标签(Labels)
低成本存储开销远低于 Elasticsearch
与 Prometheus 类似使用标签(Labels)进行多维查询
LogQL 查询语言类似 PromQL,支持管道操作

📌 “Loki 不是用于搜索日志,而是用于发现日志。”


2.2 架构组件

Push
Promtail
Loki Distributor
Ingester
Object Storage: S3/GCS
Querier
Grafana
组件作用
Promtail日志采集 Agent(类似 node_exporter)
Distributor接收日志,做一致性哈希
Ingester暂存近期日志,刷盘到对象存储
Querier查询历史和实时日志
Ruler评估日志告警规则

2.3 使用 LogQL 查询日志

基本语法
{<label filter>} | <pipeline>
示例查询
# 所有来自 job="api" 的日志
{job="api"}

# 包含 "error" 的日志
{job="api"} |= "error"

# JSON 日志字段过滤
{job="api"} | json | level="error"

# 统计日志量
count_over_time({job="api"}[5m])

2.4 与指标联动(Metrics → Logs)

在 Grafana 中实现 “点击指标图表,跳转到对应时间的日志”

配置步骤:
  1. 在 Panel 的 Panel links 中添加链接
  2. Type: Link
  3. Title: View Logs
  4. URL: /explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bjob=%5C%22api%5C%22%7D%22%7D, %22Logs%22%5D
  5. 或使用变量动态生成:
    /explore?left=[["${__from:date}","${__to:date}","Loki",{"expr":"{job=\\"api\\"}"}]]
    

✅ 实现:在 CPU 高峰时段,一键查看当时的应用日志。


三、2. Tempo:分布式追踪系统

Tempo 是 Grafana Labs 开发的无依赖、低成本、高扩展性的分布式追踪后端。

3.1 核心优势

特点说明
无数据库依赖使用对象存储(S3/GCS)存储追踪数据
低成本不需要 Cassandra、Elasticsearch 等重型存储
与 Grafana 深度集成原生支持 Tempo 数据源
支持 OpenTelemetry标准协议

3.2 架构

OTLP
Applications
Tempo Distributor
Ingester
Object Storage
Querier
Grafana

✅ 与 Loki 架构高度相似,运维成本低。


3.3 在 Grafana 中使用 Tempo

步骤:
  1. Add data source → 选择 Tempo
  2. 配置:
    • URL: http://tempo:3200
  3. Save & Test

3.4 与 Metrics/Logs 联动(Tracing → Logs/Metrics)

场景:从追踪定位到日志
  1. 在 Grafana Explore 中选择 Tempo 数据源
  2. 搜索 Trace(如通过 HTTP 路径 /api/users
  3. 点击 Span → “View logs for this span”
    • 自动跳转到 Loki,显示该 Span 时间范围内的日志
  4. 点击 “View metrics”
    • 跳转到 Prometheus,查看该时间段的指标

✅ 实现:从慢请求追踪 → 查看日志 → 分析系统指标。


四、3. Mimir:Prometheus 的长期存储与集群方案

Mimir(原 Cortex)是 Grafana Labs 开发的多租户、水平扩展、长期存储的 Prometheus 兼容系统。

4.1 为什么需要 Mimir?

Prometheus 本地存储的局限:

  • ❌ 存储有限(通常 15-90 天)
  • ❌ 无高可用
  • ❌ 无法水平扩展

Mimir 解决了这些问题。


4.2 核心特性

特性说明
无限存储基于对象存储(S3/GCS)
高可用多副本、自动故障转移
水平扩展可扩展到 PB 级数据
多租户支持多团队、多项目隔离
全局查询跨多个 Prometheus 实例聚合查询
降采样长期数据自动聚合(如 1h avg)

4.3 架构组件

Remote Write
Prometheus
Mimir Distributor
Ingester
Object Storage
Querier
Grafana

与 Loki/Tempo 架构统一,运维体验一致。


4.4 与 Thanos 对比

方案MimirThanos
架构微服务架构Sidecar + Store Gateway
多租户✅ 原生支持❌ 需额外设计
运维复杂度
社区Grafana Labs 主导CNCF 毕业项目
适用场景多租户 SaaS、大企业通用长期存储

Mimir 更适合需要多租户和强扩展性的场景


五、三者联动:实现真正的可观测性

5.1 统一查询入口

在 Grafana 中:

  • 一个 Dashboard 同时展示:
    • Mimir:长期指标趋势
    • Loki:错误日志量
    • Tempo:请求延迟分布

5.2 关联分析实战

场景:支付接口变慢
  1. Metrics:发现 http_request_duration_seconds P99 上升
  2. Traces:在 Tempo 中查看慢请求的调用链,发现 risk-check 服务耗时长
  3. Logs:点击 Span,跳转到 Loki,查看 risk-check 服务的日志,发现数据库连接超时
  4. Metrics:查看数据库连接池指标,确认连接耗尽

✅ 完整闭环:指标发现 → 追踪定位 → 日志分析 → 根因确认


六、部署建议

6.1 小型团队

services:
  grafana: ...
  prometheus: ...
  loki: ...
  tempo: ...
  • 使用 Prometheus + Loki + Tempo + Grafana

6.2 中大型企业

services:
  mimir: ...        # 长期存储
  loki: ...         # 日志
  tempo: ...        # 追踪
  grafana: ...      # 统一入口
  • 统一使用对象存储(S3/GCS)
  • 通过 Grafana 统一管理

七、最佳实践

实践说明
统一存储后端Loki、Tempo、Mimir 共用 S3/GCS
标准化标签tenant, service, env 三者一致
启用降采样减少长期存储成本
配置告警在 Grafana 中为三者设置统一告警
权限控制基于团队/租户隔离数据

八、总结

Grafana Stack 的三大支柱:

组件作用查询语言
Mimir长期指标存储PromQL
Loki高效日志聚合LogQL
Tempo低成本分布式追踪OpenTelemetry

核心价值:

“一个平台,统一管理 Metrics、Logs、Traces,实现端到端可观测性。”

<think>我们参考用户提供的引用内容,但主要根据用户当前需求来回答。用户当前的需求是安装LokiHelm(指定Chart版本6.30.1,Loki版本3.5.0)并编写其配置文件。步骤:1.添加LokiHelm仓库2.更新Helm仓库3.创建一个命名空间(如果用户需要)4.安装Loki,指定Chart版本和Loki版本5.编写配置文件(通常通过values.yaml来配置)由于用户指定了Chart版本(6.30.1)和Loki版本(3.5.0),我们需要在安装时指定chart版本,并通过values文件指定Loki的版本。注意:Helmchart的版本和Loki的版本是独立的。在values.yaml中,我们可以设置image.tag来指定Loki的版本。操作步骤:第一步:添加GrafanaHelm仓库(Loki属于Grafana的项目)第二步:更新仓库第三步:创建命名空间(可选,但推荐)第四步:编写一个values.yaml配置文件,设置Loki的版本和所需参数第五步:使用helminstall命令安装详细步骤:1.添加Helm仓库:```bashhelmrepoaddgrafanahttps://grafana.github.io/helm-charts```2.更新仓库:```bashhelmrepoupdate```3.创建命名空间(例如loki):```bashkubectlcreatenamespaceloki```4.编写values.yaml:我们需要指定Loki的版本为3.5.0,并配置其他必要的参数。以下是一个基本的values.yaml示例:```yamlloki:#指定Loki版本image:tag:3.5.0#配置存储类,根据实际情况修改persistence:enabled:truestorageClassName:"standard"#替换为你的存储类size:10Gi#其他配置...```注意:根据你的环境,可能还需要配置其他选项,如副本数、资源限制等。5.安装Loki,指定Chart版本为6.30.1,并使用上面的values.yaml:```bashhelminstalllokigrafana/loki-stack--version6.30.1-nloki-fvalues.yaml```注意:这里我们使用loki-stackchart,它包含了Loki和Promtail等组件。如果只需要Loki,可以考虑使用单独的lokichart。但用户要求的是GrafanaLoki,而loki-stack是常用的组合。关于配置文件(values.yaml)的编写:用户可以根据需求详细配置values.yaml。除了指定版本和存储,还可以配置:-资源限制(resources)-副本数(通过readReplicas配置等)-网络配置(service)-多租户配置(如果启用认证)-等等如果用户需要启用特定的配置(比如配置s3存储等),可以在values.yaml中设置。例如,配置使用MinIO作为存储:```yamlloki:env:[]config:schema_config:configs:-from:2020-12-24store:awsobject_store:s3schema:v11index:prefix:loki_index_period:24hstorage_config:aws:s3:s3://<access_key>:<secret_key>@<endpoint>/<bucket>dynamodb:dynamodb://<key>:<secret>@<dynamodb_endpoint>```但是注意,上述存储配置需要根据实际情况修改。另外,我们也可以使用Helmchart的默认配置。最后,我们还需要注意,安装完Loki后,可能需要配置Grafana数据源来连接Loki。但是用户目前的需求是安装Loki和编写配置文件。相关问题:1.如何验证Loki安装成功?2.如何配置Loki使用S3兼容的存储?3.如何升级Loki版本?4.如何配置Loki的持久化存储?注意:用户提供的引用内容中提到了Grafana的安装和启动,但用户当前需求是Loki,因此我们专注于Loki的安装配置。</think> ### 安装 Loki Helm 及配置 Grafana Loki (Chart 6.30.1, Loki 3.5.0) #### **安装步骤** 1. **添加 Helm 仓库** ```bash helm repo add grafana https://grafana.github.io/helm-charts helm repo update ``` 2. **创建命名空间** ```bash kubectl create namespace loki ``` 3. **安装 Loki Stack** 使用指定版本: ```bash helm install loki grafana/loki-stack --version 6.30.1 \ --namespace loki \ --set loki.image.tag=3.5.0 ``` - `--version 6.30.1`: 指定 Chart 版本 - `--set loki.image.tag=3.5.0`: 强制 Loki 版本为 3.5.0[^1] --- #### **配置文件编写 (`values.yaml` 示例)** ```yaml # values.yaml loki: image: tag: 3.5.0 # 指定 Loki 版本 config: auth_enabled: false ingester: lifecycler: ring: kvstore: store: inmemory limits_config: enforce_metric_name: false schema_config: configs: - from: 2020-12-24 store: boltdb-shipper object_store: s3 schema: v11 storage_config: aws: s3: s3://ACCESS_KEY:SECRET_KEY@region/bucket # 替换为实际 S3 配置 boltdb_shipper: shared_store: s3 promtail: enabled: true grafana: enabled: true # 自动安装 Grafana sidecar: datasources: enabled: true ``` --- #### **安装命令(使用自定义配置)** ```bash helm install loki grafana/loki-stack --version 6.30.1 \ -f values.yaml \ --namespace loki ``` --- #### **验证安装** ```bash kubectl get pods -n loki # 预期输出 loki-0 1/1 Running promtail-xxxx 1/1 Running grafana-xxxx 1/1 Running ``` --- #### **访问 Grafana** 1. 获取 Grafana 服务端口: ```bash kubectl get svc -n loki | grep grafana ``` 2. 访问 `http://<NODE_IP>:<PORT>`,默认用户/密码为 `admin/admin` 3. 添加 Loki 数据源: - URL: `http://loki:3100` --- ### 关键配置说明 1. **存储配置** - 使用 `schema_config` 定义存储策略(如 S3/MinIO) - 生产环境需禁用 `ring: inmemory` 改用 `consul` 2. **资源限制** 在 `values.yaml` 中添加: ```yaml loki: resources: limits: memory: 4Gi cpu: 2 ``` 3. **持久化卷** ```yaml loki: persistence: enabled: true size: 50Gi storageClassName: "standard" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值