بررسی openTelemetry در دات نت

در این مقاله ابتدا به بررسی metric و opentelemetry خواهیم پرداخت و سپس تنظیمات آن در dotnet را بررسی میکنیم برای ارسال اطلاعاتی از سرور بک اند مانند ( زمان طول کشیدن برای اجرای یک متد ، تعداد درخواست های http و یا اطلاعاتی در ارتباط با منابعی که روی سرور در حال مصرف است ) از Metric ها استفاده می شود ، metric های مختلفی وجود دارد مانند stadsD یا openteletry و ... در دات نت ، در دو حالت console application و حالت web تنظیمات متفاوتی برای openteletry وجود دارد (لازم به ذکر است تنظیمات به دو دسته تقسیم می شوند : 1. تنظیماتی که برای ارسال metric ها به مقصد مورد نظر انجام میشود. 2. تنظیمات مربوط بع خودر metric ها که مورد دوم به راحتی مثال های مختلفی از ان در اینترنت وجود دارد) ، ابتدا به بررسی تنظیمات در dotnet console application می پردازیم ، به جهت این کار ابتدا باید در قسمت program.cs موارد زیر را اضافه کنیم ( تنظمات metric به صورت ابتدایی در نظر گرفته شده است ) services.AddOpenTelemetry() .WithMetrics(builder => builder //we can see our metrics in the console window .AddConsoleExporter() //A Resource is the immutable representation of the entity producing the telemetry .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("ScannerAv")) //AddMeter() extension method configures OpenTelemetry to transmit all the metrics collected by this concrete Meter .AddMeter(meters.MetricName) //With AddPrometheusHttpListener(), OpenTelemetry PrometheusExporter will export data via //the endpoint defined by PrometheusHttpListenerOptions.UriPrefixes, which is http://localhost:9464/ by default. //prometheusUrl= *:5000/ => how its work + open as a administrator .AddPrometheusHttpListener(options => options.UriPrefixes = new string[] { prometheusUrl }) //is the specific configuration that will collect metrics for our incoming HTTP requests. .AddAspNetCoreInstrumentation() //collect metrics for outgoing HTTP requests through the HttpClient class .AddHttpClientInstrumentation() //Runtime metrics give us some interesting measurements, //such as the count of exceptions that have been thrown, or the number of thread pools that currently exist. .AddRuntimeInstrumentation() //A View in OpenTelemetry defines an aggregation, which takes a series of measurements and expresses them //as a single metric value at that point in time. .AddView( instrumentName: "scan-time-elapse", new ExplicitBucketHistogramConfiguration { Boundaries = new double[] { 100, 1000, 7000, 12000, 15000, 17000, 20000, 50000, 100000 } }) );در تنظیمات فوق تعدادی از تنظیمات ، تنظیماتی است که گویای این مورد است که به چه metric ها و یا log هایی ما نیاز دارم برای ارسال و قسمتی از تنظمات مربوط به این است که این metric کجا و به چه نحوی نمایش داده شونددر صورت استفاده از .AddConsoleExporter به برنامه میگوییم که metric ها در کنسول (cmd) نمایش داده شوددر صورتی که بخواهیم metric ها به یک سرور بیرونی ارسال شود ( درحالت console app ) از .AddPrometheusHttpListener(http:/*:5000/) استفاده می کنیم ، لازم به ذکر است حتما برنامه بصورت administratro باید اجرا شود و با این فرمت تنظیم شود که در این صورت می توانیم این اطلاعات را در هر سرور دیگری تحویل بگیریمحال در صورتی که از پروژه dotnet web استفاده می کنیم ، به جای استفاده از AddPrometheusHttpListener باید ازAddPrometheusExporter استفاده شود هم چنین باید خط کد زیر نیز دقسمت مربوط به pipeline ها اظافه شود app.UseOpenTelemetryPrometheusScrapingEndpointهمچنین در صورتی که بخواهیم اطلاعات metric را به collector ساخته شده توسط خودمان ارسال کنیم باید از پکیج OpenTelemetry.Exporter.OpenTelemetryProtocol" " استفاده نماییم و بعد از نصب پکیج به جای استفاده از سایر exporter ها کافی است در قسمت اخر کانفیگ داخل program.cs این خط را قرار دهیم .AddOtlpExporter(option => { option.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; option.Endpoint = new("http://172.22.30.62:4317"); })--------------------------------------------------------------------------------------------------------------------------------------------------------پکیج های زیر جهت استفاده از openTelemtry در دات نت نیاز به نصب است <PackageReference Include="OpenTelemetry" Version="1.5.0-alpha.1" /> <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.4.0" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.5.0-alpha.1" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus.HttpListener" Version="1.5.0-alpha.1" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.14" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.14" /> <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.1.0-rc.2" />در مرحله بعدی اطلاعاتی که مد نظر ما می باشد را به راحتی در داخل متد ها تنظیم میکنیم جهت ارسال ، که این تنظیمات بسته به نوع نیاز ما می باشد و در اینترنت به راحتی پیدا میشود (https://signoz.io/blog/opentelemetry-dotnet/) سپس در سروری که prometheus در ان تنظیم شده است و روی پورت 9090 بالا می باشد ، آی پی و پورت سرورمون رو تو تنظمات yml وارد میکنیم تا در prometheus در قسمت target ها قابل مشاهده باشد و در نهایت میتوان در گرافانا هم نمودار مد نظر خودمونو با این اطلاعات درست کنیم و داشبودرشو بسازیم