Loki:像普罗米修斯,但用于日志。
Loki 是一个受 Prometheus 启发的、水平可扩展、高可用、多租户的日志聚合系统。Loki 与 Prometheus 的不同之处在于,Loki 专注于日志而不是指标,并通过推送 (push) 而不是拉取 (pull) 的方式收集日志。
一个典型的基于 Loki 的日志堆栈由 3 个组件组成
- 代理 - 代理或客户端,例如 Grafana Alloy 或 Promtail,它们与 Loki 一起分发。代理抓取日志,通过添加标签将日志转换为流,并通过 HTTP API 将流推送到 Loki。
- Loki - 主服务器,负责摄取和存储日志以及处理查询。它可以部署在三种不同的配置中,更多信息请参阅部署模式。
- Grafana 用于查询和显示日志数据。您还可以从命令行查询日志,使用 LogCLI 或直接使用 Loki API。
架构
可扩展性
Loki 被设计为可扩展的,可以从小规模的在 Raspberry Pi 上运行,到大规模的每天摄取 PB 级数据。在其最常见的部署模式“简单可扩展模式”中,Loki 将请求解耦为单独的读取和写入路径,以便您可以独立地扩展它们,从而实现灵活的大规模安装,可以快速适应您在任何给定时间的工作负载。如果需要,Loki 的每个组件也可以作为微服务运行,这些微服务被设计为在 Kubernetes 中原生运行。
写入
- Distributor 接收带有流和日志行的 HTTP POST 请求。
- Distributor 哈希请求中包含的每个流,以便它可以根据来自一致性哈希环的信息确定需要将其发送到的 ingester 实例。
- Distributor 将每个流发送到相应的 ingester 及其副本(基于配置的复制因子)。
- Ingester 接收带有日志行的流,并为流数据创建 chunk 或附加到现有 chunk。chunk 对于每个租户和每个标签集都是唯一的。
- Ingester 确认写入。
- Distributor 等待大多数(仲裁)ingester 确认其写入。
- 如果 Distributor 收到至少 quorum 的已确认写入,则响应成功(2xx 状态代码);如果写入操作失败,则响应错误(4xx 或 5xx 状态代码)。
读取
- Query frontend 接收带有 LogQL 查询的 HTTP GET 请求。
- Query frontend 将查询拆分为子查询,并将它们传递给 query scheduler。
- Querier 从 scheduler 中拉取子查询。
- Querier 将查询传递给所有 ingester 以获取内存中的数据。
- Ingester 返回与查询匹配的内存数据(如果有)。
- 如果 ingester 没有返回数据或返回的数据不足,则 Querier 从后备存储延迟加载数据并对其运行查询。
- Querier 迭代所有接收到的数据并去重,将子查询的结果返回给 query frontend。
- Query frontend 等待查询的所有子查询完成并由 querier 返回。
- Query frontend 将各个结果合并为最终结果,并将其返回给客户端。
告警
Loki 包含一个名为 ruler 的组件,它可以持续评估针对日志的查询,并根据结果执行操作。这使您可以监控日志中的异常或事件。Loki 与 Prometheus Alertmanager 或 Grafana 内的 告警管理器 集成。
高效存储
Loki 将日志数据存储在高度压缩的块中。同样,Loki 索引由于仅索引标签集,因此比其他日志聚合工具小得多。通过利用对象存储作为唯一的数据存储机制,Loki 继承了底层对象存储的可靠性和稳定性。与其他存储机制(如本地连接的固态驱动器 (SSD) 和硬盘驱动器 (HDD))相比,它还充分利用了对象存储的成本效益和操作简易性。
压缩的块、更小的索引以及低成本对象存储的使用,使 Loki 的运营成本更低。
数据格式
Grafana Loki 有两种主要的文件类型: index 和 chunks 。
上面的图表显示了存储在 chunk 中的数据和存储在 index 中的数据的高级概述。
Trace to logs
- Loki 与 Grafana、Mimir 和 Tempo 集成,提供完整的可观测性堆栈,以及日志、指标和追踪之间的无缝关联。
- 您可以通过配置内部链接从 Loki、Elasticsearch、Splunk 和其他日志数据源中的日志链接到 Tempo 跟踪。
- 目前官方文档上没有明确说明 trace to log 支持的数据源范围, 源码中有标明
- 目前只支持
- loki
- elasticsearch
- splunk