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 -k2Laju 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:
- Ekstrak kolom latensi menjadi daftar angka biasa.
- Urutkan secara numerik.
- 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 fileMenghitung 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:
awkuntuk mencetak bidang yang diinginkan (misalnya, jalur URL)sortuntuk mengelompokkan nilai yang identikuniq -cuntuk menghitung duplikat yang berurutansort -rnuntuk mengurutkan berdasarkan jumlah secara menurunhead -n Nuntuk 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 -20Histogram ASCII dengan awk
Histogram teks membuat distribusi latensi langsung mudah dibaca di terminal atau catatan CI. Pendekatannya:
- Masukkan setiap nilai latensi ke dalam bin (misalnya, 0-50ms, 50-100ms, …).
- Hitung pengamatan di setiap bin.
- 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"
fiMenggabungkan 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 bernamatee /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:
awkmengekstrak 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 padaceil(p/100 * N)denganint(N * p + 0.9999)di awk. - Laporan Top-N: pipeline klasik
awk | sort | uniq -c | sort -rn | head -Nberfungsi 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+teememungkinkan 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
- Mengurai Log Web dan Aplikasi dalam Skala Besar
- Mengikuti Log secara Real-Time dan Mengalirkan Peringatan
- Mengkueri journald dengan journalctl dalam Skrip
- Menghitung Metrik dan Histogram dari Aliran Log