අපි ලඝු-සටහන් බැලීම සඳහා ලෝකයේ වඩාත්ම පහසු අතුරු මුහුණත සංවර්ධනය කරමින් සිටිමු

අපි ලඝු-සටහන් බැලීම සඳහා ලෝකයේ වඩාත්ම පහසු අතුරු මුහුණත සංවර්ධනය කරමින් සිටිමු ඔබ කවදා හෝ ලඝු-සටහන් බැලීමට වෙබ් අතුරුමුහුණත් භාවිතා කර ඇත්නම්, රීතියක් ලෙස, මෙම අතුරුමුහුණත් කරදරකාරී වන අතර (බොහෝ විට) එතරම් පහසු සහ ප්‍රතිචාර නොදක්වන ආකාරය ඔබ දැක ඇති. සමහරක් ඔබට පුරුදු විය හැකිය, සමහරක් නියත වශයෙන්ම භයානක ය, නමුත් මට පෙනෙන පරිදි සියලුම ගැටළු වලට හේතුව අපි ලොග් නැරඹීමේ කාර්යයට වැරදි ලෙස ප්‍රවේශ වීම ය: අපි CLI (විධාන රේඛා අතුරුමුහුණත) ඇති වෙබ් අතුරු මුහුණතක් නිර්මාණය කිරීමට උත්සාහ කරමු. වඩා හොඳින් ක්රියා කරයි. මම පුද්ගලිකව tail, grep, awk සහ වෙනත් අය සමඟ වැඩ කිරීම ඉතා පහසුයි, එබැවින් මට ලොග් සමඟ වැඩ කිරීම සඳහා කදිම අතුරු මුහුණත tail සහ grep වලට සමාන දෙයක් වනු ඇත, නමුත් එය බොහෝ සේවාදායකයන්ගෙන් ලැබෙන ලඝු-සටහන් කියවීමට ද භාවිතා කළ හැකිය. එනම්, ඇත්ත වශයෙන්ම, ක්ලික්හවුස් වෙතින් ඒවා කියවන්න!

*හබ්රා පරිශීලකයාගේ පුද්ගලික මතය අනුව ඔබේROCK

logscli හමුවන්න

මම මගේ අතුරු මුහුණත සඳහා නමක් ඉදිරිපත් නොකළ අතර, අවංකව කිවහොත්, එය මූලාකෘතියක ස්වරූපයෙන් පවතී, නමුත් ඔබට වහාම ප්‍රභව කේතය බැලීමට අවශ්‍ය නම්, ඔබව සාදරයෙන් පිළිගනිමු: https://github.com/YuriyNasretdinov/logscli (තෝරාගත් Go කේතයේ පේළි 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 වෙත ලොග් ලබා දෙන්නේ කෙසේදැයි ඔබ දැනටමත් කෙසේ හෝ දන්නා බව මම උපකල්පනය කරමි. එසේ නොවේ නම්, එය උත්සාහ කිරීමට මම නිර්දේශ කරමි ඊෂ් и kittenhouse, මෙන්ම ලොග් බෙදාහැරීම පිළිබඳ මෙම ලිපිය.

පළමුව ඔබ මූලික යෝජනා ක්රමය තීරණය කළ යුතුය. ඔබට සාමාන්‍යයෙන් කාලය අනුව වර්ග කරන ලද ලඝු-සටහන් ලබා ගැනීමට අවශ්‍ය බැවින්, ඒවා එලෙස ගබඩා කිරීම තාර්කික බව පෙනේ. බොහෝ ලොග් ප්‍රවර්ග තිබේ නම් සහ ඒවා සියල්ලම එකම වර්ගයේ නම්, ඔබට ප්‍රාථමික යතුරේ පළමු තීරුව ලෙස ලොග් ප්‍රවර්ගයක් සෑදිය හැකිය - මෙය ඔබට වගුවක් කිහිපයක් වෙනුවට එක වගුවක් ලබා ගැනීමට ඉඩ සලසයි, එය විශාල ප්ලස් එකක් වනු ඇත. ClickHouse වෙත ඇතුළු කිරීම (දෘඪ තැටි සහිත සේවාදායකයන් මත, තත්පරයට ~1 වතාවකට වඩා දත්ත ඇතුළත් කිරීම නිර්දේශ කෙරේ සම්පූර්ණ සේවාදායකය සඳහා).

එනම්, අපට පහත වගු යෝජනා ක්‍රමය ආසන්න වශයෙන් අවශ්‍ය වේ:

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

අවාසනාවකට, මට අල්ලා ගැනීමට සහ බාගත කළ හැකි යථාර්ථවාදී ලොග සහිත විවෘත මූලාශ්‍ර කිසිවක් මට වහාම සොයාගත නොහැකි විය, එබැවින් මම ඒ වෙනුවට මෙය උදාහරණයක් ලෙස ගත්තෙමි. 2015 ට පෙර Amazon වෙතින් නිෂ්පාදන පිළිබඳ සමාලෝචන. ඇත්ත වශයෙන්ම, ඒවායේ ව්‍යුහය පෙළ ලොගවලට සමාන නොවේ, නමුත් නිදර්ශන අරමුණු සඳහා මෙය වැදගත් නොවේ.

ClickHouse වෙත Amazon සමාලෝචන උඩුගත කිරීම සඳහා උපදෙස්

අපි වගුවක් සාදන්නෙමු:

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

Amazon දත්ත කට්ටලය තුළ සමාලෝචනයක් සඳහා දිනයක් පමණක් ඇත, නමුත් නිශ්චිත වේලාවක් නොමැත, එබැවින් අපි මෙම දත්ත අහඹු ලෙස පුරවන්නෙමු.

10 GB RAM එකකට නොගැලපෙන තරමක් විශාල දත්ත කට්ටලයක් ලබා ගැනීම සඳහා ඔබට සියලුම 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

Google Cloud හි 1000 GB ප්‍රමාණයේ සම්මත Persistent Disk එකක (එය HDD වේ) (මම මෙම ප්‍රමාණය ප්‍රධාන වශයෙන් ගත්තේ වේගය ටිකක් වැඩි නිසා, සමහර විට අවශ්‍ය ප්‍රමාණයේ SSD එකක් ලාබ විය හැකි වුවත්) උඩුගත කිරීම මධ්‍ය 75ක වේගය ආසන්න වශයෙන් ~ 4 MB/sec විය.

  • මම Google හි සේවය කරන බව වෙන්කරවා ගත යුතුය, නමුත් මම පුද්ගලික ගිණුමක් භාවිතා කළ අතර මෙම ලිපිය සමාගමේ මගේ වැඩකට සම්බන්ධ නැත

මා අත තිබුණේ මෙය පමණක් වන බැවින්, මම මෙම විශේෂිත දත්ත කට්ටලය සමඟ සියලු නිදර්ශන ඉදිරිපත් කරමි.

දත්ත ස්කෑන් කිරීමේ ප්‍රගතිය පෙන්වන්න

ClickHouse හි අපි ලඝු-සටහන් සහිත මේසයක් මත සම්පූර්ණ ස්කෑන් පරීක්ෂණයක් භාවිතා කරනු ඇති අතර, මෙම මෙහෙයුමට සැලකිය යුතු කාලයක් ගත විය හැකි අතර ගැලපීම් කිහිපයක් හමු වුවහොත් දිගු වේලාවක් කිසිදු ප්‍රතිඵලයක් ලබා නොදිය හැකි බැවින්, එය පෙන්වීමට හැකිවීම සුදුසුය. ප්‍රතිඵලය සහිත පළමු පේළි ලැබෙන තෙක් විමසුමේ ප්‍රගතිය. මෙය සිදු කිරීම සඳහා, HTTP අතුරුමුහුණතෙහි ඔබට HTTP ශීර්ෂයන් තුළ ප්‍රගතිය යැවීමට ඉඩ සලසන පරාමිතියක් ඇත: send_progress_in_http_headers=1. අවාසනාවකට, සම්මත Go පුස්තකාලයට ලැබෙන පරිදි ශීර්ෂ කියවිය නොහැක, නමුත් HTTP 1.0 අතුරුමුහුණත (1.1 සමඟ පටලවා නොගත යුතුය!) ClickHouse මඟින් සහය දක්වයි, එබැවින් ඔබට ClickHouse වෙත අමු TCP සම්බන්ධතාවයක් විවෘත කර එය එවිය හැක. 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

එය ස්කෑන් කිරීම අවසන් වන තෙක් බලා නොසිට, ඔවුන්ගේ පණිවිඩයේ "යමක්" යන උපසිරැසිය ඇති රේඛා ආපසු ලබා දීම වහාම ආරම්භ කරනු ඇත.

එසේම, ක්ලික්හවුස් විසින්ම එහි සම්බන්ධතාවය වසා ඇති විට ඉල්ලීම අවලංගු කළහොත් එය ඉතා පහසු වනු ඇත, නමුත් මෙය පෙරනිමි හැසිරීම නොවේ. විකල්පය භාවිතයෙන් ස්වයංක්‍රීය ඉල්ලීම් අවලංගු කිරීම සබල කළ හැක 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 සංඥා හසුරුවන්නා ද අවසානයේ "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 ms පමණ වේ).

සැබෑ කාලය තුළ නව පණිවිඩ පෙන්වන්න

එන පණිවිඩ (පාහේ) තථ්‍ය කාලීනව පෙන්වීම සඳහා, අපි පෙරදී හමු වූ අවසන් වේලා මුද්‍රාව මතක තබා ගනිමින් තත්පර කිහිපයකට වරක් ඉල්ලීම ක්‍රියාත්මක කරන්නෙමු.

විධාන උදාහරණ

සාමාන්‍ය 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 මත පදනම් වූ ලඝු-සටහන් බැලීම සඳහා කොන්සෝල අතුරු මුහුණතක් සඳහා වන මගේ අදහස ගැන ඔබේ අදහස් ඇසීමට මම සතුටු වෙමි.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න