የምዝግብ ማስታወሻዎችን ለመመልከት በዓለም ላይ በጣም ምቹ የሆነ በይነገጽ እየገነባን ነው።

የምዝግብ ማስታወሻዎችን ለመመልከት በዓለም ላይ በጣም ምቹ የሆነ በይነገጽ እየገነባን ነው። ምዝግብ ማስታወሻዎችን ለማየት የድር በይነገጾችን ተጠቅመው የሚያውቁ ከሆነ፣ እንደ ደንቡ፣ እነዚህ በይነገጾች እንዴት አስቸጋሪ እና (ብዙውን ጊዜ) በጣም ምቹ እና ምላሽ ሰጪ እንዳልሆኑ አስተውለው ይሆናል። አንዳንዶቹን ልታለማመዷቸው ትችላላችሁ, አንዳንዶቹ በጣም አስፈሪ ናቸው, ነገር ግን የችግሮች ሁሉ ምክንያት ለእኔ ይመስላል የምዝግብ ማስታወሻዎችን የመመልከት ተግባር በስህተት መቅረብ ነው: እኛ የድረ-ገጽ በይነገጽ ለመፍጠር እንሞክራለን CLI (የትእዛዝ መስመር በይነገጽ) የተሻለ ይሰራል። እኔ በግሌ ከጅራት ፣ grep ፣ awk እና ሌሎች ጋር ለመስራት በጣም ተመችቶኛል ፣ እና ስለዚህ ለእኔ ከሎግ ጋር ለመስራት ጥሩው በይነገጽ ከጅራት እና grep ጋር ተመሳሳይ የሆነ ነገር ሊሆን ይችላል ፣ ግን ከብዙ አገልጋዮች የመጡ ምዝግብ ማስታወሻዎችን ለማንበብም ሊያገለግል ይችላል። ያ፣ በእርግጥ፣ ከ ClickHouse ያንብቧቸው!

* እንደ ሀብራ ተጠቃሚው የግል አስተያየት የእርስዎ ROCK

ይተዋወቁ logscli

ለበይነገጽ ስም አላመጣሁም ፣ እና እውነቱን ለመናገር ፣ ይልቁንም በፕሮቶታይፕ መልክ አለ ፣ ግን ወዲያውኑ የምንጭ ኮዱን ማየት ከፈለጉ ፣ እንግዲያውስ እንኳን ደህና መጡ። https://github.com/YuriyNasretdinov/logscli (የተመረጠው የ Go code 350 መስመሮች)።

ባህሪዎች

ግቤ ለጅራት / ግሬፕ ለሚጠቀሙት ማለትም የሚከተሉትን ነገሮች ለመደገፍ የተለመደ የሚመስል በይነገጽ መስራት ነበር።

  1. ሁሉንም ምዝግብ ማስታወሻዎች ሳያጣራ ይመልከቱ።
  2. ቋሚ ንዑስ ሕብረቁምፊ (ባንዲራ.) የያዙ መስመሮችን ይተዉ -F у grep).
  3. ከመደበኛው አገላለጽ ጋር የሚዛመዱ መስመሮችን ይተው (ባንዲራ -E у grep).
  4. በነባሪነት፣ የቅርብ ጊዜዎቹ ምዝግብ ማስታወሻዎች ብዙውን ጊዜ የሚስቡ በመሆናቸው እይታው በተቃራኒው የዘመን ቅደም ተከተል ነው።
  5. ከእያንዳንዱ መስመር ቀጥሎ ያለውን አውድ አሳይ (አማራጮች -A, -B и -C у grep, N መስመሮችን በፊት, በኋላ እና በእያንዳንዱ ተዛማጅ መስመር ዙሪያ, በቅደም ተከተል ማተም).
  6. ገቢ ምዝግብ ማስታወሻዎችን በማጣራት ወይም ያለማጣራት በቅጽበት ይመልከቱ (በዋናነት tail -f | grep).
  7. በይነገጹ ከ ጋር ተኳሃኝ መሆን አለበት። less, head, tail እና ሌሎች - በነባሪ, ውጤቶቹ ቁጥራቸው ላይ ገደብ ሳይደረግ መመለስ አለባቸው; ተጠቃሚው እነሱን ለመቀበል ፍላጎት እስካለ ድረስ መስመሮች እንደ ዥረት ታትመዋል; ምልክት SIGPIPE ልክ እንደሚያደርጉት የምዝግብ ማስታወሻ ዥረት በፀጥታ ማቋረጥ አለበት። tail, grep እና ሌሎች UNIX መገልገያዎች.

ትግበራ

ምዝግብ ማስታወሻዎችን ወደ ClickHouse እንዴት ማድረስ እንደሚችሉ አስቀድመው ያውቃሉ ብዬ እገምታለሁ። ካልሆነ, እንዲሞክሩት እመክራለሁ ኤልኤስዲ и የድመት ቤት, እንዲሁም ይህ ጽሑፍ ስለ ሎግ መላክ.

በመጀመሪያ በመሠረታዊ መርሃግብሩ ላይ መወሰን ያስፈልግዎታል. አብዛኛውን ጊዜ ምዝግብ ማስታወሻዎችን በጊዜ የተደረደሩ መቀበል ስለሚፈልጉ፣ በዚያ መንገድ ማከማቸት ምክንያታዊ ይመስላል። ብዙ የምዝግብ ማስታወሻ ምድቦች ካሉ እና ሁሉም ተመሳሳይ ከሆኑ ፣ ከዚያ የምዝግብ ማስታወሻ ምድብ እንደ ዋናው ቁልፍ የመጀመሪያ አምድ ማድረግ ይችላሉ - ይህ ከበርካታ ይልቅ አንድ ጠረጴዛ እንዲኖርዎት ይፈቅድልዎታል ፣ ይህም ትልቅ ሲደመር ይሆናል ። ወደ ClickHouse ውስጥ ማስገባት (ሃርድ ድራይቭ ባላቸው አገልጋዮች ላይ መረጃን በሰከንድ ከ ~ 1 ጊዜ በላይ ማስገባት ይመከራል) ለአገልጋዩ በሙሉ).

ማለትም ፣ በግምት የሚከተለውን የሰንጠረዥ እቅድ እንፈልጋለን።

CREATE TABLE logs(
    category LowCardinality(String), -- категория логов (опционально)
    time DateTime, -- время события
    millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
    ..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
    message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)

እንደ አለመታደል ሆኖ፣ ጨብጬ ማውረድ የምችላቸው እውነተኛ ምዝግብ ማስታወሻ ያላቸው ክፍት ምንጮችን ወዲያውኑ ማግኘት አልቻልኩም፣ ስለዚህ ይህንን በምትኩ እንደ ምሳሌ ወሰድኩት። ከ2015 በፊት የአማዞን ምርቶች ግምገማዎች. እርግጥ ነው, የእነሱ መዋቅር ከጽሑፍ ምዝግብ ማስታወሻዎች ጋር ተመሳሳይ አይደለም, ነገር ግን ለማብራራት ይህ አስፈላጊ አይደለም.

የአማዞን ግምገማዎችን ወደ 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

በአማዞን የውሂብ ስብስብ ውስጥ ለግምገማ የሚሆን ቀን ብቻ ነው, ነገር ግን ትክክለኛ ጊዜ የለም, ስለዚህ ይህን ውሂብ በራንዶን እንሞላው.

ከ10 ጂቢ ራም ጋር የማይገጣጠም ትልቅ መጠን ያለው መረጃ ለማግኘት ሁሉንም የtsv ፋይሎችን ማውረድ እና እራስዎን በመጀመሪያ ~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

በ1000 ጂቢ መጠን ጎግል ክላውድ ውስጥ በመደበኛ ቋሚ ቋሚ ዲስክ (ኤችዲዲ ነው) (ይህን መጠን የወሰድኩት በዋናነት ፍጥነቱ ትንሽ ከፍ እንዲል ነው፣ ምንም እንኳን ምናልባት የሚፈለገው መጠን ያለው ኤስኤስዲ ርካሽ ሊሆን ይችላል) ሰቀላው ፍጥነት በግምት ~ 75 ሜባ/ሴኮንድ በ4 ኮር።

  • ጎግል ላይ የምሰራውን ቦታ ማስያዝ አለብኝ፣ ግን የግል መለያ ተጠቅሜያለሁ እና ይህ መጣጥፍ በኩባንያው ውስጥ ካለኝ ስራ ጋር ምንም ግንኙነት የለውም።

በእጄ ላይ የነበረው ይህ ብቻ ስለሆነ ሁሉንም ምሳሌዎች በዚህ የውሂብ ስብስብ አዘጋጃለሁ።

የውሂብ ቅኝት ሂደት አሳይ

በ ClickHouse ውስጥ የምዝግብ ማስታወሻዎች ባለው ጠረጴዛ ላይ ሙሉ ስካን እንጠቀማለን ፣ እና ይህ ክዋኔ ብዙ ጊዜ የሚወስድ እና ጥቂት ግጥሚያዎች ከተገኙ ለረጅም ጊዜ ምንም ውጤት ላያመጣ ይችላል ፣ ከውጤቱ ጋር የመጀመሪያዎቹ ረድፎች እስኪደርሱ ድረስ የጥያቄው ሂደት። ይህንን ለማድረግ በኤችቲቲፒ በይነገጽ ውስጥ እድገትን በኤችቲቲፒ ራስጌዎች ላይ ለመላክ የሚያስችል ልኬት አለ፡ send_progress_in_http_headers=1. እንደ አለመታደል ሆኖ፣ መደበኛው Go ላይብረሪ እንደደረሰው ራስጌ ማንበብ አይችልም፣ ነገር ግን የኤችቲቲፒ 1.0 በይነገጽ (ከ1.1 ጋር መምታታት የለበትም!) በ ClickHouse ይደገፋል፣ ስለዚህ ጥሬ የTCP ግንኙነትን ከ ClickHouse ጋር ከፍተው ወደዚያ መላክ ይችላሉ። GET /?query=... HTTP/1.0nn እና ምንም ማምለጫ ወይም ምስጠራ ሳይኖር የምላሽ ራስጌዎችን እና አካልን ይቀበሉ, ስለዚህ በዚህ ጉዳይ ላይ መደበኛውን ቤተ-መጽሐፍት እንኳን መጠቀም አያስፈልገንም.

የዥረት ምዝግብ ማስታወሻዎች ከ ClickHouse

ClickHouse በአንጻራዊነት ለረጅም ጊዜ (ከ2019 ጀምሮ?) በORDER BY ለሚደረጉ መጠይቆች ማመቻቸት ነበረው፣ ስለዚህ መጠይቁን ይመስላል።

SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC

ፍተሻው እስኪጠናቀቅ ድረስ በመልእክታቸው ውስጥ "የሆነ ነገር" ንዑስ ሕብረቁምፊ ያላቸውን መስመሮች ወዲያውኑ መመለስ ይጀምራል.

እንዲሁም, ClickHouse እራሱ ከእሱ ጋር ያለው ግንኙነት ሲዘጋ ጥያቄውን ቢሰርዝ በጣም ምቹ ይሆናል, ነገር ግን ይህ ነባሪው ባህሪ አይደለም. በራስ ሰር የጥያቄ መሰረዝ አማራጩን በመጠቀም ሊነቃ ይችላል። cancel_http_readonly_queries_on_client_close=1.

በGo ውስጥ የSIGPIPE ትክክለኛ አያያዝ

ሲፈጽሙ ትዕዛዙን በሉ። some_cmd | head -n 10, በትክክል እንዴት ትእዛዝ some_cmd መቼ አፈፃፀም ያቆማል head 10 መስመሮች ተቀንሰዋል? መልሱ ቀላል ነው፡ መቼ head ያበቃል፣ ቧንቧው ይዘጋል፣ እና የ some_cmd ትዕዛዝ stdout በሁኔታዊ፣ “የትም የለም” ማለት ይጀምራል። መቼ some_cmd በተዘጋ ቧንቧ ለመጻፍ ይሞክራል, በነባሪነት ፕሮግራሙን በጸጥታ የሚያቋርጥ የ SIGPIPE ምልክት ይቀበላል.

በ Go ውስጥ ይህ እንዲሁ በነባሪ ይከሰታል ፣ ግን የ SIGPIPE ሲግናል ተቆጣጣሪው እንዲሁ “ሲግናል: 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 ተጓዳኝ መስመሩን ከተመለሰ በኋላ ወዲያውኑ ስለሆነ በመሸጎጫው ውስጥ ያበቃል እና በአጠቃላይ ጥያቄው በፍጥነት ይከናወናል እና ትንሽ ሲፒዩ ይበላል (ብዙውን ጊዜ ጥያቄው በእኔ ምናባዊ ማሽን ላይ ~ 6 ms ይወስዳል)።

አዳዲስ መልዕክቶችን በቅጽበት አሳይ

ገቢ መልዕክቶችን በእውነተኛ ጊዜ ለማሳየት (በሚጠጋ)፣ በቀላሉ ጥያቄውን በየሰከንዱ አንድ ጊዜ እናስፈጽማለን፣ ከዚህ በፊት ያጋጠመንን የመጨረሻውን የጊዜ ማህተም እናስታውስ።

የትእዛዝ ምሳሌዎች

የተለመዱ የሎግስክሊ ትዕዛዞች በተግባር ምን ይመስላሉ?

በአንቀጹ መጀመሪያ ላይ የጠቀስኩትን የአማዞን ዳታ ስብስብ ካወረዱ የሚከተሉትን ትዕዛዞች ማሄድ ይችላሉ፡-

# Показать строки, где встречается слово 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 ላይ ተመስርተው የምዝግብ ማስታወሻዎችን ለማየት ለኮንሶል በይነገጽ ሀሳብዎን በመስማቴ ደስተኛ ነኝ።

ምንጭ: hab.com

አስተያየት ያክሉ