مراقبة هاسكيل
Instana's support for monitoring and tracing of Haskell applications is documented in depth on the Instana Haskell Trace SDK's صفحة Giuthb. وثائق API الخاصة به متاحة على Hackage.
ما هو Haskell Trace SDK هو وما هو غير صحيح
لا يقوم Traking Haskell Trace SDK بدعم التتبع / التتبع الآلي بالطريقة التي ندعمها بها بمعظم اللغات الأخرى. بدلا من ذلك ، يسمح لك SDK بتكوين spans يدويا ، مثلما يفعل SDK Trace SDK الى Java . بالاضافة الى عرض API ملائم لتكوين spans ، يقوم Haskell Trace SDK أيضا بتحديد وصلة الى Intance Agent وارسال spans الى agent بطريقة فعالة ، والتي لا تعوق أداء كود الانتاج الخاص بك. وأخيرا وليس آخرا ، فإنه يجمع مقاييس وقت التشغيل ويقدم تقارير عنها إلى Incass.
تركيب 
لاستخدام Intana Haskell Trace SDK في التطبيق الخاص بك ، قم بالاضافةinstana-haskell-trace-sdkالى الارتباطات الخاصة بك (على سبيل المثال ، الىbuild-dependsجزء من ملف cabal file الخاص بك). اذا كنت تقوم باستخدام مجموعة قد تحتاج الى اضافة SDK (مع رقم النسخة الذي ترغب في استخدامه) الىextra-depsالقسم في الخاص بكstack.yamlملف:
extra-deps:
- instana-haskell-trace-sdk-0.7.0.0
بناءا على وحدة حل stack التي تقوم باستخدامها ، قد تحتاج أيضا الى اضافة aeson-اضافية الى de-deps الخاصة بك :
- aeson-extra-0.4.1.3@sha256:8ad8e4d28e46280ea98af2e94dcaaf524c396c9d91b1eba867961efc6e7f923f,2997
استخدام 
مثال ل app : خذ نظرة على متجر الرهبان لمشاهدة SDK الخاص بتتبع Intana Haskell في التصرف.
بدء التشغيل
قبل استخدام SDK ، يجب أن تقوم ببدء تشغيله مرة واحدة ، عادة أثناء بدء التطبيق.
import qualified Instana.SDK.SDK as InstanaSDK
main :: IO ()
main = do
-- ... initialize things ...
-- initialize Instana
instana <- InstanaSDK.initInstana
-- ... initialize more things
القيمةinstana :: Instana.SDK.InstanaContextالذي يتم ارجاعه بواسطةInstanaSDK.initInstanaمطلوب لكل الاستدعاءات الأخرى ، أي ، لتكوين spans التي سيتم ارسالها الى Agent. سيقوم SDK بمحاولة الاتصال ب ـagent (غير متزامن ، في سلسلة عمليات منفصلة) بمجرد أن يقوم باستلامinitInstanaاتصل
يمكن توصيف SDK من خلال متغيرات بيئة التشغيل أو مباشرة في الكود عن طريق تمرير معاملات التوصيف الى وظيفة الاعداد للبدء ، أو كلاهما.
اذا كنت ترغب في تمرير معاملات التوصيف بطريقة مبرمجة ، استخدمinitConfiguredInstanaبدلا منinitInstana:
import qualified Instana.SDK.SDK as InstanaSDK
main :: IO ()
main = do
-- Example snippet for using the Instana SDK and providing a configuration
-- (agent host, port, ...) directly in code. You only need to specify the
-- configuration values you are interested in and can omit everything else
-- (see https://www.yesodweb.com/book/settings-types).
let
config =
InstanaSDK.defaultConfig
{ InstanaSDK.agentHost = Just "127.0.0.1"
, InstanaSDK.agentPort = Just 42699
, InstanaSDK.serviceName = Just "A Great Hakell Service"
, InstanaSDK.forceTransmissionAfter = Just 1000
, InstanaSDK.forceTransmissionStartingAt = Just 500
, InstanaSDK.maxBufferedSpans = Just 1000
}
instana <- InstanaSDK.initConfiguredInstana config
بالنسبة لمعاملات التوصيف التي يتم استبعادها عند تكوين سجل التوصيف أو تم تحديدها الىNothing، سيتم اعادة SDK الى متغيرات بيئة التشغيل (أنظر أدناه) ثم الى القيم المفترضة.
يوجد أيضا نمط-قوس متغيرات خاصة بوظيفة الاعداد للبدء ، تسمىwithInstanaوwithConfiguredInstana:
import qualified Instana.SDK.SDK as InstanaSDK
main :: IO ()
main = do
InstanaSDK.withInstana runApp
runApp :: InstanaContext -> IO ()
runApp instana = do
-- do your thing here :-)
أو ، باستخدام نمط الأقواس وسجل التوصيف :
import qualified Instana.SDK.SDK as InstanaSDK
main :: IO ()
main = do
let
config =
InstanaSDK.defaultConfig
{ InstanaSDK.agentHost = Just "127.0.0.1"
, InstanaSDK.agentPort = Just 42699
, InstanaSDK.serviceName = Just "A Great Hakell Service"
, InstanaSDK.forceTransmissionAfter = Just 1000
, InstanaSDK.forceTransmissionStartingAt = Just 500
, InstanaSDK.maxBufferedSpans = Just 1000
}
InstanaSDK.withConfiguredInstana config runApp
runApp :: InstanaContext -> IO ()
runApp instana = do
-- do your thing here :-)
تكوين مساحات
ادخالات
Trace HTTP آليا
يمكنك السماح ل SDK آليا بتكوين مراوح الادخال لكل طلبات HTTP الواردة في تطبيق WAI من خلال استخدامه كبرنامج اضافي WAI middleware plug-in. يتم أخذ عناوين التتبع غير الخاصة بالتتبع وكذلك نصوص رأس سياق تتبع W3C آليا بواسطة الوصلة plug-in. لاحظ أنه مازال هناك حاجة الى تكوين exit spans يدويا من خلالwithHttpExitأوstartHttpExit/completeExitالوظائف (أنظر في أسفل).
plug-in middleware سيقوم أيضا باضافة نص رأس رد HTTP اضافي (Server-Timing) الى استجابات HTTP. يتيح هذا العنوان امكانية مراقبة موقع الانترنت لعملية مراقبة النظام الخلفي.
import qualified Instana.Wai.Middleware.Entry as InstanaWaiMiddleware
main = do
Warp.run 3000 $ InstanaWaiMiddleware.traceHttpEntries instana $ app
Bracket Style (High Level API)
كل الوظائف التي تبدأ ب#withلقبول (بين المعاملات الأخرى) تصرف IO. سيقوم SDK ببدء الامتداد قبل ذلك ، ثم تنفيذ تصرف IO المحدد واستكمال الامتداد بعد ذلك. يتم التوصية باستخدام هذا النمط من خلال المستوى المنخفض API الذي يتطلب منك بدء واتمام spans نفسك.
withRootEntry: يقوم بتكوين امتداد للادخال هو الدليل الرئيسي لعملية التتبع (ليس لها امتداد رئيسي).withEntry: يقوم بتكوين امتداد للادخال يحتوي على امتداد رئيسي.withHttpEntry: عبارة عن وظيفة مناسبة تقوم بفحص طلب HTTP الوارد لعناوين تتبع غير فعالة أو لنصوص رأس سياق التتبع W3C وتقوم بتكوين امتداد للادخال. ستقوم آليا باضافة بيانات التوصيف الصحيحة الى الامتداد. لاحظ أنك لا تحتاج الى التعامل مع طلبات HTTP الواردة مطلقا عند استخدام البرنامج المساعد WAI WAI middleware (أنظر أعلاه).withHttpEntry_: اختلافwithHttpEntryمع الصفات المميزة للنوع العام ، ولكن بخصائص أقل. سيتم الاستمرار آليا في التتبع من العناوين الواردة (عناوين Insers أو سياق تتبع W3C ) تماما مثلwithHttpEntryلا ، ولكنه لن يقوم بالتقاط كود الحالة الخاص باستجابة HTTP أو قم باضافة نص رأس الاستجابة للارتباط (Server-Timing) لمراقبة موقع الانترنت. يوصى باستخدامهwithHttpEntryبدلا من هذه الوظيفة ، ان أمكن. كبديل ، يمكنك أيضا الاتصالpostProcessHttpResponseداخلwithHttpEntry_كتلة لتغطية المميزات المفقودة المذكورة أعلاه. لاحظ أنك لا تحتاج الى التعامل مع طلبات HTTP الواردة مطلقا عند استخدام البرنامج الاضافي Intana WAI middleware plug-in.withExit: يقوم بتكوين امتداد للخروج. هذا يمكن أن يدعى فقط داخل awithRootEntryأوwithEntryاستدعاء ، حيث أن امتداد الخروج يحتاج الى امتداد للادخال كأحد العناصر الرئيسية له.withHttpExit: يقوم بتكوين امتداد خروج لطلب HTTP client محدد. ستقوم آليا باضافة بيانات التوصيف الصحيحة الى الامتداد بحيث يجب تفضيلها علىwithExitعند تتبع طلبات HTTP الصادرة. ستقوم أيضا باضافة نصوص رأس HTTP لتتبع أسلوب التتبع بالاضافة الى W3C headers HTTP context HTTP الى الطلب لنشر سياق التتبع في اتجاه مجرى.postProcessHttpResponse: لتشغيل الرد الخاص بادخال HTTP. هذه الوظيفة تحتاج الى استدعاء أثناء تشغيل HTTP entran بطريقة فعالة. يمكن استخدامه داخلwithHttpEntry_كتلة أو بينstartHttpEntryوcompleteEntry. تقوم هذه الوظيفة بتنفيذ أمرين : تقوم بالتقاط كود حالة HTTP من الاستجابة واضافتها كتفسير الى الامتداد الفعال حاليا. وهو يقوم أيضا باضافة عنوان رد HTTP اضافي (Server-Timing) الى رد HTTP المحدد الذي يتيح امكانية مراقبة موقع الانترنت لمراقبة الشبكة. يجب أن يكون كود الوحدة التابعة نادرا ما يكون له الحاجة الى استدعاء هذا مباشرة. بدلا من ذلك ، قم باحضار طلبات HTTP الواردة معwithHttpEntry، والذي يقوم بكل من هذه الأشياء تلقائيا.
Low Level API/Explicit Start And Complete
startRootEntry: يقوم ببدء امتداد الادخال الذي يعد بداية تتبع (ليس له امتداد رئيسي). ستحتاج للاتصالcompleteEntryفي نقطة ما.startEntry: يقوم ببدء امتداد الادخال. ستحتاج للاتصالcompleteEntryفي نقطة ما.startHttpEntry: يقوم ببدء امتداد الادخال لطلب HTTP الوارد. ستقوم آليا باضافة بيانات التوصيف الصحيحة الى الامتداد. انك لا تحتاج الى التعامل مع طلبات HTTP الواردة مطلقا عند استخدام البرنامج المساعد WAI middleware (أنظر بأعلى). ستحتاج للاتصالcompleteEntryفي نقطة ما.startExit: يقوم ببدء امتداد للخروج. ستحتاج للاتصالcompleteExitفي نقطة ما.startHttpExit: يقوم ببدء امتداد للخروج لطلب HTTP الصادر. ستقوم آليا باضافة بيانات التوصيف الصحيحة الى الامتداد بحيث يجب تفضيلها علىstartExitعند تتبع طلبات HTTP الصادرة. كما ستقوم أيضا باضافة نصوص رأس HTTP الى الطلب لنشر سياق التتبع في اتجاه أسفل. ستحتاج للاتصالcompleteExitفي نقطة ما.completeEntry: يقوم بايجاد امتداد للادخال. وهذا سيؤدي الى وضع الامتداد في مساحة تخزين SDK للارسال الى وكيل Intasrea.completeExit: يقوم بايجاد امتداد للخروج. وهذا سيؤدي الى وضع الامتداد في مساحة تخزين SDK للارسال الى وكيل Intasrea.
أفضل الممارسات
Make sure you have read Instana's docs على تتبع معدل.This documentation contains a lot of useful info for integrating Instana tracing into your code; among other things, it explains which بيانات التوصيف can be added to spans (viaInstanaSDK.addTagوInstanaSDK.addTagAt).
والتفرقة بين ما يطلق عليه ما يطلق عليه التشنجات المسجلة والتشنجات الخاصة ب SDK. عادة ما يتم تكوين spans مسجلة عن طريق التتبع الآلي وتوجد معالجة متخصصة لكل من السجلات المسجلة في خط تشغيل Inctanass. span SDK ، في المقابل ، هي نوع من spans التي تم تكوينها باستخدام تتبع SDK (مثل SDK الخاص بتتبع Haskell أو أي SDKs المماثل لبيئات تشغيل runtime الأخرى). يتم تشغيل امتداد SDK بطريقة أكثر عمومية من خلال تشغيل خط أنابيب Incera للمعالجة.
يجب ملاحظة أن كل spans التي تم تكوينها باستخدام SDK هذه يجب أن تكون span SDK. تعد الاستثنائين اثنين فقط ، حيث يقوم SDK بتكوين وحدات التشجعات المسجلة :
- يمتد مدخل HTTP/WAI (وحدة الخدمة) ، و
- spans خروج HTTP (client).
يقدم SDK وظائف خاصة لتكوين هذه spans المسجلة (withHttpEntry,withHttpExitبالاضافة الى الوظائف ذات المستوى الأدنى المناظرstartHttpEntryوstartHttpExit، انظر أعلاه).
متغيرات بيئة توصيف
Configuration Via
بدلا من توصيف SDK المبرمج ، كما هو أعلى من ذلك ، يمكن أيضا توصيفه بواسطة متغيرات بيئة التشغيل :
INSTANA_AGENT_HOST: IP أو النظام الرئيسي الخاص ب ـInttana Agent الذي سيتم الاتصال به. المفترض : 127.0.0.1.INSTANA_AGENT_PORT: عبارة عن منفذ Intana Agent الذي سيتم الاتصال به. المفترض : 42699.INSTANA_SERVICE_NAME: احلال اسم الخدمة المفترض في Inastaانة.INSTANA_FORCE_TRANSMISSION_STARTING_AFTER: عادة ما يتم تخزين وحدات الامتداد قبل ارسالها الى Agent. تقوم هذه المحددات بارسال ارسال كل spans التي تم تخزينها بعد الكمية المحددة من المليثانية. المفترض : 1000.INSTANA_FORCE_TRANSMISSION_STARTING_AT: هذه المحددات تقوم بتحديد ارسال كل spans التي تم تخزينها عندما تم تخزين العدد المحدد من spans.INSTANA_MAX_BUFFERED_SPANS: حدود عدد spans الى buffer. عند الوصول الى الحد ، سيتم اسقاط spans. هذه المحددات هي حارس آمن ضد تسربات الذاكرة من تخزين كميات مفرطة من التوابل. يجب أن يكون أكبر منINSTANA_FORCE_TRANSMISSION_STARTING_AT.INSTANA_LOG_LEVEL: أنظر القسم "توصيف عملية تسجيل تصحيح الأخطاء".INSTANA_LOG_LEVEL_STDOUT: أنظر القسم "توصيف عملية تسجيل تصحيح الأخطاء".INSTANA_OVERRIDE_HSLOGGER_ROOT_HANDLER: أنظر القسم "توصيف عملية تسجيل تصحيح الأخطاء".
مزيد من القراءة
للحصول على مزيد من المعلومات ، برجاء الرجوع الى المطبوعات الفنية الموجودة في Giuthb و Hackage.