Grafana+Loki+Alloy构建企业级日志平台

发布于:2025-09-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.日志系统介绍

日志系统:

GLA、ELK、数仓

⽇志处理流程:采集 ==> 存储 ==> 检索 ==> 可视化
日志系统工作流程:
日志平台的目的:统一聚合分散的日志
日志平台搭建方案:
ELK:ElasticSearch:存储日志(日志内容进行分词,日志所有数据都可以被检索)
Loki:轻量级日志聚合平台

LAG工作逻辑:

注:检索日志时向Loki发送查询请求,Loki从MinIo中读取日志

2.Loki

2.1 介绍

Loki 是⼀个可⽔平扩展、⾼可⽤性、多租户⽇志聚合系统,其灵感来⾃Prometheus。Loki 与 Prometheus 的不同之处在于,它专注于⽇志⽽不是指标,并通过推送⽽不是拉取来收集⽇志。
Loki 的设计⾮常经济⾼效,并且具有⾼度可扩展性。与其他⽇志系统不同,Loki不会对⽇志内容进⾏索引,⽽只会对⽇志的元数据进⾏索引,将其作为每个⽇志流的⼀组标签。
⽇志流是⼀组共享相同标签的⽇志。标签帮助Loki在您的数据存储中找到⽇志流,因此拥有⼀组⾼质量的标签是⾼效查询执⾏的关键。
然后,⽇志数据被压缩并以块的形式存储在对象存储中,如亚⻢逊简单存储服务(S3)或⾕歌云存储(GCS),甚⾄为了开发或概念验证,存储在⽂件系统上。⼩索引和⾼度压缩的块简化了操作,显著降低了Loki的成本。

2.2 日志结构

Loki数据存储格式:

index:索引;存储Loki标签,如⽇志级别、来源、分组
chunk:块;存储⽇志条⽬本身
Agent:
代理或客户端,例如Grafana Alloy或Promtail,随Loki⼀起分发。代理抓取⽇志,通过添加标签将⽇志转换为流,并通过HTTP API将流推送到Loki。
Loki主服务器:
负责摄取和存储⽇志以及处理查询。它可以部署在三种不同的配置中,有关更
多信息,请参阅部署模式。
Grafana:
⽤于查询和显示⽇志数据。您还可以使⽤LogCLI或直接使⽤Loki API从命令⾏ 查询⽇志。

3.系统架构

3.1 Loki架构:

写流程:
1. distributor 接收带有流和⽇志⾏的HTTP POST请求。
2. distributor 会 hash 计算请求中包含的每个流,决定发给 ⼀致性 hash 环 中的哪个 ingester
3. distributor 把每个流 发给合适处理它的 ingester 和其副本
4. ingester 接收带有⽇志⾏的流,并为流的数据创建⼀个块或附加到现有块。每个租户和每个标
签集,块都是唯⼀的
5. ingester 回复写操作结果
6. distributor 等待⼤多数 ingester 确认写⼊完成。
7. distributor 在收到⾄少法定数量的确认写⼊时响应成功(2xx状态码)。或者在写⼊操作失败
时响应错误(4xx或5xx状态码)。
读流程:
1. 查询前端(query frontend) 接受到 携带 LogQL 的 HTTP GET 请求
2. 查询前端 将查询拆分为⼦查询并将它们传递给查询调度程序(query scheduler)。
3. querier (查询器)从调度程序(scheduler)中提取⼦查询。
4. querier 将查询传递给 所有保存数据的 ingester
5. ingester 返回与查询匹配的 记忆数据(如果有)。
6. 如果 ingester 没有返回或返回的数据不⾜,querier 会延迟从后备存储加载数据并对其运⾏查
询。
7. querier 遍历所有接收到的数据并进⾏重复数据删除,将⼦查询的结果返回到查询前端。
8. 查询前端 等待 查询的所有⼦查询完成 并由 querier 返回。
9. 查询前端将两个结果合并为最终结果并将其返回给客户端。

3.2 Alloy架构

Grafana Alloy是⼀个多功能的可观测性收集器,可以摄取各种格式的⽇志并将其 发送到Loki。我们推荐Alloy作为向Loki发送⽇志的主要⽅法,因为它为构建⾼度可扩展和可靠的可观测性流⽔线提供了更强⼤和特征丰富的解决⽅案。

4.系统部署实践

创建项目目录,在项目目录下下载默认配置文件:

# 1、准备⽬录
mkdir evaluate-loki
cd evaluate-loki
# 2、下载默认配置⽂件
wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-s
tarted/loki-config.yaml -O loki-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-s
tarted/alloy-local-config.yaml -O alloy-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-s
tarted/docker-compose.yaml -O docker-compose.yaml

dockercompose文件执行效果架构:

执行docker compose up -d 启动服务

Alloy日志收集:

5.Grafana

添加Loki数据源:

查看⽇志:可以使⽤LogCli或者Grafana可视化界⾯查看⽇志
1. 使⽤ Grafana 查询 Loki 数据源的数据
a. 访问Grafana:http://101.126.16.42:3000/
b. 已经整合了Loki数据源
c. 点击 Explore 查看
d. 使⽤Code模式,编写 LogQL 查询
查询示例:
标签检索:
# 查看 container 标签值 为 evaluate-loki-flog-1 的⽇志
{container="evaluate-loki-flog-1"}
{container="evaluate-loki-grafana-1"}
包含值:
# 查看 container 标签值 为 evaluate-loki-flog-1 ,且 json 格式中 status字段值为4
04
{container="evaluate-loki-flog-1"} | json | status=`404`
计算:
sum by(container) (rate({container="evaluate-loki-flog-1"} | json | status=
`404` [$__auto]))
其他:
{container="evaluate-loki-flog-1"}
{container="evaluate-loki-flog-1"} |= "GET"
{container="evaluate-loki-flog-1"} |= "POST"
{container="evaluate-loki-flog-1"} | json | status="401"
{container="evaluate-loki-flog-1"} != "401"
更多:https://grafana.com/docs/loki/latest/query/query_examples/