نحوه استفاده از OpenTelementry برای ردیابی برنامه های Node.js
![](https://khabarkaav.ir/wp-content/uploads/2024/02/ServiceASshot.png)
مشاهده پذیری به توانایی ما برای "دیدن" و درک آنچه در داخل یک سیستم اتفاق می افتد با نگاه کردن به سیگنال های خارجی آن (مانند گزارش ها، متریک ها و ردیابی ها) اشاره دارد.
مشاهده پذیری شامل جمع آوری و تجزیه و تحلیل داده ها از منابع درون یک سیستم برای نظارت بر عملکرد آن و رسیدگی موثر به مشکلات است.
چرا قابلیت مشاهده مفید است؟
تشخیص و عیب یابی مشکلات: قابلیت مشاهده در شناسایی و تشخیص مسائل در یک سیستم نقش دارد. هنگامی که مشکلی پیش میآید، دسترسی به دادهها به شناسایی دقیق علت و رفع سریعتر مشکلات کمک میکند.
بهینه سازی عملکرد: از طریق نظارت بر معیارها و شاخص های عملکرد، قابلیت مشاهده به بهینه سازی عملکرد سیستم شما کمک می کند. این شامل شناسایی تنگناها، بهبود استفاده از منابع و اطمینان از عملیات است.
برنامه ریزی برای ظرفیت آینده: درک نحوه رفتار سیستم شما در طول زمان برای برنامه ریزی مورد نیاز ظرفیت حیاتی است. دادههای مشاهدهپذیری میتواند روندها، دورههای اوج استفاده و نیازهای منابع را نشان دهد و به تصمیمگیریهای شما در مورد مقیاسبندی کمک کند.
افزایش تجربه کاربری: با مشاهده تعاملات کاربر با سیستم خود از طریق گزارشها و معیارها، میتوانید تجربه کاربری را بهبود ببخشید. این به شناخت الگوها، ترجیحات، و زمینه های بالقوه ای که می تواند برای رضایت کاربر افزایش یابد، کمک می کند.
چرا باید از OpenTelementary استفاده کنم؟
قابلیت مشاهده برای اطمینان از قابلیت اطمینان و در دسترس بودن برنامه های Node.js شما ضروری است. اما ابزارسازی دستی کد خود برای جمعآوری و صادرات دادههای تلهمتری، مانند ردیابی، معیارها و گزارشها، میتواند بسیار استرسزا باشد.
ابزار دقیق دستی بسیار خسته کننده، مستعد خطا و ناسازگار است. همچنین می تواند سربار و پیچیدگی بیشتری را به منطق برنامه شما وارد کند.
در این راهنما، نحوه استفاده از ابزار خودکار OpenTelemetry را برای کمک به نظارت بدون زحمت Node.js یاد خواهید گرفت.
پیش نیازها
قبل از انجام این راهنما، مطمئن شوید که موارد زیر را دارید:
یک برنامه Node.js
یک حساب Datadog و یک کلید API. اگر ندارید، می توانید برای دریافت یکی از اینجا ثبت نام کنید .
یک سرویس Backend. برای ذخیره و تجزیه و تحلیل دادههای ردیابی میتوانید از یک سرویس پشتیبان مانند Zepkin یا Jaeger استفاده کنید. برای این راهنما، ما از Jaeger استفاده خواهیم کرد.
برخی از دانش اولیه دستورات لینوکس . شما باید با استفاده از خط فرمان و ویرایش فایل های پیکربندی آشنا باشید.
درخواست خود را آماده کنید
در این راهنما، شما از یک برنامه Node.js استفاده می کنید که دارای دو سرویس است که داده ها را بین خود انتقال می دهند. شما از کتابخانه سرویس گیرنده Node.js OpenTelemetry برای ارسال داده های ردیابی به جمع کننده OpenTelementay استفاده خواهید کرد.
ابتدا Repo را به صورت محلی شبیه سازی کنید:
$ git clone https://github.com/<github-account>/nodejs-example.git
سپس برنامه را اجرا کنید:
npm install
با استفاده از این دستور به دایرکتوری اولین سرویس بروید:
$ cd <ServiceA>
و اولین سرویس را شروع کنید.
$ node index.js
سپس به دایرکتوری سرویس دوم بروید
$ cd <ServiceB>
و سرویس دوم را شروع کنید.
$ node index.js
سرویس A، در این مورد پورت 5555
را باز کنید و اطلاعاتی را وارد کنید. سپس همین کار را برای سرویس B تکرار کنید.
نحوه راه اندازی OpenTelementary
پس از شروع سرویسها، زمان نصب ماژولهای OpenTelementary که برای ابزار دقیقسازی خودکار نیاز دارید فرا میرسد.
مواردی که باید نصب کنیم در اینجا آمده است:
$ npm install --save @opentelemetry/api $ npm install --save @opentelemetry/instrumentation $ npm install --save @opentelemetry/tracing $ npm install --save @opentelemetry/exporter-trace-otlp-http $ npm install --save @opentelemetry/resources $ npm install --save @opentelemetry/semantic-conventions $ npm install --save @opentelemetry/auto-instrumentations-node $ npm install --save @opentelemetry/sdk-node $ npm install --save @opentelemetry/exporter-jaeger
در اینجا به تفکیک کارهایی که هر ماژول انجام می دهد آورده شده است:
@opentelemetry/api
: این ماژول OpenTelemetry API را برای Node.js فراهم می کند.
@opentelemetry/instrumentation
: کتابخانه های ابزار دقیق ابزار دقیقی را برای برنامه Node.js شما ارائه می دهند. آنها به طور خودکار داده های تله متری را بدون نیاز به تغییر کد دستی می گیرند.
@opentelemetry/tracing
: این ماژول شامل قابلیت ردیابی اصلی برای OpenTelemetry در برنامه Node.js شما است. این شامل رابط های Tracer و Span است که برای ثبت و نمایش ردیابی های توزیع شده در برنامه های شما مهم هستند.
@opentelemetry/exporter-trace-otlp-http
: این ماژول صادرکننده امکان ارسال دادههای ردیابی را به پشتیبان سازگار با پروتکل OpenTelemetry (OTLP) از طریق HTTP میدهد.
@opentelemetry/resources
: این ماژول راهی برای تعریف و مدیریت منابع مرتبط با ردیابی ها ارائه می دهد.
@opentelemetry/semantic-conventions
: این ماژول مجموعه ای از قراردادهای معنایی را برای ردیابی تعریف می کند. مجموعه ای مشترک از کلیدهای ویژگی و فرمت های ارزش را برای اطمینان از سازگاری در نحوه نمایش و تفسیر داده های تله متری ایجاد می کند.
@opentelemetry/auto-instrumentations-node
: این ماژول فرآیند ابزارسازی برنامه شما را با اعمال خودکار ابزار دقیق در کتابخانه های پشتیبانی شده ساده می کند.
@opentelemetry/sdk-node
: کیت توسعه نرم افزار (SDK) برای Node.js پیاده سازی OpenTelemetry API را فراهم می کند.
@opentelemetry/exporter-jaeger
: این ماژول صادرکننده اجازه می دهد تا داده های ردیابی را به Jaeger صادر کنید. Jaeger یک رابط کاربر پسند برای نظارت و تجزیه و تحلیل داده های ردیابی فراهم می کند.
برنامه Node.js را پیکربندی کنید
در مرحله بعد، یک ردیاب Node.js SDk اضافه کنید تا نمونه سازی و خاموش کردن ردیابی را کنترل کند.
برای گفت ن ردیاب، یک فایل tracer.js
ایجاد کنید:
$ nano tracer.js
سپس کد زیر را به فایل اضافه کنید:
"use strict"; const { BasicTracerProvider, SimpleSpanProcessor, } = require("@opentelemetry/tracing"); // Import the JaegerExporter const { JaegerExporter } = require("@opentelemetry/exporter-jaeger"); const { Resource } = require("@opentelemetry/resources"); const { SemanticResourceAttributes, } = require("@opentelemetry/semantic-conventions"); const opentelemetry = require("@opentelemetry/sdk-node"); const { getNodeAutoInstrumentations, } = require("@opentelemetry/auto-instrumentations-node"); // Create a new instance of JaegerExporter with the options const exporter = new JaegerExporter({ serviceName: "YOUR-SERVICE-NAME", host: "localhost", // optional, can be set by OTEL_EXPORTER_JAEGER_AGENT_HOST port: 16686 // optional }); const provider = new BasicTracerProvider({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: "YOUR-SERVICE-NAME", }), }); // Add the JaegerExporter to the span processor provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); provider.register(); const sdk = new opentelemetry.NodeSDK({ traceExporter: exporter, instrumentations: [getNodeAutoInstrumentations()], }); sdk .start() .then(() => { console.log("Tracing initialized"); }) .catch((error) => console.log("Error initializing tracing", error)); process.on("SIGTERM", () => { sdk .shutdown() .then(() => console.log("Tracing terminated")) .catch((error) => console.log("Error terminating tracing", error)) .finally(() => process.exit(0));
در اینجا یک تفکیک ساده از کد است:
کد با وارد کردن ماژول های BasicTracerProvider
و SimpleSpanProcessor
برای تنظیم ردیابی از کتابخانه OpenTelemetry شروع می شود.
سپس ماژول JaegerExporter را برای صادرات ردیابی داده به Jaeger وارد می کند.
کد یک نمونه جدید از JaegerExporter ایجاد می کند که نام سرویس، میزبان و پورت را مشخص می کند.
سپس یک BasicTracerProvider
ایجاد می کند و JaegerExporter را با استفاده از SimpleSpanProcessor
به پردازنده span اضافه می کند.
ارائه دهنده ثبت شده است و آن را به عنوان ارائه دهنده پیش فرض برنامه تنظیم می کند.
یک نمونه OpenTelemetry SDK ایجاد میشود، آن را با JaegerExporter پیکربندی میکند و ابزارهای خودکار را برای Node.js فعال میکند.
OpenTelemetry SDK شروع می شود و ردیابی اولیه را آغاز می کند.
یک کنترل کننده برای سیگنال SIGTERM تنظیم شده است تا پس از پایان برنامه، ردیابی را خاموش کند.
سپس کد ارائه دهنده ردیابی را با صادرکننده ردیابی پیکربندی می کند. برای تأیید ابزار دقیق، ConsoleSpanExporter
برای چاپ برخی از خروجی های ردیاب در کنسول استفاده می شود.
نحوه تنظیم OpenTelemetry برای صادرات Traces
در مرحله بعد، باید تنظیمات جمع آوری و صادرات داده ها را در OpenTelemetry Collector بنویسید.
یک فایل config.yaml
ایجاد کنید:
receivers: otlp: protocols: grpc: http: exporters: datadog: api: # Replace with your Datadog API key key: "<YOUR_DATADOG_API_KEY>" # Optional: # - endpoint: https://app.datadoghq.eu # For EU region processors: batch: extensions: pprof: endpoint: :1777 zpages: endpoint: :55679 health_check: service: extensions: [health_check, pprof, zpages] pipelines: traces: receivers: [otlp] processors: [batch] exporters: [datadog]
پیکربندی OpenTelemetry را با گیرنده OTLP (پروتکل OpenTelemetry) و صادرکننده Datadog تنظیم میکند. در اینجا به تفکیک کد آمده است:
receivers
: اجزایی را مشخص می کند که داده های تله متری را دریافت می کنند. در این مورد، شامل گیرنده OTLP است که از هر دو پروتکل gRPC و HTTP پشتیبانی می کند.
exporters
: اجزای مسئول صادرات داده های تله متری را تعریف می کند. در اینجا، صادرکننده Datadog را پیکربندی میکند و کلید Datadog API را ارائه میکند. علاوه بر این، یک endpoint
اختیاری برای استفاده از منطقه اتحادیه اروپا Datadog ارائه شده است.
processors
: اجزای پردازش داده را مشخص می کند. در این مورد، پردازنده batch
برای دسته بندی و ارسال داده ها در تکه های بزرگتر برای کارایی استفاده می شود.
extensions
: اجزای اضافی را تعریف می کند که عملکرد را گسترش می دهد. در اینجا، شامل برنامههای گفت نی برای pprof (پروفایل دادهها)، zpages (صفحات اشکالزدایی) و یک پسوند تحلیل سلامت است.
service
: رفتار کلی سرویس، از جمله برنامه های گفت نی و خطوط لوله را پیکربندی می کند. بخش extensions
برنامههای گفت نی مورد استفاده را فهرست میکند و بخش pipelines
خط لوله دادههای تله متری را پیکربندی میکند. در اینجا، خط لوله ردیابی شامل گیرنده OTLP، پردازنده دسته ای و صادرکننده Datadog است.
این کد توسط گردآورنده با صادرکننده Datadog پیکربندی شده است تا ردیابی ها را به سرویس های Datadog Distributed Tracing ارسال کند. با این حال، خدمات ردیابی توزیع شده دیگری مانند New Relic، Logzio و Zipkin وجود دارد که می توانید از آنها استفاده کنید.
نحوه شروع برنامه
پس از تنظیم صحیح ابزار دقیق خودکار، برنامه را دوباره راه اندازی کنید تا پیکربندی ردیابی را آزمایش و تأیید کنید.
با راه اندازی OpenTelemetry Collector شروع کنید:
./otelcontribcol_darwin_amd64 --config ./config.yaml
کلکتور در پورت 4317 راه اندازی می شود.
سپس به دایرکتوری اولین سرویس بروید:
$ cd <ServiceA>
سپس اولین سرویس را با پارامتر «--require './tracer.js'» برای فعال کردن ابزار دقیق برنامه شروع کنید.
$ node --require './tracer.js' index.js
برای شروع سرویس دوم این کار را تکرار کنید.
با استفاده از مرورگری مانند کروم، به نقاط پایانی سرویس های دو برنامه خود بروید، مقداری داده اضافه کنید و درخواست هایی را برای آزمایش پیکربندی ردیابی ارسال کنید.
پس از انجام درخواستها، این ردیابیها توسط گردآورنده انتخاب میشوند، که سپس آنها را به باطن ردیابی توزیع شده مشخص شده توسط پیکربندی صادرکننده در فایل پیکربندی گردآورنده ارسال میکند.
شایان ذکر است که ردیاب ما نه تنها انتقال ردیابی ها را به باطن تعیین شده تسهیل می کند، بلکه همزمان آنها را به کنسول صادر می کند.
این عملکرد دوگانه امکان مشاهده بلادرنگ ردیابی های تولید و ارسال می شود و به ما در فرآیندهای نظارت و اشکال زدایی کمک می کند.
حالا بیایید از Jaeger UI برای نظارت بر ردیابی ها استفاده کنیم:
Jaeger را با دستور زیر شروع کنید:
docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.32
با استفاده از یک مرورگر، Jaeger UI را در http://localhost:16686/ نقطه پایانی راه اندازی کنید.
شما آن را دارید! شروع ردیابی که از نقطه شروع یک سرویس شروع می شود و از طریق دنباله ای از عملیات پیمایش می کند.
این مسیر زمانی ایجاد میشود که سرویس عملیات خود را شروع میکند و در نتیجه سرویس دیگر برای انجام درخواست اصلی که قبلاً شروع کردهاید، تنظیم میشود.
ردیابی یک روایت بصری از آنچه بین این سرویسها اتفاق میافتد، ارائه میکند و بینشهایی را در مورد هر مرحله از فرآیند ارائه میدهد.
چگونه می توان از داده های مشاهده پذیری استفاده کرد؟
معیارهای نظارت: به معیارهای کلیدی مانند زمان پاسخ، نرخ خطا و استفاده از منابع توجه داشته باشید. سنبله ها یا ناهنجاری های ناگهانی می تواند نشان دهنده مسائلی باشد که نیاز به توجه دارند.
Logging: داده های گزارش اطلاعات دقیقی در مورد رویدادها و اقدامات درون یک سیستم ارائه می دهد. تجزیه و تحلیل گزارش ها به درک توالی فعالیت ها و ردیابی مراحل منجر به یک مشکل کمک می کند.
ردیابی: ردیابی شامل ردیابی جریان درخواست ها یا تراکنش ها در اجزای مختلف یک سیستم است. این به درک سفر یک درخواست و شناسایی هر گونه تنگنا یا تاخیر کمک می کند.
هشدار: هشدارها را بر اساس شرایط یا آستانه های خاص تنظیم کنید. هنگامی که معیارهای خاصی از محدودیت های از پیش تعریف شده فراتر می روند، هشدارها می توانند شما را در زمان واقعی مطلع کنند و امکان اقدام فوری را فراهم کنند.
تجسم: از نمایش های گرافیکی و داشبورد برای تجسم داده های پیچیده استفاده کنید. این امر شناسایی الگوها، روندها و همبستگی ها در داده های مشاهده پذیری را آسان تر می کند.
مشاهده پذیری، زمانی که به طور موثر پیاده سازی شود، تیم ها را به مدیریت فعال و بهبود عملکرد، قابلیت اطمینان و تجربه کاربری سیستم های خود توانمند می کند. این یک جنبه حیاتی از توسعه و عملیات نرم افزار مدرن است.
نتیجه
در این راهنما شما یاد گرفتید که چگونه برنامه های Node.js را با کد کم به صورت خودکار ابزارسازی کنید:
نصب و پیکربندی OpenTelemetry Node.js SDK و بسته خودکار ابزار دقیق
فعال کردن ردیابی خودکار و جمعآوری معیارها برای برنامههای Node.js و وابستگیهای آنها
در حال صادرات برای تجسم داده های تله متری شما در یک باطن، Jaeger.
استفاده از ابزار خودکار OpenTelemetry می تواند به شما کمک کند تا بینش ارزشمندی در مورد عملکرد و رفتار برنامه های Node.js خود بدون نیاز به ابزارسازی دستی هر کتابخانه یا فریم ورک به دست آورید.
ارسال نظر