我们使用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模块(默认情况下)将所有syslog消息插入名为“systemevents”的表中,该表具有以下结构:
┌─severity─┬─facility─┬───────────timestamp─┬─hostname─────────────────┬─tag────────────┬─message──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 6 │ 18 │ 2020-06-06 15:01:00 │ reverseproxy.fqdn │ haproxy[6892]: │ 1.2.3.4:57220 [06/Jun/2020:15:00:59.996] HTTPS~ HAPBACKEND/HAPSRV 15/0/1/2/18 500 617 - - ---- 48/42/9/9/0 0/0 "POST /SOAPService HTTP/1.1" │
└──────────┴──────────┴─────────────────────┴──────────────────────────┴────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(我们不想开发定制的rsyslog解析c模块)
出于报告目的,我们感兴趣的是syslog消息字段中包含的haproxy(或kong)详细信息,而不是整个syslog内容本身。因此,为了获得“细粒度”查询功能,我们创建了另一个表,称为“haproxy\u logs”,其结构如下:
(`CLIENT_IP` String, `CLIENT_PORT` Int32, `REQUEST_DATE` DateTime, `FRONTEND_NAME` String, `BACKEND_NAME` String, `SERVER_NAME` String, `TREQ` Int32, `TWAIT` Int32, `TCONNECTION` Int32, `TRESPONSE` Int32, `TACTIVE` Int32, `STATUS_CODE` Int32, `BYTES_READ` Int32, `CAPTURED_REQUEST_COOKIE` String, `CAPTURED_RESPONSE_COOKIE` String, `TERMINATION_STATE` String, `ACTCONN` Int32, `FECONN` Int32, `BECONN` Int32, `SRV_CONN` Int32, `RETRIES` Int32, `SRV_QUEUE` Int32, `BACKEND_QUEUE` Int32, `METHOD` String, `REQUEST` String, `PARAMETERS` String, `PROTOCOL` String) ENGINE = MergeTree() PARTITION BY toYYYYMM(REQUEST_DATE) ORDER BY (REQUEST_DATE, TRESPONSE, STATUS_CODE, PARAMETERS) SETTINGS index_granularity = 8192
这就是事情开始变得更奇怪的地方。。。clickhouse本身似乎也没有提供某种调度器,à la mssql,也不是将编程语言嵌入引擎的方法(pl/pgsql,pl/python-like),也不是触发器(我们还没有研究物化视图)。因此,为了将数据从一个表转换并移动到另一个表,cron每分钟都会启动一个shell脚本,使用clickhouse client获取输入数据,通过管道将其传输到python脚本,然后python脚本的结果再次通过管道传输到clickhouse client进行插入:
* * * * * { /usr/bin/clickhouse-client < /path/clkh/extract-system-events.sql | /path/clkh/latestmessages-to-TSV-pipe.py 2>/path/clkh/errors-haproxy.log ; } |/usr/bin/clickhouse-client --query="INSERT INTO HAPROXY_LOGS FORMAT TSV" >> /var/log/latestmessages-to-TSV-pipe.log
python脚本对于haproxy和kong解析是不同的。
听起来像个肮脏的黑客。。。
有没有更好的方法来完成同样的事情?
(尽管有这种黑客攻击,但整个程序运行良好,报告生成时间大大缩短,clickhouse存储了6亿多行,没有任何问题。)
谢谢
1条答案
按热度按时间um6iljoc1#
我认为在clickhouse之外转换数据是正确的方法。
尽管如此,ch还是可以独当一面。例如,让我们考虑一下json日志,它将使用物化视图和一组丰富的json相关函数):
测试数据集: