GitHub - grafana/loki: Like Prometheus, but for logs.

Loki:像普罗米修斯,但用于日志。

|

Loki 是一个受 Prometheus 启发的、水平可扩展、高可用、多租户的日志聚合系统。Loki 与 Prometheus 的不同之处在于,Loki 专注于日志而不是指标,并通过推送 (push) 而不是拉取 (pull) 的方式收集日志。

一个典型的基于 Loki 的日志堆栈由 3 个组件组成

  • 代理  - 代理或客户端,例如 Grafana Alloy 或 Promtail,它们与 Loki 一起分发。代理抓取日志,通过添加标签将日志转换为流,并通过 HTTP API 将流推送到 Loki。
  • Loki  - 主服务器,负责摄取和存储日志以及处理查询。它可以部署在三种不同的配置中,更多信息请参阅部署模式
  • Grafana  用于查询和显示日志数据。您还可以从命令行查询日志,使用 LogCLI 或直接使用 Loki API。

架构

Loki components

可扩展性

Loki 被设计为可扩展的,可以从小规模的在 Raspberry Pi 上运行,到大规模的每天摄取 PB 级数据。在其最常见的部署模式“简单可扩展模式”中,Loki 将请求解耦为单独的读取和写入路径,以便您可以独立地扩展它们,从而实现灵活的大规模安装,可以快速适应您在任何给定时间的工作负载。如果需要,Loki 的每个组件也可以作为微服务运行,这些微服务被设计为在 Kubernetes 中原生运行。

写入

  1. Distributor 接收带有流和日志行的 HTTP POST 请求。
  2. Distributor 哈希请求中包含的每个流,以便它可以根据来自一致性哈希环的信息确定需要将其发送到的 ingester 实例。
  3. Distributor 将每个流发送到相应的 ingester 及其副本(基于配置的复制因子)。
  4. Ingester 接收带有日志行的流,并为流数据创建 chunk 或附加到现有 chunk。chunk 对于每个租户和每个标签集都是唯一的。
  5. Ingester 确认写入。
  6. Distributor 等待大多数(仲裁)ingester 确认其写入。
  7. 如果 Distributor 收到至少 quorum 的已确认写入,则响应成功(2xx 状态代码);如果写入操作失败,则响应错误(4xx 或 5xx 状态代码)。

读取

  1. Query frontend 接收带有 LogQL 查询的 HTTP GET 请求。
  2. Query frontend 将查询拆分为子查询,并将它们传递给 query scheduler。
  3. Querier 从 scheduler 中拉取子查询。
  4. Querier 将查询传递给所有 ingester 以获取内存中的数据。
  5. Ingester 返回与查询匹配的内存数据(如果有)。
  6. 如果 ingester 没有返回数据或返回的数据不足,则 Querier 从后备存储延迟加载数据并对其运行查询。
  7. Querier 迭代所有接收到的数据并去重,将子查询的结果返回给 query frontend。
  8. Query frontend 等待查询的所有子查询完成并由 querier 返回。
  9. Query frontend 将各个结果合并为最终结果,并将其返回给客户端。

告警

Loki 包含一个名为 ruler 的组件,它可以持续评估针对日志的查询,并根据结果执行操作。这使您可以监控日志中的异常或事件。Loki 与 Prometheus Alertmanager 或 Grafana 内的 告警管理器 集成。

高效存储

Loki 将日志数据存储在高度压缩的块中。同样,Loki 索引由于仅索引标签集,因此比其他日志聚合工具小得多。通过利用对象存储作为唯一的数据存储机制,Loki 继承了底层对象存储的可靠性和稳定性。与其他存储机制(如本地连接的固态驱动器 (SSD) 和硬盘驱动器 (HDD))相比,它还充分利用了对象存储的成本效益和操作简易性。
压缩的块、更小的索引以及低成本对象存储的使用,使 Loki 的运营成本更低。

数据格式

Grafana Loki 有两种主要的文件类型: index  和  chunks

  • index  是一个目录,指示在哪里可以找到特定标签集的日志。
  • chunk  是特定标签集日志条目的容器。

Loki data format: chunks and indexes

上面的图表显示了存储在 chunk 中的数据和存储在 index 中的数据的高级概述。

Trace to logs

Link to a trace ID Traces to logs

  • Loki 与 Grafana、Mimir 和 Tempo 集成,提供完整的可观测性堆栈,以及日志、指标和追踪之间的无缝关联。
  • 您可以通过配置内部链接从 Loki、Elasticsearch、Splunk 和其他日志数据源中的日志链接到 Tempo 跟踪。
  • 目前官方文档上没有明确说明 trace to log 支持的数据源范围, 源码中有标明
  • 目前只支持
    • loki
    • elasticsearch
    • splunk