حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات
اجمع معدلات الطلبات والمئينات وتقارير أعلى N مباشرةً من بيانات السجلات المتدفقة
حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات درس مجاني في Linux Command Line & Bash Scripting Mastery على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Linux Command Line & Bash Scripting Mastery، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Linux Command Line & Bash Scripting Mastery 4 دروس في المجموع.
لماذا نحسب المقاييس من السجلات الخام؟
تُصدر أنظمة الإنتاج آلاف أسطر السجل في الثانية. وبدلًا من إرسال السجلات الخام إلى منصات تحليلات مكلفة، يمكنكم حساب معدلات الطلبات والنسب المئوية وتقارير أعلى N مباشرةً في shell — وبتكلفة تقترب من الصفر.
- معدل الطلبات: كم طلبًا في الثانية أو الدقيقة تعالج خدمتكم؟
- النسب المئوية لزمن الاستجابة: ما زمن الاستجابة عند p50 أو p95 أو p99؟
- تقارير أعلى N: ما نقاط النهاية أو عناوين IP أو رموز الأخطاء الأكثر تكرارًا؟
تشكل أدوات shell مثل awk وsort وuniq وbc مسار معالجة قويًا قابلًا للتركيب، يمكنه الإجابة عن هذه الأسئلة من دفق سجل مباشر أو ملف تاريخي دون مغادرة الطرفية.
بنية سجل وصول شائع
تكتب معظم خوادم الويب سجلاتها بتنسيق Combined Log Format. ويُعد فهم حقوله أساس كل مسار لمعالجة المقاييس:
127.0.0.1 - frank [10/Oct/2024:13:55:36 -0700] "GET /api/users HTTP/1.1" 200 2326 0.042- الحقل 1: عنوان IP للعميل
- الحقل 4 (بين قوسين): الطابع الزمني
- الحقل 7 (بين علامتي اقتباس): طريقة HTTP والمسار
- الحقل 9: رمز الحالة
- الحقل 10: عدد بايتات الاستجابة
- الحقل 11: زمن الاستجابة بالثواني (حقل مخصص، وليس موجودًا دائمًا)
استخدموا awk للإشارة إلى الحقول حسب موضعها ($1 و$9 وغيرهما). ولا تُحسب الحقول الواقعة بين علامتي اقتباس كرمز واحد إلا عند التقسيم بعناية — غلّفوا سطر السجل في awk -F'"' أو استخدموا عدة تمريرات.
حساب معدل الطلبات لكل دقيقة
لحساب الطلبات في الدقيقة، استخرجوا جزء الدقيقة من كل طابع زمني ثم احسبوا مرات ظهوره. يمنحكم النمط [day/Mon/year:HH:MM مجموعة الساعة والدقيقة.
يقرأ مسار المعالجة أدناه access.log ويطبع جدولًا من الشكل الدقيقة → عدد الطلبات:
#!/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معدل النافذة المنزلقة مع دفق مباشر
عند المتابعة المباشرة، تحتاجون إلى نافذة منزلقة. وتتمثل الحيلة في تمرير tail -f إلى awk الذي يعيد ضبط عداده كل N ثانية باستخدام ساعة النظام (systime()).
يطبع هذا المثال سطر معدل كل 10 ثوانٍ:
#!/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
}
}'استخراج قيم زمن الاستجابة لحساب النسب المئوية
تتطلب النسب المئوية فرز جميع قيم زمن الاستجابة المرصودة. والطريقة القياسية هي:
- استخراج عمود زمن الاستجابة في قائمة أرقام عادية.
- فرز القائمة رقميًا.
- اختيار القيمة في المرتبة الصحيحة باستخدام حساب عدد الأسطر.
يستخرج النص البرمجي أدناه الحقل 11 (زمن الاستجابة بالثواني) ويحفظه في ملف مؤقت لحساب النسب المئوية في الخطوة التالية:
#!/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حساب p50 وp95 وp99 باستخدام awk
بعد فرز قيم زمن الاستجابة، يصبح اختيار نسبة مئوية عملية حسابية: تقع النسبة المئوية p في الصف ceil(p/100 * N). ويمكن لـ awk وحده تنفيذ ذلك في تمريرة واحدة بعد تحميل الملف المرتب في مصفوفة:
#!/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"إنشاء تقرير أعلى N من نقاط النهاية
يجيب تقرير أعلى N عن السؤال: «ما المسارات الأكثر وصولًا إليها؟» والنمط التقليدي في shell هو:
awkلطباعة الحقل المطلوب (مثل مسار URL)sortلتجميع القيم المتطابقةuniq -cلعدّ التكرارات المتتاليةsort -rnلترتيب القيم تنازليًا حسب العددhead -n 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 }'أعلى N حسب رمز الحالة: اكتشاف الأخطاء بنظرة واحدة
توضح رموز حالة HTTP حالة خدمتكم. ويكشف تجميع أسطر السجل حسب رمز الحالة وعدّها ما إذا كانت الأخطاء نادرة أم منتشرة على مستوى النظام.
ينشئ النص البرمجي أدناه تفصيلًا عبر جميع مجموعات 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مخططات ASCII المدرّجة باستخدام awk
يجعل المدرج النصي لتوزيعات زمن الاستجابة قراءتها فورية في الطرفية أو سجل CI. وتتمثل الطريقة في:
- وضع كل قيمة لزمن الاستجابة في فئة (مثل 0-50ms و50-100ms و…).
- عدّ المشاهدات في كل فئة.
- طباعة شريط من محارف
#بمقياس يتناسب مع أكبر عدد.
يفيد ذلك للغاية في اكتشاف التوزيعات ثنائية النمط أو القيم الشاذة دون استخدام أداة رسم بياني.
#!/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جمع المقاييس: تقرير الملخص بأمر واحد
تحتاج أدلة تشغيل الإنتاج غالبًا إلى أمر واحد يُصدر جميع المقاييس الرئيسية دفعة واحدة: المعدل، والنسب المئوية لزمن الاستجابة، ونقاط النهاية الأعلى، ومعدل الأخطاء. ويمكنكم تركيب كل ما تعلمتموه حتى الآن في نص برمجي واحد يستدعيه شخص أو نظام تنبيه.
#!/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)]
}'بث المقاييس عبر الأنابيب المسماة وtee
في مسارات معالجة قابلية المراقبة، تحتاجون غالبًا إلى تفريع دفق سجل: كتابة الأسطر الخام على القرص، وفي الوقت نفسه حساب المقاييس. يتيح tee مع أنبوب مسمّى (mkfifo) ذلك دون تخزين الدفق بأكمله مؤقتًا في الذاكرة.
mkfifo /tmp/log_pipe— إنشاء الأنبوب المسمّىtee /tmp/log_pipe | metric_consumer &— تفريع أحد المسارين إلى مستهلك المقاييس- يكتب المسار الآخر البيانات إلى ملف الأرشيف
يحافظ هذا النمط على فصل عمليات الكتابة إلى القرص عن تجميع المقاييس، ويسمح بإعادة تشغيل أي من الجانبين بشكل مستقل.
#!/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"ما تقنية awk التي تحسب بشكل صحيح القيمة المئوية p95 من مصفوفة مرتبة تحتوي على N من قيم زمن الاستجابة؟
لقد حمّلت N من قيم زمن الاستجابة المرتبة في مصفوفة awk باسم v[1..N]. ما التعبير الذي يسترجع بشكل صحيح القيمة المئوية p95؟
مراجعة الدرس: المقاييس والمدرجات التكرارية من تدفقات السجلات
في هذا الدرس، أنشأت خط أنابيب متكاملًا للمقاييس مباشرةً في Bash:
- معدل الطلبات: تستخرج
awkفترة الدقيقة من الطوابع الزمنية وتحسب التكرارات؛ ويتيحtail -fمعsystime()حساب معدل مباشر ضمن نافذة زمنية منزلقة. - النسب المئوية لزمن الاستجابة: استخرج عمود زمن الاستجابة، ثم استخدم
sort -n، وبعد ذلك اختر الصف الموجود عندceil(p/100 * N)باستخدامint(N * p + 0.9999)في awk. - تقارير أعلى N: يعمل خط الأنابيب التقليدي
awk | sort | uniq -c | sort -rn | head -Nمع أي حقل تصنيفي (المسار أو IP أو رمز الحالة). - المدرجات التكرارية النصية: جمّع القيم في فئات، واحسب عدد القيم في كل فئة، واضبط طول الشريط وفقًا لأكبر عدد في فئة للحصول على عرض سريع للتوزيع.
- توزيع التدفق باستخدام الأنابيب المُسمّاة: يتيح
mkfifoمعteeأرشفة السجلات الخام وتغذية مستهلكي المقاييس في الوقت نفسه، من دون تحميل التدفق إلى الذاكرة.
تلغي هذه اللبنات القابلة للتركيب الحاجة إلى أدوات خارجية أثناء الحوادث، وتشكل أساسًا لبرامج نصية خفيفة للمراقبة يمكن تشغيلها في أي مكان يعمل فيه Bash.
الأسئلة الشائعة
هل درس «حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات» مجاني؟
نعم — نص درس «حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Linux Command Line & Bash Scripting Mastery، انتقل إلى CoddyKit PRO. تتضمن دورة Linux Command Line & Bash Scripting Mastery 4 دروس في المجموع.
ماذا ستتعلم في «حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات»؟
اجمع معدلات الطلبات والمئينات وتقارير أعلى N مباشرةً من بيانات السجلات المتدفقة تتمرن على Linux Command Line & Bash Scripting Mastery مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Linux Command Line & Bash Scripting Mastery؟
لا تُشترط خبرة سابقة. Linux Command Line & Bash Scripting Mastery على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Linux Command Line & Bash Scripting Mastery هذا؟
نعم. كل درس في Linux Command Line & Bash Scripting Mastery يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحليل سجلات الويب والتطبيقات على نطاق واسع
- متابعة السجلات والتنبيهات المتدفقة في الوقت الفعلي
- الاستعلام عن journald باستخدام journalctl داخل السكربتات
- حساب المقاييس والمدرّجات التكرارية من تدفقات السجلات