مراقبة التطبيقات باستخدام Logger.Backends

يستخدم Elixir البنية الأساسية لتسجيل Erlang بالكامل لإنشاء سجلات. بدءًا من الإصدار 1.10 ، الذي من المقرر إصداره في المستقبل القريب ، تتوفر لنا وظائف تسجيل المستخدم الجديدة التي ظهرت في Erlang / OTP 21+ .


بينما يوفر مكتب المدعي العام البنية الأساسية بأكملها لتقديم أحداث المجلة (الأحداث) للمشتركين ، يجب أن يتم تنفيذ تسجيل الدخول ، إذا فهم على أنه تخزين و / أو عرض أحداث المجلة ، بواسطة التطبيق. لهذا الغرض ، Logger.Backend التجريد المطابق لـ Logger.Backend .


فيما يلي مقتطف من الوثائق الرسمية:


يدعم Logger مختلف أنواع الخلفية حيث يتم كتابة رسائل السجل.

تقتصر الخلفية المتاحة بشكل افتراضي على واحدة:
  • :console - تسجل الرسائل إلى وحدة التحكم (يتم تمكينها افتراضيًا)


يمكن لأي مطور إنشاء جني خاص به مثل الواجهة الخلفية لـ Logger . نظرًا لأن Logger هو مدير الأحداث الذي يقوم بتنفيذ Erlang :gen_event behaviour ، فإن كتابة خلفية جديدة هي مجرد مسألة إنشاء معالج أحداث خاص بك ، كما هو موضح في وثائق :gen_event .

يتم تحميل الأسطح الخلفية المستخدمة من خلال :backends القسم :backends في ملف التكوين ، والذي يجب معالجته قبل بدء تشغيل التطبيق :logger .


hex.pm الأكثر شيوعًا التي ولدت العديد من نفس النوع من مكتبات hex.pm في إنشاء Logger.Backend ، الذي يفهم وحدة تحكم JSON Logger.Backend ، Logger.Backend نوعًا من تسليم السجل إلى المكان الذي تحتاج إليه (عادة ما يكون نوعًا من أنواع LaaS ) . وبالتالي ، فإن جميع السجلات عادة ما تنتهي في قاعدة بيانات NoSQL ، مثل مرنة ، أو شيء مشابه.


لم نكن أصليين ، ونخزن سجلاتنا في مرن ، لكن سجلاتنا الآن وحدها لا تكفي: الأولاد العصريون العصريون يتشبثون بجميع الرسائل الموجودة في السجلات - مقاييس لكل شيء عن كل شيء. كان المعيار الفعلي للعمل باستخدام المقاييس في تطبيقات OTP مؤخرًا مكتبة القياس عن بُعد ، وهو مشروع مفتوح المصدر حديثًا يهدف إلى توحيد وتوحيد كيفية التحكم في مكتبات وتطبيقات BEAM.


تعتبر الطريقة التي تتبعها Telemetry بسيطة إلى :telemetry.execute/2 الرعب: نسميها :telemetry.execute/2 كلما دعت الحاجة إلى قياس شيء ما في التطبيق ، وتستجيب المكتبة مع رد الاتصال المسجل في بداية التطبيق. بالإضافة إلى ذلك ، من الممكن إرفاق Telemetry.Poller وتنفيذ طلبات القياس بشكل دوري. المثال في المقالة التي أعطيتها الرابط أعلاه يشير إلى استدعاء Logger.log/3 من معالج أحداث القياس عن بعد الداخلي.


Gelato


أنا أكره رمز boilerplate الذي يجب عليك سحب نسخ لصق من مشروع إلى آخر ، من ملف إلى آخر. أريد كل ما يمكن القيام به بواسطة المترجم والجدولة والعمال حتى لا أفكر في الأمر. للقيام بذلك ، غالبًا ما أحزم تعليمة برمجية boilerplate في مكتبات صغيرة تخفي جميع القوالب اللازمة أسفل الغطاء وتوفر واجهات نظيفة لأداء الإجراءات التي يحتاجها تطبيقنا. أرغب فقط في شيء يمكن تسميته report("message", payload) لإنشاء سجل ، وإضافة بيانات القياس عن بعد ، وإرسال هذا السجل إلى مستودعنا المرن.


اتضح أن هذا ليس بالأمر الصعب.


قررنا استخدام مكالمات Logger القياسية كواجهة ، بحيث ببساطة عن طريق تغيير التكوينات يمكننا تقديم الوظيفة المطلوبة في المشاريع الحالية. فقط أضف Logger.Backend جديد إلى مشروع موجود:


 config :logger, backends: [Our.Fancy.Logger.Backend] 

- و voilà - يتم الآن إرسال السجلات ذات القياس عن بعد إلى مخبأ مرن.


وهكذا جاءت مكتبة Gelato . أعلم أن المطورين المدربين الحقيقيين مثل المكتبات ليتم استدعاؤهم بشكل أقل بقليل ، لكنني لست مطورًا حقيقيًا. ما هو ، عليك أن تتصالح. على الرغم من أن الجيلاتي (بالأسبانية - الآيس كريم ، بالمناسبة) يتناغم قليلاً مع المرونة.


تركز المكتبة بشدة على كيفية رؤيتي للعالم الصحيح ، وفي الذيل والرجل يستخدم نهج "الاصطلاح فوق التكوين". إنه يحزم كل شيء قد تحتاجه في JSON واحد ويرسله إلى خادم مرن تم تكوينه مسبقًا مع طلب HTTP بسيط. كما أنه يرفق جميع البيانات الوصفية التي يمكن الوصول إليها ، مثل المقاييس التي تم الحصول عليها باستخدام Process.info/1 ، إلخ.


لبدء استخدام هذه المكتبة في مشروع ما ، تحتاج إلى إضافة ما يلي إلى ملف config/releases.exs :


 config :gelato, uri: "http://127.0.0.1:9200", # Elastic API endoint events: [:foo, :bar], # attached telemetry events handler: :elastic # or :console for tests config :logger, backends: [Gelato.Logger.Backend], level: :info 

بعد ذلك ، Logger.log/3 أي Logger.log/3 مثل المكالمة أدناه بواسطة telemetry عن telemetry وإرسالها إلى الخادم المرن الذي تم تكوينه.


 Logger.info "foo", question: "why?", answer: 42, now: System.monotonic_time(:microsecond) 

تقدم المكتبة أيضًا الماكرو Gelato.bench/4 ، الذي يأخذ كتلة ويقوم بإجراء مكالمتين على Logger.log/3 : أحدهما قبل تنفيذ الكتلة والآخر بعدها مباشرة ، حسب نوع الجوانب في Java.


يصر Gelato بشكل Gelato.defdelegatelog/2 على تنظيم أفضل للواجهات داخل المشروعات باستخدام الماكرو Gelato.defdelegatelog/2 ، Gelato.bench/4 البسيط Gelato.bench/4 و Kernel.defdelegate/2 . باستخدام هذا الماكرو ، يمكنك استخراج جميع واجهات المشروع في مجموعة محدودة من وحدات المستوى الأعلى وإجراء هذه المكالمات مع القياس عن بُعد.


Envío.Log


تطبيق Logger.Backend آخر وُلد في ركن من شغفنا التكنولوجي هو Envío.Log . يستخدم مكتبة Envío لإرسال رسائل إلى قناة Slack مخصصة. يحتوي هذا المسجل على إعداد log_level الخاص به ، والذي عادةً ما يتم تعيين القيمة الخاصة به على :warn أو :error ، لمنع قناة log_level من log_level ، وسيتم حذف جميع المكالمات بمستويات أقل من التهيئة من BEAM أثناء التحويل البرمجي.


سيبدو التكوين النموذجي كما يلي:


 config :envio, :log, level: :warn, # do not send :info to Slack process_info: false # do not attach process info config :logger, backends: [Envio.Log.Backend], level: :debug config :envio, :backends, %{ Envio.Slack => %{ {Envio.Log.Publisher, :info} => [ hook_url: {:system, "YOUR_SLACK_CHANNEL_API_ENDPOINT"} ] } } 

بعد التهيئة ، سيتم إرسال جميع المكالمات إلى Logger.{warn,error}/2 إلى قناة سلاك المقابلة. أنها مريحة للغاية لمراقبة عمليات العمل في الإنتاج في الوقت الحقيقي.


أتمنى لك تسجيل لطيف!

Source: https://habr.com/ru/post/ar482626/


All Articles