பதிவுகளைப் பார்ப்பதற்கு உலகில்* மிகவும் வசதியான இடைமுகத்தை நாங்கள் உருவாக்குகிறோம்

பதிவுகளைப் பார்ப்பதற்கு உலகில்* மிகவும் வசதியான இடைமுகத்தை நாங்கள் உருவாக்குகிறோம் பதிவுகளைப் பார்க்க நீங்கள் எப்போதாவது இணைய இடைமுகங்களைப் பயன்படுத்தியிருந்தால், ஒரு விதியாக, இந்த இடைமுகங்கள் எவ்வாறு சிக்கலானவை மற்றும் (பெரும்பாலும்) மிகவும் வசதியாகவும் பதிலளிக்கக்கூடியதாகவும் இல்லை என்பதை நீங்கள் கவனித்திருக்கலாம். சில நீங்கள் பழகலாம், சில முற்றிலும் பயங்கரமானவை, ஆனால் எல்லா சிக்கல்களுக்கும் காரணம் பதிவுகளைப் பார்க்கும் பணியை நாங்கள் தவறாக அணுகுவதே என்று எனக்குத் தோன்றுகிறது: CLI (கட்டளை வரி இடைமுகம்) உள்ள ஒரு வலை இடைமுகத்தை உருவாக்க முயற்சிக்கிறோம். சிறப்பாக செயல்படுகிறது. நான் தனிப்பட்ட முறையில் டெயில், grep, awk மற்றும் பிறவற்றுடன் பணிபுரிய மிகவும் வசதியாக இருக்கிறேன், எனவே பதிவுகளுடன் பணிபுரிவதற்கான சிறந்த இடைமுகம் tail மற்றும் grep ஐப் போலவே இருக்கும், ஆனால் இது பல சேவையகங்களிலிருந்து வரும் பதிவுகளைப் படிக்கவும் பயன்படுத்தப்படலாம். அதாவது, நிச்சயமாக, கிளிக்ஹவுஸிலிருந்து அவற்றைப் படியுங்கள்!

*ஹப்ரா பயனரின் தனிப்பட்ட கருத்தின்படி நீ நன்றாக செய்தாய்

logscli ஐ சந்திக்கவும்

எனது இடைமுகத்திற்கு நான் ஒரு பெயரைக் கொண்டு வரவில்லை, உண்மையைச் சொல்வதானால், இது ஒரு முன்மாதிரி வடிவத்தில் உள்ளது, ஆனால் நீங்கள் உடனடியாக மூலக் குறியீட்டைப் பார்க்க விரும்பினால், நீங்கள் வரவேற்கப்படுகிறீர்கள்: https://github.com/YuriyNasretdinov/logscli (தேர்ந்தெடுக்கப்பட்ட கோ குறியீட்டின் 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 க்கு பதிவுகளை எவ்வாறு வழங்குவது என்பது உங்களுக்கு ஏற்கனவே எப்படியாவது தெரியும் என்று நான் கருதுகிறேன். இல்லையென்றால், முயற்சிக்க பரிந்துரைக்கிறேன் LSD и பூனைக்குட்டி வீடுமேலும் பதிவு விநியோகம் பற்றிய இந்த கட்டுரை.

முதலில் நீங்கள் அடிப்படை திட்டத்தை தீர்மானிக்க வேண்டும். நீங்கள் வழக்கமாக பதிவுகளை நேரத்தின்படி வரிசைப்படுத்த விரும்புவதால், அவற்றை அப்படியே சேமிப்பது தர்க்கரீதியானதாகத் தெரிகிறது. பல பதிவு வகைகள் இருந்தால், அவை அனைத்தும் ஒரே வகையாக இருந்தால், முதன்மை விசையின் முதல் நெடுவரிசையாக நீங்கள் ஒரு பதிவு வகையை உருவாக்கலாம் - இது பலவற்றுக்குப் பதிலாக ஒரு அட்டவணையை வைத்திருக்க உங்களை அனுமதிக்கும், இது ஒரு பெரிய பிளஸ் ஆகும் 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

அமேசான் தரவுத்தொகுப்பில் மதிப்பாய்வுக்கான தேதி மட்டுமே உள்ளது, ஆனால் சரியான நேரம் இல்லை, எனவே இந்தத் தரவை ஒரு ரேண்டன் மூலம் நிரப்புவோம்.

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 GB அளவுள்ள Google Cloud இல் நிலையான Persistent Disk (இது HDD) இல் (நான் இந்த அளவை முக்கியமாக எடுத்தேன், அதனால் வேகம் கொஞ்சம் அதிகமாக இருந்தது, ஒருவேளை தேவையான அளவு SSD மலிவானதாக இருக்கலாம்) பதிவேற்றம் 75 கோர்களில் வேகம் தோராயமாக ~ 4 MB/sec இருந்தது.

  • நான் கூகுளில் பணிபுரிய முன்பதிவு செய்ய வேண்டும், ஆனால் நான் தனிப்பட்ட கணக்கைப் பயன்படுத்தினேன், இந்தக் கட்டுரைக்கும் நிறுவனத்தில் எனது பணிக்கும் எந்தத் தொடர்பும் இல்லை

இந்தக் குறிப்பிட்ட தரவுத்தொகுப்புடன் அனைத்து விளக்கப்படங்களையும் உருவாக்குவேன், ஏனெனில் இதுவே என் கையில் இருந்தது.

தரவு ஸ்கேனிங் முன்னேற்றத்தைக் காட்டு

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 முதல்?) ஆர்டர் மூலம் வினவல்களுக்கு உகந்ததாக்கப்பட்டுள்ளது, எனவே இது போன்ற வினவல்

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 விருப்பங்களைப் பயன்படுத்தி செய்யப்படுகிறது, இது முறையே செய்திக்கு பின், முன் மற்றும் அதைச் சுற்றியுள்ள குறிப்பிட்ட எண்ணிக்கையிலான வரிகளைக் காட்டுகிறது.

துரதிர்ஷ்டவசமாக, கிளிக்ஹவுஸில் இதைச் செய்வதற்கான எளிதான வழியை நான் கண்டுபிடிக்கவில்லை, எனவே சூழலைக் காட்ட, முடிவின் ஒவ்வொரு வரிக்கும் இது போன்ற கூடுதல் கோரிக்கை அனுப்பப்படும் (விவரங்கள் வரிசைப்படுத்துதல் மற்றும் சூழல் முன் காட்டப்பட்டதா என்பதைப் பொறுத்தது. அல்லது பின்):

SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1

கிளிக்ஹவுஸ் தொடர்புடைய வரியைத் திருப்பி அனுப்பிய உடனேயே கோரிக்கை அனுப்பப்படுவதால், அது தற்காலிக சேமிப்பில் முடிவடைகிறது மற்றும் பொதுவாக கோரிக்கை மிக விரைவாக செயல்படுத்தப்பட்டு ஒரு சிறிய CPU ஐப் பயன்படுத்துகிறது (வழக்கமாக கோரிக்கை எனது மெய்நிகர் கணினியில் ~6 ms ஆகும்).

புதிய செய்திகளை உண்மையான நேரத்தில் காட்டு

உள்வரும் செய்திகளை (கிட்டத்தட்ட) நிகழ்நேரத்தில் காண்பிப்பதற்காக, சில வினாடிகளுக்கு ஒருமுறை கோரிக்கையை செயல்படுத்துகிறோம், இதற்கு முன்பு நாங்கள் சந்தித்த கடைசி நேர முத்திரையை நினைவில் கொள்கிறோம்.

கட்டளை எடுத்துக்காட்டுகள்

வழக்கமான logscli கட்டளைகள் நடைமுறையில் எப்படி இருக்கும்?

கட்டுரையின் தொடக்கத்தில் நான் குறிப்பிட்டுள்ள அமேசான் தரவுத்தொகுப்பை நீங்கள் பதிவிறக்கம் செய்திருந்தால், பின்வரும் கட்டளைகளை இயக்கலாம்:

# Показать строки, где встречается слово 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

கருத்தைச் சேர்