Aggregations
Statistika (Aggregations)
"Bugun nechta ERROR bo'ldi?" yoki "qaysi servis eng ko'p log yozdi?" — bu savollarga javob berish uchun HAR BIR log yozuvini QO'LDA sanash SHART emas. Aggregation (statistikaga guruhlash) — ko'plab log yozuvini, ma'lum bir MEZON bo'yicha (masalan Level yoki Service) GURUHLAB, har bir guruhning SONINI hisoblab beradi.
package main
import (
"fmt"
"sort"
)
type LogEntry struct {
Level string
Service string
}
// CountByLevel — har bir Level bo'yicha nechta log borligini hisoblaydi
func CountByLevel(entries []LogEntry) map[string]int {
counts := make(map[string]int)
for _, entry := range entries {
counts[entry.Level]++
}
return counts
}
func main() {
entries := []LogEntry{
{Level: "ERROR", Service: "payments"},
{Level: "INFO", Service: "payments"},
{Level: "ERROR", Service: "auth"},
{Level: "ERROR", Service: "payments"},
}
counts := CountByLevel(entries)
var levels []string
for level := range counts {
levels = append(levels, level)
}
sort.Strings(levels)
for _, level := range levels {
fmt.Println(level, counts[level])
}
}counts[entry.Level]++ — "Maps as Counters" naqshi: agar kalit hali XARITADA yo'q bo'lsa, Go AVTOMATIK uni nolga tenglashtirib, keyin 1 qo'shadi ("Zero Values" darsini eslang) — qo'shimcha if tekshiruvi KERAK EMAS. Bu — bir marta BUTUN ro'yxat bo'ylab yurib, BARCHA guruhlarning sonini BIRDANIGA hisoblab chiqadigan, samarali usul.
Diqqat qiling: natijani chop etishdan OLDIN, kalitlar (levels) sort.Strings bilan TARTIBLANADI — bu "Iterating over Maps" darsida ko'rgan MUHIM eslatma: Go xaritasining ITERATSIYA tartibi HAR SAFAR BOSHQACHA bo'lishi mumkin, shuning uchun DETERMINISTIK (bashorat qilinadigan) natija kerak bo'lganda, har doim ALOHIDA tartiblash kerak.
>_ Exercise
Service bo'yicha guruhlab, ENG KO'P log yozgan servisni toping.
- •CountByService(entries []LogEntry) map[string]int funksiyasini yozing (CountByLevel bilan bir xil naqsh, lekin entry.Service bo'yicha)
- •TopService(counts map[string]int) string funksiyasini yozing: eng katta qiymatga ega kalitni qaytaring (teng bo'lsa, istalgani bo'lishi mumkin)
- •berilgan entries uchun CountByService chaqirib, TopService natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Aggregation funksiyalari (CountByLevel, CountByService) loglarni ma'lum mezon bo'yicha guruhlab, ular ustida statistik savollarga (eng ko'p, eng kam) tez javob berish imkonini beradi.
NEXT UP
REST API
$ go run main.go
Kodingizni ishga tushiring