عد إلى لوحة قيادة السيارة من الدرس 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، والمسار :
# 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، وهو عدد الطلبات قيد المعالجة في اللحظة الدقيقة للقراءة :
# 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 :
# 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.
يعمل Prometheus بنمط pull (يذهب للجلب) : يستعلم بنفسه، كل 15 ثانية في المختبر (scrape_interval: 15s في prometheus/prometheus.yml)، عنوان /metrics لكل خدمة يراقبها. وهذا عكس نظام push، حيث ترسل الخدمة المراقَبة مقاييسها نحو مجمّع. لنمط pull ميزة مباشرة : إذا توقفت خدمة عن الاستجابة، يعرف Prometheus ذلك فوراً، وينتقل المقياس up إلى 0، دون الاعتماد على الخدمة المعطلة للإبلاغ عن غيابها بنفسها. هذا بالضبط ما يجعلك تمرين هذه الوحدة تستحضره بـ casser api.
| المصطلح | ما هو | في المختبر |
|---|---|---|
| scrape (كشط) | قراءة لـ /metrics من قِبل Prometheus | كل 15 ثانية، على كل هدف من الأهداف الثمانية |
| target (هدف) | عنوان /metrics يقرؤه Prometheus | http://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، في الغالب)، بدلاً من جملة حرة. يكتب API على مخرجه القياسي سطر JSON لكل طلب يعالجه. إليك سطراً حقيقياً، قرأه .\labo.ps1 journal api على جهاز الدورة :
{"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"}| الحقل | مثال | ما هو |
|---|---|---|
horodatage | 2026-09-15T19:33:25.839+00:00 | اللحظة الدقيقة للحدث، بصيغة ISO 8601، بتوقيت UTC (+00:00) |
niveau | INFO | الخطورة : INFO (2xx)، وWARNING (404، 422)، وERROR (500). ثلاث قيم في المختبر |
id_requete | 46bb533b33e9 | معرّف فريد من 12 حرفاً مولَّد لهذا الطلب، يُعاد إلى العميل في ترويسة HTTP x-id-requete |
methode | GET | طريقة HTTP |
route | /cours/{id} | قالب المسار، وهو نفسه الموجود في المقياس |
code | 200 | رمز استجابة HTTP |
duree_ms | 13.9 | مدة المعالجة، بالمللي ثانية |
message | GET /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 | يقرأ الأهداف، ويخزن السلاسل، ويقيّم القواعد | 9090 | http://localhost:9090 |
alertmanager | يستقبل تنبيهات Prometheus، ويجمعها، ويوجهها | 9093 | http://localhost:9093 |
grafana | يستكشف ويعرض Prometheus وLoki وAlertmanager | 3000 (GRAFANA_PORT) | http://localhost:3000 (admin / aiopsatlas2026) |
loki | يخزن السجلات، مفهرسة حسب التسميات | 3100 | http://localhost:3100/ready |
alloy | يكتشف الحاويات وينقل سجلاتها نحو Loki | 12345 | http://localhost:12345 |
node-exporter | مقاييس الجهاز المضيف | 9100 | http://localhost:9100/metrics |
cadvisor | مقاييس كل حاوية | 8080 | http://localhost:8080 |
api | الخدمة المراقَبة | 8000 | http://localhost:8000/cours · http://localhost:8000/metrics |
webhook | يستقبل التنبيهات ويعرضها | 8090 | http://localhost:8090 |
charge | يولّد حركة نحو API | لا شيء | لا شيء : ليس له واجهة، سجل فقط |
تسعة منافذ، عشر خدمات : charge لا يستمع على أي منفذ. ثمانية أهداف Prometheus، عشر خدمات : charge وwebhook لا يعرضان /metrics.
تفترض هذه الخطوات أن المختبر قد بدأ (الدرس 04). إذا كنت تقرأ هذا الدرس قبل ذلك، احتفظ به لوقت لاحق : كل خطوة تتم في المتصفح أو في طرفية، بالقراءة فقط.
افتح 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.
ابحث عن الـ # TYPE الأربعة لـ API. في الصفحة، ابحث (Ctrl+F) عن # TYPE http_ : تجد counter لـ http_requetes_total وhistogram لـ http_duree_requete_seconds. ابحث عن # TYPE requetes_en_cours : gauge. ابحث عن summary : لا توجد نتيجة.
ما يجب رؤيته : الأنواع الثلاثة المستخدمة، والغياب المتعمد للنوع الرابع.
عدّ سلاسل http_requetes_total في Prometheus. افتح http://localhost:9090، واكتب http_requetes_total في حقل الاستعلام ونفّذ. على جهاز الدورة، يعرض الجدول 14 سطراً، منها :
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 ثانية.
اقرأ سطر سجل من API في الطرفية. من المجلد lab3 :
.\labo.ps1 journal apiعلى جهاز الدورة، تبدو الأسطر الأخيرة هكذا :
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.
تحقق من التسميات التي يعرفها Loki. افتح http://localhost:3100/loki/api/v1/labels :
{"status":"success","data":["code","conteneur","niveau","service"]}ثم http://localhost:3100/loki/api/v1/label/niveau/values :
{"status":"success","data":["ERROR","INFO","WARNING"]}ما يجب رؤيته : أربع تسميات، لا ثمانٍ. لا يفهرس Loki لا id_requete ولا duree_ms ولا message : تبقى هذه الحقول في نص السطر، حيث يستطيع LogQL استخراجها عند الطلب بـ | json (الوحدة 5). القيم الثلاث لـ niveau تؤكد الجدول أعلاه.
الرسائل أدناه استُحضرت فعلياً في Prometheus، على جهاز الدورة. ستعود في الوحدة 2 ؛ فمن الأفضل التعرف عليها منذ الآن.
نسيان علامات الاقتباس حول قيمة تسمية : up{job=api} يعيد
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) يعيد
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 يعرض تحذيراً :
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).
/metrics التي فتحتها في الخطوة 1 (الأسطر # HELP و# TYPE، وتهريب التسميات)._total لعداد، و_seconds لمدة، و_bytes لحجم ؛ يحترم API المختبر هذه الاصطلاحات، باستثناء واحد : الأسماء بالفرنسية.histogram_quantile.api/app.py لعرض المقاييس ؛ الوحدة 3 تجعلك تضيف مقياسك الخاص بها.up، والتصفية حسب تسمية، وحساب rate()، وقراءة مدرج تكراري بـ histogram_quantile().