我们使用 Clickhouse 来存储 HAProxy 和 Kong 日志和指标。
“管道”是围绕 syslog 协议和 rsyslog 构建的,如下所示:HAProxy/Kong -> local rsyslog -> remote rsyslog (TCP) -> omclickhouse rsyslog module -> clickhouse。
系统日志消息的格式当然在 HAProxy 和 Kong 之间有所不同。
HAProxy 消息如下所示:
1.2.3.4:58629 [06/Jun/2020:14:54:59.932] HTTPS~ HAPBACKEND/HAPSERVER 0/0/1/36/37 200 778 - - ---- 32/32/1/1/0 0/0 "GET /api/map/v2/GetSomeStuff/json?Latitude=47.22960133109915&Longitude=-1.5727845858797176 HTTP/1.1"
如此处所述:https ://cbonte.github.io/haproxy-dconv/1.7/configuration.html#8.2.3 ,
Kong 消息是基于 JSON 的,看起来像这样:
{
"request": {
"method": "GET",
"uri": "/get",
"url": "http://httpbin.org:8000/get",
"size": "75",
"querystring": {},
"headers": {
"accept": "*/*",
"host": "httpbin.org",
"user-agent": "curl/7.37.1"
},
"tls": {
"version": "TLSv1.2",
如此处所述:https ://docs.konghq.com/hub/kong-inc/syslog/
rsyslog omclickhouse 模块(默认情况下)将所有系统日志消息插入名为“SystemEvents”的表中,该表具有以下结构:
出于报告目的,我们对 syslog 消息字段中包含的 HAProxy(或 Kong)详细信息感兴趣,而不是整个 syslog 内容本身。因此,为了能够获得“细粒度”查询功能,我们创建了另一个表,比如“HAPROXY_LOGS”,其结构如下:
这就是事情开始变得更奇怪的地方……Clickhouse 本身似乎既不提供某种调度程序,就像 MSSQL,也不提供将编程语言嵌入引擎的方法(PL/pgSQL,PL/ Python - like),也不是触发器(我们还没有研究物化视图)。因此,为了将数据从一个表转换和移动到另一个表,cron 每分钟启动一个 shell 脚本,使用 clickhouse-client 获取输入数据,将其通过管道传输到 Python 脚本,然后其结果本身再次通过管道传输到 clickhouse -插入客户端:
HAProxy 和 Kong 解析的 Python 脚本不同。
听起来像一个肮脏的黑客...
有没有更好的方法来完成同样的事情?
(尽管有这个 hack,但整个东西工作得很好,报告构建时间减少了一个很大的因素,Clickhouse 存储 600M+ 行没有任何问题。)
慕斯王
相关分类