此博客文章是系列的一部分
简介
ClickHouse 已经成为接收日志的流行后端,例如 Uber 将这款速度极快的数据库纳入其基础设施后。所有数据存储都面临一个共同的挑战,即如何从各种来源提取数据。幸运的是,云原生计算基金会 (CNCF) 项目 Fluent Bit 已经为许多后端(例如 Amazon)解决了这个问题。Fluent Bit 是一个超快、轻量级且高度可扩展的日志和指标处理器和转发器。
在本博客中,我们将介绍如何在 5 分钟内设置 Fluent Bit 将日志路由到 Clickhouse。在我们的下一篇文章中,我们将展示收集和丰富来自 Kubernetes 的日志的日常可观察性用例。
环境
- 同时运行 Clickhouse 和 Calypita Fluent Bit(由创建者提供的 Fluent Bit 的 LTS 版本)的 Ubuntu 20.04 LTS
- Fluent Bit v1.9.9
对于 ClickHouse,我们建议尝试使用我们的无服务器 ClickHouse Cloud,它提供慷慨的免费试用,足以满足本博客文章的要求。或者,所有说明都应与大于 22.6 的自管理版本兼容。
创建 ClickHouse 数据库和表
我们的第一步是在 ClickHouse 中创建一个数据库,我们将在此存储日志。我们可以通过 clickhouse-client 或通过您的 ClickHouse Cloud 控制台运行以下命令
CREATE DATABASE fluentbit
请注意,JSON 类型 目前在 ClickHouse 核心数据库中处于实验阶段,并且默认情况下在 ClickHouse Cloud 中未启用。如果用户希望在 ClickHouse Cloud 中使用此功能,他们可以在启动服务后打开支持案例。
创建数据库后,我们需要通过实验性标志 allow_experimental_object_type
启用 JSON 对象类型
SET allow_experimental_object_type = 1
设置完毕后,我们可以使用提供的结构创建表。这将创建一个包含所有 JSON 对象的字段 log
。
CREATE TABLE fluentbit.jsonlogs ( timestamp DateTime, log JSON ) Engine = MergeTree ORDER BY tuple()
创建完毕后,我们可以配置 Fluent Bit 发送数据。
在 Ubuntu 上配置 Fluent Bit
以下说明使用 Fluent Bit 的开源版本。如果您有兴趣使用具有更多高级功能的 LTS 版本,请在此处找到有关 Calyptia 产品的更多信息 here.
为了举例说明,我们发送基本的 Nginx 访问日志,并假设用户使用 Ubuntu 系统。对于其他系统,说明请参考 here
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
这将安装 Fluent Bit 到 /opt/fluent-bit。如果您需要一些测试 Nginx 访问日志,您可以从 here 下载一系列模拟访问日志,并将它们放置在 /var/log/access.log
下。
sudo wget -O /var/log/access.log https://gist.githubusercontent.com/agup006/b936d299c11b60283bdaf05a12e334eb/raw/b87905c7ea1e21745dba87233666135ee61d0087/apache-access.log
sudo chmod a+r /var/log/access.log
作为对 Fluent Bit 配置的概述,我们指定了一组 输入、过滤器 和 输出。在输入端,我们将指定 tail
插件,该插件将读取访问日志并使用众所周知的格式进行解析。
解析这些日志后,我们将使用 Fluent Bit 嵌套过滤器 将所有字段嵌套在字段“log”下,使 ClickHouse 能够识别包含 JSON 对象 的字段。
最后但并非最不重要的是,我们将使用 Fluent Bit 的 HTTP 输出 插件将这些日志路由到 ClickHouse,并使用一些参数。从 URI 中可以看出,我们使用了之前创建的数据库和表。
Fluent Bit 配置
注意:我们还需要指定默认用户的密码,以便 Fluent Bit 使用 HTTP 基本身份验证。对于 ClickHouse Cloud,我们指定端口 8443,并通过 tls on
参数启用 SSL。使用自管理 ClickHouse 的用户可能需要使用端口 8143(如果您的集群不安全)。您还需要显式设置 http 的使用情况,即 tls off
参数。
将以下配置文件追加到 /etc/fluent-bit/fluent-bit.conf
。
[INPUT] name tail path /var/log/access.log read_from_head true parser nginx_access [FILTER] Name nest Match * Operation nest Wildcard * Nest_under log [OUTPUT] name http tls on match * host port 8443 URI /?query=INSERT+INTO+fluentbit.jsonlogs+FORMAT+JSONEachRow format json_stream json_date_key timestamp json_date_format epoch http_user default http_passwd
如果使用 ClickHouse Cloud,您的凭据将在创建集群时提供,即
使用以下命令运行 Fluent Bit,并将日志发送到 ClickHouse
/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
在 ClickHouse 中搜索日志
在 ClickHouse 中,我们可以运行以下命令来查看日志的实际情况。如果没有 FORMAT 选项,我们只会看到 JSON 的值。
SET output_format_json_named_tuples_as_objects = 1 SELECT * FROM fluentbit.jsonlogs FORMAT JSONEachRow
现在将这些日志存储在 ClickHouse 中的一个优势是,我们可以运行临时查询进行分析,而无需指定任何模式。使用 DESCRIBE 命令(设置 describe_extend_object_types
),我们可以发现 jsonlogs 表中可用的字段。
DESCRIBE TABLE fluentbit.jsonlogs FORMAT Vertical SETTINGS describe_extend_object_types = 1 Row 1: ────── name: timestamp type: DateTime default_type: default_expression: comment: codec_expression: ttl_expression: Row 2: ────── name: log type: Tuple(agent String, code String, host String, method String, path String, referer String, remote String, size String, user String) default_type: default_expression: comment: codec_expression: ttl_expression: 2 rows in set. Elapsed: 0.001 sec.
我们可以运行以下命令来了解返回了多少个错误代码 - 请注意我们如何通过其点分隔的 json 路径访问代码字段。
SELECT count(log.code) AS count, log.code AS code FROM fluentbit.jsonlogs GROUP BY log.code ┌─count─┬─code─┐ │ 26 │ 301 │ │ 9 │ 500 │ │ 397 │ 200 │ │ 17 │ 404 │ └───────┴──────┘ 4 rows in set. Elapsed: 0.003 sec.
对于有兴趣可视化这些日志的用户,我们建议使用 Grafana 和官方支持的 ClickHouse 插件。有关更多详细信息,请参考 here,其中包含在本博客文章结尾处可视化 JSON 日志的示例 earlier post。下面我们在 Grafana 的日志视图中显示了上述数据。
注意:确保您的 Grafana 实例可以访问您的 ClickHouse Cloud 服务,并具有适当的 IP 访问列表规则。
总结
在本博客文章中,我们使用 Fluent Bit 和 JSON 类型将 Nginx 日志加载到 ClickHouse 中。在本系列的下一篇文章中,我们将探讨收集 Kubernetes 日志的常见可观察性用例。
如果您对最新技术充满热情,并且对开源充满热情,我们目前正在招聘 集成团队 的成员,期待您的加入。