0Pricing
DevOps Bootcamp · Pelajaran

Menghitung Metrik dan Histogram dari Aliran Log

Agregasikan laju permintaan, persentil, dan laporan N-teratas langsung dari data log yang dialirkan.

Menghitung Metrik dan Histogram dari Aliran Log adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Mengapa Menghitung Metrik dari Catatan Mentah?

Sistem produksi menghasilkan ribuan baris catatan per detik. Daripada mengirim catatan mentah ke platform analitik yang mahal, Anda dapat menghitung laju permintaan, persentil, dan laporan N teratas langsung di shell — dengan biaya nyaris nol.

  • Laju permintaan: Berapa banyak permintaan per detik/menit yang dapat ditangani layanan Anda?
  • Persentil latensi: Berapa waktu respons p50/p95/p99?
  • Laporan N teratas: Endpoint, IP, atau kode kesalahan mana yang paling sering muncul?

Alat shell seperti awk, sort, uniq, dan bc membentuk alur yang kuat dan dapat dikomposisikan, yang dapat menjawab pertanyaan-pertanyaan ini dari aliran catatan langsung atau berkas historis tanpa meninggalkan terminal.

Anatomi Catatan Akses Umum

Sebagian besar server web menulis catatan dalam Format Catatan Gabungan. Memahami bidangnya merupakan dasar bagi setiap alur metrik:

127.0.0.1 - frank [10/Oct/2024:13:55:36 -0700] "GET /api/users HTTP/1.1" 200 2326 0.042
  • Bidang 1: IP klien
  • Bidang 4 (dalam tanda kurung siku): cap waktu
  • Bidang 7 (dalam tanda kutip): metode HTTP + jalur
  • Bidang 9: kode status
  • Bidang 10: byte respons
  • Bidang 11: waktu respons dalam detik (bidang khusus, tidak selalu tersedia)

Gunakan awk untuk merujuk bidang berdasarkan posisi ($1, $9, dan seterusnya). Bidang di dalam tanda kutip hanya dihitung sebagai satu token jika Anda memisahkannya dengan cermat — bungkus baris catatan dengan awk -F'"' atau gunakan beberapa tahap.

Menghitung Laju Permintaan per Menit

Untuk menghitung permintaan per menit, ekstrak bagian menit dari setiap cap waktu dan hitung kemunculannya. Pola [day/Mon/year:HH:MM memberi Anda kelompok jam:menit.

Alur di bawah membaca access.log dan mencetak tabel menit → jumlah permintaan:

#!/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

Laju Jendela Geser dengan Aliran Langsung

Untuk tail langsung, Anda memerlukan jendela geser. Caranya adalah menyalurkan tail -f ke awk yang mengatur ulang penghitungnya setiap N detik menggunakan jam sistem (systime()).

Contoh ini mencetak satu baris laju setiap 10 detik:

#!/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
    }
}'

Mengekstrak Nilai Latensi untuk Penghitungan Persentil

Persentil mengharuskan semua nilai latensi yang diamati diurutkan. Pendekatan standarnya:

  1. Ekstrak kolom latensi menjadi daftar angka biasa.
  2. Urutkan secara numerik.
  3. Pilih nilai pada peringkat yang tepat menggunakan perhitungan jumlah baris.

Skrip di bawah mengekstrak bidang 11 (waktu respons dalam detik) dan menyimpannya ke berkas sementara untuk penghitungan persentil pada langkah berikutnya:

#!/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

Menghitung p50, p95, dan p99 dengan awk

Setelah nilai latensi diurutkan, memilih persentil merupakan operasi aritmetika: persentil ke-p berada pada baris ceil(p/100 * N). awk murni dapat melakukannya dalam satu lintasan setelah memuat berkas yang telah diurutkan ke dalam larik:

#!/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"

Membangun Laporan Endpoint N Teratas

Laporan N teratas menjawab pertanyaan "jalur mana yang paling sering diakses?" Idiom shell klasiknya adalah:

  • awk untuk mencetak bidang yang diinginkan (misalnya, jalur URL)
  • sort untuk mengelompokkan nilai yang identik
  • uniq -c untuk menghitung duplikat yang berurutan
  • sort -rn untuk mengurutkan berdasarkan jumlah secara menurun
  • head -n N untuk mengambil N teratas
#!/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 }'

N Teratas berdasarkan Kode Status: Menemukan Kesalahan Sekilas

Kode status HTTP menunjukkan kesehatan layanan Anda. Mengelompokkan baris catatan berdasarkan kode status dan menghitungnya akan menunjukkan apakah kesalahan jarang terjadi atau bersifat sistemik.

Skrip di bawah menghasilkan perincian di seluruh kelompok 2xx/3xx/4xx/5xx:

#!/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

Histogram ASCII dengan awk

Histogram teks membuat distribusi latensi langsung mudah dibaca di terminal atau catatan CI. Pendekatannya:

  1. Masukkan setiap nilai latensi ke dalam bin (misalnya, 0-50ms, 50-100ms, …).
  2. Hitung pengamatan di setiap bin.
  3. Cetak batang karakter # yang diskalakan terhadap jumlah maksimum.

Ini sangat berguna untuk menemukan distribusi bimodal atau pencilan tanpa alat pembuatan grafik.

#!/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

Menggabungkan Metrik: Laporan Ringkasan Sekali Jalan

Panduan operasional produksi sering memerlukan satu perintah yang menghasilkan semua metrik utama sekaligus: laju, persentil latensi, endpoint teratas, dan laju kesalahan. Anda dapat menyusun semua hal yang telah dipelajari sejauh ini menjadi satu skrip yang dapat dipanggil oleh manusia atau sistem pemberi peringatan.

#!/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)]
}'

Mengalirkan Metrik melalui Pipa Bernama dan tee

Dalam alur observabilitas, Anda sering perlu membagi aliran catatan: menulis baris mentah ke disk dan sekaligus menghitung metrik. tee dengan pipa bernama (mkfifo) memungkinkan hal ini tanpa menyangga seluruh aliran di memori.

  • mkfifo /tmp/log_pipe — buat pipa bernama
  • tee /tmp/log_pipe | metric_consumer & — pecah satu cabang untuk konsumen metrik
  • Cabang lainnya menulis ke berkas arsip

Pola ini memisahkan penulisan ke disk dan agregasi metrik, serta memungkinkan masing-masing sisi dimulai ulang secara independen.

#!/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"

Teknik awk mana yang menghitung persentil p95 dengan benar dari array terurut berisi N nilai latensi?

Anda telah memuat N nilai latensi yang sudah diurutkan ke dalam array awk v[1..N]. Ekspresi mana yang mengambil persentil p95 dengan benar?

Ringkasan Pelajaran: Metrik dan Histogram dari Aliran Log

Dalam pelajaran ini, Anda membangun pipeline metrik lengkap langsung di Bash:

  • Laju permintaan: awk mengekstrak bucket menit dari stempel waktu dan menghitung kemunculannya; tail -f + systime() menghasilkan laju jendela geser secara langsung.
  • Persentil latensi: ekstrak kolom latensi, jalankan sort -n, lalu pilih baris pada ceil(p/100 * N) dengan int(N * p + 0.9999) di awk.
  • Laporan Top-N: pipeline klasik awk | sort | uniq -c | sort -rn | head -N berfungsi untuk bidang kategorikal apa pun (jalur, IP, kode status).
  • Histogram ASCII: kelompokkan nilai ke dalam bucket, hitung setiap bin, lalu skalakan panjang batang berdasarkan jumlah bin maksimum agar distribusi dapat dilihat sekilas.
  • Penyebaran dengan pipe bernama: mkfifo + tee memungkinkan Anda mengarsipkan log mentah dan memasoknya ke konsumen metrik secara bersamaan tanpa memuat aliran ke memori.

Primitif yang dapat dikomposisikan ini menghilangkan kebutuhan akan perkakas eksternal selama insiden dan menjadi fondasi skrip observabilitas ringan yang dapat berjalan di mana pun Bash berjalan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghitung Metrik dan Histogram dari Aliran Log” gratis?

Ya — teks lengkap “Menghitung Metrik dan Histogram dari Aliran Log” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menghitung Metrik dan Histogram dari Aliran Log”?

Agregasikan laju permintaan, persentil, dan laporan N-teratas langsung dari data log yang dialirkan. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?

Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Menghitung Metrik dan Histogram dari Aliran Log” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?

Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengurai Log Web dan Aplikasi dalam Skala Besar
  2. Mengikuti Log secara Real-Time dan Mengalirkan Peringatan
  3. Mengkueri journald dengan journalctl dalam Skrip
  4. Menghitung Metrik dan Histogram dari Aliran Log
← Kembali ke DevOps Bootcamp