Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama
İstek hızlarını, yüzdelik dilimleri ve ilk N raporlarını doğrudan akış hâlindeki günlük verilerinden toplayın.
Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama, CoddyKit'te ücretsiz bir Linux Command Line & Bash Scripting Mastery dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Linux Command Line & Bash Scripting Mastery öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.
Ham Günlüklerden Neden Ölçümler Hesaplanır?
Üretim sistemleri saniyede binlerce günlük satırı üretir. Ham günlükleri pahalı analiz platformlarına göndermek yerine istek hızlarını, yüzdelik dilimleri ve ilk-N raporlarını doğrudan kabukta, neredeyse sıfır maliyetle hesaplayabilirsiniz.
- İstek hızı: Hizmetiniz saniyede veya dakikada kaç isteği işliyor?
- Gecikme yüzdelik dilimleri: p50/p95/p99 yanıt süresi nedir?
- İlk-N raporları: Hangi uç noktalar, IP'ler veya hata kodları en sık görülüyor?
awk, sort, uniq ve bc gibi kabuk araçları, canlı bir günlük akışından veya geçmişe ait bir dosyadan terminalden çıkmadan bu soruları yanıtlayabilen güçlü ve birleştirilebilir bir işlem hattı oluşturur.
Yaygın Bir Erişim Günlüğünün Anatomisi
Web sunucularının çoğu günlükleri Birleştirilmiş Günlük Biçimi ile yazar. Alanlarını anlamak, her ölçüm işlem hattının temelidir:
127.0.0.1 - frank [10/Oct/2024:13:55:36 -0700] "GET /api/users HTTP/1.1" 200 2326 0.042- Alan 1: istemci IP'si
- Alan 4 (köşeli parantez içinde): zaman damgası
- Alan 7 (tırnak içinde): HTTP yöntemi + yol
- Alan 9: durum kodu
- Alan 10: yanıt baytları
- Alan 11: saniye cinsinden yanıt süresi (özel alan, her zaman bulunmayabilir)
Alanlara konumlarıyla başvurmak için ($1, $9 vb.) awk kullanın. Tırnak içindeki alanlar yalnızca dikkatli bölerseniz tek belirteç sayılır; günlük satırını awk -F'"' ile çevreleyin veya birden çok geçiş kullanın.
Dakika Başına İstek Hızını Sayma
Dakika başına istekleri hesaplamak için her zaman damgasının dakika bölümünü çıkarıp tekrarları sayın. [day/Mon/year:HH:MM deseni, saat:dakika grubunu verir.
Aşağıdaki işlem hattı access.log dosyasını okur ve dakika → istek sayısı tablosunu yazdırır:
#!/usr/bin/env bash
# Requests per minute from an nginx/apache access log
# Usage: bash req_per_min.sh access.log
LOG="${1:-access.log}"
awk '{
# Extract [day/Mon/year:HH:MM from field 4
match($0, /\[([^:]+:[0-9]+:[0-9]+)/, arr)
minute = arr[1]
if (minute != "") count[minute]++
} END {
for (m in count) print count[m], m
}' "$LOG" | sort -k2Canlı Akışla Kayan Pencere Hızı
Canlı izleme için kayan bir pencereye ihtiyacınız vardır. Bunun yolu, tail -f çıktısını, sistem saatini (systime()) kullanarak sayacını her N saniyede sıfırlayan awk'ye aktarmaktır.
Bu örnek her 10 saniyede bir hız satırı yazdırır:
#!/usr/bin/env bash
# Live request rate — prints lines/10s from a tailed log
# Usage: bash live_rate.sh /var/log/nginx/access.log
LOG="${1:-/var/log/nginx/access.log}"
WINDOW=10
tail -f "$LOG" | awk -v win="$WINDOW" '
BEGIN { start = systime(); count = 0 }
{
count++
now = systime()
if (now - start >= win) {
printf "[%s] %d req/%ds (%.1f req/s)\n",
strftime("%H:%M:%S", now), count, win, count/win
count = 0
start = now
}
}'Yüzdelik Dilim Hesabı İçin Gecikme Değerlerini Çıkarma
Yüzdelik dilimler, gözlemlenen tüm gecikme değerlerinin sıralanmasını gerektirir. Standart yaklaşım şöyledir:
- Gecikme sütununu düz bir sayı listesine çıkarın.
- Sayısal olarak sıralayın.
- Satır sayısı hesabını kullanarak doğru sıradaki değeri seçin.
Aşağıdaki betik, 11. alanı (saniye cinsinden yanıt süresi) çıkarır ve sonraki adımda yüzdelik dilim hesaplaması için geçici bir dosyaya kaydeder:
#!/usr/bin/env bash
# Extract latency column from access log (field 11)
# Assumes last field on each line is response time in seconds
LOG="${1:-access.log}"
TMP=$(mktemp /tmp/latency_XXXXXX.txt)
awk '{ if ($NF ~ /^[0-9]+\.?[0-9]*$/) print $NF }' "$LOG" \
| sort -n > "$TMP"
echo "Extracted $(wc -l < "$TMP") latency samples -> $TMP"
echo "$TMP" # callers can read this fileawk ile p50, p95 ve p99 Hesaplama
Gecikme değerleri sıralandıktan sonra bir yüzdelik dilimi seçmek aritmetik bir işlemdir: p. yüzdelik dilimi ceil(p/100 * N) satırında bulunur. Saf awk, sıralanmış dosyayı bir diziye yükledikten sonra bunu tek geçişte yapabilir:
#!/usr/bin/env bash
# Compute p50 / p95 / p99 from a sorted latency file
# Usage: bash percentiles.sh latency_sorted.txt
# Demo: generate 1000 random latencies if no file given
if [[ $# -eq 0 ]]; then
SORTED=$(mktemp)
for i in $(seq 1 1000); do
awk 'BEGIN { srand(); printf "%.4f\n", 0.001 + rand()*0.999 }'
done | sort -n > "$SORTED"
else
SORTED="$1"
fi
awk '
{ values[NR] = $1 }
END {
n = NR
if (n == 0) { print "No data"; exit }
p50 = values[int(n * 0.50 + 0.9999)]
p95 = values[int(n * 0.95 + 0.9999)]
p99 = values[int(n * 0.99 + 0.9999)]
printf "p50 = %.4fs\np95 = %.4fs\np99 = %.4fs\nN = %d\n",
p50, p95, p99, n
}' "$SORTED"İlk-N Uç Nokta Raporu Oluşturma
İlk-N raporu, "en çok hangi yollara erişiliyor?" sorusunu yanıtlar. Klasik kabuk deyimi şöyledir:
- İlgilenilen alanı (ör. URL yolu) yazdırmak için
awk - Aynı değerleri gruplamak için
sort - Ardışık tekrarları saymak için
uniq -c - Sayıya göre azalan sıralama yapmak için
sort -rn - İlk N sonucu almak için
head -n N
#!/usr/bin/env bash
# Top-10 most requested URL paths from access log
# Usage: bash top_endpoints.sh access.log [N]
LOG="${1:-access.log}"
N="${2:-10}"
echo "=== Top $N endpoints ==="
awk -F'"' '{ print $2 }' "$LOG" \
| awk '{ print $2 }' \
| sort \
| uniq -c \
| sort -rn \
| head -n "$N" \
| awk '{ printf "%6d %s\n", $1, $2 }'Durum Koduna Göre İlk-N: Hataları Bir Bakışta Görme
HTTP durum kodları, hizmetinizin sağlığı hakkında bilgi verir. Günlük satırlarını durum koduna göre gruplamak ve saymak, hataların nadir mi yoksa sistemik mi olduğunu ortaya çıkarır.
Aşağıdaki betik, tüm 2xx/3xx/4xx/5xx gruplarına göre ayrıntılı bir döküm oluşturur:
#!/usr/bin/env bash
# Status code frequency breakdown
# Usage: bash status_breakdown.sh access.log
LOG="${1:-access.log}"
echo "=== HTTP Status Code Distribution ==="
awk '{ print $9 }' "$LOG" \
| grep -E '^[0-9]{3}$' \
| sort \
| uniq -c \
| sort -rn \
| awk '{ printf "%6d %s\n", $1, $2 }'
echo
echo "=== 5xx Error Spike Check ==="
awk '$9 ~ /^5/ { print $9, $7 }' "$LOG" \
| sort | uniq -c | sort -rn | head -20awk ile ASCII Histogramları
Metin histogramı, gecikme dağılımlarını terminalde veya CI günlüğünde anında okunabilir hâle getirir. Yaklaşım şöyledir:
- Her gecikme değerini bir aralığa (ör. 0-50ms, 50-100ms, …) yerleştirin.
- Her aralıktaki gözlemleri sayın.
- Azami sayıya göre ölçeklendirilmiş bir
#karakter çubuğu yazdırın.
Bu yöntem, bir grafik aracı olmadan çift tepeli dağılımları veya aykırı değerleri fark etmek için son derece kullanışlıdır.
#!/usr/bin/env bash
# ASCII latency histogram from a list of latency values in seconds
# Demo: generates synthetic data if no input file is provided
if [[ $# -eq 0 ]]; then
# Generate 500 synthetic latencies (ms converted to s)
python3 -c "
import random, math
for _ in range(500):
# bimodal: fast cluster ~50ms, slow cluster ~300ms
if random.random() < 0.75:
v = max(1, random.gauss(50, 15))
else:
v = max(1, random.gauss(300, 80))
print(f'{v/1000:.4f}')
" | sort -n | awk '
{ values[NR] = $1 * 1000 } # convert to ms
END {
buckets = 10; maxVal = 500
step = maxVal / buckets
for (i = 0; i < buckets; i++) hist[i] = 0
for (i = 1; i <= NR; i++) {
b = int(values[i] / step)
if (b >= buckets) b = buckets - 1
hist[b]++
}
maxCount = 0
for (i = 0; i < buckets; i++) if (hist[i] > maxCount) maxCount = hist[i]
print "Latency (ms) Count Distribution"
print "---------------------------------------"
for (i = 0; i < buckets; i++) {
lo = i * step; hi = lo + step
barLen = int(hist[i] / maxCount * 40)
bar = ""
for (j = 0; j < barLen; j++) bar = bar "#"
printf "%4d-%4dms %5d %s\n", lo, hi, hist[i], bar
}
}'
else
echo "Usage: pipe a sorted latency file (in seconds) to this pattern"
fiÖlçümleri Birleştirme: Tek Komutluk Özet Raporu
Üretim çalıştırma kılavuzları çoğu zaman tek bir komutun tüm temel ölçümleri aynı anda üretmesini gerektirir: hız, gecikme yüzdelik dilimleri, en çok kullanılan uç noktalar ve hata hızı. Şimdiye kadar öğrendiğiniz her şeyi, bir insanın veya uyarı sisteminin çağırabileceği tek bir betikte birleştirebilirsiniz.
#!/usr/bin/env bash
# One-shot log summary report
# Usage: bash log_summary.sh access.log
LOG="${1:-access.log}"
[[ -f "$LOG" ]] || { echo "File not found: $LOG"; exit 1; }
TOTAL=$(wc -l < "$LOG")
ERRORS=$(awk '$9 ~ /^[45]/' "$LOG" | wc -l)
ERR_RATE=$(awk "BEGIN { printf \"%.1f\", ($ERRORS / ($TOTAL || 1)) * 100 }")
echo "====================================="
echo " Log Summary: $LOG"
echo "====================================="
printf " Total requests : %d\n" "$TOTAL"
printf " 4xx/5xx errors : %d (%.1f%%)\n" "$ERRORS" "$ERR_RATE"
echo
echo "--- Top 5 Endpoints ---"
awk -F'"' '{ print $2 }' "$LOG" | awk '{ print $2 }' \
| sort | uniq -c | sort -rn | head -5 \
| awk '{ printf " %6d %s\n", $1, $2 }'
echo
echo "--- Latency Percentiles ---"
awk '{ if ($NF ~ /^[0-9]+\.?[0-9]*$/) print $NF * 1000 }' "$LOG" \
| sort -n \
| awk '
{ v[NR]=$1 }
END {
if (NR==0) { print " No latency data"; exit }
printf " p50 = %.1fms\n", v[int(NR*0.50+0.9999)]
printf " p95 = %.1fms\n", v[int(NR*0.95+0.9999)]
printf " p99 = %.1fms\n", v[int(NR*0.99+0.9999)]
}'Adlandırılmış Borular ve tee ile Akış Ölçümleri
Gözlemlenebilirlik işlem hatlarında çoğu zaman bir günlük akışını çatallamanız gerekir: ham satırları diske yazarken aynı anda ölçümleri hesaplamak. Adlandırılmış bir boruyla (mkfifo) birlikte tee kullanmak, tüm akışı bellekte arabelleğe almadan bunu mümkün kılar.
mkfifo /tmp/log_pipe— adlandırılmış boruyu oluştururtee /tmp/log_pipe | metric_consumer &— bir dalı ölçüm tüketicisine ayırır- Diğer dal, arşiv dosyasına yazar
Bu yöntem, disk yazma işlemleriyle ölçüm toplamayı birbirinden ayırır ve taraflardan birinin diğerinden bağımsız olarak yeniden başlatılmasına olanak tanır.
#!/usr/bin/env bash
# Fan-out: write to archive AND count errors in real time
# Run: bash fanout_pipeline.sh /var/log/nginx/access.log
LOG="${1:-/var/log/nginx/access.log}"
ARCHIVE="/tmp/access_archive.log"
PIPE="/tmp/log_metrics_pipe"
# Clean up on exit
trap 'rm -f "$PIPE"' EXIT
mkfifo "$PIPE"
# Branch 1: count 5xx errors per minute from the pipe
awk '$9 ~ /^5/ {
match($0, /\[([^:]+:[0-9]+:[0-9]+)/, arr)
errors[arr[1]]++
} END {
for (m in errors) printf "5xx errors at %s: %d\n", m, errors[m]
}' "$PIPE" &
# Branch 2: archive to disk + feed Branch 1 via pipe
tail -f "$LOG" | tee "$PIPE" >> "$ARCHIVE"Sıralanmış N gecikme değerinden p95 yüzdelik dilimini doğru hesaplayan awk tekniği hangisidir?
N adet sıralanmış gecikme değerini awk dizisi v[1..N] içine yüklediniz. p95 yüzdelik dilimini hangi ifade doğru şekilde getirir?
Ders Özeti: Günlük Akışlarından Ölçümler ve Histogramlar
Bu derste doğrudan Bash içinde eksiksiz bir ölçüm işlem hattı oluşturdunuz:
- İstek hızı:
awk, zaman damgalarından dakika aralığını çıkarır ve oluşumları sayar;tail -f+systime()canlı kayan pencere hızını sağlar. - Gecikme yüzdelik dilimleri: gecikme sütununu çıkarın,
sort -nile sıralayın, ardından awk içindeint(N * p + 0.9999)kullanarakceil(p/100 * N)konumundaki satırı seçin. - İlk N raporu: klasik
awk | sort | uniq -c | sort -rn | head -Nişlem hattı, her türlü kategorik alanla (yol, IP, durum kodu) çalışır. - ASCII histogramları: değerleri aralıklara ayırın, her aralıktaki sayıları hesaplayın ve çubuk uzunluğunu en yüksek aralık sayısına göre ölçeklendirerek dağılımı bir bakışta gösterin.
- Adlandırılmış kanallarla dağıtım:
mkfifo+tee, ham günlükleri arşivlemenize ve ölçüm tüketicilerine aynı anda iletmenize olanak tanır; akışın tamamını belleğe yüklemeniz gerekmez.
Birleştirilebilir bu temel yapı taşları, olaylar sırasında harici araçlara duyulan ihtiyacı ortadan kaldırır ve Bash'in çalıştığı her yerde çalışabilen hafif gözlemlenebilirlik betiklerinin temelini oluşturur.
Sıkça Sorulan Sorular
“Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama” dersi ücretsiz mi?
Evet — “Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Linux Command Line & Bash Scripting Mastery kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.
“Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama” dersinde ne öğreneceğim?
İstek hızlarını, yüzdelik dilimleri ve ilk N raporlarını doğrudan akış hâlindeki günlük verilerinden toplayın. Linux Command Line & Bash Scripting Mastery ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Linux Command Line & Bash Scripting Mastery öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Linux Command Line & Bash Scripting Mastery, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Linux Command Line & Bash Scripting Mastery dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Linux Command Line & Bash Scripting Mastery dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma
- Gerçek Zamanlı Günlük Takibi ve Akış Uyarıları
- Betiklerde journalctl ile journald Sorgulama
- Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama