description: 从 Fluent Bit 收集指标

监控

Fluent Bit 带有内置的 HTTP 服务,可用于查询内部信息并监控每个正在运行的插件的指标。

监控接口可以轻松地与 Prometheus 集成,因为我们支持 Prometheus 原生格式。

快速开始

首先,第一步是修改配置文件以启用 HTTP Server:

  1. [SERVICE]
  2. HTTP_Server On
  3. HTTP_Listen 0.0.0.0
  4. HTTP_PORT 2020
  5. [INPUT]
  6. Name cpu
  7. [OUTPUT]
  8. Name stdout
  9. Match *

上面的配置代码片段将指示 Fluent Bit 在 TCP/2020 端口上启动 HTTP Server 并在所有网络接口上进行监听:

  1. $ bin/fluent-bit -c fluent-bit.conf
  2. Fluent Bit v1.4.0
  3. * Copyright (C) 2019-2020 The Fluent Bit Authors
  4. * Copyright (C) 2015-2018 Treasure Data
  5. * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
  6. * https://fluentbit.io
  7. [2020/03/10 19:08:24] [ info] [engine] started
  8. [2020/03/10 19:08:24] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020

现在使用简单 curl 命令就可以收集一些信息:

  1. $ curl -s http://127.0.0.1:2020 | jq
  2. {
  3. "fluent-bit": {
  4. "version": "0.13.0",
  5. "edition": "Community",
  6. "flags": [
  7. "FLB_HAVE_TLS",
  8. "FLB_HAVE_METRICS",
  9. "FLB_HAVE_SQLDB",
  10. "FLB_HAVE_TRACE",
  11. "FLB_HAVE_HTTP_SERVER",
  12. "FLB_HAVE_FLUSH_LIBCO",
  13. "FLB_HAVE_SYSTEMD",
  14. "FLB_HAVE_VALGRIND",
  15. "FLB_HAVE_FORK",
  16. "FLB_HAVE_PROXY_GO",
  17. "FLB_HAVE_REGEX",
  18. "FLB_HAVE_C_TLS",
  19. "FLB_HAVE_SETJMP",
  20. "FLB_HAVE_ACCEPT4",
  21. "FLB_HAVE_INOTIFY"
  22. ]
  23. }
  24. }

请注意,我们正在将 curl 命令输出发送到 jq 程序,这有助于从终端读取 JSON 数据。Fluent Bit 并非旨在进行 JSON 优雅打印。

REST API Interface

Fluent Bit 公开了许多有用的监控接口,从 Fluent Bit v0.14 开始,以下端点可用:

URI Description Data Format
/ Fluent Bit 构建信息 JSON
/api/v1/uptime 以秒和可读的格式获取正常运行的时间 JSON
/api/v1/metrics 已加载插件的内部指标 JSON
/api/v1/metrics/prometheus 可以被 Prometheus 服务获取已加载插件的内部指标 Prometheus Text 0.0.4

Uptime Example

使用以下命令查询服务正常运行时间:

  1. $ curl -s http://127.0.0.1:2020/api/v1/uptime | jq

它应该打印类似如下的输出:

  1. {
  2. "uptime_sec": 8950000,
  3. "uptime_hr": "Fluent Bit has been running: 103 days, 14 hours, 6 minutes and 40 seconds"
  4. }

Metrics Examples

使用以下命令查询 JSON 格式的内部指标:

  1. $ curl -s http://127.0.0.1:2020/api/v1/metrics | jq

it should print a similar output like this:

  1. {
  2. "input": {
  3. "cpu.0": {
  4. "records": 8,
  5. "bytes": 2536
  6. }
  7. },
  8. "output": {
  9. "stdout.0": {
  10. "proc_records": 5,
  11. "proc_bytes": 1585,
  12. "errors": 0,
  13. "retries": 0,
  14. "retries_failed": 0
  15. }
  16. }
  17. }

Metrics in Prometheus format

查询 Prometheus Text 0.0.4 格式的内部指标:

  1. $ curl -s http://127.0.0.1:2020/api/v1/metrics/prometheus

这次,相同的指标将以 Prometheus 格式输出,而不是 JSON

  1. fluentbit_input_records_total{name="cpu.0"} 57 1509150350542
  2. fluentbit_input_bytes_total{name="cpu.0"} 18069 1509150350542
  3. fluentbit_output_proc_records_total{name="stdout.0"} 54 1509150350542
  4. fluentbit_output_proc_bytes_total{name="stdout.0"} 17118 1509150350542
  5. fluentbit_output_errors_total{name="stdout.0"} 0 1509150350542
  6. fluentbit_output_retries_total{name="stdout.0"} 0 1509150350542
  7. fluentbit_output_retries_failed_total{name="stdout.0"} 0 1509150350542

配置别名

默认情况下,在运行时配置的插件会以 plugin_name.ID 的格式获取内部名称。出于监控目的,如果配置了多个相同类型的插件,可能会造成混淆。为了区别,每个配置的输入或输出部分都可以使用别名,它将用作指标的父名称。

下面的示例使用 CPU 输入插件的 INPUT 部分设置别名:

  1. [SERVICE]
  2. HTTP_Server On
  3. HTTP_Listen 0.0.0.0
  4. HTTP_PORT 2020
  5. [INPUT]
  6. Name cpu
  7. Alias server1_cpu
  8. [OUTPUT]
  9. Name stdout
  10. Alias raw_output
  11. Match *

当查询指标时,我们获取到了设置的别名而不是插件的名称:

  1. {
  2. "input": {
  3. "server1_cpu": {
  4. "records": 8,
  5. "bytes": 2536
  6. }
  7. },
  8. "output": {
  9. "raw_output": {
  10. "proc_records": 5,
  11. "proc_bytes": 1585,
  12. "errors": 0,
  13. "retries": 0,
  14. "retries_failed": 0
  15. }
  16. }
  17. }