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

简介: Loki是一个水平可扩展、高可用的多租户日志聚合系统,其设计灵感来自Prometheus。与Prometheus不同,Loki专注于日志处理,采用推送方式收集日志,并通过标签索引而非日志内容实现高效查询。其架构包含Distributor、Ingester和Querier等组件,分别负责请求分发、日志存储和查询处理。Loki将日志数据压缩存储在对象存储中,大大降低了成本。部署时,可结合Grafana Alloy作为日志收集器,并通过Grafana可视化界面或LogQL查询语言进行日志检索和分析。系统支持多种查

 1.日志系统介绍

日志系统:

GLA、ELK、数仓

⽇志处理流程:采集 ==> 存储 ==> 检索 ==> 可视化

日志系统工作流程:

image.gif 编辑

image.gif 编辑

日志平台的目的:统一聚合分散的日志

日志平台搭建方案:

image.gif 编辑

ELK:ElasticSearch:存储日志(日志内容进行分词,日志所有数据都可以被检索)

Loki:轻量级日志聚合平台

image.gif 编辑

LAG工作逻辑:

image.gif 编辑

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

image.gif 编辑

2.Loki

2.1 介绍

Loki 是⼀个可⽔平扩展、⾼可⽤性、多租户⽇志聚合系统,其灵感来⾃Prometheus。Loki 与 Prometheus 的不同之处在于,它专注于⽇志⽽不是指标,并通过推送⽽不是拉取来收集⽇志。

Loki 的设计⾮常经济⾼效,并且具有⾼度可扩展性。与其他⽇志系统不同,Loki不会对⽇志内容进⾏索引,⽽只会对⽇志的元数据进⾏索引,将其作为每个⽇志流的⼀组标签。

⽇志流是⼀组共享相同标签的⽇志。标签帮助Loki在您的数据存储中找到⽇志流,因此拥有⼀组⾼质量的标签是⾼效查询执⾏的关键。

然后,⽇志数据被压缩并以块的形式存储在对象存储中,如亚⻢逊简单存储服务(S3)或⾕歌云存储(GCS),甚⾄为了开发或概念验证,存储在⽂件系统上。⼩索引和⾼度压缩的块简化了操作,显著降低了Loki的成本。

2.2 日志结构

Loki数据存储格式:

index:索引;存储Loki标签,如⽇志级别、来源、分组

chunk:块;存储⽇志条⽬本身

image.gif 编辑

Agent:

代理或客户端,例如Grafana Alloy或Promtail,随Loki⼀起分发。代理抓取⽇志,通过添加标签将⽇志转换为流,并通过HTTP API将流推送到Loki。

Loki主服务器:

负责摄取和存储⽇志以及处理查询。它可以部署在三种不同的配置中,有关更

多信息,请参阅部署模式。

Grafana:

⽤于查询和显示⽇志数据。您还可以使⽤LogCLI或直接使⽤Loki API从命令⾏ 查询⽇志。

3.系统架构

3.1 Loki架构:

image.gif 编辑

image.gif 编辑

image.gif 编辑

写流程:

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架构

image.gif 编辑

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

image.gif

dockercompose文件执行效果架构:

image.gif 编辑

执行docker compose up -d 启动服务

Alloy日志收集:

image.gif 编辑

5.Grafana

添加Loki数据源:

image.gif 编辑

查看⽇志:可以使⽤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"}

image.gif

包含值:

# 查看 container 标签值 为 evaluate-loki-flog-1 ,且 json 格式中 status字段值为4
04
{container="evaluate-loki-flog-1"} | json | status=`404`

image.gif

计算:

sum by(container) (rate({container="evaluate-loki-flog-1"} | json | status=
`404` [$__auto]))

image.gif

其他:

{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"

image.gif

更多:https://grafana.com/docs/loki/latest/query/query_examples/


相关文章
|
12小时前
|
运维 负载均衡 Java
微服务基础1-微服务拆分与服务调用
文章摘要: 本文详细介绍了微服务架构的概念、优势及实现方式。对比单体架构的局限性,微服务通过拆分功能模块实现高内聚、低耦合,提升系统可用性和开发效率。重点讲解了微服务拆分策略(纵向按功能、横向抽通用)、服务注册与发现机制(基于Nacos),以及远程调用方案(RestTemplate和OpenFeign)。OpenFeign通过动态代理简化RPC调用,支持连接池和日志配置,使远程调用如同本地方法。文章还探讨了微服务拆分时机(初创期验证后或大型项目初期直接采用),为不同规模团队提供架构演进建议。
|
12小时前
|
消息中间件 存储 Java
详解RabbitMQ2-高阶技巧
摘要:本文详细探讨了RabbitMQ消息可靠性的保障措施,从生产者、MQ到消费者的全流程解决方案。针对生产者端提出重试机制和确认机制(PublisherConfirm/Return),MQ层面通过持久化和LazyQueue防止消息丢失。消费者端则采用确认机制(ack/nack/reject)、失败重试策略(最大重试次数限制)以及异常消息重定向机制(RepublishMessageRecoverer)。此外,还介绍了幂等性处理方案(唯一消息ID/业务状态判断)和两种延迟消息实现方式(死信交换机与DelayEx
|
12小时前
|
前端开发 Java Nacos
微服务基础2-网关路由
本文介绍了微服务架构中网关技术与配置管理的解决方案。主要内容包括:1)网关路由功能,通过统一入口解决前端联调问题,实现请求转发;2)网关鉴权机制,利用JWT统一处理登录校验,避免各服务重复开发;3)Nacos配置管理,实现共享配置、热更新和动态路由功能。通过网关路由和过滤器链实现请求路由与鉴权,利用Nacos集中管理配置并支持动态更新,解决了微服务架构下的入口统一、身份认证和配置维护难题。最终实现无需重启即可更新配置和路由的能力,提升了系统的灵活性和可维护性。
|
12小时前
|
消息中间件 运维 Java
详解RabbitMQ1-基础使用
MQ异步通信技术摘要 MQ(消息队列)是一种异步通信方式,通过消息Broker实现生产者、消费者解耦。RabbitMQ作为主流MQ方案,支持多种交换机类型(Fanout广播、Direct路由、Topic主题)实现灵活消息路由。Spring AMQP简化了RabbitMQ集成,提供: 自动声明队列/交换机 注解式监听器 RabbitTemplate消息模板 核心优势包括降低耦合、提升性能、故障隔离,但也需考虑Broker可靠性问题。实际开发中需注意: 配置prefetch控制消费速率 使用JSON转换器替代默
|
12小时前
|
SQL Java 数据库
微服务基础3-服务保护与分布式事务
本文介绍了微服务架构中常见的服务保护与分布式事务解决方案。主要内容包括:1. 微服务保护:分析级联故障、业务健壮性等问题,提出限流、线程隔离、熔断等保护方案,并介绍Sentinel的具体实现;2. 分布式事务:阐述跨服务事务问题,讲解Seata框架的XA和AT两种模式,比较其优缺点和适用场景。文章通过购物车、商品服务等实例,详细说明了如何利用Sentinel实现服务降级、熔断,以及如何使用Seata处理分布式事务问题,为微服务系统的高可用和数据一致性提供了实践指导。
|
12小时前
|
监控 Java Maven
深入浅出地理解SpringBoot自动装配原理
摘要: SpringBoot通过起步依赖和自动配置简化了JavaWeb开发。起步依赖(如spring-boot-starter-web)集成关联依赖,减少手动配置;自动配置基于@Conditional条件装配Bean,避免繁琐声明。文章解析了自动配置源码(如@EnableAutoConfiguration导入AutoConfigurationImportSelector),并演示如何手写自定义starter。
|
12小时前
|
存储 NoSQL 安全
|
12小时前
|
存储 Java API
Java日志收集技术
本文系统介绍了Java日志系统的发展历程及主流框架。首先阐述了日志的基本概念和作用,包括调试日志和系统日志的分类。随后详细解析了JUL、Log4j等传统日志框架的使用方法,并介绍了JCL、SLF4J等日志门面技术。重点讲解了SLF4J的绑定机制和桥接技术,以及Logback和Log4j2两大主流日志实现框架的特性与配置方式。最后说明了SpringBoot框架中的日志系统整合方案,包括默认的Logback实现和切换为Log4j2的方法。文章通过代码示例展示了各框架的具体应用,为开发者选择适合的日志方案提供了全
|
12小时前
|
SQL 关系型数据库 MySQL
深入MySQL底层3-事务与锁机制
本文系统介绍了MySQL事务机制及锁实现原理。主要内容包括:1. 事务基础:定义事务为不可分割的操作集合,详解ACID四大特性(原子性、一致性、隔离性、持久性)及其实现机制,分析脏读、不可重复读、幻读等并发问题及四种隔离级别的解决方案。2. 日志系统:阐述redo log(重做日志)保障持久性的WAL机制,以及undo log(回滚日志)实现原子性和MVCC的逻辑。3. MVCC原理:通过隐藏字段(DB_TRX_ID,DB_ROLL_PTR)、undo log版本链和ReadView实现多版本并发控制,详细
|
12小时前
|
存储 JSON 前端开发
MinIo在Ubantu和Java中的整合
方法抛出的各种异常进行了捕获,然后打印了异常信息,目前这种处理逻辑,无论Minio是否发生异常,前端在上传文件时,总是会受到成功的响应信息。会处理所有Controller方法抛出的异常,因此Controller层就无序关注异常的处理逻辑了,因此Controller层代码可做出如下调整。MinIO是一个开源的对象存储服务器,兼容Amazon S3,性能卓越,适合存储非结构化数据,例如照片、视频、日志文件、备份和容器镜像等。功能,可以将所有处理异常的逻辑集中起来,进而统一处理所有异常,使代码更容易维护。