يجري طرح تنبيهات الإنفاق والحظر وتقارير الإنفاق تدريجيًا. وإلى أن يتم تفعيلها، تُحفظ القواعد والإعدادات لكن لا يُقيَّم أي شيء ولا يُحظر ولا يُرسل.
كيف تعمل القاعدة
تجمع القاعدة بين:- مقياس: ما الذي يُقاس (راجع أنواع التنبيهات)؛
- نطاق: إنفاق من يُحتسب، مثل مساحة العمل أو مفتاح API واحد أو قسم واحد؛
- فترة: يوم أو أسبوع أو شهر تقويمي، أو نافذة متجددة من الساعات؛
- حدود: المبلغ بالدولار أو النسب المئوية التي تُرسل تنبيهًا؛
- إجراء:
notify، أوblockلرفض الطلبات التي تتجاوز حدًا معيّنًا أيضًا.
أنواع التنبيهات والأسس
تُقاس النسب المئوية مقارنةً بأساس (
base_kind):
amount: مبلغ بالدولار يُحدَّد في القاعدة ويُستخدم للتنبيهات فقط.workspace_budget: ميزانية مساحة العمل ذات الفاصل الزمني المطابق (base_ref:dailyلفترة اليوم، وweeklyللأسبوع، وmonthlyللشهر). لا يمكن أن تكون الميزانية الدائمة أساسًا.key_limit: حد إنفاق مفتاح API الخاص بالقاعدة للنافذة المطابقة. يتطلب نطاق المفتاح.previous_period: الإنفاق عند النقطة نفسها من الفترة السابقة، مثل “أمس حتى هذا الوقت”. وفي القواعد المتجددة هي النافذة السابقة، وفي التوقعات الفترة السابقة كاملة.
النطاقات
يُنسب إنفاق القسم لكل طلب على حدة:
- المفتاح المخصّص لقسم يُحتسب لهذا القسم فقط.
- وإلا فمنشئ المفتاح هو من يحدد: أقسامه، أو في طلبات OAuth أقسام المستخدم الذي سجّل الدخول.
- الشخص الذي ينتمي إلى عدة أقسام يُحتسب افتراضيًا لها كلها. اختر القسم الأساسي فقط بدلًا من كل أقسامه في إعدادات إنفاق مساحة العمل (API:
spend.department_attribution: "primary") لاحتسابه لقسمه الأساسي فقط. وإذا لم يكن أي قسم محددًا كقسم أساسي، فيأتي أولًا قسم أُضيف إليه يدويًا، ثم الأقدم.
الفترات والمناطق الزمنية
اليوم والأسبوع والشهر فترات تقويمية. يمتد الأسبوع من الاثنين إلى الأحد. يمكن لكل قاعدة تحديدtime_zone خاص بها من IANA، مثل Europe/London أو America/New_York؛ وإلا فتستخدم المنطقة الزمنية للفوترة في مساحة العمل، وهي UTC افتراضيًا. غيّر المنطقة الزمنية للفوترة في إعدادات إنفاق مساحة العمل أو باستخدام spend.billing_time_zone في API إعدادات الإشعارات. تُراعى تغييرات التوقيت الصيفي، وأسماء المناطق حساسة لحالة الأحرف.
تغطي فترة rolling آخر window_hours (من 1 إلى 720) وتتقدم باستمرار. تستخدمها قواعد الارتفاع المفاجئ كنافذة للارتفاع، وقواعد الرصيد كمدة لحساب متوسط الإنفاق.
تُعاد حدود المفاتيح وميزانيات مساحة العمل دائمًا عند حدود UTC. القاعدة التي تعتمد أساس
workspace_budget أو key_limit في منطقة زمنية أخرى تقارن يومها أو أسبوعها أو شهرها المحلي بهذا الحد، لذا قد يختلف إنفاقها عمّا يحتسبه الحد.الحدود والتنبيهات المتكررة
بحسب المقياس، تحتوي القاعدة على حد إلى خمسة حدود بالنسبة المئوية (من 1 إلى 1000) أو حد واحد بالدولار.- في الفترات التقويمية، يرسل كل حد تنبيهًا واحدًا على الأكثر في كل فترة. وعندما يتجاوز الإنفاق عدة حدود دفعة واحدة، يذكر تنبيه واحد الحد الأعلى ويسرد الحدود الأخرى.
- تستخدم القواعد المتجددة وقواعد الارتفاع المفاجئ والرصيد بدلًا من ذلك
cooldown_minutes(من 5 إلى 43,200، والافتراضي 360). خلال فترة التهدئة لا يرسل تنبيهًا إلا حدٌّ أعلى، وبعدها تنبّه القاعدة مجددًا إذا ظل الإنفاق فوق الحد. - لا تُرسل الحدود التي أُرسلت بالفعل في هذه الفترة مرة أخرى عند تعديل القاعدة.
[TEST]، إلى وجهات القاعدة. لا يُسجَّل أي شيء، ويمكن لمساحة العمل إرسال خمسة اختبارات في الدقيقة. يعرض السجل لكل قاعدة التنبيهات وحالات الحظر التي أرسلتها.
حظر الطلبات
تنبّه قاعدةspend أو budget_percent ذات action: "block" عند حدودها، وتحظر عندما يبلغ الإنفاق نقطة الحظر: block_at_percent من الأساس (الافتراضي 110، وعلى الأقل الحد الأعلى)، أو block_at_amount لقاعدة spend. لا يمكن للقواعد ذات أساس previous_period الحظر. المسافة بين آخر تنبيه ونقطة الحظر هي هامش السماح: يتلقى فريقك تحذيرًا قبل توقف الطلبات.
طوال فترة نشاط الحظر، تتلقى الطلبات ضمن نطاقه
429 مع رمز الخطأ spend_rule_blocked. يتضمن النص reason: "spend_rule_block" وrule_id وrule_name وblock_id وlimit_scope وlimit_value (بالدولار الأمريكي) وreset_at. يحدد Retry-After عدد الثواني حتى تُعاد الفترة. ليس للقاعدة المتجددة وقت إعادة: يستمر حظرها حتى ينخفض الإنفاق في النافذة إلى ما دون نقطة الحظر، ولا تتضمن الاستجابة Retry-After. يزيل حظر المزوّد مسارات ذلك المزوّد، ولا يُرفض الطلب إلا إذا لم يبقَ مسار آخر. لا تُحظر جلسات الوقت الفعلي بعد.
ما دام الإنفاق فوق آخر حد للقاعدة لكنه دون نقطة الحظر، تحمل استجابات الطلبات ضمن النطاق ترويسة x-phaseo-spend-warning تسرد ما يصل إلى ثلاث قواعد، مثل rule_id=…; scope=workspace; resets_at=2026-11-01T00:00:00.000Z. يمكن للعملاء تسجيلها أو الإبطاء قبل أن يبدأ الحظر.
يُرفع الحظر تلقائيًا عند إعادة الفترة، أو عندما ينخفض إنفاق قاعدة متجددة إلى ما دون نقطة الحظر، أو عند تعطيل القاعدة أو حذفها أو تغييرها. يمكن للمالكين والمشرفين رفعه من تنبيهات الإنفاق → الحظر النشط أو باستخدام POST /v1/spend-blocks/{id}/lift. لا يبدأ الحظر المرفوع مجددًا في الفترة نفسها (وفي القواعد المتجددة لمدة نافذة واحدة). تُرسل إشعارات حظر الإنفاق عند بدء الحظر وعند رفعه.
الرصيد والمدة المتبقية
تراقب قاعدةbalance الرصيد المتاح لمساحة العمل: رصيد الأرصدة مطروحًا منه المبالغ المحجوزة للطلبات الجارية. وتستخدم نطاق مساحة العمل وفترة متجددة، وتنبّه عند تحقق أي من الشرطين:
threshold_amount: الرصيد المتاح يساوي هذا المبلغ أو أقل منه؛runway_days: بمتوسط الإنفاق اليومي خلال آخرwindow_hours، سيكفي الرصيد أقل من هذا العدد من الأيام. وإذا لم يكن هناك إنفاق حديث، فلا يوجد تنبيه للمدة المتبقية.
التوقع
تتوقع قاعدةforecast الإنفاق بخط مستقيم حتى نهاية اليوم أو الأسبوع أو الشهر الحالي: الإنفاق حتى الآن مقسومًا على الجزء المنقضي من الفترة. وتنتظر حتى تمر 3 ساعات من اليوم أو 24 ساعة من الأسبوع أو 72 ساعة من الشهر، وحتى يُنفق 0.01 دولار على الأقل، كي لا تؤدي بداية هادئة إلى تنبيه. يذكر التنبيه متى سيُبلغ الحد بالوتيرة الحالية.
حدد threshold_amount بالدولار، أو أساسًا مع نسب مئوية. مع أساس previous_period، يُقارن التوقع بالفترة السابقة كاملة. ينبّه كل حد مرة واحدة في كل فترة.
الارتفاع المفاجئ
تقارن قاعدةspike إنفاق آخر window_hours (من 1 إلى 56) بالإنفاق المعتاد لذلك الوقت:
- في النوافذ الأقصر من 24 ساعة، الإنفاق المعتاد هو وسيط الساعات نفسها في كل يوم من الأيام السبعة السابقة. وفي النوافذ الأطول، هو وسيط النوافذ السابقة ذات الطول نفسه خلال الأيام السبعة السابقة.
- تنبّه عندما يبلغ الإنفاق على الأقل
spike_multiplierضعف المعتاد (الافتراضي 3) وعلى الأقلspike_floor(الافتراضي 5 دولارات). - تحتاج إلى إنفاق لمساحة العمل في ثلاث من تلك النوافذ السابقة على الأقل. وحتى ذلك الحين يُظهر المحرر أنها لا تزال تتعلّم. وعندما يكون الإنفاق المعتاد صفرًا، لا يُطبَّق إلا الحد الأدنى.
- تستخدم فترة تهدئة (الافتراضي 6 ساعات) ولا تحظر أبدًا.
تقارير الإنفاق
يتلقى المالكون تقرير إنفاق أسبوعيًا افتراضيًا، ويمكن للمشرفين الاشتراك فيه. تتوفر أيضًا تقارير يومية وشهرية. يشرح دليل إشعارات مساحة العمل الإعدادات والمحتوى. إضافةً إلى ذلك:- يُرسل التقرير بين 09:00 و21:00 في المنطقة الزمنية للفوترة في اليوم الأول بعد فترته. وإذا تعذّر إرساله في ذلك اليوم، فيُتخطى بدلًا من إرساله متأخرًا.
- التوقع في التقرير خاص بشهر الفوترة الحالي.
- تشمل إجماليات الأعضاء والأقسام المهام غير المتزامنة وتتبع قاعدة الأقسام أعلاه، لذا قد تختلف قليلًا عن الإجمالي.
- يلغي كل شخص اشتراكه في نسخته فقط من تقرير مساحة العمل. ولا يتلقاه أبدًا الأعضاء الذين ليسوا مالكين أو مشرفين.
التوجيه والوجهات
ترسل قواعد الإنفاق ثلاثة أنواع من الإشعارات. اختر وجهة كل نوع في الإعدادات → الإشعارات:
يمكن أن تكون للقاعدة وجهاتها الخاصة. وهي تحل محل مساري تنبيهات الإنفاق وحظر الإنفاق لتلك القاعدة؛ وإذا كانت كلها متوقفة مؤقتًا، فلا تُرسل تنبيهات القاعدة إلى المسارات بدلًا منها. تصل التنبيهات وحالات الحظر أيضًا إلى تطبيق الجوال لدى المالكين والمشرفين، ولدى منشئ المفتاح أو العضو الذي تخصه القاعدة.
تتلقى خطافات الويب المخصصة التنبيه بصيغة JSON، مع
title وmessage وrule_id وrule_name وmetric وscope وperiod وvalue_nanos، وبحسب المقياس base_nanos أو forecast أو spike أو حقول الرصيد. تحقّق من كل عملية تسليم بتوقيعها؛ راجع القسم الخاص بالتحقق من توقيعات خطافات الويب في إشعارات مساحة العمل.
إدارة القواعد باستخدام API
تستخدم API قواعد الإنفاق مفتاح إدارة يملكspend_rules:read أو spend_rules:write أو spend_rules:delete. يمكن إرسال المبالغ بالدولار (threshold_amount_usd) أو بدقة بالنانودولار (threshold_amount_nanos)، وتتضمن الاستجابات الاثنين.
GET /v1/spend-rules/{id}/preview لعرض القيمة الحالية والحد التالي، وPOST /v1/spend-rules/{id}/test لإرسال اختبار. يعرض GET /v1/spend-blocks حالات الحظر النشطة. توجد المنطقة الزمنية للفوترة ونسبة الإنفاق إلى الأقسام وإعدادات التقارير في الكائن spend ضمن إعدادات الإشعارات.
إدارة القواعد باستخدام Terraform
يوفّر مزوّد Terraform من Phaseo (phaseoteam/phaseo) المورديْن phaseo_spend_rule وphaseo_workspace_budget، ومصادر البيانات phaseo_spend_rules وphaseo_spend_blocks وphaseo_workspace_budgets.