Query Language
So'rov tili
Google qidiruv satriga site:go.dev concurrency deb yozganingizda, siz aslida SODDA "so'rov tili"dan foydalanyapsiz — site: MAXSUS ma'noga ega FILTR, qolgani esa oddiy qidiruv so'zi. Log Aggregator'imizga ham xuddi shunday, oddiy so'rov tilini qo'shamiz: level:ERROR service:payments kabi so'rovlar orqali loglarni FILTRLASH.
package main
import (
"fmt"
"strings"
)
type LogEntry struct {
Level string
Service string
Message string
}
// parseQuery — "level:ERROR service:payments" kabi so'rovni filtrlar xaritasiga aylantiradi
func parseQuery(query string) map[string]string {
filters := make(map[string]string)
for _, token := range strings.Fields(query) {
parts := strings.SplitN(token, ":", 2)
if len(parts) == 2 {
filters[parts[0]] = parts[1]
}
}
return filters
}
// matches — bitta log yozuvi berilgan filtrlarga MOS kelamikan tekshiradi
func matches(entry LogEntry, filters map[string]string) bool {
if level, ok := filters["level"]; ok && entry.Level != level {
return false
}
if service, ok := filters["service"]; ok && entry.Service != service {
return false
}
return true
}
func main() {
entries := []LogEntry{
{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"},
{Level: "INFO", Service: "payments", Message: "boshlandi"},
{Level: "ERROR", Service: "auth", Message: "kirish rad etildi"},
}
filters := parseQuery("level:ERROR service:payments")
var results []LogEntry
for _, entry := range entries {
if matches(entry, filters) {
results = append(results, entry)
}
}
fmt.Println(len(results), results[0].Message)
}filters[parts[0]] = parts[1] — so'rovdagi har bir kalit:qiymat juftligi (level:ERROR) filtrlar xaritasiga qo'shiladi. matches funksiyasi — HAR BIR filtr uchun "comma-ok" (ok) tekshiruvidan foydalanadi: agar SO'ROVDA o'sha filtr BERILMAGAN bo'lsa (masalan foydalanuvchi service: yozmagan bo'lsa), o'sha shart TEKSHIRILMAYDI — faqat AYTIB o'tilgan filtrlar qo'llaniladi.
Bu — "API Gateway Pattern" darsida ko'rgan g'oyaga o'xshash: murakkab, ICHKI mantiq (filtrlash) FOYDALANUVCHIGA sodda, matnga o'xshash INTERFEYS orqali TAQDIM etiladi. Foydalanuvchi Go kodini yozmasdan, faqat ODDIY matn so'rovi orqali murakkab filtrlashni AMALGA OSHIRA oladi.
>_ Exercise
So'rov tiliga "contains" (xabar ichida qidirish) imkonini qo'shing.
- •matches funksiyasiga qo'shimcha tekshiruv qo'shing: agar filters'da "contains" bo'lsa VA entry.Message unda strings.Contains bo'yicha TOPILMASA, false qaytaring
- •"level:ERROR contains:kirish" so'rovini tahlil qilib, entries bo'ylab filtrlang
- •natijadagi mos kelgan yozuvlar sonini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Oddiy "kalit:qiymat" so'rov tili, foydalanuvchiga murakkab Go kodi yozmasdan, matnga o'xshash so'rovlar orqali loglarni moslashuvchan tarzda filtrlash imkonini beradi.
NEXT UP
Real-Time Tail
$ go run main.go
Kodingizni ishga tushiring