الأركان الثلاثة والمصطلحات

15 دقيقة
الجمهور
مبتدئ، بعد قراءة الدرس 01
المدة
من 35 إلى 45 دقيقة
الوحدة
1/7
الكفاءة المستهدفة
التعرف على أنواع مقاييس Prometheus الأربعة على الأسطر الحقيقية لـ /metrics في API المختبر، وفهم التسميات والعدد الكلي (cardinalité)، والتمييز بين pull وpush، وقراءة سطر سجل JSON حقلاً بحقل، وتحديد موقع خدمات المختبر العشر بمنفذها وعنوانها

في صورة واحدة

عد إلى لوحة قيادة السيارة من الدرس 01. عداد المسافات لا يفعل سوى الازدياد : إنه عداد (counter)، مثل http_requetes_total. مؤشر الوقود يرتفع عند التعبئة وينخفض أثناء القيادة : إنه مقياس لحظي (gauge)، مثل requetes_en_cours. دفتر الصيانة الذي يدوّن « 12 رحلة أقل من 10 كم، و30 أقل من 50 كم، و3 أكثر من 100 كم » يصنّف كل رحلة في شريحة : إنه مدرج تكراري (histogram)، مثل http_duree_requete_seconds. أما الصندوق الأسود، الذي يكتب سطراً لكل حدث مع الوقت الدقيق، فهو سجل JSON الخاص بـ API. لا يستقبل Prometheus شيئاً : هو من يأتي ليقرأ العدادات كل 15 ثانية، مثل مراقب يمرّ لتسجيل قراءات عدادات كل سيارة في الأسطول.

كيف يعمل ذلك

أنواع المقاييس الأربعة، على الأسطر الحقيقية للمختبر

لمقياس Prometheus دائماً اسم، وربما تسميات، وقيمة رقمية. النوع يقول كيف تُقرأ هذه القيمة في الزمن. يعرف Prometheus أربعة أنواع : العداد، والمقياس اللحظي، والمدرج التكراري، والملخص. الأنواع الثلاثة الأولى يستخدمها API الكتالوج ؛ أما الرابع فلا، والسبب مفيد. جميع الأسطر أدناه منسوخة من http://localhost:8000/metrics على جهاز الدورة ؛ ستكون القيم مختلفة عندك.

العداد (counter). العداد لا يفعل سوى الازدياد، أو يعود إلى الصفر إذا أعيد تشغيل الخدمة. إنه يعدّ أحداثاً متراكمة. يعرض API المقياس http_requetes_total، بثلاث تسميات : رمز الاستجابة، وطريقة HTTP، والمسار :

text
# HELP http_requetes_total Nombre de requêtes HTTP reçues, par méthode, route normalisée et code de réponse.
# TYPE http_requetes_total counter
http_requetes_total{code="200",methode="GET",route="/cours"} 3247.0
http_requetes_total{code="201",methode="POST",route="/inscriptions"} 855.0
http_requetes_total{code="404",methode="GET",route="/cours/{id}"} 210.0
http_requetes_total{code="500",methode="GET",route="/cours"} 32.0

ما لا تفعله أبداً مع عداد : قراءة قيمته الخام لتقول « هناك 3247 طلباً في هذه اللحظة ». العداد لا ينخفض أبداً ؛ ما يهمك هو سرعة ازدياده، المحسوبة بالدالة rate() (الوحدة 2). التوثيق : Prometheus — Metric types, Counter.

المقياس اللحظي (gauge). المقياس اللحظي يرتفع وينخفض بحرية : قيمة في لحظة معينة. يعرض API المقياس requetes_en_cours، وهو عدد الطلبات قيد المعالجة في اللحظة الدقيقة للقراءة :

text
# HELP requetes_en_cours Nombre de requêtes HTTP en cours de traitement à cet instant.
# TYPE requetes_en_cours gauge
requetes_en_cours 1.0

طلب واحد قيد المعالجة في لحظة القراءة ؛ في اللحظة التالية، قد يكون هذا الرقم 0 أو 4. يعرض API أيضاً مقاييس لحظية للإعداد، قيمتها معلومة أكثر منها قياساً : api_info{version="1.0.0"} 1.0 (الإصدار في التسمية، والقيمة تساوي 1 دائماً) وapi_panne_taux_erreurs 0.01 (نسبة الطلبات التي يُفشلها API عمداً : 1 % في التشغيل العادي). التوثيق : Prometheus — Metric types, Gauge.

المدرج التكراري (histogram). المدرج التكراري يقيس توزيع قيمة، مثل مدة طلب HTTP : كم عدد الطلبات التي استغرقت أقل من 5 مللي ثانية، أقل من 10 مللي ثانية، أقل من 25 مللي ثانية… ؟ يعرض API المقياس http_duree_requete_seconds. خلافاً للعداد أو المقياس اللحظي، ينشر المدرج التكراري عدة أسطر لمقياس واحد : عداد لكل شريحة (bucket)، بالإضافة إلى عدد إجمالي ومجموع. إليك الأسطر الاثني عشر للمسار /cours :

text
# HELP http_duree_requete_seconds Durée de traitement des requêtes HTTP, en secondes, par route normalisée.
# TYPE http_duree_requete_seconds histogram
http_duree_requete_seconds_bucket{le="0.005",route="/cours"} 32.0
http_duree_requete_seconds_bucket{le="0.01",route="/cours"} 74.0
http_duree_requete_seconds_bucket{le="0.025",route="/cours"} 1566.0
http_duree_requete_seconds_bucket{le="0.05",route="/cours"} 3248.0
http_duree_requete_seconds_bucket{le="0.1",route="/cours"} 3276.0
http_duree_requete_seconds_bucket{le="0.25",route="/cours"} 3278.0
http_duree_requete_seconds_bucket{le="0.5",route="/cours"} 3279.0
http_duree_requete_seconds_bucket{le="1.0",route="/cours"} 3279.0
http_duree_requete_seconds_bucket{le="2.0",route="/cours"} 3279.0
http_duree_requete_seconds_bucket{le="+Inf",route="/cours"} 3279.0
http_duree_requete_seconds_count{route="/cours"} 3279.0
http_duree_requete_seconds_sum{route="/cours"} 85.42293146001248

كل _bucket{le="…"} (le اختصار less or equal) يعدّ الطلبات الأسرع من هذه العتبة أو المساوية لها، بشكل تراكمي : الطلبات الـ 32 التي استغرقت أقل من 5 مللي ثانية تُحسب أيضاً ضمن الـ 74 الأقل من 10 مللي ثانية، وضمن الـ 3279 في الدلو +Inf (الكل). _count هو العدد الإجمالي للملاحظات (3279، يساوي الدلو +Inf)، و_sum مجموع كل المدد (85,4 ثانية في المجموع، أي 26 مللي ثانية في المتوسط لكل طلب). هذا ما يتيح إعادة بناء كمّيّ (quantile) لاحقاً، بـ histogram_quantile() (الوحدة 2). قراءة مباشرة : 3248 طلباً من أصل 3279 استغرقت أقل من 50 مللي ثانية، أي 99 %. التوثيق : Prometheus — Metric types, Histogram.

الملخص (summary)، ولماذا لا يستخدمه المختبر. الملخص يقيس أيضاً توزيعاً، لكنه يحسب كمّيّاته مباشرة داخل البرنامج المراقَب، قبل نشرها : سطر {quantile="0.5"}، وسطر {quantile="0.9"}، بالإضافة إلى _sum و_count. المشكلة : الكمّيّ المحسوب من جهة العميل لا يمكن إعادة دمجه مع كمّيّ مثيل آخر. لو كان المختبر يشغّل ثلاث نسخ من API، لما استطعت حساب متوسط الثلاثة quantile="0.9" للحصول على المئين التسعين الحقيقي للمجموع. المدرج التكراري ينشر عدادات خاماً لكل شريحة : يستطيع Prometheus جمعها بين المثيلات قبل حساب الكمّيّ. لذلك لا يوجد أي سطر summary في /metrics الخاص بـ API المختبر. التوثيق : Prometheus — Histograms and summaries.

النوعما يقيسهفي المختبرالسؤال الذي يجيب عنه
العدادتراكم لا يفعل سوى الازديادhttp_requetes_total وinscriptions_total وcours_consultes_total« كم طلباً في الثانية ؟ » (مع rate)
المقياس اللحظيقيمة لحظية ترتفع وتنخفضrequetes_en_cours وapi_disque_libre_octets وapi_info« كم في هذه اللحظة ؟ »
المدرج التكراريتوزيع، بشرائح تراكميةhttp_duree_requete_seconds« 95 % من الطلبات تستغرق أقل من كم ؟ »
الملخصتوزيع، كمّيّات محسوبة من جهة العميللا شيءالسؤال نفسه، لكن دون إمكانية التجميع بين المثيلات

السلسلة الزمنية والتسميات والعدد الكلي

كل تركيبة فريدة من اسم مقياس وتسميات تشكّل سلسلة زمنية : سلسلة من الأزواج (طابع زمني، قيمة) يخزنها Prometheus ويستعلمها. http_requetes_total{code="200",methode="GET",route="/cours"} سلسلة ؛ وhttp_requetes_total{code="201",methode="POST",route="/inscriptions"} سلسلة أخرى. على جهاز الدورة، يضم http_requetes_total 14 سلسلة (14 تركيبة من رمز وطريقة ومسار ظهرت منذ بدء التشغيل). التسميات تتيح التصفية والتجميع دون تغيير الاسم : « أخطاء الخادم، على /inscriptions فقط » تُكتب http_requetes_total{route="/inscriptions",code=~"5.."}. التوثيق : Prometheus — Data model.

العدد الكلي (cardinalité) لمقياس هو عدد السلاسل المتمايزة التي ينتجها. http_requetes_total{code,methode,route}، بخمسة رموز وطريقتين وسبعة مسارات في شكل قالب، يعطي بضع عشرات من السلاسل على الأكثر. انظر إلى سجل الخطوة 2 من الدرس 01 : استدعى الطلب /cours/C0038، لكن المقياس يحمل route="/cours/{id}"، أي قالب المسار كما أعلنه FastAPI. لو احتوت التسمية على المعرّف الحقيقي، لأنشأت كل دورة يُطّلع عليها سلسلة : 64 دورة × 5 رموز × طريقتان. على كتالوج حقيقي من عشرات الآلاف من الدورات، سينفجر المقياس وسيتباطأ Prometheus. القاعدة : يجب أن يكون للتسمية عدد محدود ومعقول من القيم ؛ المعرّف الفريد أو عنوان IP أو الطابع الزمني لا مكان لها في تسمية. المسار غير الموجود يُحسب تحت route="inconnue"، وليس أبداً تحت مساره الحقيقي، للسبب نفسه.

يحتوي المختبر عمداً على استثناء مفيد : inscriptions_total{cours_id="C0028"} وcours_consultes_total{cours_id="…"} لهما تسمية لكل دورة. مع 64 دورة، يبقى الأمر محدوداً (64 سلسلة لكل منهما). مع مليون دورة، سيكون ذلك خطأً. وللمختبر في الواقع تنبيه PrometheusTropDeSeries يرن فوق 100 000 سلسلة. التوثيق : Prometheus — Instrumentation, cardinality.

Pull وscrape وtarget وexporter وjob وinstance

يعمل Prometheus بنمط pull (يذهب للجلب) : يستعلم بنفسه، كل 15 ثانية في المختبر (scrape_interval: 15s في prometheus/prometheus.yml)، عنوان /metrics لكل خدمة يراقبها. وهذا عكس نظام push، حيث ترسل الخدمة المراقَبة مقاييسها نحو مجمّع. لنمط pull ميزة مباشرة : إذا توقفت خدمة عن الاستجابة، يعرف Prometheus ذلك فوراً، وينتقل المقياس up إلى 0، دون الاعتماد على الخدمة المعطلة للإبلاغ عن غيابها بنفسها. هذا بالضبط ما يجعلك تمرين هذه الوحدة تستحضره بـ casser api.

المصطلحما هوفي المختبر
scrape (كشط)قراءة لـ /metrics من قِبل Prometheusكل 15 ثانية، على كل هدف من الأهداف الثمانية
target (هدف)عنوان /metrics يقرؤه Prometheushttp://api:8000/metrics وhttp://node-exporter:9100/metrics
exporter (مُصدِّر)برنامج يعرض بصيغة Prometheus مقاييس نظام لا يتحدث هذه الصيغة أصلاًnode-exporter (الجهاز المضيف)، وcadvisor (الحاويات)
job (مهمة)مجموعة أهداف تؤدي العمل نفسهjob="api" وjob="prometheus" وjob="loki"… 8 مهام
instance (مثيل)هدف فردي داخل مهمةinstance="api:8000"
upالمقياس الذي يصنعه Prometheus بنفسه عند كل كشط : 1 إذا استجاب الهدف، و0 خلاف ذلكup{job="api"} يساوي 1 في التشغيل العادي

الأسماء api:8000 وnode-exporter:9100 هي أسماء الشبكة الداخلية لـ Docker Compose : إنه Prometheus، في حاويته، الذي يتحدث إلى API في حاويته. من جهازك، الصفحة نفسها هي http://localhost:8000/metrics. التوثيق : Prometheus — Configuration, scrape_config وPrometheus — Jobs and instances.

السجلات المنظمة : سطر JSON لكل حدث

السجل المنظم يُكتب بصيغة تقطّعها الآلة دون تخمين (JSON، في الغالب)، بدلاً من جملة حرة. يكتب API على مخرجه القياسي سطر JSON لكل طلب يعالجه. إليك سطراً حقيقياً، قرأه .\labo.ps1 journal api على جهاز الدورة :

json
{"horodatage": "2026-09-15T19:33:25.839+00:00", "niveau": "INFO", "id_requete": "46bb533b33e9", "methode": "GET", "route": "/cours/{id}", "code": 200, "duree_ms": 13.9, "message": "GET /cours/C0038 -> 200"}
الحقلمثالما هو
horodatage2026-09-15T19:33:25.839+00:00اللحظة الدقيقة للحدث، بصيغة ISO 8601، بتوقيت UTC (+00:00)
niveauINFOالخطورة : INFO (2xx)، وWARNING (404، 422)، وERROR (500). ثلاث قيم في المختبر
id_requete46bb533b33e9معرّف فريد من 12 حرفاً مولَّد لهذا الطلب، يُعاد إلى العميل في ترويسة HTTP x-id-requete
methodeGETطريقة HTTP
route/cours/{id}قالب المسار، وهو نفسه الموجود في المقياس
code200رمز استجابة HTTP
duree_ms13.9مدة المعالجة، بالمللي ثانية
messageGET /cours/C0038 -> 200الجملة المقروءة : هنا، وهنا فقط، يظهر المعرّف الحقيقي للدورة

ما يجب رؤيته : route يحتفظ بالقالب /cours/{id} (مثل المقياس)، لكن message يحتوي على C0038، المعرّف الحقيقي. يمكن للسجل أن يسمح لنفسه بهذا التفصيل : لا يفهرس Loki نص الرسالة، بل يفهرس أربع تسميات فقط (service وconteneur وniveau وcode) يستخرجها Alloy. الوحدة 5 تريك كيف يقرأ Alloy الـ JSON ويصنع هذه التسميات. التوثيق : Grafana Loki — Labels.

لا تكتب جميع خدمات المختبر الأخرى JSON. فـ webhook، عند بدء التشغيل، يكتب نصاً حراً : INFO: Uvicorn running on http://0.0.0.0:8090 (Press CTRL+C to quit). والخدمة charge تكتب JSON، لكن بحقول أخرى : كل 30 ثانية، ملخص {"niveau": "INFO", "message": "résumé des 30 dernières secondes", "requetes": {"200": 214, "total": 262, "201": 26, "500": 4, "404": 16, "422": 2}}. السجل المنظم ليس صيغة عالمية : إنه قرار يُتخذ خدمة بخدمة.

التتبعات : ذكر، بلا أداة في هذا المختبر

التتبع (trace) يتابع طلباً واحداً عبر عدة خدمات : كل مرحلة (span) تسجّل اسمها ومدتها وعلاقتها الأب-الابن مع المراحل الأخرى. يجيب عن « استغرق الطلب 800 مللي ثانية، في أي خدمة قُضي هذا الوقت ؟ ». لا يثبّت المختبر أي أداة تتبع : API الكتالوج ومولّد الحمل هما الخدمتان التطبيقيتان الوحيدتان، مرتبطتان باستدعاء HTTP بسيط، مما يحدّ من الفائدة التعليمية لتتبع موزع هنا. id_requete في السجل هو أصلاً القطعة الأولى من تتبع : هو ما سيسميه OpenTelemetry trace id. الوحدة 7 تقول عنه كلمة إضافية. التوثيق : OpenTelemetry — Traces.

الخدمات العشر : الدور والمنفذ والعنوان

الخدمةالدورالمنفذالعنوان من جهازك
prometheusيقرأ الأهداف، ويخزن السلاسل، ويقيّم القواعد9090http://localhost:9090
alertmanagerيستقبل تنبيهات Prometheus، ويجمعها، ويوجهها9093http://localhost:9093
grafanaيستكشف ويعرض Prometheus وLoki وAlertmanager3000 (GRAFANA_PORT)http://localhost:3000 (admin / aiopsatlas2026)
lokiيخزن السجلات، مفهرسة حسب التسميات3100http://localhost:3100/ready
alloyيكتشف الحاويات وينقل سجلاتها نحو Loki12345http://localhost:12345
node-exporterمقاييس الجهاز المضيف9100http://localhost:9100/metrics
cadvisorمقاييس كل حاوية8080http://localhost:8080
apiالخدمة المراقَبة8000http://localhost:8000/cours · http://localhost:8000/metrics
webhookيستقبل التنبيهات ويعرضها8090http://localhost:8090
chargeيولّد حركة نحو APIلا شيءلا شيء : ليس له واجهة، سجل فقط

تسعة منافذ، عشر خدمات : charge لا يستمع على أي منفذ. ثمانية أهداف Prometheus، عشر خدمات : charge وwebhook لا يعرضان /metrics.

خطوة بخطوة

تفترض هذه الخطوات أن المختبر قد بدأ (الدرس 04). إذا كنت تقرأ هذا الدرس قبل ذلك، احتفظ به لوقت لاحق : كل خطوة تتم في المتصفح أو في طرفية، بالقراءة فقط.

  1. افتح http://localhost:8000/metrics في المتصفح. هذه هي الصفحة الخام التي يقرؤها Prometheus كل 15 ثانية : نص، سطر لكل سلسلة، مسبوق بسطريه # HELP و# TYPE. على جهاز الدورة، تضم 271 سطراً. قارن مع http://localhost:9100/metrics (node-exporter : 1578 سطراً) وhttp://localhost:8080/metrics (cAdvisor : 3444 سطراً، لعشر حاويات).

    ما يجب رؤيته : الأسطر التي تبدأ بـ python_ وprocess_ في أعلى صفحة API لم يكتبها المختبر. تضيفها مكتبة prometheus_client من تلقاء نفسها (ذاكرة العملية، جامع القمامة في Python). تبدأ مقاييس الدورة من http_requetes_total.

  2. ابحث عن الـ # TYPE الأربعة لـ API. في الصفحة، ابحث (Ctrl+F) عن # TYPE http_ : تجد counter لـ http_requetes_total وhistogram لـ http_duree_requete_seconds. ابحث عن # TYPE requetes_en_cours : gauge. ابحث عن summary : لا توجد نتيجة.

    ما يجب رؤيته : الأنواع الثلاثة المستخدمة، والغياب المتعمد للنوع الرابع.

  3. عدّ سلاسل http_requetes_total في Prometheus. افتح http://localhost:9090، واكتب http_requetes_total في حقل الاستعلام ونفّذ. على جهاز الدورة، يعرض الجدول 14 سطراً، منها :

    text
    http_requetes_total{code="200", instance="api:8000", job="api", methode="GET", route="/cours", service="api"}   3241
    http_requetes_total{code="500", instance="api:8000", job="api", methode="GET", route="/cours", service="api"}   32

    ما يجب رؤيته : أضاف Prometheus ثلاث تسميات إلى تسميات صفحة /metrics : job="api" وinstance="api:8000" (اللتان تحددان الهدف) وservice="api" (المضافة بإعداد المهمة في prometheus.yml). القيمة 3241 أقل قليلاً من 3247 المقروءة في الخطوة 1 : يعرض Prometheus آخر كشط، الذي يعود إلى ما بين 0 و15 ثانية.

  4. اقرأ سطر سجل من API في الطرفية. من المجلد lab3 :

    powershell
    .\labo.ps1 journal api

    على جهاز الدورة، تبدو الأسطر الأخيرة هكذا :

    text
    labo-api  | {"horodatage": "2026-09-15T19:33:25.916+00:00", "niveau": "INFO", "id_requete": "5ccaee4d1a2a", "methode": "GET", "route": "/sante", "code": 200, "duree_ms": 1.0, "message": "GET /sante -> 200"}
    labo-api  | {"horodatage": "2026-09-15T19:33:26.217+00:00", "niveau": "INFO", "id_requete": "e64206564a68", "methode": "GET", "route": "/cours/{id}", "code": 200, "duree_ms": 8.2, "message": "GET /cours/C0043 -> 200"}

    ما يجب رؤيته : GET /sante كل بضع ثوانٍ، هذا Docker يتحقق من صحة الحاوية (healthcheck) ؛ والباقي هو الخدمة charge. البادئة labo-api | يضيفها Docker Compose، وليست جزءاً من الـ JSON.

  5. تحقق من التسميات التي يعرفها Loki. افتح http://localhost:3100/loki/api/v1/labels :

    json
    {"status":"success","data":["code","conteneur","niveau","service"]}

    ثم http://localhost:3100/loki/api/v1/label/niveau/values :

    json
    {"status":"success","data":["ERROR","INFO","WARNING"]}

    ما يجب رؤيته : أربع تسميات، لا ثمانٍ. لا يفهرس Loki لا id_requete ولا duree_ms ولا message : تبقى هذه الحقول في نص السطر، حيث يستطيع LogQL استخراجها عند الطلب بـ | json (الوحدة 5). القيم الثلاث لـ niveau تؤكد الجدول أعلاه.

إذا حدثت مشكلة

الرسائل أدناه استُحضرت فعلياً في Prometheus، على جهاز الدورة. ستعود في الوحدة 2 ؛ فمن الأفضل التعرف عليها منذ الآن.

  • نسيان علامات الاقتباس حول قيمة تسمية : up{job=api} يعيد

    text
    invalid parameter "query": 1:8: parse error: unexpected identifier "api" in label matching, expected string

    قيمة التسمية هي دائماً سلسلة نصية بين علامتي اقتباس : up{job="api"}. حتى بالنسبة إلى رقم : http_requetes_total{code=500} يعيد parse error: unexpected character inside braces: '5' ؛ يجب كتابة code="500".

  • استدعاء rate() دون نافذة زمنية : rate(http_requetes_total) يعيد

    text
    invalid parameter "query": 1:6: parse error: expected type range vector in call to function "rate", got instant vector

    تحتاج rate() إلى فترة بين قوسين معقوفين : rate(http_requetes_total[1m]). بدون الأقواس، تعطيها القيمة الأخيرة (instant vector) بينما تحتاج إلى سلسلة من القيم (range vector).

  • استدعاء rate() على مقياس لحظي : rate(requetes_en_cours[1m]) لا يسبب خطأً، لكن Prometheus يعرض تحذيراً :

    text
    PromQL info: metric might not be a counter, name does not end in _total/_sum/_count/_bucket: "requetes_en_cours" (1:6)

    النتيجة (0.017… على جهاز الدورة) لا معنى لها : سرعة ازدياد قيمة ترتفع وتنخفض ليست معلومة. rate() مخصصة للعدادات.

  • الخطأ في اسم مقياس : http_request_total (بالمفرد، دون حرف e الفرنسي) يعيد نتيجة فارغة، دون رسالة خطأ. لا يعرف Prometheus هذا المقياس، ولا يصحّحه. الاسم الدقيق هو http_requetes_total. وبالمثل، http_requetes_total{route="/inexistant"} يعيد نتيجة فارغة : المسار المجهول يُحسب تحت route="inconnue"، وليس تحت مساره الحقيقي.

ما يجب تذكره

أنواع مقاييس Prometheus الأربعة هي العداد (http_requetes_total، الذي لا يزداد إلا في اتجاه واحد ويُقرأ بـ rate())، والمقياس اللحظي (requetes_en_cours، الذي يرتفع وينخفض)، والمدرج التكراري (http_duree_requete_seconds، اثنا عشر سطراً لكل مسار : عشرة _bucket تراكمية، و_count، و_sum)، والملخص (غائب عن المختبر، لأن كمّيّاته لا تُجمَّع بين المثيلات). السلسلة الزمنية تركيبة فريدة من اسم وتسميات ؛ لـ http_requetes_total منها 14 على جهاز الدورة. العدد الكلي يفسّر لماذا يحمل المقياس route="/cours/{id}" بينما يحتوي السجل على C0038 في رسالته. يعمل Prometheus بنمط pull : يقرأ (scrape) ثمانية أهداف (targets) كل 15 ثانية، مجمّعة حسب job، ومحددة بـ instance، ويصنع بنفسه المقياس up. السجل المنظم في المختبر سطر JSON من ثمانية حقول، منها id_requete، الذي يُعاد أيضاً في الترويسة x-id-requete ؛ لا يفهرس Loki منه سوى أربع تسميات : service وconteneur وniveau وcode. عشر خدمات، تسعة منافذ (charge ليس له منفذ)، ثمانية أهداف Prometheus (charge وwebhook لا يعرضان /metrics).

للتعمق أكثر

  • Prometheus — Exposition formats : القواعد النحوية الدقيقة لصفحة /metrics التي فتحتها في الخطوة 1 (الأسطر # HELP و# TYPE، وتهريب التسميات).
  • Prometheus — Metric and label naming : لماذا _total لعداد، و_seconds لمدة، و_bytes لحجم ؛ يحترم API المختبر هذه الاصطلاحات، باستثناء واحد : الأسماء بالفرنسية.
  • Prometheus — Histograms and summaries : المقال المرجعي حول الاختيار بين المدرج التكراري والملخص، مع أخطاء التقريب في histogram_quantile.
  • prometheus_client (Python) : المكتبة التي يستخدمها api/app.py لعرض المقاييس ؛ الوحدة 3 تجعلك تضيف مقياسك الخاص بها.
  • Grafana Loki — Labels : لماذا تسميات قليلة، ولا معرّف فريد فيها أبداً : قاعدة العدد الكلي نفسها كما في Prometheus.
  • الوحدة 2 تعيد كل مصطلح عملياً : كتابة up، والتصفية حسب تسمية، وحساب rate()، وقراءة مدرج تكراري بـ histogram_quantile().