انتقل إلى المحتوى الرئيسي

دليل عمليات OmniCHF

جدول المحتويات

  1. نظرة عامة على المكونات
  2. دور 3GPP والمراجع الفنية
  3. نقاط نهاية SBI
  4. مرجع التكوين
  5. الإجراءات الرئيسية
  6. المراقبة
  7. القيود المعروفة
  8. استكشاف الأخطاء وإصلاحها

نظرة عامة على المكونات

يطبق OmniCHF وظيفة الشحن (CHF) المعرفة في 3GPP TS 32.291. توفر CHF شحنًا متقاربًا عبر الإنترنت وغير المتصل لجلسات PDU 5G عبر خدمة Nchf_ConvergedCharging. يقوم بتحويل طلبات الشحن 5G إلى استدعاءات JSON-RPC لـ CGRateS SessionS لتفويض الائتمان وإدارة الجلسات، وينتج سجلات تفاصيل المكالمات (CDRs) عند إنهاء الجلسة.

دورة حياة جلسة الشحن

تتوافق كل جلسة PDU مع جلسة شحن واحدة، يتم تتبعها بواسطة chargingDataRef (UUID). يتم الاحتفاظ بحالة الجلسة في وكيل في الذاكرة ولا يتم الاحتفاظ بها. يؤدي إعادة التشغيل إلى فقدان جميع حالات الجلسات النشطة.

الحالةالزنادإجراء التخزين
تم الإنشاءPOST /chargingdataتم إنشاء السياق، تم استدعاء CGRateS InitiateSession
تم التحديثPOST /chargingdata/:ref/updateتم تحديث السياق (تم تجميع الاستخدام، تم زيادة التسلسل)
تم الإفراجPOST /chargingdata/:ref/releaseتم بناء CDR وتسجيله، تم استدعاء CGRateS TerminateSession، تم حذف السياق

دور 3GPP والمراجع الفنية

العنصرالمرجع
تعريف NF CHF3GPP TS 23.501 القسم 6.2.16
خدمة Nchf_ConvergedCharging3GPP TS 32.291
إجراء إنشاء بيانات الشحن3GPP TS 32.291 القسم 6.1.3.2.1
إجراء تحديث بيانات الشحن3GPP TS 32.291 القسم 6.1.3.2.2
إجراء إفراج بيانات الشحن3GPP TS 32.291 القسم 6.1.3.2.3
نموذج بيانات ChargingDataRequest / Response3GPP TS 32.291 القسم 6.1.6
تنسيق CDR لجلسات PDU 5G3GPP TS 32.290
إطار عمل SBI المشترك3GPP TS 29.500
تسجيل NF مع NRF3GPP TS 29.510

نقاط نهاية SBI

مسار القاعدة: /nchf-convergedcharging/v3

الطريقةالمسارالوصفالنجاحالخطأ
POST/chargingdataإنشاء جلسة شحن (طلب أولي). يخصص chargingDataRef، يبدأ جلسة CGRateS، ويعيد الوحدات الممنوحة.201 تم الإنشاء مع رأس Location500 خطأ في الخادم الداخلي
POST/chargingdata/{chargingDataRef}/updateتحديث جلسة شحن (طلب مؤقت). يبلغ عن الاستخدام الحالي ويطلب ائتمانًا إضافيًا.200 حسنًا404 غير موجود، 500 خطأ في الخادم الداخلي
POST/chargingdata/{chargingDataRef}/releaseإفراج عن جلسة شحن (طلب نهائي). يبلغ عن الاستخدام النهائي، ينتج CDR، ينهي جلسة CGRateS.204 لا محتوى404 غير موجود، 500 خطأ في الخادم الداخلي

ChargingDataRequest — الحقول الرئيسية

الحقلالنوعمستخدم فيالوصف
subscriberIdentifierstringإنشاء، تحديث، إفراجSUPI (على سبيل المثال، imsi-999700000000001). يستخدم كمعرف حساب CGRateS.
nfConsumerIdentificationobjectإنشاءمعلومات مستهلك NF. مصدر احتياطي لـ SUPI إذا كان subscriberIdentifier غائبًا.
pDUSessionChargingInformationobjectإنشاء، تحديث، إفراجتفاصيل جلسة PDU: DNN، S-NSSAI، نوع RAT، QoS، معرف ونوع جلسة PDU.
multipleUnitUsagearrayتحديث، إفراجحاويات الاستخدام المبلغ عنها. يتم استخدام usedUnitContainer لعنصر الأول لاستخراج الحجم والمدة.
requestTypestringالكلINITIAL_REQUEST، UPDATE_REQUEST، أو TERMINATION_REQUEST.

ChargingDataResponse — الحقول الرئيسية

الحقلالنوعموجودالوصف
invocationSequenceNumberintegerإنشاء، تحديثرقم التسلسل لهذه الاستجابة. ثابت على 1 عند الإنشاء (انظر CHF-M1). يتم زيادته في كل تحديث.
invocationResultobjectإنشاء، تحديثدائمًا {"resultCode": "SUCCESS"} في المسار السعيد.
sessionIdstringإنشاء، تحديثchargingDataRef (UUID) المخصص لهذه الجلسة.
multipleUnitInformationarrayإنشاء، تحديثالوحدات الممنوحة. تحتوي على إدخال واحد مع resultCode، grantedUnit (totalVolume، time)، وratingGroup (ثابت على 1، انظر CHF-L2).

مرجع التكوين

يتم تعيين جميع المعلمات عبر بيئة التطبيق (عادةً config/runtime.exs).

config :omnichf,
sbi_scheme: "http",
sbi_addr: "127.0.0.14",
sbi_port: 7777,
nrf_uri: "http://127.0.0.10:7777",
mcc: "999",
mnc: "70",
heartbeat_interval: 10_000,
cgrates_enabled: false,
cgrates_url: "http://localhost:2080/jsonrpc",
cgrates_tenant: "cgrates.org",
cgrates_timeout: 5000

جدول المعلمات

المعلمةالافتراضيالنوعالوصف
sbi_scheme"http"stringمخطط النقل لمستمع SBI.
sbi_addr"127.0.0.14"stringعنوان IP الذي يرتبط به خادم HTTP SBI.
sbi_port7777integerمنفذ TCP الذي يستمع عليه خادم HTTP SBI.
nrf_uri"http://127.0.0.10:7777"stringURI الأساسي لـ NRF المستخدم لتسجيل NF وheartbeat.
mcc"999"stringرمز الدولة المحمول. يستخدم في ملف NF المقدم إلى NRF وفي اسم الشبكة الخدمية.
mnc"70"stringرمز الشبكة المحمولة. يستخدم في ملف NF المقدم إلى NRF وفي اسم الشبكة الخدمية.
heartbeat_interval10_000integer (ms)الفاصل الزمني بين طلبات heartbeat NRF.
cgrates_enabledfalsebooleanمفتاح رئيسي لتكامل CGRateS. عندما يكون false، يتم تخطي جميع استدعاءات CGRateS ويتم إرجاع منحة افتراضية قدرها 86,400 وحدة. يجب تعيينه إلى true في الإنتاج عند توفر مثيل CGRateS.
cgrates_url"http://localhost:2080/jsonrpc"stringعنوان URL لنقطة نهاية JSON-RPC لمثيل CGRateS. يستخدم فقط عندما يكون cgrates_enabled هو true.
cgrates_tenant"cgrates.org"stringاسم مستأجر CGRateS. يتم تمريره في جميع استدعاءات API SessionS كحقل Tenant. يجب أن يتطابق مع المستأجر المكون في CGRateS.
cgrates_timeout5000integer (ms)مهلة طلب HTTP لاستدعاءات JSON-RPC لـ CGRateS. تستخدم استدعاءات التحقق من الصحة min(cgrates_timeout, 3000) لتجنب حظر نقطة النهاية الصحية.

ملاحظات تكامل CGRateS

عندما يكون cgrates_enabled هو false، يعمل OmniCHF في وضع التجاوز: يتم قبول جميع طلبات الشحن ومنح 86,400 وحدة (وقت أو حجم) دون أي تقييم أو تفويض. هذا مناسب للاختبار في المختبر والتكامل عندما لا يتوفر CGRateS.

تستخدم اتصالات CGRateS عميل HTTP المدمج في Erlang :httpc (انظر القيود CHF-M5). لا يدعم هذا العميل تجميع الاتصالات. تحت الحمل العالي، يفتح كل طلب CGRateS اتصال HTTP جديد ويغلقه، مما قد يصبح عنق زجاجة.


الإجراءات الرئيسية

إنشاء جلسة الشحن (الأولية)

تحديث جلسة الشحن (المؤقت)

إفراج عن جلسة الشحن (النهائي)

تخطيط أحداث CGRateS

يقوم OmniCHF بتخطيط حقول الشحن 5G إلى حقول أحداث CGRateS SessionS كما يلي:

حقل CGRateSالمصدرملاحظات
AccountsubscriberIdentifier (SUPI)يتراجع إلى nfConsumerIdentification.supi
SubjectsubscriberIdentifier (SUPI)نفس الشيء كـ Account
DestinationpduSessionInformation.dnnId أو .dnnاسم الشبكة البيانات
ToRpduSessionInformation.pduTypeدائمًا *data لجلسات PDU
RequestTyperequestTypeدائمًا يتم تخطيطه إلى *prepaid
UsageusedUnitContainer.totalVolume أو مجموع uplink+downlink أو timeأول قيمة غير صفرية تفوز
OriginIDchargingDataRefUUID فريد لكل جلسة
OriginHostثابت "OmniCHF"
SUPIsubscriberIdentifierحقل امتداد 5G
DNNpduSessionInformation.dnnIdحقل امتداد 5G
S-NSSAI_SSTpduSessionInformation.sNSSAI.sstحقل امتداد 5G
S-NSSAI_SDpduSessionInformation.sNSSAI.sdحقل امتداد 5G
5QIpduSessionInformation.qoSInformation.5qIحقل امتداد 5G
RATTypepduSessionInformation.ratTypeالافتراضي: "NR"
PDUSessionIDpduSessionInformation.pduSessionIDحقل امتداد 5G
PDUSessionTypepduSessionInformation.pduTypeالافتراضي: "IPV4"

حقول CDR

يتم بناء CDRs عند الإفراج عنها ويتم إصدارها إلى سجل التطبيق على مستوى INFO. تحتوي خريطة CDR على:

الحقلالمصدر
record_typeثابت: "5G_PDU_SESSION"
supiسياق الشحن
dnnpduSessionInformation.dnnId أو .dnn
snssai{sst, sd} من pduSessionInformation.sNSSAI
qos_5qipduSessionInformation.qoSInformation.5qI
rat_typepduSessionInformation.ratType
pdu_session_idسياق الشحن
pdu_session_typepduSessionInformation.pduType
volume_uplinkusedUnitContainer.uplinkVolume
volume_downlinkusedUnitContainer.downlinkVolume
volume_totalusedUnitContainer.totalVolume (أو uplink+downlink)
durationusedUnitContainer.time (أو فرق الساعة إذا كانت صفر)
start_timeطابع زمني created_at للجلسة
end_timeالساعة عند وقت الإفراج
charging_data_refUUID للجلسة

المراقبة

أحداث القياس

الحدثالقياساتالعلاماتالوصف
[:omnichf, :charging, :initial]countsupiيتم إطلاقه في كل طلب إنشاء
[:omnichf, :charging, :update]countrefيتم إطلاقه في كل طلب تحديث
[:omnichf, :charging, :release]countrefيتم إطلاقه في كل طلب إفراج
[:omnichf, :charging, :creates]countresult (success/failure)نتيجة عملية الإنشاء
[:omnichf, :charging, :updates]countresultنتيجة عملية التحديث
[:omnichf, :charging, :releases]countresultنتيجة عملية الإفراج
[:omnichf, :cgrates, :request]count, duration_msoperation, resultلكل استدعاء JSON-RPC لـ CGRateS
[:omnichf, :cgrates, :health]status (1/0)صحة الاتصال بـ CGRateS
[:omnichf, :sessions, :active]countمقياس: الجلسات النشطة للشحن
[:omni5g, :nrf, :registration]status (1/0)nf_typeحالة تسجيل NRF

مقاييس Prometheus

مقاييس الشحن

المقياسالنوعالعلاماتالوصف
omni_chf.charging.initial.countcountersupiإنشاء جلسات الشحن
omni_chf.charging.update.countcounterrefتحديث جلسات الشحن
omni_chf.charging.release.countcounterrefإفراج عن جلسات الشحن
omni_chf.charging.creates.totalcounterresultإجمالي إنشاء جلسات الشحن
omni_chf.charging.updates.totalcounterresultإجمالي تحديث جلسات الشحن
omni_chf.charging.releases.totalcounterresultإجمالي إفراج عن جلسات الشحن
omni_chf.sessions.active.countgauge--عدد جلسات الشحن النشطة

مقاييس CGRateS

المقياسالنوعالعلاماتالوصف
omni_chf.cgrates.calls.countcountermethod, resultاستدعاءات JSON-RPC لـ CGRateS
omni_chf.cgrates.latency.millisecondsgauge--زمن استجابة استدعاء CGRateS
omni_chf.cgrates.healthgauge--صحة الاتصال بـ CGRateS (1=متصل، 0=غير متصل)
omni_chf.cgrates.requests.totalcounteroperation, resultإجمالي طلبات JSON-RPC لـ CGRateS
omni_chf.cgrates.request.duration_msdistributionoperationمدة طلب CGRateS بالمللي ثانية (الأقسام: 5، 10، 25، 50، 100، 250، 500، 1000، 2500)

مقاييس NRF

المقياسالنوعالعلاماتالوصف
omni_chf.nrf.registration.statusgaugenf_typeحالة تسجيل NRF (1=مسجل، 0=غير مسجل)

مقاييس BEAM VM

المقياسالنوعالوصف
beam.memory.totalgaugeإجمالي ذاكرة BEAM بالبايت
beam.memory.processesgaugeالذاكرة المستخدمة من قبل عمليات Erlang
beam.memory.processes_usedgaugeالذاكرة المستخدمة فعليًا من قبل العمليات
beam.memory.systemgaugeذاكرة النظام
beam.memory.atomgaugeإجمالي ذاكرة الذرات
beam.memory.atom_usedgaugeذاكرة الذرات المستخدمة
beam.memory.binarygaugeذاكرة ثنائية
beam.memory.codegaugeذاكرة الشيفرة
beam.memory.etsgaugeذاكرة جدول ETS
beam.processes.countgaugeعدد عمليات Erlang
beam.ports.countgaugeعدد منافذ Erlang
beam.atom.countgaugeعدد الذرات
beam.vm.uptimegaugeوقت تشغيل VM بالثواني

أنماط السجل

المستوىالنمطالمعنى
infoCHF Create: ref=<UUID> supi=<SUPI> pdu_session=<N>تم بدء إنشاء ناجح
infoCHF Update: ref=<UUID>تم استلام طلب التحديث
infoCHF Release: ref=<UUID>تم استلام طلب الإفراج
infoCHF CDR: %{...}تم إصدار CDR عند الإفراج
infoInitiating CGRateS session for <ref>, account: &lt;SUPI>تم إرسال CGRateS InitiateSession
infoCGRateS authorized &lt;N> units for session <ref>تم منح الائتمان
infoCGRateS session <ref> terminated successfullyتم إنهاء CGRateS TerminateSession بنجاح
warningCGRateS integration disabled, returning default authorizationوضع التجاوز نشط
warningCHF Update: unknown ref=&lt;UUID>تحديث لجلسة غير موجودة
warningCHF Release: unknown ref=&lt;UUID>إفراج لجلسة غير موجودة
errorCHF Create failed: <reason>فشل عملية الإنشاء
errorCHF Update failed: <reason>فشل عملية التحديث
errorCGRateS InitiateSession failed for <ref>: <reason>خطأ CGRateS عن�� الإنشاء
errorCGRateS HTTP error <status>: <body>غير 200 من CGRateS
errorCGRateS HTTP request failed: <reason>خطأ في الشبكة إلى CGRateS

القيود المعروفة

المعرفالشدةالوصف
CHF-M1متوسطinvocationSequenceNumber ثابت على 1 في استجابة الإنشاء (الأولية). وفقًا لـ TS 32.291 يجب أن يبدأ رقم التسلسل من 1 ويزداد في الاستجابات اللاحقة، وهو ما يحدث في التحديث. المشكلة هي أنه إذا أرسل مستهلك إنشاء مع invocationSequenceNumber في الطلب، فإن تلك القيمة لا يتم فحصها أو التحقق منها.
CHF-M3متوسطinvocationTimeStamp غائب من ChargingDataResponse. وفقًا لـ TS 32.291، هذا الحقل إلزامي في جسم الاستجابة. سيحصل المستهلكون الصارمون الذين يتطلبون هذا الحقل على استجابة غير مكتملة.
CHF-M5متوسطيستخدم عميل CGRateS عميل HTTP :httpc في Erlang بدلاً من Finch. لا يدعم :httpc تجميع الاتصالات؛ يفتح كل استدعاء JSON-RPC اتصال TCP جديد ويغلقه. تحت الحم�� (العديد من جلسات الشحن المتزامنة)، ستزداد زمن استجابة استدعاءات CGRateS وتصبح تكاليف إعداد الاتصال كبيرة. راقب omni_chf.cgrates.request.duration_ms.
CHF-L1منخفضلا يتم تضمين حقل triggers في ChargingDataResponse. وفقًا لـ TS 32.291، يمكن أن instruct SMF لإرسال تحديث مؤقت عند أحداث معينة (حد حجم، حد زمن، تغيير QoS). بدون المحفزات، يستخدم SMF سياسته المحلية لتحديد متى يجب إرسال التحديثات.
CHF-L2منخفضratingGroup في multipleUnitInformation ثابت على 1. عادةً ما تحتوي النشر الفعلي على مجموعات تقييم متعددة لكل جلسة PDU (واحدة لكل تدفق بيانات خدمة). يتم نسب جميع الاستخدامات إلى مجموعة التقييم 1 بغض النظر عن قيم ratingGroup في multipleUnitUsage في الطلب.
CHF-L3منخفضلا يتم إنشاء chargingId في تنسيق 3GPP. وفقًا لـ TS 32.290، يجب أن تحمل سجلات الشحن chargingId الذي يتوافق مع معرف جلسة PDU المعين بواسطة SMF. يتم استخدام UUID charging_data_ref بدلاً من ذلك، مما قد يسبب مشاكل في الارتباط في أنظمة الفوترة السفلية التي تتوقع تنسيق chargingId 3GPP.
CHF-L4منخفضسجل CDR مفقود الحقول chargingID وrecordingEntity المطلوبة من قبل TS 32.290. ستحتاج أنظمة الوساطة أو الفوترة السفلية التي تتوقع هذه الحقول إلى تحمل غيابها أو تكوينها لتعتبرها اختيارية.
CHF-L5منخفضلم يتم تنفيذ الشحن غير المتصل وإخراج ملف CDR. يتم إصدار CDRs فقط إلى سجل التطبيق عبر Logger.info. لا يوجد إخراج CDR قائم على الملفات، ولا ترميز ASN.1، ولا نقل إلى بوابة مجال الفوترة. من أجل الشحن غير المتصل في الإنتاج، يجب على شاحن السجل (مثل Fluentd، Vector) جمع خطوط سجل CDR لـ CHF وتحويلها لنظام الفوترة.

استكشاف الأخطاء وإصلاحها

404 عند التحديث أو الإفراج

لا يتطابق chargingDataRef مع أي جلسة نشطة في الذاكرة. الأسباب:

  1. تم إعادة تشغيل OmniCHF بين الإنشاء والتحديث/الإفراج - جميع حالات ا��جلسات في الذاكرة وتفقد عند إعادة التشغيل.
  2. أرسل SMF chargingDataRef غير صحيح في المسار.
  3. تم إرسال إفراج سابق عن هذه الجلسة، مما أدى إلى حذف السياق.

تحقق من السجلات لـ CHF Update: unknown ref= أو CHF Release: unknown ref= للتأكيد.

500 عند الإنشاء مع تمكين CGRateS

فشل استدعاء CGRateS. تحقق من:

  1. هل cgrates_url يشير إلى مثيل CGRateS يمكن الوصول إليه؟
  2. هل cgrates_tenant صحيح؟ تسبب أسماء المستأجر غير المتطابقة في عودة CGRateS باستجابة خطأ.
  3. تحقق من مقياس omni_chf.cgrates.health (1=متصل، 0=غير متصل).
  4. راجع السجلات لـ CGRateS InitiateSession failed for <ref>: <reason> - ستكون السبب واحدًا من: {:cgrates_error, message}، {:http_error, status}، أو {:http_error, reason}.
  5. تحقق من أن خدمة CGRateS SessionSv1 مفعلة في تكوين CGRateS.

فشل التحقق من صحة CGRateS ولكن الخدمة تعمل

يستخدم التحقق من الصحة (عبر SessionSv1.GetActiveSessions) مهلة محددة بـ 3 ثوانٍ. إذا كانت CGRateS بطيئة في الاستجابة، فقد يفشل التحقق من الصحة بينما تكون الخدمة متاحة تقنيًا. تحقق من cgrates_timeout - الحد هو min(cgrates_timeout, 3000). أيضًا تأكد من أن cgrates_url يستخدم HTTP (ليس HTTPS) ما لم يتم تكوين TLS.

عدم ظهور CDRs أو عدم اكتمالها

يتم كتابة CDRs إلى سجل التطبيق على مستوى INFO (انظر القيود CHF-L5). لالتقاط CDRs:

  1. تأكد من أن مستوى سجل التطبيق مضبوط على info أو أقل.
  2. قم بتصفية خطوط السجل التي تحتوي على "CHF CDR:" للمعالجة اللاحقة.
  3. لاحظ أن CDRs تفتقر إلى chargingID، recordingEntity (CHF-L4)، وستحتوي على ratingGroup: 1 لجميع تدفقات بيانات الخدمة (CHF-L2).

ارتفاع زمن استجابة استدعاءات CGRateS

نظرًا لأن CGRateS يستخدم :httpc بدون تجميع الاتصالات (CHF-M5)، يزداد الزمن تحت الحمل. لتشخيص:

  1. تحقق من مخطط omni_chf.cgrates.request.duration_ms لزمن الاستجابة في النسبة المئوية 99.
  2. إذا كان الزمن مرتفعًا تحت الحمل المتزام��، قلل من عدد جلسات الشحن المتزامنة أو اعتبر نشر OmniCHF خلف موازن تحميل مع عدة مثيلات.
  3. كحل مؤقت، قم بتعيين cgrates_timeout إلى قيمة أقل من الزمن المتوقع الأسوأ لاستجابة CGRateS لمنع استدعاءات CGRateS البطيئة من حظر مجموعة عمليات Elixir.

عدم انخفاض عدد الجلسات النشطة بعد الإفراج

إذا ظل omni_chf.sessions.active.count مرتفعًا بعد أن كان يجب الإفراج عن الجلسات:

  1. تحقق من استجابات 404 على استدعاءات الإفراج - إذا تلقى SMF 404، فقد لا يعيد المحاولة ويعتبر SMF الجلسة قد أفرج عنها بينما قد لا يزال لدى OmniCHF السياق.
  2. في الحالة العكسية، إذا أعيد تشغيل OmniCHF وفقد حالة الجلسة، فإن السياقات قد اختفت ولكن قد لا يزال SMF يرسل طلبات تحديث/إفراج تؤدي إلى 404. هذا سلوك متوقع.

عدم الحفاظ على تسجيل NRF

تحقق من مقياس omni_chf.nrf.registration.status. إذا كان يقرأ 0:

  1. تحقق من أن nrf_uri صحيح وأن NRF يمكن الوصول إليه من sbi_addr لـ OmniCHF.
  2. تحقق من أن mcc و mnc يتطابقان مع تكوين PLMN الخاص بـ NRF.
  3. راجع سجلات التطبيق عند بدء التشغيل للبحث عن أخطاء تسجيل NRF.