Nous développons l'interface la plus pratique au monde * pour afficher les journaux

Si vous avez déjà utilisé des interfaces Web pour afficher les journaux, vous avez probablement remarqué comment, en règle générale, ces interfaces sont encombrantes et (souvent) pas très pratiques et réactives. Vous pouvez vous habituer à certains, certains sont absolument terribles, mais il me semble que la raison de tous les problèmes est que nous abordons la tâche de visualisation des journaux de manière incorrecte: nous essayons de créer une interface Web où la CLI (interface de ligne de commande) fonctionne mieux. Personnellement, je suis très à l'aise avec tail, grep, awk et autres, et donc pour moi l'interface idéale pour travailler avec les logs serait quelque chose de similaire à tail et grep, mais qui en même temps pourrait être utilisée pour lire les logs provenant de nombreux serveurs ... C'est, bien sûr, lisez-les sur ClickHouse!



* selon l'opinion personnelle de l'habrapuser tu gères



Rencontrez LogCli



Je n'ai pas trouvé de nom pour mon interface et, pour être honnête, elle existe plutôt sous la forme d'un prototype, mais si vous voulez voir la source tout de suite, alors bienvenue: https://github.com/YuriyNasretdinov/logscli (350 lignes de code Go sélectionné) ...



Capacités



Mon objectif était de créer une interface familière à ceux qui ont l'habitude de tail / grep, c'est-à-dire de prendre en charge les éléments suivants:



  1. Affichez tous les journaux, sans filtrage.
  2. Laissez les chaînes contenant une sous-chaîne fixe (indicateur -Fy grep).
  3. Laissez les lignes correspondant à l'expression régulière (drapeau -Ey grep).
  4. Par défaut, les analyses sont dans l'ordre chronologique inverse, car les journaux les plus récents sont généralement intéressants en premier.
  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