0Pricing
DevOps Bootcamp · Ders

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 DevOps Bootcamp 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, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp 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 -k2

Canlı 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:

  1. Gecikme sütununu düz bir sayı listesine çıkarın.
  2. Sayısal olarak sıralayın.
  3. 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 file

awk 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 -20

awk 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:

  1. Her gecikme değerini bir aralığa (ör. 0-50ms, 50-100ms, …) yerleştirin.
  2. Her aralıktaki gözlemleri sayın.
  3. 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şturur
  • tee /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 -n ile sıralayın, ardından awk içinde int(N * p + 0.9999) kullanarak ceil(p/100 * N) konumundaki satırı seçin.
  • İlk N raporu: klasik awk | sort | uniq -c | sort -rn | head -N iş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 DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp 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. DevOps Bootcamp 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.

DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, 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 DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DevOps Bootcamp 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

  1. Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma
  2. Gerçek Zamanlı Günlük Takibi ve Akış Uyarıları
  3. Betiklerde journalctl ile journald Sorgulama
  4. Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama
← DevOps Bootcamp Sayfasına Dön