使用 ClickHouse 和 Grafana 构建高效可观测性方案 - 日志处理
架构设计与代理选择
构建可观测性系统的核心在于合理选择代理(Agent)和聚合器(Aggregator)。以下为几种常用代理技术及其特点:
- OpenTelemetry Collector: 提供了丰富的接收器、处理器和导出器支持,适用于复杂场景。
- Vector: 开源工具,支持多格式输入输出,适合轻量级部署。
- Fluent Bit: 轻量化日志处理器,适合资源受限环境。
代理与聚合器部署
对于小型部署,可以直接将代理部署到数据源附近,通过 HTTP 或原生协议发送数据至 ClickHouse。而在大规模环境中,建议引入聚合器以减少小批量插入,提升性能。
数据模型与表结构设计
合理的数据模型设计对查询效率至关重要。以下是一个示例表结构:
CREATE TABLE logs (
timestamp DateTime64(9),
log_message String,
pod_name LowCardinality(String),
container_id LowCardinality(String),
labels Map(LowCardinality(String), String)
) ENGINE = MergeTree
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (pod_name, timestamp);
此设计利用了 ClickHouse 的列式存储特性,并通过分区和排序键优化查询性能。
代码实现与配置
OpenTelemetry Collector 配置
以下是 OpenTelemetry Collector 的基本配置示例:
receivers:
otlp:
protocols:
grpc:
exporters:
clickhouse:
endpoint: "http://clickhouse-server:8123"
database: "otel"
table: "logs"
service:
pipelines:
logs:
receivers: [otlp]
exporters: [clickhouse]
Vector 配置
Vector 的配置文件可以如下设置:
[sources.in]
type = "kubernetes_logs"
[transforms.parse]
type = "remap"
inputs = ["in"]
source = '''
.pod_name = this.kubernetes.pod_name
del(this.kubernetes)
'''
[sinks.out]
type = "clickhouse"
inputs = ["parse"]
endpoint = "http://clickhouse-server:8123"
table = "vector_logs"
Fluent Bit 配置
Fluent Bit 的配置示例如下:
[INPUT]
Name tail
Path /var/log/containers/*.log
Tag kube.*
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
[OUTPUT]
Name http
Match *
Host clickhouse-server
Port 8123
URI /?query=INSERT%20INTO%20fluent.logs%20FORMAT%20JSONEachRow
查询与可视化
通过 ClickHouse 强大的查询功能,可以轻松实现日志数据的分析。以下是一些常用查询示例:
按时间统计日志数量
SELECT
toStartOfInterval(timestamp, INTERVAL 1 HOUR) AS time_interval,
COUNT(*) AS count
FROM logs
GROUP BY time_interval
ORDER BY time_interval;
查找特定 Pod 的错误日志
SELECT *
FROM logs
WHERE pod_name = 'example-pod' AND log_message LIKE '%ERROR%'
LIMIT 100;
结合 Grafana,可以通过其 ClickHouse 插件实现日志数据的可视化展示。
总结
通过合理选择代理技术并优化数据模型设计,可以显著提升基于 ClickHouse 的可观测性系统的性能和可维护性。未来文章将进一步探讨指标和追踪数据的集成及优化策略。