Wir entwickeln die weltweit bequemste * Oberfläche zum Anzeigen von Protokollen

Wenn Sie jemals Webschnittstellen zum Anzeigen von Protokollen verwendet haben, haben Sie wahrscheinlich bemerkt, dass diese Schnittstellen in der Regel umständlich und (oft) nicht sehr bequem und reaktionsschnell sind. Sie können sich an einige gewöhnen, andere sind völlig schrecklich, aber es scheint mir, dass der Grund für alle Probleme darin besteht, dass wir uns der Aufgabe nähern, Protokolle falsch anzuzeigen: Wir versuchen, eine Weboberfläche zu erstellen, in der die CLI (Befehlszeilenschnittstelle) besser funktioniert. Ich persönlich bin sehr zufrieden mit Tail, Grep, Awk und anderen, und daher wäre für mich die ideale Schnittstelle für die Arbeit mit Protokollen etwas Ähnliches wie Tail und Grep, das aber gleichzeitig zum Lesen von Protokollen verwendet werden könnte, die von vielen Servern stammen ... Das heißt natürlich, lesen Sie sie von ClickHouse!



* nach persönlicher Meinung des Habrapusers youROCK



Treffen Sie logscli



Ich habe keinen Namen für meine Benutzeroberfläche gefunden, und um ehrlich zu sein, existiert er eher in Form eines Prototyps. Wenn Sie jedoch die Quelle sofort sehen möchten, begrüßen Sie: https://github.com/YuriyNasretdinov/logscli (350 Zeilen ausgewählten Go-Codes) ...



Fähigkeiten



Mein Ziel war es, eine Oberfläche zu schaffen, die denjenigen vertraut erscheint, die es gewohnt sind, Tail / Grep zu verwenden, dh die folgenden Dinge zu unterstützen:



  1. Alle Protokolle anzeigen, ohne zu filtern.
  2. Belassen Sie Zeichenfolgen mit einem festen Teilstring ( -Fy- Flag grep).
  3. Belassen Sie die Zeilen, die dem regulären Ausdruck entsprechen (Flag -Ey grep).
  4. Standardmäßig sind die Scans in umgekehrter chronologischer Reihenfolge, da die neuesten Protokolle normalerweise zuerst von Interesse sind.
  5. ( -A, -B -C grep, N , , ).
  6. , ( tail -f | grep).
  7. 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 . , , , .



Amazon ClickHouse

:



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.




All Articles