Migrieren von .NET Application Insights SDKs zu Azure Monitor OpenTelemetry
Dieser Leitfaden enthält eine Schritt-für-Schritt Anleitung für die Migration verschiedener .NET-Anwendungen von der Verwendung von Application Insights Software Development Kits (SDKs) zu Azure Monitor OpenTelemetry.
Die Azure Monitor OpenTelemetry-Instrumentierung bietet eine ähnliche Erfahrung wie die Application Insights SDKs. Weitere Informationen und einen featurespezifischen Vergleich finden Sie unter Wie lautet der aktuelle Releasestatus der Features in der OpenTelemetry-Distribution von Azure Monitor?.
- Migration von ASP.NET Core zur OpenTelemetry-Distribution von Azure Monitor (NuGet-Paket
Azure.Monitor.OpenTelemetry.AspNetCore
) - Migration von ASP.NET, Konsole, und WorkerService zum OpenTelemetry-Exporter von Azure Monitor (NuGet-Paket
Azure.Monitor.OpenTelemetry.Exporter
)
Wenn Sie mit der Verwendung von Application Insights beginnen und nicht von der Classic API migrieren müssen, lesen Sie Aktivieren von Azure Monitor OpenTelemetry für .NET-, Node.js-, Python und Java-Anwendungen.
Voraussetzungen
- Eine bereits mit Application Insights instrumentierte ASP.NET Core-Webanwendung ohne Anpassungen
- Eine aktiv unterstützte Version von .NET
Tipp
Unsere Produktgruppe freut sich über Feedback zu dieser Dokumentation. Senden Sie Feedback an otel@microsoft.com, oder sehen Sie den Abschnitt Support an.
Entfernen des Application Insights SDK
Hinweis
Vergewissern Sie sich, dass Sie über eine aktuelle Sicherung Ihrer Anwendung verfügen, bevor Sie mit den hier beschriebenen Schritten fortfahren.
Entfernen von NuGet-Paketen
Entfernen Sie das Paket
Microsoft.ApplicationInsights.AspNetCore
auscsproj
.dotnet remove package Microsoft.ApplicationInsights.AspNetCore
Entfernen von Initialisierungscode und Anpassungen
Entfernen Sie alle Verweise auf Application Insights-Typen aus Ihrer Codebasis.
Tipp
Nachdem Sie das Application Insights-Paket entfernt haben, können Sie Ihre Anwendung neu erstellen, um eine Liste von Verweisen abzurufen, die entfernt werden müssen.
Entfernen Sie Application Insights aus
ServiceCollection
, indem Sie die folgende Zeile löschen:builder.Services.AddApplicationInsightsTelemetry();
Entfernen Sie den Abschnitt
ApplicationInsights
ausappsettings.json
.{ "ApplicationInsights": { "ConnectionString": "<Your Connection String>" } }
Bereinigen und Erstellen
Überprüfen Sie ihr Bin-Verzeichnis, um sich zu vergewissern, dass alle Verweise auf
Microsoft.ApplicationInsights.*
entfernt wurden.Testen Ihrer Anwendung
Vergewissern Sie sich, dass Ihre Anwendung keine unerwarteten Auswirkungen hat.
Tipp
Unsere Produktgruppe freut sich über Feedback zu dieser Dokumentation. Senden Sie Feedback an otel@microsoft.com, oder sehen Sie den Abschnitt Support an.
Aktivieren von OpenTelemetry
Es wird empfohlen, eine Ressource für die Entwicklung zu erstellen und deren Verbindungszeichenfolge zu verwenden, wenn Sie dieser Anleitung folgen.
Planen Sie ein, die Verbindungszeichenfolge zu aktualisieren, um Telemetriedaten an die ursprüngliche Ressource zu senden, nachdem Sie sich vergewissert haben, dass die Migration erfolgreich war.
Installieren der Azure Monitor-Distribution
Unsere Azure Monitor-Distribution ermöglicht die Verwendung automatischer Telemetriedaten durch Einbeziehung von OpenTelemetry-Instrumentierungsbibliotheken zum Sammeln von Ablaufverfolgungen, Metriken, Protokollen und Ausnahmen und ermöglicht auch das Sammeln benutzerdefinierter Telemetriedaten.
Die Installation der Azure Monitor-Distribution ist mit dem OpenTelemetry SDK als Abhängigkeit verbunden.
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
Hinzufügen und Konfigurieren von OpenTelemetry und Azure Monitor
Das OpenTelemery SDK muss beim Starten der Anwendung als Teil von
ServiceCollection
konfiguriert werden (in der Regel in der DateiProgram.cs
).Das Konzept von OpenTelemetry umfasst drei Signale: Ablaufverfolgungen, Metriken und Protokolle. Die Azure Monitor-Distribution konfiguriert jedes dieser Signale.
Program.cs
Im folgenden Codebeispiel werden die Grundlagen veranschaulicht:
using Azure.Monitor.OpenTelemetry.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Call AddOpenTelemetry() to add OpenTelemetry to your ServiceCollection.
// Call UseAzureMonitor() to fully configure OpenTelemetry.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
}
}
Es empfiehlt sich, die Verbindungszeichenfolge in einer Umgebungsvariablen festzulegen:
APPLICATIONINSIGHTS_CONNECTION_STRING=<Your Connection String>
Weitere Optionen zum Konfigurieren der Verbindungszeichenfolge finden Sie hier.
Tipp
Unsere Produktgruppe freut sich über Feedback zu dieser Dokumentation. Senden Sie Feedback an otel@microsoft.com, oder sehen Sie den Abschnitt Support an.
Installieren und Konfigurieren von Instrumentierungsbibliotheken
Instrumentierungsbibliotheken können Ihrem Projekt hinzugefügt werden, um automatisch Telemetriedaten zu bestimmten Komponenten oder Abhängigkeiten zu sammeln.
Folgende Bibliotheken sind in der Distribution enthalten:
Anpassen von Instrumentierungsbibliotheken
Die Azure Monitor-Distribution beinhaltet die .NET OpenTelemetry-Instrumentierung für ASP.NET Core, HttpClient und SQLClient. Sie können diese enthaltenen Instrumentierungen anpassen oder mithilfe der OpenTelemetry-API manuell eine zusätzliche Instrumentierung hinzufügen.
Hier sind einige Beispiele für die Anpassung der Instrumentierung:
Anpassen von AspNetCoreTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
options.RecordException = true;
options.Filter = (httpContext) =>
{
// only collect telemetry about HTTP GET requests
return HttpMethods.IsGet(httpContext.Request.Method);
};
});
Anpassen von HttpClientTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<HttpClientTraceInstrumentationOptions>(options =>
{
options.RecordException = true;
options.FilterHttpRequestMessage = (httpRequestMessage) =>
{
// only collect telemetry about HTTP GET requests
return HttpMethods.IsGet(httpRequestMessage.Method.Method);
};
});
Anpassen von SqlClientInstrumentationOptions
Wir bieten zwar die SQLClient-Instrumentierung innerhalb unseres Pakets an, diese befindet sich allerdings noch in der Betaphase. Wenn sie ein stabiles Release erreicht, fügen wir sie als Standardpaketreferenz hinzu. Fügen Sie bis dahin Ihrem Projekt den OpenTelemetry.Instrumentation.SqlClient
-Paketverweis hinzu, und verwenden Sie die zugehörige öffentliche API, um die SQLClient-Instrumentierung anzupassen.
dotnet add package --prerelease OpenTelemetry.Instrumentation.SqlClient
builder.Services.AddOpenTelemetry().UseAzureMonitor().WithTracing(builder =>
{
builder.AddSqlClientInstrumentation(options =>
{
options.SetDbStatementForStoredProcedure = false;
});
});
Konfigurieren von Azure Monitor
Application Insights bietet über ApplicationInsightsServiceOptions
viele weitere Konfigurationsoptionen.
Application Insights-Einstellung | OpenTelemetry-Alternative |
---|---|
AddAutoCollectedMetricExtractor | N/V |
ApplicationVersion | Legen Sie „service.version“ für die Ressource fest. |
ConnectionString | Sehen Sie sich die Anleitung zum Konfigurieren der Verbindungszeichenfolge an. |
DependencyCollectionOptions | N/V. Um Abhängigkeiten anzupassen, überprüfen Sie die verfügbaren Konfigurationsoptionen für entsprechende Instrumentierungsbibliotheken. |
DeveloperMode | N/V |
EnableActiveTelemetryConfigurationSetup | N/V |
EnableAdaptiveSampling | N/V. Nur die Stichprobenentnahme mit festem Prozentsatz wird unterstützt. |
EnableAppServicesHeartbeatTelemetryModule | N/V |
EnableAuthenticationTrackingJavaScript | N/V |
EnableAzureInstanceMetadataTelemetryModule | N/V |
EnableDependencyTrackingTelemetryModule | Sehen Sie sich die Anleitung zum Filtern von Ablaufverfolgungen an. |
EnableDiagnosticsTelemetryModule | N/V |
EnableEventCounterCollectionModule | N/V |
EnableHeartbeat | N/V |
EnablePerformanceCounterCollectionModule | N/V |
EnableQuickPulseMetricStream | AzureMonitorOptions.EnableLiveMetrics |
EnableRequestTrackingTelemetryModule | Sehen Sie sich die Anleitung zum Filtern von Ablaufverfolgungen an. |
EndpointAddress | Verwenden Sie „ConnectionString“. |
InstrumentationKey | Verwenden Sie „ConnectionString“. |
RequestCollectionOptions | N/V. Sehen Sie sich die Optionen für „OpenTelemetry.Instrumentation.AspNetCore“ an. |
Entfernen benutzerdefinierter Konfigurationen
Die folgenden Szenarien sind optional und nur für erfahrene Benutzer bestimmt.
Wenn Sie über weitere Verweise auf
TelemetryClient
verfügen, die zur manuellen Erfassung von Telemetriedaten verwendet werden können, müssen diese entfernt werden.Wenn Sie benutzerdefinierte Filter oder Anreicherungen in Form eines benutzerdefinierten Elements vom Typ
TelemetryProcessor
oderTelemetryInitializer
hinzugefügt haben, müssen diese entfernt werden. Sie befinden sich inServiceCollection
.builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();
builder.Services.AddApplicationInsightsTelemetryProcessor<MyCustomTelemetryProcessor>();
Entfernen des JavaScript-Codeschnipsels
Wenn Sie den vom Application Insights .NET SDK bereitgestellten Codeschnipsel verwendet haben, muss dieser ebenfalls entfernt werden. Vollständige Codebeispiele, die zeigen, was entfernt werden muss, finden Sie im Leitfaden Aktivieren der clientseitigen Telemetrie für Webanwendungen.
Wenn Sie das JavaScript SDK zum Sammeln clientseitiger Telemetriedaten hinzugefügt haben, kann es ebenfalls entfernt werden, auch wenn es ohne .NET SDK weiterhin funktioniert. Vollständige Codebeispiele, die zeigen, was entfernt werden muss, finden Sie im Onboardingleitfaden für das JavaScript SDK.
Entfernen aller ggf. vorhandenen Visual Studio-Artefakte
Wenn Sie Visual Studio für das Onboarding in Application Insights verwendet haben, sind in Ihrem Projekt möglicherweise noch mehr Dateien übrig.
- Das Verzeichnis
Properties/ServiceDependencies
enthält unter Umständen einen Verweis auf Ihre Application Insights-Ressource.
- Das Verzeichnis
Tipp
Unsere Produktgruppe freut sich über Feedback zu dieser Dokumentation. Senden Sie Feedback an otel@microsoft.com, oder sehen Sie den Abschnitt Support an.
Häufig gestellte Fragen
Dieser Abschnitt richtet sich an Kunden, die Telemetrieinitialisierer oder -prozessoren verwenden oder benutzerdefinierten Code für die klassische Application Insights-API schreiben, um benutzerdefinierte Telemetriedaten zu erstellen.
Wie sieht die Zuordnung zwischen SDK-APIs und OpenTelemetry-Konzepten aus?
OpenTelemetry ist ein anbieterneutrales Einblickframework. Das OpenTelemetry SDK und die Bibliotheken enthalten keine Application Insights-APIs. Vor der Migration ist es wichtig, sich mit einigen der Konzepte von OpenTelemetry vertraut zu machen.
In Application Insights wurden sämtliche Telemetriedaten über einen einzelnen Telemetrieclient (
TelemetryClient
) und über eine einzelne Telemetriekonfiguration (TelemetryConfiguration
) verwaltet. In OpenTelemetry verfügt jedes der drei Telemetriesignale (Ablaufverfolgungen, Metriken und Protokolle) über eine eigene Konfiguration. Sie können Telemetriedaten manuell und ohne externe Bibliotheken über die .NET-Runtime erstellen. Weitere Informationen finden Sie in den .NET-Leitfäden zu verteilter Ablaufverfolgung, Metriken und Protokollierung.Von Application Insights wurde
TelemetryModules
verwendet, um automatisch Telemetriedaten für Ihre Anwendung zu sammeln. OpenTelemetry verwendet stattdessen Instrumentierungsbibliotheken, um Telemetriedaten von bestimmten Komponenten zu sammeln (z. B. AspNetCore für Anforderungen und HttpClient für Abhängigkeiten).Von Application Insights wurde
TelemetryInitializers
verwendet, um Telemetriedaten mit zusätzlichen Informationen anzureichern oder Eigenschaften außer Kraft zu setzen. Bei OpenTelemetry können Sie einen Prozessor schreiben, um ein bestimmtes Signal anzupassen. Darüber hinaus bieten viele OpenTelemetry-Instrumentierungsbibliotheken eineEnrich
-Methode zum Anpassen der Telemetriedaten, die von dieser spezifischen Komponente generiert werden.Von Application Insights wurde
TelemetryProcessors
verwendet, um Telemetriedaten zu filtern. Mit einem Prozessor von OpenTelemetry können auch Filterregeln auf ein bestimmtes Signal angewendet werden.
Wie sieht die Zuordnung zwischen Application Insights-Telemetrietypen und OpenTelemetry aus?
Diese Tabelle zeigt die Zuordnung zwischen Application Insights-Datentypen und OpenTelemetry-Konzepten sowie deren .NET-Implementierungen.
Azure Monitor-Tabelle | Application Insights-Datentyp | OpenTelemetry-Datentyp | .NET-Implementierung |
---|---|---|---|
customEvents | EventTelemetry | – | – |
customMetrics | MetricTelemetry | Metriken | System.Diagnostics.Metrics.Meter |
Abhängigkeiten | DependencyTelemetry | Spans (Client, intern, Consumer) | System.Diagnostics.Activity |
Ausnahmen | ExceptionTelemetry | Ausnahmen | System.Exception |
requests | RequestTelemetry | Spans (Server, Producer) | System.Diagnostics.Activity |
traces | TraceTelemetry | Protokolle | Microsoft.Extensions.Logging.ILogger |
Weitere Informationen finden Sie in folgenden Dokumenten:
- Grundlagen der Datensammlung von Azure Monitor Application Insights
- Application Insights-Telemetriedatenmodell
- OpenTelemetry-Konzepte
Wie sieht die Zuordnung zwischen Application Insights-Konzepten für die Stichprobenentnahme und OpenTelemetry aus?
In Application Insights standen mehrere Optionen zum Konfigurieren der Stichprobenentnahme zur Verfügung. Der Azure Monitor-Exporter und die Azure Monitor-Distribution bieten dagegen nur eine Stichprobenentnahme mit festem Prozentsatz. Stichproben können nur für Anforderungen und Abhängigkeiten (OpenTelemetry-Ablaufverfolgungen) entnommen werden.
Codebeispiele zur Konfiguration der Stichprobenentnahme finden Sie in unserem Leitfaden zum Aktivieren der Stichprobenentnahme.
Wie sieht die Zuordnung zwischen Telemetrieprozessoren bzw. -initialisierern und OpenTelemetry aus?
Verwenden Sie im Application Insights .NET SDK Telemetrieprozessoren, um Telemetriedaten zu filtern und zu ändern oder zu verwerfen. Verwenden Sie Telemetrieinitialisierer, um benutzerdefinierte Eigenschaften hinzuzufügen oder zu ändern. Weitere Informationen finden Sie in der Dokumentation zu Azure Monitor. OpenTelemetry ersetzt diese Konzepte durch Aktivitäts- oder Protokollprozessoren, die Telemetriedaten anreichern und filtern.
Filtern von Ablaufverfolgungen
Wenn Sie Telemetriedaten in OpenTelemetry filtern möchten, können Sie einen Aktivitätsprozessor implementieren. Dieses Beispiel entspricht dem Application Insights-Beispiel zum Filtern von Telemetriedaten aus der Dokumentation zu Azure Monitor. Das Beispiel zeigt, wo nicht erfolgreiche Abhängigkeitsaufrufe gefiltert werden.
using System.Diagnostics;
using OpenTelemetry;
internal sealed class SuccessfulDependencyFilterProcessor : BaseProcessor<Activity>
{
public override void OnEnd(Activity activity)
{
if (!OKtoSend(activity))
{
activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
}
}
private bool OKtoSend(Activity activity)
{
return activity.Kind == ActivityKind.Client && activity.Status == ActivityStatusCode.Ok;
}
}
Um diesen Prozessor zu verwenden, müssen Sie ein TracerProvider
-Element erstellen und den Prozessor vor AddAzureMonitorTraceExporter
hinzufügen.
using OpenTelemetry.Trace;
public static void Main()
{
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddProcessor(new SuccessfulDependencyFilterProcessor())
.AddAzureMonitorTraceExporter()
.Build();
}
Filtern von Protokollen
ILogger
-Implementierungen verfügen über einen integrierten Mechanismus zum Anwenden der Protokollfilterung.
Mit dieser Filterung können Sie die Protokolle steuern, die an die einzelnen registrierten Anbieter gesendet werden (einschließlich OpenTelemetryLoggerProvider
). „OpenTelemetry“ ist der Alias für OpenTelemetryLoggerProvider
, der beim Konfigurieren von Filterregeln verwendet wird.
Im folgenden Beispiel wird „Error“ als standardmäßiger Protokolliergrad (LogLevel
) und „Warning“ als minimaler Protokolliergrad (LogLevel
) für eine benutzerdefinierte Kategorie definiert.
Diese Regeln gelten wie definiert nur für OpenTelemetryLoggerProvider
.
builder.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Error);
builder.AddFilter<OpenTelemetryLoggerProvider>("MyProduct.MyLibrary.MyClass", LogLevel.Warning);
Weitere Informationen finden Sie in der OpenTelemetry .NET-Dokumentation zu Protokollen.
Hinzufügen benutzerdefinierter Eigenschaften zu Ablaufverfolgungen
In OpenTelemetry können Sie Aktivitätsprozessoren verwenden, um Telemetriedaten mit weiteren Eigenschaften anzureichern. Dies funktioniert ähnlich wie die Verwendung von Telemetrieinitialisierern in Application Insights zum Ändern von Telemetrieeigenschaften.
Standardmäßig kennzeichnet der Azure Monitor-Exporter jede HTTP-Anforderung mit einem Antwortcode ab 400 als nicht erfolgreich. Wenn Sie 400 jedoch als Erfolg behandeln möchten, können Sie einen anreichernden Aktivitätsprozessor hinzufügen, der den Erfolg für die Aktivität festlegt und ein Tag hinzufügt, um weitere Telemetrieeigenschaften einzuschließen. Dies ist vergleichbar mit dem Hinzufügen oder Ändern von Eigenschaften mithilfe eines Initialisierers in Application Insights, wie in der Dokumentation zu Azure Monitor beschrieben.
Hier ist ein Beispiel für das Hinzufügen von benutzerdefinierten Eigenschaften und die Außerkraftsetzung des Standardverhaltens für bestimmte Antwortcodes:
using System.Diagnostics;
using OpenTelemetry;
/// <summary>
/// Custom Processor that overrides the default behavior of treating response codes >= 400 as failed requests.
/// </summary>
internal class MyEnrichingProcessor : BaseProcessor<Activity>
{
public override void OnEnd(Activity activity)
{
if (activity.Kind == ActivityKind.Server)
{
int responseCode = GetResponseCode(activity);
if (responseCode >= 400 && responseCode < 500)
{
// If we set the Success property, the SDK won't change it
activity.SetStatus(ActivityStatusCode.Ok);
// Allow to filter these requests in the portal
activity.SetTag("Overridden400s", "true");
}
// else leave the SDK to set the Success property
}
}
private int GetResponseCode(Activity activity)
{
foreach (ref readonly var tag in activity.EnumerateTagObjects())
{
if (tag.Key == "http.response.status_code" && tag.Value is int value)
{
return value;
}
}
return 0;
}
}
Um diesen Prozessor zu verwenden, müssen Sie ein TracerProvider
-Element erstellen und den Prozessor vor AddAzureMonitorTraceExporter
hinzufügen.
using OpenTelemetry.Trace;
public static void Main()
{
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("Company.Product.Name")
.AddProcessor(new MyEnrichingProcessor())
.AddAzureMonitorTraceExporter()
.Build();
}
Wie kann ich Telemetriedaten mit OpenTelemetry manuell nachverfolgen?
Senden von Ablaufverfolgungen: Manuell
Ablaufverfolgungen in Application Insights werden als RequestTelemetry
und DependencyTelemetry
gespeichert. In OpenTelemetry werden Ablaufverfolgungen mithilfe der Activity
-Klasse als Span
modelliert.
OpenTelemetry .NET verwendet die Klassen ActivitySource
und Activity
für die Ablaufverfolgung. Diese sind Teil der .NET-Runtime. Dieser Ansatz ist unterscheidend, da die .NET-Implementierung die Ablaufverfolgungs-API direkt in die Runtime selbst integriert. Mit dem Paket System.Diagnostics.DiagnosticSource
können Entwickler ActivitySource
verwenden, um Activity
-Instanzen zu erstellen und zu verwalten. Mithilfe dieser Methode können Sie .NET-Anwendungen nahtlos Ablaufverfolgung hinzufügen, ohne sich auf externe Bibliotheken zu verlassen, und dabei die integrierten Funktionen des .NET-Ökosystems nutzen. Ausführlichere Informationen finden Sie in den exemplarischen Vorgehensweisen zur verteilten Ablaufverfolgungsinstrumentierung.
So migrieren Sie die manuelle Ablaufverfolgung:
Hinweis
In Application Insights können der Rollenname und die Rolleninstanz auf Telemetrieebene festgelegt werden. Mit dem Azure Monitor-Exporter ist jedoch keine Anpassung auf Telemetrieebene möglich. Der Rollenname und die Rolleninstanz werden aus der OpenTelemetry-Ressource extrahiert und auf alle Telemetriedaten angewendet. Weitere Informationen zum Festlegen des Cloudrollennamens und der Cloudrolleninstanz finden Sie hier.
DependencyTelemetry
DependencyTelemetry
von Application Insights wird verwendet, um ausgehende Anforderungen zu modellieren. So konvertieren Sie sie in OpenTelemetry:
Application Insights-Beispiel:
DependencyTelemetry dep = new DependencyTelemetry
{
Name = "DependencyName",
Data = "https://www.example.com/",
Type = "Http",
Target = "www.example.com",
Duration = TimeSpan.FromSeconds(10),
ResultCode = "500",
Success = false
};
dep.Context.Cloud.RoleName = "MyRole";
dep.Context.Cloud.RoleInstance = "MyRoleInstance";
dep.Properties["customprop1"] = "custom value1";
client.TrackDependency(dep);
OpenTelemetry-Beispiel:
var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
{ "service.name", "MyRole" },
{ "service.instance.id", "MyRoleInstance" }
};
var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource(activitySource.Name)
.AddAzureMonitorTraceExporter()
.Build();
// Emit traces
using (var activity = activitySource.StartActivity("DependencyName", ActivityKind.Client))
{
activity?.SetTag("url.full", "https://www.example.com/");
activity?.SetTag("server.address", "www.example.com");
activity?.SetTag("http.request.method", "GET");
activity?.SetTag("http.response.status_code", "500");
activity?.SetTag("customprop1", "custom value1");
activity?.SetStatus(ActivityStatusCode.Error);
activity?.SetEndTime(activity.StartTimeUtc.AddSeconds(10));
}
RequestTelemetry
RequestTelemetry
von Application Insights modelliert eingehende Anforderungen. So migrieren Sie sie zu OpenTelemetry:
Application Insights-Beispiel:
RequestTelemetry req = new RequestTelemetry
{
Name = "RequestName",
Url = new Uri("http://example.com"),
Duration = TimeSpan.FromSeconds(10),
ResponseCode = "200",
Success = true,
Properties = { ["customprop1"] = "custom value1" }
};
req.Context.Cloud.RoleName = "MyRole";
req.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackRequest(req);
OpenTelemetry-Beispiel:
var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
{ "service.name", "MyRole" },
{ "service.instance.id", "MyRoleInstance" }
};
var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource(activitySource.Name)
.AddAzureMonitorTraceExporter()
.Build();
// Emit traces
using (var activity = activitySource.StartActivity("RequestName", ActivityKind.Server))
{
activity?.SetTag("url.scheme", "https");
activity?.SetTag("server.address", "www.example.com");
activity?.SetTag("url.path", "/");
activity?.SetTag("http.response.status_code", "200");
activity?.SetTag("customprop1", "custom value1");
activity?.SetStatus(ActivityStatusCode.Ok);
}
Nachverfolgung benutzerdefinierter Vorgänge
In Application Insights können benutzerdefinierte Vorgänge mithilfe von StartOperation
- und StopOperation
-Methoden nachverfolgt werden. Verwenden Sie dazu ActivitySource
und Activity
in OpenTelemetry .NET. Für Vorgänge mit ActivityKind.Server
und ActivityKind.Consumer
generiert der Azure Monitor-Exporter RequestTelemetry
. Für ActivityKind.Client
, ActivityKind.Producer
und ActivityKind.Internal
wird DependencyTelemetry
generiert. Weitere Informationen zur Nachverfolgung benutzerdefinierter Vorgänge finden Sie in der Dokumentation zu Azure Monitor. Weitere Informationen zur Verwendung von ActivitySource
und Activity
in .NET finden Sie in den exemplarischen Vorgehensweisen zur verteilten Ablaufverfolgungsinstrumentierung von .NET.
Hier ist ein Beispiel für das Starten und Beenden einer Aktivität für benutzerdefinierte Vorgänge:
using System.Diagnostics;
using OpenTelemetry;
var activitySource = new ActivitySource("Company.Product.Name");
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource(activitySource.Name)
.AddAzureMonitorTraceExporter()
.Build();
// Start a new activity
using (var activity = activitySource.StartActivity("CustomOperation", ActivityKind.Server))
{
activity?.SetTag("customTag", "customValue");
// Perform your custom operation logic here
// No need to explicitly call Activity.Stop() because the using block automatically disposes the Activity object, which stops it.
}
Senden von Protokollen
Protokolle in Application Insights werden als TraceTelemetry
und ExceptionTelemetry
gespeichert.
TraceTelemetry
In OpenTelemetry ist die Protokollierung über die ILogger
-Schnittstelle integriert. So migrieren Sie TraceTelemetry
:
Application Insights-Beispiel:
TraceTelemetry traceTelemetry = new TraceTelemetry
{
Message = "hello from tomato 2.99",
SeverityLevel = SeverityLevel.Warning,
};
traceTelemetry.Context.Cloud.RoleName = "MyRole";
traceTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackTrace(traceTelemetry);
OpenTelemetry-Beispiel:
var resourceAttributes = new Dictionary<string, object>
{
{ "service.name", "MyRole" },
{ "service.instance.id", "MyRoleInstance" }
};
var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);
using var loggerFactory = LoggerFactory.Create(builder => builder
.AddOpenTelemetry(logging =>
{
logging.SetResourceBuilder(resourceBuilder);
logging.AddAzureMonitorLogExporter();
}));
// Create a new instance `ILogger` from the above LoggerFactory
var logger = loggerFactory.CreateLogger<Program>();
// Use the logger instance to write a new log
logger.FoodPrice("tomato", 2.99);
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Warning, "Hello from `{name}` `{price}`.")]
public static partial void FoodPrice(this ILogger logger, string name, double price);
}
ExceptionTelemetry
Application Insights verwendet ExceptionTelemetry
, um Ausnahmen zu protokollieren. So führen Sie die Migration zu OpenTelemetry durch:
Application Insights-Beispiel:
ExceptionTelemetry exceptionTelemetry = new ExceptionTelemetry(new Exception("Test exception"))
{
SeverityLevel = SeverityLevel.Error
};
exceptionTelemetry.Context.Cloud.RoleName = "MyRole";
exceptionTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
exceptionTelemetry.Properties["customprop1"] = "custom value1";
client.TrackException(exceptionTelemetry);
OpenTelemetry-Beispiel:
var resourceAttributes = new Dictionary<string, object>
{
{ "service.name", "MyRole" },
{ "service.instance.id", "MyRoleInstance" }
};
var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);
using var loggerFactory = LoggerFactory.Create(builder => builder
.AddOpenTelemetry(logging =>
{
logging.SetResourceBuilder(resourceBuilder);
logging.AddAzureMonitorLogExporter();
}));
// Create a new instance `ILogger` from the above LoggerFactory.
var logger = loggerFactory.CreateLogger<Program>();
try
{
// Simulate exception
throw new Exception("Test exception");
}
catch (Exception ex)
{
logger?.LogError(ex, "An error occurred");
}
Senden von Metriken
Metriken in Application Insights werden als MetricTelemetry
gespeichert. In OpenTelemetry werden Metriken als Meter
aus dem Paket System.Diagnostics.DiagnosticSource
modelliert.
Application Insights verfügt sowohl über Metrik-APIs ohne Vorabaggregation (TrackMetric()
) als auch über Metrik-APIs mit Vorabaggregation (GetMetric().TrackValue()
). Im Gegensatz zu OpenTelemetry gibt es in Application Insights kein Konzept für Instrumente. Application Insights verwendet die gleiche API für alle Metrikszenarien.
Bei OpenTelemetry müssen Benutzer dagegen zuerst das richtige Metrikinstrument auswählen (basierend auf der tatsächlichen Semantik der Metrik). Wenn beispielsweise etwas gezählt werden soll (z. B. die Anzahl empfangener Serveranforderungen oder Ähnliches), muss der OpenTelemetry-Zähler verwendet werden. Wenn verschiedene Quantile berechnet werden sollen (z. B. den P99-Wert der Serverwartezeit), muss das Instrument OpenTelemetry-Histogramm verwendet werden. Aufgrund dieses grundlegenden Unterschieds zwischen Application Insights und OpenTelemetry gibt es keinen direkten Vergleich zwischen ihnen.
Im Gegensatz zu Application Insights bietet OpenTelemetry keine integrierten Mechanismen zum Anreichern oder Filtern von Metriken. In Application Insights können Telemetrieprozessoren und -initialisierer verwendet werden, um Metriken zu ändern oder zu verwerfen. Diese Funktion ist in OpenTelemetry jedoch nicht verfügbar.
Darüber hinaus unterstützt OpenTelemetry das direkte Senden von Rohmetriken nicht, da es dort keine Entsprechung für die in Application Insights enthaltene TrackMetric()
-Funktion gibt.
Im Zuge der Migration von Application Insights zu OpenTelemetry müssen alle Verwendungen der Metrik-APIs von Application Insights durch die OpenTelemetry-API ersetzt werden. Dies erfordert Vertrautheit mit den verschiedenen OpenTelemetry-Instrumenten und deren Semantik.
Tipp
Das Histogramm ist am vielseitigsten und entspricht am ehesten der GetMetric().TrackValue()
-API von Application Insights. Sie können Metrik-APIs von Application Insights durch das Histogramm ersetzen, um das gleiche Ergebnis zu erzielen.
Weitere Telemetrietypen
CustomEvents
Wird in OpenTelemetry nicht unterstützt.
Application Insights-Beispiel:
TelemetryClient.TrackEvent()
AvailabilityTelemetry
Wird in OpenTelemetry nicht unterstützt.
Application Insights-Beispiel:
TelemetryClient.TrackAvailability()
PageViewTelemetry
Wird in OpenTelemetry nicht unterstützt.
Application Insights-Beispiel:
TelemetryClient.TrackPageView()
Kann ich Livemetriken für Konsolen- und Workerdienstanwendungen abrufen?
Wir empfehlen den Azure Monitor OpenTelemetry Exporter für Konsolen- und Workerdienstanwendungen, die keine Livemetriken enthalten.
Nächste Schritte
Tipp
Unsere Produktgruppe freut sich über Feedback zu dieser Dokumentation. Senden Sie Feedback an otel@microsoft.com, oder sehen Sie den Abschnitt Support an.
Unterstützung
- Bei Azure-Supportproblemen öffnen Sie ein Azure-Supportticket.
- Wenden Sie sich bei OpenTelemetry-Problemen direkt an die OpenTelemetry .NET-Community.
- Eine Liste der offenen Probleme im Zusammenhang mit Azure Monitor Exporter finden Sie auf der Issues-Seite auf GitHub.