.NET, Node.js, Python ve Java uygulamaları için Azure İzleyici OpenTelemetry'yi etkinleştirme
Makale
Bu makalede , Azure İzleyici Application Insights'ta deneyimleri desteklemek için OpenTelemetry tabanlı veri toplamanın nasıl etkinleştirileceği ve yapılandırıldığı açıklanır. "Azure İzleyici OpenTelemetry Distro" uygulamasının nasıl yükleneceğini inceleyeceğiz. OpenTelemetry kavramları hakkında daha fazla bilgi edinmek için bkz. OpenTelemetry'ye genel bakış veya OpenTelemetry SSS.
OpenTelemetry Yayın Durumu
.NET, Node.js, Python ve Java uygulamaları için OpenTelemetry teklifleri sağlanır.
OpenTelemetry Topluluk Paketi ile yan yana çalışan Azure İzleyici OpenTelemetry Dağıtımını test ettik. Dağıtımı yüklemeden önce OpenTelemetry ile ilgili tüm paketleri kaldırmanızı öneririz.
Önceki bir 3.x sürümünden yükseltme yapıyorsanız, topladığımız verilerde varsayılanları veya küçük farkları değiştirdiğinizde etkilenmiş olabilirsiniz. Daha fazla bilgi için sürüm notlarındaki geçiş bölümüne bakın.
3.4.0, 3.3.0, 3.2.0 ve 3.1.0
Azure İzleyici Application Insights'ı etkinleştirmek için uygulamanızda küçük bir değişiklik yapacak ve "Bağlantı Dizenizi" ayarlayacaksınız. Bağlantı Dizesi, uygulamanıza Distro'nun topladığı telemetri verilerini nereye göndereceğinizi bildirir ve sizin için benzersizdir.
Uygulamanızın başlangıcına ekleyin UseAzureMonitor() . .NET sürümünüze bağlı olarak, bu sizin veya program.cs sınıfınızda startup.cs olacaktır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
Uygulama başlatmadaki her OpenTelemetry sinyaline Azure İzleyici Dışarı Aktarma'sını ekleyin. .NET sürümünüze bağlı olarak, bu sizin veya program.cs sınıfınızda startup.cs olacaktır.
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddAzureMonitorTraceExporter();
var metricsProvider = Sdk.CreateMeterProviderBuilder()
.AddAzureMonitorMetricExporter();
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddOpenTelemetry(options =>
{
options.AddAzureMonitorLogExporter();
});
});
Java otomatik müdahalesi yapılandırma değişiklikleriyle etkinleştirilir; kod değişikliği gerekmez.
Uygulamanızın JVM args öğesine ekleyerek -javaagent:"path/to/applicationinsights-agent-3.4.13.jar" JVM'yi jar dosyasına işaret edin.
Bağlantı dizesini birden fazla yerde ayarlarsanız, aşağıdaki ilkeye bağlıyız:
Kod
Ortam Değişkeni
Yapılandırma Dosyası
Verilerin aktığını onaylayın
Uygulamanızı çalıştırın ve Azure portal Application Insights Kaynak sekmenizi açın. Verilerin portalda görünmesi birkaç dakika sürebilir.
İşte bu kadar. Uygulamanız artık Application Insights tarafından izleniyor. Aşağıdaki diğer her şey isteğe bağlıdır ve daha fazla özelleştirme için kullanılabilir.
Çalışmıyor musunuz? ASP.NET Core, Java, Node.js veya Python için sorun giderme sayfasına göz atın.
Önemli
Aynı Application Insights kaynağına telemetri yayan iki veya daha fazla hizmetiniz varsa, Bunları Uygulama Haritası'nda düzgün bir şekilde göstermek için Bulut Rolü Adları'nı ayarlamanız gerekir.
Application Insights izlemesini kullanmanın bir parçası olarak tanılama verilerini toplar ve Microsoft'a göndeririz. Bu veriler Application Insights'ı çalıştırmamıza ve geliştirmemize yardımcı olur. Daha fazla bilgi edinmek için bkz. Azure Uygulaması İçgörüler'de statsbeat.
Otomatik veri toplama
Dağıtımlar, OpenTelemetry "izleme kitaplıkları" içinde toplayarak otomatik olarak veri toplar.
3: Varsayılan olarak, günlük yalnızca BİlGİ düzeyinde veya daha yüksek bir düzeyde toplanır. Bu ayarı değiştirmek için yapılandırma seçeneklerine bakın.
4: Varsayılan olarak günlük kaydı yalnızca UYARI düzeyinde veya daha yüksek bir düzeyde toplanır...
OpenTelemetry tabanlı teklifler şu anda tüm OpenTelemetry ölçümlerini Ölçüm Gezgini'nde Özel Ölçümler ve Performans Sayaçları olarak gösterir. .NET, Node.js ve Python için ölçüm adı olarak ayarladığınız her şey ölçüm ad alanı olur.
Topluluk izleme kitaplığı ekleme
OpenTelemetry topluluğundan izleme kitaplıkları eklediğinizde otomatik olarak daha fazla veri toplayabilirsiniz.
Not
Topluluk izleme kitaplıklarının kalitesini desteklemiyoruz ve garanti edemiyoruz. Dağıtıma eklemek için bir topluluk araç kitaplığı önermek isterseniz geri bildirim topluluğumuzda bir fikir gönderin veya oy verin.
Dikkat
Bazı izleme kitaplıkları deneysel OpenTelemetry semantik belirtimlerini temel alır. Bunları eklemek sizi gelecekteki hataya neden olan değişikliklere karşı savunmasız bırakabilir.
Topluluk kitaplığı eklemek için veya ConfigureOpenTelemetryTraceProvider yöntemlerini kullanınConfigureOpenTelemetryMeterProvider.
Aşağıdaki örnekte, ek ölçümler toplamak için Çalışma Zamanı İzleme'nin nasıl eklenebilecekleri gösterilmektedir.
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddRuntimeInstrumentation());
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
Aşağıdaki örnekte, ek ölçümler toplamak için Çalışma Zamanı İzleme'nin nasıl eklenebilecekleri gösterilmektedir.
var metricsProvider = Sdk.CreateMeterProviderBuilder()
.AddRuntimeInstrumentation()
.AddAzureMonitorMetricExporter();
Java Dağıtımı'nı topluluk izleme kitaplıklarıyla genişletemezsiniz. Başka bir izleme kitaplığı eklememizi istemek için lütfen GitHub sayfamızda bir sorun açın. Sonraki Adımlarda GitHub sayfamızın bağlantısını bulabilirsiniz.
Diğer OpenTelemetry Araçları burada bulunabilir ve ApplicationInsightsClient'da TraceHandler kullanılarak eklenebilir.
Aşağıdaki tablo, şu anda desteklenen özel telemetri türlerini temsil eder:
Dil
Özel Olaylar
Özel Ölçümler
Bağımlılıklar
Özel durumlar
Sayfa Görüntülemeleri
İstekler
İzlemeler
ASP.NET Core
OpenTelemetry API'si
Yes
Yes
Yes
Yes
iLogger API'si
Yes
AI Klasik API
Java
OpenTelemetry API'si
Yes
Yes
Yes
Yes
Logback, Log4j, JUL
Yes
Yes
Micrometer ölçümleri
Yes
AI Klasik API
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Node.js
OpenTelemetry API'si
Yes
Yes
Yes
Yes
Konsol, Winston, Bunyan
Yes
AI Klasik API
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Python
OpenTelemetry API'si
Yes
Yes
Yes
Yes
Python Günlük Modülü
Yes
Not
Application Insights Java 3.x, Application Insights Klasik API'sine gönderilen telemetri verilerini dinler. Benzer şekilde, Application Insights Node.js 3.x, Application Insights Klasik API'siyle oluşturulan olayları toplar. Bu, yükseltmeyi kolaylaştırır ve tüm özel telemetri türleri OpenTelemetry API'sinde desteklenene kadar özel telemetri desteğimizdeki boşluğu doldurur.
Özel Ölçümler Ekleme
Not
Özel Ölçümler, Azure İzleyici Application Insights'ta önizleme aşamasındadır. Boyutları olmayan özel ölçümler varsayılan olarak kullanılabilir. Boyutları görüntülemek ve uyarı vermek için kabul etmeniz gerekir.
İzleme kitaplıkları tarafından sağlananların ötesinde daha fazla ölçüm toplamayı göz önünde bulundurun.
OpenTelemetry API'si, çeşitli ölçüm senaryolarını kapsayan altı ölçüm "aracı" sunar ve Ölçüm Gezgini'nde ölçümleri görselleştirirken doğru "Toplama Türü"nü seçmeniz gerekir. Bu gereksinim, ölçümleri göndermek için OpenTelemetry Ölçüm API'sini kullanırken ve izleme kitaplığı kullanırken geçerlidir.
Aşağıdaki tabloda OpenTelemetry Ölçüm Araçlarının her biri için önerilen toplama türleri gösterilmektedir.
OpenTelemetry Instrument
Azure İzleyici Toplama Türü
Sayaç
Sum
Zaman Uyumsuz Sayaç
Sum
Histogram
Min, Max, Average, Sum ve Count
Zaman Uyumsuz Ölçer
Ortalama
UpDownCounter
Sum
Zaman Uyumsuz UpDownCounter
Sum
Dikkat
Tabloda gösterilenlerin ötesinde toplama türleri genellikle anlamlı değildir.
OpenTelemetry Belirtimi, araçları açıklar ve her birini ne zaman kullanabileceğinize ilişkin örnekler sağlar.
İpucu
Histogram, Application Insights GetMetric Klasik API'sinin en çok yönlü ve en yakın eşdeğeridir. Azure İzleyici şu anda histogram aracını desteklenen beş toplama türümüzde düzleştirir ve yüzdebirlik dilim desteği devam etmektedir. Daha az çok yönlü olsa da, diğer OpenTelemetry araçları uygulamanızın performansı üzerinde daha az etkiye sahiptir.
Uygulama başlatma, bir Ölçüme ada göre abone olmalıdır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddMeter("OTel.AzureMonitor.Demo"));
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
aynı Meter ad kullanılarak başlatılmalıdır.
var meter = new Meter("OTel.AzureMonitor.Demo");
Histogram<long> myFruitSalePrice = meter.CreateHistogram<long>("FruitSalePrice");
var rand = new Random();
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "red"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "green"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "red"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
public class Program
{
private static readonly Meter meter = new("OTel.AzureMonitor.Demo");
public static void Main()
{
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("OTel.AzureMonitor.Demo")
.AddAzureMonitorMetricExporter()
.Build();
Histogram<long> myFruitSalePrice = meter.CreateHistogram<long>("FruitSalePrice");
var rand = new Random();
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "red"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "green"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "apple"), new("color", "red"));
myFruitSalePrice.Record(rand.Next(1, 1000), new("name", "lemon"), new("color", "yellow"));
System.Console.WriteLine("Press Enter key to exit.");
System.Console.ReadLine();
}
}
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.Meter;
public class Program {
public static void main(String[] args) {
Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");
DoubleHistogram histogram = meter.histogramBuilder("histogram").build();
histogram.record(1.0);
histogram.record(100.0);
histogram.record(30.0);
}
}
Uygulama başlatma, bir Ölçüme ada göre abone olmalıdır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddMeter("OTel.AzureMonitor.Demo"));
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
aynı Meter ad kullanılarak başlatılmalıdır.
var process = Process.GetCurrentProcess();
var meter = new Meter("OTel.AzureMonitor.Demo");
ObservableGauge<int> myObservableGauge = meter.CreateObservableGauge("Thread.State", () => GetThreadState(process));
private static IEnumerable<Measurement<int>> GetThreadState(Process process)
{
foreach (ProcessThread thread in process.Threads)
{
yield return new((int)thread.ThreadState, new("ProcessId", process.Id), new("ThreadId", thread.Id));
}
}
public class Program
{
private static readonly Meter meter = new("OTel.AzureMonitor.Demo");
public static void Main()
{
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("OTel.AzureMonitor.Demo")
.AddAzureMonitorMetricExporter()
.Build();
var process = Process.GetCurrentProcess();
ObservableGauge<int> myObservableGauge = meter.CreateObservableGauge("Thread.State", () => GetThreadState(process));
System.Console.WriteLine("Press Enter key to exit.");
System.Console.ReadLine();
}
private static IEnumerable<Measurement<int>> GetThreadState(Process process)
{
foreach (ProcessThread thread in process.Threads)
{
yield return new((int)thread.ThreadState, new("ProcessId", process.Id), new("ThreadId", thread.Id));
}
}
}
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter;
public class Program {
public static void main(String[] args) {
Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");
meter.gaugeBuilder("gauge")
.buildWithCallback(
observableMeasurement -> {
double randomNumber = Math.floor(Math.random() * 100);
observableMeasurement.record(randomNumber, Attributes.of(AttributeKey.stringKey("testKey"), "testValue"));
});
}
}
const { ApplicationInsightsClient, ApplicationInsightsConfig } = require("applicationinsights");
const appInsights = new ApplicationInsightsClient(new ApplicationInsightsConfig());
const customMetricsHandler = appInsights.getMetricHandler().getCustomMetricsHandler();
const meter = customMetricsHandler.getMeter();
let gauge = meter.createObservableGauge("gauge");
gauge.addCallback((observableResult: ObservableResult) => {
let randomNumber = Math.floor(Math.random() * 100);
observableResult.observe(randomNumber, {"testKey": "testValue"});
});
from typing import Iterable
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import metrics
from opentelemetry.metrics import CallbackOptions, Observation
configure_azure_monitor(
connection_string="<your-connection-string>",
)
meter = metrics.get_meter_provider().get_meter("otel_azure_monitor_gauge_demo")
def observable_gauge_generator(options: CallbackOptions) -> Iterable[Observation]:
yield Observation(9, {"test_key": "test_value"})
def observable_gauge_sequence(options: CallbackOptions) -> Iterable[Observation]:
observations = []
for i in range(10):
observations.append(
Observation(9, {"test_key": i})
)
return observations
gauge = meter.create_observable_gauge("gauge", [observable_gauge_generator])
gauge2 = meter.create_observable_gauge("gauge2", [observable_gauge_sequence])
input()
Özel Özel Durumlar Ekleme
İzleme kitaplıklarının özel durumları otomatik olarak Application Insights'a bildirmesini seçin.
Ancak, izleme kitaplıkları raporunun ötesinde özel durumları el ile raporlamak isteyebilirsiniz.
Örneğin, kodunuz tarafından yakalanan özel durumlar normalde bildirilir. Hataların bölümü ve uçtan uca işlem görünümleri dahil olmak üzere ilgili deneyimlere dikkat çekmek için bunları raporlamak isteyebilirsiniz.
const { ApplicationInsightsClient, ApplicationInsightsConfig } = require("applicationinsights");
const appInsights = new ApplicationInsightsClient(new ApplicationInsightsConfig());
const tracer = appInsights.getTraceHandler().getTracer();
let span = tracer.startSpan("hello");
try{
throw new Error("Test Error");
}
catch(error){
span.recordException(error);
}
OpenTelemetry Python SDK'sı, oluşan özel durumlar otomatik olarak yakalanıp kaydedilebilecek şekilde uygulanır. Bu davranış örneği için aşağıdaki kod örneğine bakın.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
configure_azure_monitor(
connection_string="<your-connection-string>",
)
tracer = trace.get_tracer("otel_azure_monitor_exception_demo")
# Exception events
try:
with tracer.start_as_current_span("hello") as span:
# This exception will be automatically recorded
raise Exception("Custom exception message.")
except Exception:
print("Exception raised")
Özel durumları el ile kaydetmek isterseniz, bağlam yöneticisinde bu seçeneği devre dışı bırakabilir ve aşağıdaki örnekte gösterildiği gibi doğrudan kullanabilirsiniz record_exception() :
...
with tracer.start_as_current_span("hello", record_exception=False) as span:
try:
raise Exception("Custom exception message.")
except Exception as ex:
# Manually record exception
span.record_exception(ex)
...
Özel Spans Ekleme
İki senaryoda özel bir yayılma alanı eklemek isteyebilirsiniz. İlk olarak, izleme kitaplığı tarafından henüz toplanmamış bir bağımlılık isteği olduğunda. İkincisi, bir uygulama işlemini uçtan uca işlem görünümünde bir yayılma alanı olarak modellemek istediğinizde.
Activity Ad alanından ve ActivitySource sınıfları System.Diagnostics sırasıyla ve Tracer'nin Span OpenTelemetry kavramlarını temsil ediyor. kullanarak yerine TracerProvideroluşturucusunu kullanarak doğrudan oluşturursunuzActivitySource. Her ActivitySource sınıf kullanılarak AddSource()açıkça bağlanmalıdırTracerProvider. Bunun nedeni OpenTelemetry izleme API'sinin bölümlerinin doğrudan .NET çalışma zamanına dahil edilmiş olmasıdır. Daha fazla bilgi edinmek için bkz. OpenTelemetry .NET İzleme API'sine Giriş.
internal static readonly ActivitySource activitySource = new("ActivitySourceName");
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddSource("ActivitySourceName"));
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.MapGet("/", () =>
{
using (var activity = activitySource.StartActivity("CustomActivity"))
{
// your code here
}
return $"Hello World!";
});
app.Run();
çağrılırken StartActivity varsayılan olarak ActivityKind.Internal ayarlanır, ancak başka ActivityKindherhangi bir sağlayabilirsiniz.
ActivityKind.Client, ActivityKind.Producerve ActivityKind.Internal Application Insights dependenciesile eşlenir.
ActivityKind.Server ve ActivityKind.Consumer Application Insights requestsile eşlenir.
Not
Activity Ad alanından ve ActivitySource sınıfları System.Diagnostics sırasıyla ve Tracer'nin Span OpenTelemetry kavramlarını temsil ediyor. kullanarak yerine TracerProvideroluşturucusunu kullanarak doğrudan oluşturursunuzActivitySource. Her ActivitySource sınıf kullanılarak AddSource()açıkça bağlanmalıdırTracerProvider. Bunun nedeni OpenTelemetry izleme API'sinin bölümlerinin doğrudan .NET çalışma zamanına dahil edilmiş olmasıdır. Daha fazla bilgi edinmek için bkz. OpenTelemetry .NET İzleme API'sine Giriş.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("ActivitySourceName")
.AddAzureMonitorTraceExporter()
.Build();
var activitySource = new ActivitySource("ActivitySourceName");
using (var activity = activitySource.StartActivity("CustomActivity"))
{
// your code here
}
çağrılırken StartActivity varsayılan olarak ActivityKind.Internal ayarlanır, ancak başka ActivityKindherhangi bir sağlayabilirsiniz.
ActivityKind.Client, ActivityKind.Producerve ActivityKind.Internal Application Insights dependenciesile eşlenir.
ActivityKind.Server ve ActivityKind.Consumer Application Insights requestsile eşlenir.
OpenTelemetry ek açıklamasını kullanma
Kendi yayılma alanlarınızı eklemenin en kolay yolu OpenTelemetry'nin @WithSpan ek açıklamasını kullanmaktır.
Spans, Application Insights'ta ve dependencies tablolarını doldururrequests.
Uygulamanıza (veya daha yenisini) ekleyin opentelemetry-instrumentation-annotations-1.21.0.jar :
Varsayılan olarak, span bağımlılık türüne dependenciesInProcsahip tabloda biter.
Otomatik müdahale tarafından yakalanmayan bir arka plan işini temsil eden yöntemler için, Application Insights requests tablosunda göründüklerinden emin olmak için @WithSpan ek açıklamaya özniteliğini kind = SpanKind.SERVER uygulamanızı öneririz.
OpenTelemetry API'sini kullanma
Yukarıdaki OpenTelemetry @WithSpan ek açıklaması gereksinimlerinizi karşılamıyorsa OpenTelemetry API'sini kullanarak yayılma alanlarınızı ekleyebilirsiniz.
Uygulamanıza (veya daha yenisini) ekleyin opentelemetry-api-1.0.0.jar :
OpenTelemetry API'sini kullanarak Application Insights'taki ve dependencies tablolarında requests görünen kendi yayılma alanlarınızı ekleyebilirsiniz.
Kod örneği, başlangıç yapmak, yayılma alanını geçerli hale getirmek ve bağlamı içinde span'ı sonlandırmak için yönteminin nasıl kullanılacağını tracer.start_as_current_span() gösterir.
...
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
# The "with" context manager starts, makes the span current, and ends the span within it's context
with tracer.start_as_current_span("my first span") as span:
try:
# Do stuff within the context of this
except Exception as ex:
span.record_exception(ex)
...
Varsayılan olarak, span bağımlılık türüne sahip tablodadır dependenciesInProc.
Yönteminiz otomatik yetkisiz erişim tarafından yakalanmamış bir arka plan işini temsil ediyorsanız, özniteliğini kind = SpanKind.SERVER Application Insights requests tablosunda göründüğünden emin olacak şekilde ayarlamanızı öneririz.
...
from opentelemetry import trace
from opentelemetry.trace import SpanKind
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("my request span", kind=SpanKind.SERVER) as span:
...
Application Insights Klasik API'sini kullanarak özel telemetri gönderme
Mümkün olduğunda OpenTelemetry API'lerini kullanmanızı öneririz, ancak Application Insights Klasik API'lerinikullanmanız gerektiğinde bazı senaryolar olabilir.
Bu bölümde telemetrinin nasıl değiştirileceği açıklanmaktadır.
Span öznitelikleri ekleme
Bu öznitelikler telemetrinize özel özellik eklemeyi içerebilir. Application Insights şemasında İstemci IP'leri gibi isteğe bağlı alanlar ayarlamak için öznitelikleri de kullanabilirsiniz.
Span'a özel özellik ekleme
Spans'a eklediğiniz tüm öznitelikler özel özellikler olarak dışarı aktarılır. İstekler, bağımlılıklar, izlemeler veya özel durumlar tablosunda customDimensions alanını doldurur.
İzleme kitaplıkları tarafından sağlanan seçenekleri kullanmanın avantajı, kullanılabilir olduğunda bağlamın tamamının kullanılabilir olmasıdır. Sonuç olarak, kullanıcılar daha fazla öznitelik eklemeyi veya filtrelemeyi seçebilir. Örneğin, HttpClient izleme kitaplığındaki zenginleştirme seçeneği, kullanıcıların HttpRequestMessage'a ve HttpResponseMessage'a erişmesini sağlar. Herhangi bir öğeyi seçip bir öznitelik olarak depolayabilirler.
Birçok izleme kitaplığı zenginleştirme seçeneği sunar. Yönergeler için tek tek izleme kitaplıklarının benioku dosyalarına bakın:
Azure İzleyici'yi eklemeden önce burada gösterilen işlemciyi ekleyin.
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddProcessor(new ActivityEnrichingProcessor()));
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
Aşağıdaki kodla projenize ekleyin ActivityEnrichingProcessor.cs :
public class ActivityEnrichingProcessor : BaseProcessor<Activity>
{
public override void OnEnd(Activity activity)
{
// The updated activity will be available to all processors which are called after this processor.
activity.DisplayName = "Updated-" + activity.DisplayName;
activity.SetTag("CustomDimension1", "Value1");
activity.SetTag("CustomDimension2", "Value2");
}
}
Span öznitelikleri eklemek için aşağıdaki iki yoldan birini kullanın:
İzleme kitaplıkları tarafından sağlanan seçenekleri kullanın.
Özel bir span işlemcisi ekleyin.
İpucu
İzleme kitaplıkları tarafından sağlanan seçenekleri kullanmanın avantajı, kullanılabilir olduğunda bağlamın tamamının kullanılabilir olmasıdır. Sonuç olarak, kullanıcılar daha fazla öznitelik eklemeyi veya filtrelemeyi seçebilir. Örneğin, HttpClient izleme kitaplığındaki zenginleştirme seçeneği, kullanıcılara httpRequestMessage'ın kendisine erişim sağlar. Herhangi bir öğeyi seçip bir öznitelik olarak depolayabilirler.
Birçok izleme kitaplığı zenginleştirme seçeneği sunar. Yönergeler için tek tek izleme kitaplıklarının benioku dosyalarına bakın:
Burada gösterilen işlemciyi Azure İzleyici Dışarı Vereni'nin önüne ekleyin.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("OTel.AzureMonitor.Demo")
.AddProcessor(new ActivityEnrichingProcessor())
.AddAzureMonitorTraceExporter()
.Build();
Aşağıdaki kodla projenize ekleyin ActivityEnrichingProcessor.cs :
public class ActivityEnrichingProcessor : BaseProcessor<Activity>
{
public override void OnEnd(Activity activity)
{
// The updated activity will be available to all processors which are called after this processor.
activity.DisplayName = "Updated-" + activity.DisplayName;
activity.SetTag("CustomDimension1", "Value1");
activity.SetTag("CustomDimension2", "Value2");
}
}
Spans'a öznitelik eklemek için kullanabilirsiniz opentelemetry-api .
Bir veya daha fazla span özniteliği eklemek , dependencies, tracesveya exceptions tablosundaki requestsalanı doldururcustomDimensions.
Uygulamanıza (veya daha yenisini) ekleyin opentelemetry-api-1.0.0.jar :
...
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
configure_azure_monitor(
connection_string="<your-connection-string>",
)
span_enrich_processor = SpanEnrichingProcessor()
# Add the processor shown below to the current `TracerProvider`
trace.get_tracer_provider().add_span_processor(span_enrich_processor)
...
Aşağıdaki kodla projenize ekleyin SpanEnrichingProcessor.py :
from opentelemetry.sdk.trace import SpanProcessor
class SpanEnrichingProcessor(SpanProcessor):
def on_end(self, span):
span._name = "Updated-" + span.name
span._attributes["CustomDimension1"] = "Value1"
span._attributes["CustomDimension2"] = "Value2"
Kullanıcı IP'sini ayarlama
span özniteliğini ayarlayarak http.client_ip istekler için client_IP alanını doldurabilirsiniz. Application Insights, kullanıcı konumu öznitelikleri oluşturmak için IP adresini kullanır ve ardından varsayılan olarak atar.
Kullanıcı kimliğini veya kimliği doğrulanmış kullanıcı kimliğini ayarlama
aşağıdaki yönergeleri kullanarak istekler için user_Id veya user_AuthenticatedId alanını doldurabilirsiniz. Kullanıcı Kimliği anonim bir kullanıcı tanımlayıcısıdır. Kimliği Doğrulanmış Kullanıcı Kimliği bilinen bir kullanıcı tanımlayıcısıdır.
Önemli
Kimliği Doğrulanmış Kullanıcı Kimliği'ni ayarlamadan önce geçerli gizlilik yasalarına başvurun.
Python günlük kitaplığı otomatik olarak dağıtılır. Günlüklerinizin bağımsız değişkenine bir sözlük extra geçirerek günlüklerinize özel boyutlar ekleyebilirsiniz.
...
logger.warning("WARNING: Warning log with properties", extra={"key1": "value1"})
...
Telemetri filtreleme
Telemetriyi uygulamanızdan ayrılmadan önce filtrelemek için aşağıdaki yöntemleri kullanabilirsiniz.
Azure İzleyici'yi eklemeden önce burada gösterilen işlemciyi ekleyin.
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddProcessor(new ActivityFilteringProcessor()));
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddSource("ActivitySourceName"));
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.Run();
Aşağıdaki kodla projenize ekleyin ActivityFilteringProcessor.cs :
public class ActivityFilteringProcessor : BaseProcessor<Activity>
{
public override void OnStart(Activity activity)
{
// prevents all exporters from exporting internal activities
if (activity.Kind == ActivityKind.Internal)
{
activity.IsAllDataRequested = false;
}
}
}
Belirli bir kaynak kullanılarak açıkça eklenmiyorsa, bu kaynak kullanılarak AddSource("ActivitySourceName")oluşturulan etkinliklerin hiçbiri dışarı aktarılamaz.
Birçok izleme kitaplığı bir filtre seçeneği sağlar. Yönergeler için tek tek izleme kitaplıklarının benioku dosyalarına bakın:
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("OTel.AzureMonitor.Demo")
.AddProcessor(new ActivityFilteringProcessor())
.AddAzureMonitorTraceExporter()
.Build();
Aşağıdaki kodla projenize ekleyin ActivityFilteringProcessor.cs :
public class ActivityFilteringProcessor : BaseProcessor<Activity>
{
public override void OnStart(Activity activity)
{
// prevents all exporters from exporting internal activities
if (activity.Kind == ActivityKind.Internal)
{
activity.IsAllDataRequested = false;
}
}
}
Belirli bir kaynak kullanılarak açıkça eklenmezse, bu kaynak kullanılarak AddSource("ActivitySourceName")oluşturulan etkinliklerin hiçbiri dışarı aktarılamaz.
Özel işlemci kullanın. Belirli aralıkların dışarı aktarılmasını dışlamak için özel bir span işlemcisi kullanabilirsiniz. Yayılmaları dışarı aktarılmayacak şekilde işaretlemek için olarak ayarlayın TraceFlagDEFAULT.
Özel özellik ekleme örneğini kullanın, ancak aşağıdaki kod satırlarını değiştirin:
Bunu yaptığınızda aşağıdaki Flask örneğinde gösterilen uç nokta hariç tutulur:
...
import flask
from azure.monitor.opentelemetry import configure_azure_monitor
# Configure Azure monitor collection telemetry pipeline
configure_azure_monitor(
connection_string="<your-connection-string>",
)
app = flask.Flask(__name__)
# Requests sent to this endpoint will not be tracked due to
# flask_config configuration
@app.route("/ignore")
def ignore():
return "Request received but not tracked."
...
Özel işlemci kullanın. Belirli aralıkların dışarı aktarılmasını dışlamak için özel bir span işlemcisi kullanabilirsiniz. Yayılmaları dışarı aktarılmayacak şekilde işaretlemek için olarak ayarlayın TraceFlagDEFAULT.
...
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
configure_azure_monitor(
connection_string="<your-connection-string>",
)
trace.get_tracer_provider().add_span_processor(SpanFilteringProcessor())
...
Aşağıdaki kodla projenize ekleyin SpanFilteringProcessor.py :
from opentelemetry.trace import SpanContext, SpanKind, TraceFlags
from opentelemetry.sdk.trace import SpanProcessor
class SpanFilteringProcessor(SpanProcessor):
# prevents exporting spans from internal activities
def on_start(self, span):
if span._kind is SpanKind.INTERNAL:
span._context = SpanContext(
span.context.trace_id,
span.context.span_id,
span.context.is_remote,
TraceFlags.DEFAULT,
span.context.trace_state,
)
İzleme kimliğini veya span kimliğini alma
İzleme kimliğini veya span kimliğini almak isteyebilirsiniz. Application Insights dışında bir hedefe gönderilen günlükleriniz varsa, izleme kimliğini veya span kimliğini eklemeyi göz önünde bulundurun. Bunu yapmak, hata ayıklama ve sorunları tanılama sırasında daha iyi bağıntı sağlar.
Activity ad alanından System.Diagnostics ve ActivitySource sınıfları sırasıyla ve Tracer'nin Span OpenTelemetry kavramlarını temsil ediyor. Bunun nedeni OpenTelemetry izleme API'sinin parçalarının doğrudan .NET çalışma zamanına dahil edilmiş olmasıdır. Daha fazla bilgi edinmek için bkz. OpenTelemetry .NET İzleme API'sine Giriş.
Activity ad alanından System.Diagnostics ve ActivitySource sınıfları sırasıyla ve Tracer'nin Span OpenTelemetry kavramlarını temsil ediyor. Bunun nedeni OpenTelemetry izleme API'sinin parçalarının doğrudan .NET çalışma zamanına dahil edilmiş olmasıdır. Daha fazla bilgi edinmek için bkz. OpenTelemetry .NET İzleme API'sine Giriş.