云原生日志Agent/Aggregator

news2024/11/25 10:14:31

Loggie是一个基于Golang的轻量级、高性能、云原生日志采集Agent和中转处理Aggregator,支持多Pipeline和组件热插拔,提供了:
一栈式日志解决方案: 同时支持日志中转、过滤、解析、切分、日志报警等
云原生的日志形态: 快速便捷的容器日志采集方式,原生的Kubernetes CRD动态配置下发
生产级的特性: 基于长期的大规模运维经验,形成了全方位的可观测性、快速 排障、异常预警、自动化运维能力
我们可以基于Loggie,打造一套的云原生可扩展的全链路日志数据平台。
在这里插入图片描述

概念

核心数据流

● Source: 输入源,表示一个具体的输入源,一个Pipeline可以有多个不同的输入源。比如file source表示日志文件采集源,Kafka source为读取Kafka的输入源。
● Sink: 输出源,表示一个具体的输出源,一个Pipeline仅能配置一种类型的输出源,但是可以有多个并行实例。比如Elasticsearch sink表示日志数据将发送至远端的Elasticsearch。
● Interceptor: 拦截器,表示一个日志数据处理组件,不同的拦截器根据实现可以进行日志的解析、切分、转换、限流等。一个Pipeline可以有多个Interceptor,数据流经过多个Interceptor被链式处理。
● Queue: 队列,目前有内存队列。
● Pipeline: 管道,source/interceptor/queue/sink共同组成了一个Pipeline,不同的Pipeline数据隔离。

管理与控制

● Discovery: 动态配置的下发,目前主要为Kubernetes下的日志配置,可以通过创建LogConfig等CRD实例的方式来采集容器日志。后续将陆续支持主机形态下的各种配置中心对接。
● Monitor EventBus: 各组件均可以通过publish数据到EventBus Topic中,由特定的Listener监听Topic并进行消费处理。主要用于监控数据的暴露或发送。
● Reloader: 用于配置的动态更新。

特性

新一代的云原生日志采集和传输方式

基于CRD的快速配置和使用

Loggie包含 LogConfig/ClusterLogConfig/Interceptor/Sink CRD,只需简单的创建一些YAML文件,即可搭建一系列的数据采集、传输、处理、发送流水线。

apiVersion: loggie.io/v1beta1
kind: LogConfig
metadata:
  name: tomcat
  namespace: default
spec:
  selector:
    type: pod
    labelSelector:
      app: tomcat
  pipeline:
    sources: |
      - type: file
        name: common
        paths:
          - stdout
          - /usr/local/tomcat/logs/*.log
    sinkRef: default
    interceptorRef: default

在这里插入图片描述

支持多种部署架构

● Agent: 使用DaemonSet部署,无需业务容器挂载Volume即可采集日志文件
● Sidecar: 支持Loggie sidecar无侵入自动注入,无需手动添加到Deployment/StatefulSet部署模版
● Aggregator: 支持Deployment独立部署成中转机形态,可接收聚合Loggie Agent发送的数据,也可单独用于消费处理各类数据源

但不管是哪种部署架构,Loggie仍然保持着简单直观的内部设计。
在这里插入图片描述

轻量级和高性能

基准压测对比
配置Filebeat和Loggie采集日志,并发送至Kafka某个Topic,不使用客户端压缩,Kafka Topic配置Partition为3。

在保证Agent规格资源充足的情况下,修改采集的文件个数、发送客户端并发度(配置Filebeat worker和Loggie parallelism),观察各自的CPU、Memory和Pod网卡发送速率。

Agent文件大小日志文件数发送并发度CPUMEM (rss)网卡发包速率
Filebeat3.2G137.5~8.5c63.8MiB75.9MiB/s
Filebeat3.2G1810c65MiB70MiB/s
Filebeat3.2G10811c65MiB80MiB/s
Loggie3.2G132.1c60MiB120MiB/s
Loggie3.2G182.4c68.7MiB120MiB/s
Loggie3.2G1083.5c70MiB210MiB/s

自适应sink并发度
打开sink并发度配置后,Loggie可做到:
● 根据下游数据响应的实际情况,自动调整下游数据发送并行数,尽量发挥下游服务端的性能,且不影响其性能。
● 在上游数据收集被阻塞时,适当调整下游数据发送速度,缓解上游阻塞。

轻量级流式数据分析与监控

日志本身是一种通用的,和平台、系统无关的数据,如何更好的利用到这些数据,是Loggie关注和主要发展的核心能力。
在这里插入图片描述
实时解析和转换
只需配置transformer interceptor,通过配置函数式的action,即可实现:
● 各种数据格式的解析(json, grok, regex, split…)
● 各种字段的转换(add, copy, move, set, del, fmt…)
● 支持条件判断和处理逻辑(if, else, return, dropEvent, ignoreError…)
可用于:
● 日志提取出日志级别level,并且drop掉DEBUG日志
● 日志里混合包括有json和plain的日志形式,可以判断json形式的日志并且进行处理
● 根据访问日志里的status code,增加不同的topic字

示例:

interceptors:
  - type: transformer
    actions:
      - action: regex(body)
        pattern: (?<ip>\S+) (?<id>\S+) (?<u>\S+) (?<time>\[.*?\]) (?<url>\".*?\") (?<status>\S+) (?<size>\S+)
      - if: equal(status, 404)
        then:
          - action: add(topic, not_found)
          - action: return()
      - if: equal(status, 500)
        then:
          - action: dropEvent()

检测识别与报警
帮你快速检测到数据中可能出现的问题和异常,及时发出报警。
支持匹配方式:
● 无数据:配置的时间段内无日志数据产生
● 匹配
模糊匹配
正则匹配
● 条件判断
字段比较:equal/less/greater…

支持部署形态:
● 在数据采集链路检测:简单易用,无需额外部署
● 独立链路检测两种形态:独立部署Aggregator,消费Kafka/Elasticsearch等进行数据的匹配和报警
均可支持自定义webhook对接各类报警渠道

业务数据聚合与监控
很多时候指标数据Metrics不仅仅是通过prometheus exporter来暴露,日志数据本身也可以提供指标的来源。 比如说,通过统计网关的access日志,可以计算出一段时间间隔内5xx或者4xx的statusCode个数,聚合某个接口的qps,计算出传输body的总量等等。
该功能正在内测中示例:

- type: aggregator
  interval: 1m
  select:
  # 算子:COUNT/COUNT-DISTINCT/SUM/AVG/MAX/MIN
  - {key: amount, operator: SUM, as: amount_total}
  - {key: quantity, operator: SUM, as: qty_total}
  groupby: ["city"]
  # 计算:根据字段中的值,再计算处理
  calculate:
  - {expression: " ${amount_total} / ${qty_total} ", as: avg_amount}

全链路的快速排障与可观测性

● Loggie提供了可配置的、丰富的数据指标,还有dashboard可以一键导入到grafana中
在这里插入图片描述
● 使用Loggie terminal和help接口快速便捷的排查Loggie本身的问题,数据传输过程中的问题
在这里插入图片描述

FAQs

Loggie vs Filebeat/Fluentd/Logstash/Flume

LoggieFilebeatFluentdLogstashFlume
开发语言GolangGolangRubyJRubyJava
多Pipeline支持单队列单队列支持支持
多输出源支持不支持,仅一个Output配置copy支持支持
中转机支持不支持支持支持支持
日志报警支持不支持不支持不支持不支持
Kubernetes容器日志采集支持容器的stdout和容器内部日志文件只支持容器stdout只支持容器stdout不支持不支持
配置下发Kubernetes下可通过CRD配置,主机场景配置中心陆续支持中手动配置手动配置手动配置手动配置
监控原生支持Prometheus metrics,同时可配置单独输出指标日志文件、发送metrics等方式API接口暴露,接入Prometheus需使用额外的exporter支持API和Prometheus metrics需使用额外的exporter需使用额外的exporter
资源占用一般较高较高

部署

1. 准备Kubernetes环境

可以使用现有Kubernetes集群,或者部署Kubernetes。本地推荐使用Kind搭建Kubernetes集群。
本文的操作需要在本地使用:
kubectl(下载)
helm(下载)
请确保本地有kubectl和helm可执行命令。

2. 部署Loggie DaemonSet

你可以在 installation 页面查看所有发布的部署chart。
可以选择下载chart再部署:

VERSION=v1.4.0
helm pull https://github.com/loggie-io/installation/releases/download/$VERSION/loggie-$VERSION.tgz && tar xvzf loggie-$VERSION.tgz

尝试修改一下其中的values.yaml。 请将以上的<VERSION>替换成具体的版本号。然后部署安装:
如果你的环境中已经创建了loggie namespace,可以忽略其中的 -nloggie 和 --create-namespace 参数。当然,你也可以使用自己的namespace,将其中loggie替换即可。

helm install loggie ./loggie -nloggie --create-namespace

当然你也可以直接部署:

# 请将下面的<VERSION>替换成具体的版本号
helm install loggie -nloggie --create-namespace https://github.com/loggie-io/installation/releases/download/$VERSION/loggie-$VERSION.tgz

为了方便体验最新的Fix和特性,我们提供了main分支每次合并后的镜像版本,可通过 <这里>在这里插入图片描述
(https://hub.docker.com/r/loggieio/loggie/tags) 进行选择。
同时你可以在helm install命令中增加 --set image=loggieio/loggie:vX.Y.Z 来指定具体的Loggie镜像。
● Kubernetes版本问题
failed to install CRD crds/crds.yaml: unable to recognize “”: no matches for kind “CustomResourceDefinition” in version “apiextensions.k8s.io/v1”
如果你在helm install的时候出现类似的问题,说明你的Kubernetes版本较低,不支持apiextensions.k8s.io/v1版本CRD。Loggie暂时保留了v1beta1版本的CRD,请删除charts中v1beta1版本,rm loggie/crds/crds.yaml,重新install。

3. 采集日志

Loggie定义了Kubernetes CRD LogConfig,一个LogConfig表示采集一类Pods的日志采集任务。

3.1 创建被采集的Pods

我们先创建一个Pod用于被采集日志的对象。接下来将采集这个Nginx Pod的标准输出stdout日志。

kubectl create deploy nginx --image=nginx

3.2 定义输出源Sink

接着我们创建一个Loggie定义的 CRD Sink 实例,表明日志发送的后端。为了方便演示,这里我们将日志发送至Loggie Agent自身的日志中并打印。

cat << EOF | kubectl apply -f -
apiVersion: loggie.io/v1beta1
kind: Sink
metadata:
  name: default
spec:
  sink: |
    type: dev
    printEvents: true
EOF

可以通过 kubectl get sink 查看到已创建的Sink。

3.3 定义采集任务

Loggie定义CRD LogConfig,表示一个日志采集任务。我们创建一个LogConfig示例如下所示:

cat << EOF | kubectl apply -f -
apiVersion: loggie.io/v1beta1
kind: LogConfig
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    type: pod
    labelSelector:
      app: nginx
  pipeline:
    sources: |
      - type: file
        name: mylog
        paths:
        - stdout
    sinkRef: default
EOF

可以看到,上面使用了sinkRef引用了刚才创建的sink default CR。当然,我们还可以直接在Logconfig中使用sink字段,示例如下:

cat << EOF | kubectl apply -f -
apiVersion: loggie.io/v1beta1
kind: LogConfig
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    type: pod
    labelSelector:
      app: nginx
  pipeline:
    sources: |
      - type: file
        name: mylog
        paths:
        - stdout
    sink: |
      type: dev
      printEvents: true
      codec:
        type: json
        pretty: true
EOF

创建完之后,我们可以使用kubectl get lgc查看到创建的CRD实例。同时,我们还可以通过kubectl describe lgc nginx查看LogConfig的事件,以获取最新的状态

Events:
  Type    Reason       Age   From                       Message
  ----    ------       ----  ----                       -------
  Normal  syncSuccess  52s   loggie/kind-control-plane  Sync type pod [nginx-6799fc88d8-5cb67] success

上面的nginx LogConfig通过其中的spec.selector来匹配采集哪些Pod的日志,这里我们使用app: nginx选择了刚才创建的nginx Pod。
spec.pipeline则表示Loggie的Pipeline配置,我们只采集容器标准输出的日志,所以在paths中填写stdout即可。

4. 查看日志

首先找到所在的nginx pod节点:

kubectl get po -owide -l app=nginx

然后我们找到该节点的Loggie:

kubectl -nloggie get po -owide |grep ${node}

可以通过:

kubectl -nloggie logs -f ${logge-pod}

查看Loggie打印出的日志,里面展示了采集到的nginx标准输出日志。
更全面的部署介绍:Kubernetes下部署Loggie
Kubernetes下日志采集最佳实践:Kubernetes下的日志采集

使用Loggie采集容器日志

Loggie如何采集容器日志?

由于Kubernetes良好的可扩展性,Kubernetes设计了一种自定义资源CRD的概念,用户可以自己定义CRD表示自己的期望状态,并借助一些framework开发Controller,使用Controller将我们的期望变成现实。
基于这个思路,一个服务需要采集哪些日志,需要什么样的日志配置,是用户的期望,而这就需要我们开发一个日志采集的Controller去实现。
所以,用户只需要在我们定义的CRD LogConfig中,填写需要采集哪些Pods的日志,在Pod中的日志路径是什么。
核心架构如下图所示:
在这里插入图片描述
Loggie会感知到Pod和CRD的事件,进行配置的动态更新。同时,Loggie可以根据日志文件路径挂载的Volume,找到相应在节点的文件进行采集。另外还可以根据配置,自动将Pod上的Env/Annotation/Label加入到日志里作为元信息。
同时相比粗暴的所有节点挂载相同路径进行通配采集的方式,也解决了没法针对单个服务精细化配置、采集无关日志的问题。
当然带来的好处不仅仅这些,Loggie在动态配置下发、监控指标等方面都可以基于Kubernetes进行相应的适配和支持。

CRD使用说明

Loggie目前有以下几种CRD:
LogConfig: namespace级别CRD,用于采集Pod容器日志,其中主要填写采集的source配置,以及关联的sink和interceptor。
ClusterLogConfig: cluster级别CRD,表示集群级别的采集Pod容器日志,采集Node节点上的日志,以及为某个Loggie集群下发通用的pipeline配置。
Sink: 表示一个sink后端,需要在ClusterLogConfig/LogConfig中被关联。
Interceptor: 表示一个interceptors组,需要在ClusterLogConfig/LogConfig中被关联。
使用CRD的流程架构如下所示:
在这里插入图片描述
If you do, you have a fifty percent chance. If you don’t, you don’t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网独家:修改CoreDNS禁用ipv6解析后的查询反馈信息

CoreDNS是用Go开发的&#xff0c;可以配置多种插件来扩展其功能&#xff0c;非常灵活高效&#xff0c;它是Kubernetes的默认DNS服务器。笔者的平台采用CoreDNS来作单独的高并发域名解析服务器&#xff0c;在禁用ipv6解析后应用侧遇到反馈信息识别问题&#xff0c;本例全网独家提…

MSP430F5529单片机,万年历,闹钟,数字时钟,温湿度dht11,蜂鸣器音乐

文章目录 功能硬件连接实物程序 功能 功能1 万年历显示2 按键修改时间3 按键修改闹钟4 闹钟到达 蜂鸣器鸣叫10秒自动关闭 闹钟是音乐5 温湿度显示6 温度到达28度以上蜂鸣器鸣叫 采用单片机内部的RTC模块走时。 按键1 切换选择年月日时分秒&#xff0c;靠按键1退出时间不会保存…

Openlayers实战:加载google地图

google地图在业界一直是标杆的存在, 其zoomlevel超级大,可看到非常精细的程度。 Openlayers中如何加载谷歌地图呢?同样是XYZ的挂载方式,根据参数的不同,可以显示不同状态的谷歌地图,如果矢量地图,瓦片遥感图片等。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuan…

36. 合并两个排序的链表

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 链接&#xff1a; 链接 题目&#xff1a; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的结点仍然是按照递增排序的。 数据范围 链表长度 [0,500][0,500]。 样例 输入&#x…

第五章 爬虫小程序-实例43-获取网页内容

1、准备工作 用Python编写的访问网页的程序中&#xff0c;有很多是调用 requests 库模块中的函数来进行操作&#xff0c;这个库模块把网页请求和操作等多项功能进行了高度封装&#xff0c;使其可以轻而易举完成浏览器的许多操作。 requests库是第三方模块&#xff0c;需要进行…

【算法与数据结构】239、LeetCode滑动窗口最大值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题我们如果用暴力破解法需要 O ( n ∗ k ) O(n*k) O(n∗k)的复杂度。思索再三&#xff0c;我们需要…

electron-vue 台称串口对接 SerialPort

大致流程 1.首先找一个串口工具&#xff08;sscom5.12.1&#xff09;试试读取串口是否成功连上&#xff1b; 2.创建electron-vue的项目&#xff1b; 3.安装依赖&#xff0c;调整版本&#xff0c;启动项目&#xff1b;&#xff08;在electron中使用串口_electron 串口_Jack_K…

Eclipse控制台输出log4j日志乱码解决

1. 出现乱码可能是编码格式对应不起来&#xff0c;主要是Eclipse控制台编码和log4j编码的匹配 log4j.properties 主要是查看这两个地方编码一致不一致&#xff0c;如果不一致则手动更改成一致编码&#xff0c;GBK或UTF-8

Ribbon 负载均衡服务调用

文章目录 1 SpringCloud Load Balance2 总结:3 Ribbon工作流程&#xff1a;4 自定义Ribbon 负载均衡算法&#xff1a;4.1 iRule接口&#xff1a;4.2 Ribbon自带的负载均衡算法&#xff1a;4.3 负载均衡算法替代&#xff1a;4.3.1、在非启动类包及子包下创建配置类4.3.2、定义4.…

LayUI动态选项卡的使用

目录 一、Tab选项卡 1.什么是Tab选项卡 2.Tab选项卡的作用 二、Tab选项卡的详细使用步骤 1.参考官网&#xff0c;选择自己喜欢的选项卡 ​ 2.将静态选项卡转换成动态选项卡 3.将选项卡的标签名变成实际菜单名 4.重名选项卡不能二次打开 5.切换到指定选项卡 6.iframe的…

Python示例解释观察者模式

观察者模式是一种常用的设计模式&#xff0c;用于在对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。下面通过一个简单的例子来解释观察者模式的概念。 假设我们有一个名为"主题"&a…

神经网络万能近似定理探索与实验

神经网络万能近似定理探索与实验 今天&#xff0c;我们来做神经网络万能近似定理的探索与实验。关于万能近似定理呢&#xff0c;就是说&#xff0c;对这个神经元的输出进行非线性激活函数处理&#xff0c;单层的神经网络就可以拟合任何一个函数。 下面先看我们搭建的第一个网…

docker部署达梦数据库

一、下载安装包 安装步骤&#xff1a; 先跟着网页走 注&#xff1a;第二步导入安装包&#xff0c;如果是在自己电脑上&#xff0c;就不一定要拷贝到/opt目录下&#xff0c;在安装包所在目录地址栏输入cmd&#xff0c;进入终端进行操作即可 操作到正常打印日志&#xff08;如…

java项目之房屋租赁系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的房屋租赁系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

尚硅谷Docker实战教程-笔记14【高级篇,Docker容器监控之CAdvisor+InfluxDB+Granfana、Docker终章总结】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…

centos7.9 连续登录失败处理

如果有人恶意破解你的服务器&#xff0c;下面的操作可以起到一定的作用&#xff0c;连续登录失败锁定账户一段时间&#xff0c;让攻击者的成本增加&#xff0c;从而降低服务器被恶意破解的风险。 参考博客 https://blog.csdn.net/hjxloveqsx/article/details/129004832 https…

MyBatis 中如何使用分页

MyBatis 中如何使用分页 在实际的项目开发中&#xff0c;我们经常需要对数据库中的数据进行分页查询&#xff0c;以提高数据查询的效率和用户体验。MyBatis 是一种流行的 Java 持久层框架&#xff0c;它提供了多种分页查询的方式&#xff0c;本文将介绍其中常用的两种方式&…

MySQL数据库详解

文章目录 引言1. SQL1.1 SQL通用语法1.2 SQL分类1.3 DDL1.3.1 数据库操作1.3.2 表操作1.3.2.1 表操作-查询创建1.3.2.2 表操作-数据类型1.3.2.3 表操作-修改1.3.2.3 表操作-删除 1.4 DML1.4.1 添加数据1.4.2 修改数据1.4.3 删除数据 1.5 DQL1.5.1 基本语法1.5.2 基础查询1.5.3 …

车载以太网之SOME/IP-SD专题篇

前言 首先,请问大家几个小小问题,你清楚: 你知道什么是SOME/IP SD吗?SOME/IP-SD报文是如何发送与接收的呢?SOME/IP-SD 存在哪几种Entry Type呢?SOME/IP-SD内部状态机转换又是如何?今天,我们就来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲: 目录…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…