Se você já usou interfaces da web para visualizar logs, provavelmente notou como, como regra, essas interfaces são complicadas e (frequentemente) não muito convenientes e responsivas. Você pode se acostumar com alguns, alguns são completamente horríveis, mas me parece que o motivo de todos os problemas é que abordamos a tarefa de visualizar os logs de forma incorreta: estamos tentando criar uma interface web onde a CLI (interface de linha de comando) funcione melhor. Pessoalmente, estou muito confortável trabalhando com tail, grep, awk e outros e, portanto, para mim, a interface ideal para trabalhar com logs seria algo semelhante a tail e grep, mas que ao mesmo tempo poderia ser usado para ler logs que vieram de muitos servidores ... Isto é, é claro, leia-os na ClickHouse!
* de acordo com a opinião pessoal do habrapuser você é demais
Conheça o logscli
Não criei um nome para minha interface e, para ser honesto, ela existe na forma de um protótipo, mas se você quiser ver a fonte imediatamente, seja bem-vindo: https://github.com/YuriyNasretdinov/logscli (350 linhas de código Go selecionado) ...
Capacidades
Meu objetivo era fazer uma interface que parecesse familiar para aqueles que estão acostumados com tail / grep, ou seja, para suportar as seguintes coisas:
- Veja todos os registros, sem filtragem.
- Deixe as strings contendo uma substring fixa (sinalizador
-F
ygrep
). - Deixe as linhas correspondentes à expressão regular (sinalizador
-E
ygrep
). - Por padrão, as varreduras estão em ordem cronológica reversa, uma vez que os registros mais recentes geralmente são de interesse primeiro.
- (
-A
,-B
-C
grep
, N , , ). - , (
tail -f | grep
). -
less
,head
,tail
— ; , ;SIGPIPE
, ,tail
,grep
UNIX-.
, - ClickHouse. , lsd kittenhouse, .
. , . , — , ClickHouse ( ~1 ).
, :
CREATE TABLE logs(
category LowCardinality(String), -- ()
time DateTime, --
millis UInt16, -- ( , ..): , ,
..., -- , , ,
message String --
) ENGINE=MergeTree()
ORDER BY (category, time, millis)
, - , , Amazon 2015 . , , , .
:
CREATE TABLE amazon(
review_date Date,
time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),
millis UInt16 DEFAULT rand() % 1000,
marketplace LowCardinality(String),
customer_id Int64,
review_id String,
product_id LowCardinality(String),
product_parent Int64,
product_title String,
product_category LowCardinality(String),
star_rating UInt8,
helpful_votes UInt32,
total_votes UInt32,
vine FixedString(1),
verified_purchase FixedString(1),
review_headline String,
review_body String
)
ENGINE=MergeTree()
ORDER BY (time, millis)
SETTINGS index_granularity=8192
, , .
tsv- ~10-20, , 16 . TSV- :
for i in *.tsv; do
echo $i;
tail -n +2 $i | pv |
clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'
done
Persistent Disk ( HDD) Google Cloud 1000 ( , , , SSD ) ~75 / 4 .
- , Google,
, , .
ClickHouse full scan , , , . HTTP- , HTTP: send_progress_in_http_headers=1
. , Go , HTTP 1.0 ( 1.1!) ClickHouse, TCP- ClickHouse, GET /?query=... HTTP/1.0\n\n
- , .
ClickHouse
ClickHouse ( 2019 ?) ORDER BY,
SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC
, message "something", .
, , ClickHouse , , . cancel_http_readonly_queries_on_client_close=1
.
SIGPIPE Go
, , some_cmd | head -n 10
, some_cmd
, head
10 ? : head
, pipe , stdout some_cmd , , «». some_cmd
pipe, SIGPIPE, .
Go , SIGPIPE "signal: SIGPIPE" , , SIGPIPE , , :
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
<-ch
os.Exit(0)
}()
, - (, , ), grep
-A, -B -C, , , .
, ClickHouse, , , ( , ):
SELECT time,millis,review_body FROM amazon
WHERE (time = '_' AND millis < _) OR (time < '_')
ORDER BY time DESC, millis DESC
LIMIT __
SETTINGS max_threads=1
, ClickHouse , CPU ( ~6 ).
, () , , timestamp, .
logscli ?
Amazon, , :
# , walmart
$ logscli -F 'walmart' | less
# 10 , "terrible"
$ logscli -F terrible -limit 10
# -limit:
$ logscli -F terrible | head -n 10
# , /times [0-9]/, vine
$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less
# "panic" 3
$ logscli -F 'panic' -C 3 | less
# "5-star"
$ logscli -F '5-star' -tailf
( ) github https://github.com/YuriyNasretdinov/logscli. ClickHouse.