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

يتم إرسال شيء ما في مكان ما ، تتم معالجته بطريقة أو بأخرى على مسمار واحد. كانت المهمة هي جمع إحصائيات معالجة البيانات من جميع النقاط ووضعها في مكان واحد ، ثم بناء الرسوم البيانية وكتابة التقارير.
بفضل هذه المقالة ، وقع الاختيار على مجموعة من Telegraf-Elasticsearch-Grafana. يتلاءم Telegraf بشكل مثالي مع مشروع تنظيم مراقبة حالة كل من برامج الطرف الثالث الحديد والمتاحة للجمهور ، لكنني سأناقش بشكل منفصل مسألة قياس الحمل على خدماتي الخاصة. في هذه الحالة ، نتحدث عن خدمات .NET التي تعمل في حاويات الإرساء في نظام Linux. تشكل جميع الخدمات عدة مراحل لمعالجة المعلومات الواردة ، وكنت بحاجة إلى قياس عدد الحزم التي تمت معالجتها ورفضها بنجاح مع تسميات إضافية لمرحلة المعالجة ، والمصدر ، وما إلى ذلك لاحتمال المعالجة الإحصائية اللاحقة.
سوف أغفل عملية التثبيت والمضي قدما على الفور إلى التكوين. لذلك ، يمكن لـ Telegraf تلقي الرسائل ذات المقاييس على tcp و udp القنوات وكذلك من خلال unixsocket
[[inputs.socket_listener]] #service_address = "unixgram:///tmp/telegraf.sock" service_address = "udp4://:14230" data_format = "json" json_name_key = "name" namepass = ["query_pass"] tag_keys = ["appname","fromip"]
سترسل الخدمات رسائل في كل مرة تتم فيها معالجة الحزمة التالية ، لذلك سنقوم أيضًا بتكوين التجميع. الفاصل الزمني لمدة 10 ثوانٍ يكفي ، اعتمادًا على تحميل نظام معين.
[[aggregators.basicstats]] period = "10s" drop_original = true stats = ["sum"] namepass = ["query_pass"] fieldpass = ["pass","fail"]
دعنا نذهب إلى المعلمات: query_pass - اسم القياس الذي يجمع بين القياسات المستقبلية ، النجاح - المعالجة الناجحة ، الفشل - لا. بالإضافة إلى ذلك ، سيتم وضع علامة على المقاييس باستخدام علامات التطبيق والعلامات .
الآن رمز صغير. أحب إرسال المقاييس عبر udp و unixsocket ، على الرغم من أن الخيارات الأخرى قد تناسبك.
UdpClient udpClient = new UdpClient("127.0.0.1", 14230); byte[] datagramBytes= Encoding.UTF8.GetBytes("{\"name\":\"query_pass\",\"pass\":1,\"fromip\":\"127.0.0.1\",\"appname\":\"application\"}"); udpClient.Send(datagramBytes, datagramBytes.Length); datagramBytes= Encoding.UTF8.GetBytes("{\"name\":\"query_pass\",\"fail\":1,\"fromip\":\"127.0.0.1\",\"appname\":\"application\"}"); udpClient.Send(datagramBytes, datagramBytes.Length);
يتم تلخيص كل هذا بشكل كامل وإضافته إلى قاعدة البيانات ، وفي حالتي ، فإنه elasticsearch ( لقطة شاشة ).
[[outputs.elasticsearch]] urls = [ "http://localhost:9200" ] # required. timeout = "5s" health_check_interval = "5s" index_name = "telegraf-%Y.%m.%d" # required. manage_template = true template_name = "tp_telegraf" overwrite_template = true
جميع القطط.
ملاحظة: هنا هو المشروع النهائي لإرسال المقاييس تحت net.core