# 一、基础概念 ## 1.1 Fluent Bit   [Fluent Bit](https://fluentbit.io/)​​ 是一个开源的、轻量级、高性能的日志处理器和转发器。Fluent Bit 的核心任务是:​​**从各种来源收集日志、指标和追踪数据,进行处理和过滤,然后将其发送到一个或多个目的地。​** ### 1.1.1 特点 1. 极致的轻量级​ Fluent Bit 是用 C 语言编写的,运行时内存占用极低(通常只有几百 KB),CPU 使用率也非常低。这使得它成为在资源受限环境(如边缘计算、IoT 设备、容器侧车)中运行的理想选择。 2. 高性能​ 其核心架构经过高度优化,处理数据的速度极快,能够轻松应对高吞吐量的日志流。 3. 可插拔架构​ Fluent Bit 的功能通过“插件”来扩展。 ### 1.1.2 插件类型 1. ​​Input(输入)​​ 定义数据来源,例如从文件、标准输入、TCP/UDP、系统指标(CPU/内存)、Docker 容器、Windows 事件日志等收集数据。 2. Filter(过滤器)​​ 在数据传递过程中进行处理,例如解析(如将非结构化文本解析为 JSON)、丰富(如添加 Kubernetes 元数据)、修改(如重命名字段)、采样等。 3. Output(输出)​​ 定义数据目的地,例如 Elasticsearch、Splunk、Kafka、Datadog、Loki、S3、另一个 Fluentd/Fluent Bit 实例等。 ### 1.1.3 核心架构与数据流 1. Input(输入)​ 一个或多个输入插件持续地从数据源收集数据。每条数据被读入后,会带上时间戳和标签等信息,被包装成一个内部的事件记录。 2. ​​Parser(解析器)​ (可选)输入插件可以使用解析器,将非结构化的日志数据(如 Nginx 访问日志)转换为结构化的 JSON 格式。 3. ​​Filter(过滤) (可选)数据会经过一个或多个过滤器插件。这些插件可以修改、丰富或删除记录。过滤器是按顺序执行的。 4. ​​Router(路由) 根据每条记录的标签(Tag),路由器将其匹配到相应的输出插件。一个记录可以被路由到多个输出(多路复用)。 5. ​​Buffer(缓冲) 在发送到输出之前,数据可能会在内存或文件系统中进行缓冲。 6. ​​Output(输出) 最终,输出插件将处理好的数据发送到配置的目的地。 ## 1.2 OpenObserve   [OpenObserve](https://openobserve.ai/)​​ 是一个开源的、云原生的可观测性数据平台,旨在处理日志、指标、追踪和性能数据。它的目标是成为 ​​Elasticsearch/Logstash/Kibana (ELK)​​、​​Grafana Loki​​ 和 ​​Datadog​​ 等流行解决方案的​​更简单、更经济高效、更高性能​​的替代品。   OpenObserve 是一个“一体化”的平台,你可以将所有的可观测性数据(日志、指标、追踪)都发送到它这里,然后通过统一的界面进行搜索、分析和可视化。 # 二、Docker部署 ```yml services: fluent-bit: image: fluent/fluent-bit:4.0.7 container_name: fluent-bit restart: unless-stopped volumes: - ./fluent-bit/config:/fluent-bit/etc ports: - "24422:24422" environment: - TZ=Asia/Shanghai networks: - devops openobserve: image: public.ecr.aws/zinclabs/openobserve:v0.14.0 container_name: openobserve restart: unless-stopped volumes: - ./openobserve-data:/data environment: - ZO_ROOT_USER_EMAIL=1556464090@qq.com - ZO_ROOT_USER_PASSWORD=19940822Cxx - TZ=Asia/Shanghai ports: - "5080:5080" networks: - devops networks: devops: driver: bridge volumes: openobserve-data: driver: local ```   fluent bit配置文件: ```conf [SERVICE] Flush 5 Log_Level info Daemon off Parsers_File parsers.conf [INPUT] Name forward Listen 0.0.0.0 Port 24422 Tag external [OUTPUT] Name http Match * Host openobserve Port 5080 URI /api/default/default/_json http_user 1556464090@qq.com http_passwd 19940822Cxx Format json json_date_key timestamp json_date_format iso8601 ```   INPUT为日志输入源,监听24422端口。   OUTPUT为日志输出源,将日志发送到openobserve中(这里使用的是容器名称),URI表示openobserve接收数据的api路径,default/default表示组织名称/流名称,可以更改为其他的名称。_json表示以json的格式。 # 三、简单使用 ## 3.1 配置数据流   打开控制台,选择数据流->添加数据流,输入fluent bit配置文件中的流名称,选择数据流类型为Logs。   在新添加的数据流中,点击查看,跳转到日志页面即可看到上次的日志信息。   如果没有日志请检查FluentBit容器日志是否有错误,正确的应该会有上传成功的提示。 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/a2cfe735a9245758daf6ea36a4c82f04.png '配置数据流.png') ## 3.2 配置邮件告警   首先需要配置模板和邮箱地址。   修改docker-compose.yml文件,添加邮件服务器: ```yml openobserve: image: public.ecr.aws/zinclabs/openobserve:v0.14.0 container_name: openobserve restart: unless-stopped volumes: - ./openobserve-data:/data environment: - ZO_ROOT_USER_EMAIL=njcxx0822@163.com - ZO_ROOT_USER_PASSWORD=19940822Cxx - TZ=Asia/Shanghai - ZO_SMTP_ENABLED=true - ZO_SMTP_HOST=smtp.163.com - ZO_SMTP_PORT=25 - ZO_SMTP_USER_NAME=njcxx0822@163.com - ZO_SMTP_PASSWORD=NBZzx6jXtZ2G6wrB - ZO_SMTP_FROM_EMAIL=njcxx0822@163.com #- ZO_SMTP_ENCRYPTION=starttls ports: - "5080:5080" networks: - devops ```   这里配置587端口会有问题,使用了25端口,并且去掉了安全认证。   注意配置的邮件地址需要和用户名一致。   打开控制台,选择右上角的设置按钮,选择模板->添加模板->Email,填写标题和Body: ```json [Alert: {alert_name}] - Severity: {alert_type} ``` ```json [ { "labels": { "alertname": "{alert_name}", "stream": "{stream_name}", "organization": "{org_name}", "alerttype": "{alert_type}", "severity": "critical" }, "annotations": { "timestamp": "{timestamp}" } } ] ``` ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/2b747fa01dd59a6dbd3da8d2cb3579f8.png '邮箱模板.png')   **注:这里的`{}`里面的内容需要和日志里面的字段保持一致。**   选择地址->添加地址->Email,选择刚才的模板,并填写收件人。 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/352d69738b7325637e5716425757ac87.png '邮箱地址.png')   配置完模板和地址后,选择告警->添加告警,例如可以选择当有level='critical',并且出现1次时,触发报警,并通知到指定邮箱。 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/05200db676132fd43d3346099facee1b.png '邮箱告警.png')   周期:监控数据的时间窗口范围,即每次检查告警条件时,回溯多长时间的监控数据。如果周期 = 5分钟:每次检查时,分析最近 5 分钟的日志/指标数据。   频率:告警规则检查的时间间隔,即每隔多久执行一次告警条件判断。   通知后静默:触发告警并发送通知后,系统暂时停止重复通知的时间。   也可以设置为实时告警,即当告警发生时就立即触发,不会有周期和频率参数设置。 ## 3.3 配置WebHook   首先配置模板和WebHook地址。   打开控制台,选择右上角的设置按钮,选择模板->添加模板->Web Hook,填写Body: ```json { "msgtype": "markdown", "markdown": { "content": "alertname: {alert_name} timestamp:{timestamp}" } } ``` ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/5c6514f9d689f55aa1bf74f75f5ea806.png 'WebHook模板.png')   选择地址->添加地址->WebHook,选择刚才的模板,并填写URL。   这里可以使用企业微信的群消息推送功能,添加成功后,会提供一个WebHook地址。也可以自定义一个WebHook接收地址。   配置完模板和地址后,选择告警->添加告警,选择通知到刚才的WebHook地址即可。 ## 3.4 通过API获取日志信息   通过http://ip:5080/swagger/index.html#/ 即可访问OpenobserveAPI接口。   例如要获取日志,可以使用/api/{origin_id}/_search的接口: ```cmd curl -X 'POST' \ 'http://127.0.0.1:5080/api/default/_search' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "query": { "end_time": 1759115401962000, "from": 0, "size": 10, "sql": "select * from default", "start_time": 1759029001962000 } }' ```   注意这里要加上Basic auth认证,并提供username和password。 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/d29ddbd369e32cb7c2770464e8d0a142.png 'API查看日志.png') # 四、自定义日志告警服务 ![暂无图片](https://cxx0822.iepose.cn/rustfs/blog/74d5efdb80f506395b81988258433d9d.png '日志框架.png')   基本原理为通过提供一个HTTP的API接口,当Openobserver触发告警时,调用该接口,并传入当前的alert_name和timestamp,然后根据timestamp和Openobserver提供的API接口去查询最近一段时间内的所有日志信息,并存储到SqLite数据库中。同时也可以选择是否同步推送到企业微信和邮箱。   最后也需要提供一个查询历史日志告警信息的接口,并可视化显示,方便运维和开发查看。   自定义服务参考代码:[log-alert-service](https://cxxgit.iepose.cn/Cxx0822/log-alert-service)