Ce guide fournit des instructions sur l’intégration et la personnalisation de l’instrumentation OpenTelemetry (OTel) dans Azure Monitor Application Insights.
Pour en savoir plus sur les concepts OpenTelemetry, consultez la vue d’ensemble d’OpenTelemetry ou les questions fréquentes (FAQ).
Collecte automatique des données
Les distributions collectent automatiquement les données en intégrant les bibliothèques d’instrumentation OpenTelemetry.
Bibliothèques d’instrumentation incluses
Demandes
Dépendances
Journalisation
Pour réduire ou augmenter le nombre de journaux envoyés à Azure Monitor, configurez la journalisation pour définir le niveau de journal approprié ou appliquer des filtres. Par exemple, vous pouvez choisir d’envoyer uniquement les journaux Warning
et Error
à OpenTelemetry/Azure Monitor. OpenTelemetry ne contrôle pas le routage ni le filtrage des journaux. Votre configuration ILogger
prend ces décisions. Pour plus d’informations sur la configuration ILogger
, consultez Configurer la journalisation.
Pour plus d’informations sur ILogger
, consultez Journalisation dans C# et .NET et les exemples de code.
Azure Monitor Exporter n'inclut pas de bibliothèques d'instrumentation.
Vous pouvez collecter des dépendances à partir des kits de développement logiciel Azure (SDK) à l’aide de l’exemple de code suivant pour vous abonner manuellement à la source.
// Create an OpenTelemetry tracer provider builder.
// It is important to keep the TracerProvider instance active throughout the process lifetime.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
// The following line subscribes to dependencies emitted from Azure SDKs
.AddSource("Azure.*")
.AddAzureMonitorTraceExporter()
.AddHttpClientInstrumentation(o => o.FilterHttpRequestMessage = (_) =>
{
// Azure SDKs create their own client span before calling the service using HttpClient
// In this case, we would see two spans corresponding to the same operation
// 1) created by Azure SDK 2) created by HttpClient
// To prevent this duplication we are filtering the span from HttpClient
// as span from Azure SDK contains all relevant information needed.
var parentActivity = Activity.Current?.Parent;
if (parentActivity != null && parentActivity.Source.Name.Equals("Azure.Core.Http"))
{
return false;
}
return true;
})
.Build();
Pour réduire ou augmenter le nombre de journaux envoyés à Azure Monitor, configurez la journalisation pour définir le niveau de journal approprié ou appliquer des filtres. Par exemple, vous pouvez choisir d’envoyer uniquement les journaux Warning
et Error
à OpenTelemetry/Azure Monitor. OpenTelemetry ne contrôle pas le routage ni le filtrage des journaux. Votre configuration ILogger
prend ces décisions. Pour plus d’informations sur la configuration ILogger
, consultez Configurer la journalisation.
Demandes
- Consommateurs Java Message Service (JMS)
- Consommateurs Kafka
- Netty
- Quartz
- RabbitMQ
- Servlets
- Planification de Spring
Remarque
L'autoinstrumentation de Servlet et Netty couvre la plupart des services HTTP Java, notamment Java EE, Jakarta EE, Spring Boot, Quarkus et Micronaut
.
Dépendances (avec propagation de trace distribuée en aval)
- Apache HttpClient
- Apache HttpAsyncClient
- AsyncHttpClient
- Google HttpClient
- gRPC
- java.net.HttpURLConnection
- Java 11 HttpClient
- Client JAX-RS
- Jetty HttpClient
- JMS
- Kafka
- Client Netty
- OkHttp
- RabbitMQ
Dépendances (sans propagation de trace distribuée en aval)
- Prend en charge Cassandra
- Prend en charge la connectivité de base de données Java (JDBC)
- Prend en charge MongoDB (asynchrone et synchrone)
- Prend en charge Redis (Lettuce et Jedis)
Métriques
- Métriques Micrometer, notamment les métriques Spring Boot Actuator
- Métriques JMX (Java Management Extensions)
Journaux de bord
- Logback (y compris les propriétés MDC) ¹
- Log4j (y compris les propriétés MDC/Thread Context) ¹
- Journalisation JBoss (y compris les propriétés MDC) ¹
- java.util.logging ¹
Pour réduire ou augmenter le nombre de journaux collectés par Azure Monitor, commencez par définir le niveau de journalisation souhaité (tel que WARNING
ou ERROR
) dans la bibliothèque de journalisation de l’application.
Collection par défaut
Les données de télémétrie émises par les SDK Azure suivants sont automatiquement collectées par défaut :
[//]: # "Azure Cosmos DB 4.22.0+ due to https://github.com/Azure/azure-sdk-for-java/pull/25571"
[//]: # "the remaining above names and links scraped from https://azure.github.io/azure-sdk/releases/latest/java.html"
[//]: # "and version synched manually against the oldest version in maven central built on azure-core 1.14.0"
[//]: # ""
[//]: # "var table = document.querySelector('#tg-sb-content > div > table')"
[//]: # "var str = ''"
[//]: # "for (var i = 1, row; row = table.rows[i]; i++) {"
[//]: # " var name = row.cells[0].getElementsByTagName('div')[0].textContent.trim()"
[//]: # " var stableRow = row.cells[1]"
[//]: # " var versionBadge = stableRow.querySelector('.badge')"
[//]: # " if (!versionBadge) {"
[//]: # " continue"
[//]: # " }"
[//]: # " var version = versionBadge.textContent.trim()"
[//]: # " var link = stableRow.querySelectorAll('a')[2].href"
[//]: # " str += '* [' + name + '](' + link + ') ' + version + '\n'"
[//]: # "}"
[//]: # "console.log(str)"
Requêtes pour les applications natives Spring Boot
- Spring Web
- Spring Web MVC (Model-View-Controller)
- Spring WebFlux
Dépendances pour les applications natives Spring Boot
Métriques
Journaux d’activité pour les applications natives Spring Boot
Pour réduire ou augmenter le nombre de journaux collectés par Azure Monitor, commencez par définir le niveau de journalisation souhaité (tel que WARNING
ou ERROR
) dans la bibliothèque de journalisation de l’application.
Pour les applications natives Quartz, consultez la documentation Quarkus.
Les bibliothèques d’instrumentation OpenTelemetry suivantes sont incluses dans la Distribution Azure Monitor Application Insights. Pour plus d’informations, consultez Kit de développement logiciel (SDK) Azure pour JavaScript.
Demandes
Dépendances
Journaux de bord
Pour réduire ou augmenter le nombre de journaux collectés par Azure Monitor, commencez par définir le niveau de journalisation souhaité (tel que WARNING
ou ERROR
) dans la bibliothèque de journalisation de l’application.
Les instrumentations peuvent être configurées à l’aide de AzureMonitorOpenTelemetryOptions
:
// Import Azure Monitor OpenTelemetry
const { useAzureMonitor, AzureMonitorOpenTelemetryOptions } = require("@azure/monitor-opentelemetry");
// Import OpenTelemetry HTTP Instrumentation to get config type
const { HttpInstrumentationConfig } = require("@azure/monitor-opentelemetry");
// Import HTTP to get type
const { IncomingMessage } = require("http");
// Specific Instrumentation configs could be added
const httpInstrumentationConfig: HttpInstrumentationConfig = {
ignoreIncomingRequestHook: (request: IncomingMessage) => {
return false; //Return true if you want to ignore a specific request
},
enabled: true
};
// Instrumentations configuration
const options: AzureMonitorOpenTelemetryOptions = {
instrumentationOptions: {
http: httpInstrumentationConfig,
azureSdk: { enabled: true },
mongoDb: { enabled: true },
mySql: { enabled: true },
postgreSql: { enabled: true },
redis: { enabled: true },
redis4: { enabled: true },
}
};
// Enable Azure Monitor integration
useAzureMonitor(options);
Demandes
Dépendances
Journaux de bord
Pour réduire ou augmenter le nombre de journaux collectés par Azure Monitor, commencez par définir le niveau de journalisation souhaité (tel que WARNING
ou ERROR
) dans la bibliothèque de journalisation de l’application.
Vous trouverez des exemples d’utilisation de la bibliothèque de journalisation Python sur GitHub.
Les données de télémétrie émises par les kits de développement logiciel (SDK) Azure sont collectées automatiquement par défaut.
Notes de bas de page
- ¹ : prend en charge la création de rapports automatiques d’exceptions non gérées/non capturées
- ² : prend en charge les métriques OpenTelemetry
Conseil
Toutes les métriques OpenTelemetry collectées automatiquement à partir de bibliothèques d’instrumentation ou manuellement collectées à partir du codage personnalisé sont actuellement considérées comme des « métriques personnalisées » d’Application Insights à des fins de facturation. Plus d’informations
Vous pouvez collecter automatiquement davantage de données lorsque vous incluez des bibliothèques d’instrumentation de la communauté OpenTelemetry.
Attention
Nous ne prenons pas en charge et ne garantissons la qualité des bibliothèques d’instrumentation de la communauté. Pour en suggérer une pour notre distribution, publiez ou votez dans notre communauté de feedback. N’oubliez pas que certaines sont basées sur des spécifications OpenTelemetry expérimentales et peuvent introduire des changements cassants futurs.
Pour ajouter une bibliothèque de communauté, utilisez les méthodes ConfigureOpenTelemetryMeterProvider
ou ConfigureOpenTelemetryTracerProvider
, après avoir ajouté le package NuGet pour la bibliothèque.
L'exemple suivant montre comment l'instrumentation du temps d'exécution peut être ajoutée pour collecter des données supplémentaires :
dotnet add package OpenTelemetry.Instrumentation.Runtime
// Create a new ASP.NET Core web application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry meter provider to add runtime instrumentation.
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddRuntimeInstrumentation());
// Add the Azure Monitor telemetry service to the application.
// This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core web application.
var app = builder.Build();
// Start the ASP.NET Core web application.
app.Run();
L'exemple suivant montre comment l'instrumentation du temps d'exécution peut être ajoutée pour collecter des données supplémentaires :
// Create a new OpenTelemetry meter provider and add runtime instrumentation and the Azure Monitor metric exporter.
// It is important to keep the MetricsProvider instance active throughout the process lifetime.
var metricsProvider = Sdk.CreateMeterProviderBuilder()
.AddRuntimeInstrumentation()
.AddAzureMonitorMetricExporter();
Vous ne pouvez pas étendre la Distribution Java avec des bibliothèques d’instrumentation de la communauté. Pour nous demander d'inclure une autre bibliothèque d'instrumentation, ouvrez un problème sur notre page GitHub. Vous trouverez un lien vers notre page GitHub dans Étapes suivantes.
Vous ne pouvez pas utiliser de bibliothèques d’instrumentation communautaires avec des applications natives GraalVM Java.
D’autres instrumentations OpenTelemetry sont disponibles ici et peuvent être ajoutées à l’aide de TraceHandler dans ApplicationInsightsClient :
// Import the Azure Monitor OpenTelemetry plugin and OpenTelemetry API
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { metrics, trace, ProxyTracerProvider } = require("@opentelemetry/api");
// Import the OpenTelemetry instrumentation registration function and Express instrumentation
const { registerInstrumentations } = require( "@opentelemetry/instrumentation");
const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');
// Get the OpenTelemetry tracer provider and meter provider
const tracerProvider = (trace.getTracerProvider() as ProxyTracerProvider).getDelegate();
const meterProvider = metrics.getMeterProvider();
// Enable Azure Monitor integration
useAzureMonitor();
// Register the Express instrumentation
registerInstrumentations({
// List of instrumentations to register
instrumentations: [
new ExpressInstrumentation(), // Express instrumentation
],
// OpenTelemetry tracer provider
tracerProvider: tracerProvider,
// OpenTelemetry meter provider
meterProvider: meterProvider
});
Pour ajouter une bibliothèque d’instrumentation de la communauté (non prise en charge officiellement/incluse dans la distribution Azure Monitor), vous pouvez instrumenter directement avec les instrumentations. La liste des bibliothèques d’instrumentation de la communauté est disponible ici.
Remarque
L’instrumentation manuelle d’une bibliothèque d’instrumentation prise en charge avec instrument()
et la distribution configure_azure_monitor()
n’est pas recommandée. Ce n’est pas un scénario pris en charge et vous pouvez obtenir un comportement non souhaité pour vos données de télémétrie.
# Import the `configure_azure_monitor()`, `SQLAlchemyInstrumentor`, `create_engine`, and `text` functions from the appropriate packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
from sqlalchemy import create_engine, text
# Configure OpenTelemetry to use Azure Monitor.
configure_azure_monitor()
# Create a SQLAlchemy engine.
engine = create_engine("sqlite:///:memory:")
# SQLAlchemy instrumentation is not officially supported by this package, however, you can use the OpenTelemetry `instrument()` method manually in conjunction with `configure_azure_monitor()`.
SQLAlchemyInstrumentor().instrument(
engine=engine,
)
# Database calls using the SQLAlchemy library will be automatically captured.
with engine.connect() as conn:
result = conn.execute(text("select 'hello world'"))
print(result.all())
Collecter des données de télémétrie personnalisées
Cette section explique comment collecter des données de télémétrie personnalisées à partir de votre application.
Selon votre langage et votre type de signal, il existe différentes façons de collecter des données de télémétrie personnalisées, notamment :
- API OpenTelemetry
- Bibliothèques spécifiques au langage pour les métriques et la journalisation
- API classique Application Insights
Le tableau suivant représente les types de télémétrie personnalisés actuellement pris en charge :
Langage |
Événements personnalisés |
Métriques personnalisées |
Les dépendances |
Exceptions |
Affichages de pages |
Demandes |
Traces |
ASP.NET Core |
|
|
|
|
|
|
|
API OpenTelemetry |
|
Oui |
Oui |
Oui |
|
Oui |
|
ILogger Interface de Programmation d'Applications (API) |
|
|
|
|
|
|
Oui |
API IA classique |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Java |
|
|
|
|
|
|
|
API OpenTelemetry |
|
Oui |
Oui |
Oui |
|
Oui |
|
Logback, Log4j , JUL |
|
|
|
Oui |
|
|
Oui |
Mesures Micrometer |
|
Oui |
|
|
|
|
|
API IA classique |
Oui |
Oui |
Oui |
Oui |
Oui |
Oui |
Oui |
|
|
|
|
|
|
|
|
Node.JS |
|
|
|
|
|
|
|
API OpenTelemetry |
|
Oui |
Oui |
Oui |
|
Oui |
|
|
|
|
|
|
|
|
|
Python |
|
|
|
|
|
|
|
API OpenTelemetry |
|
Oui |
Oui |
Oui |
|
Oui |
|
Module de journalisation Python |
|
|
|
|
|
|
Oui |
Extension d’événements |
Oui |
|
|
|
|
|
Oui |
Remarque
Application Insights Java 3.x et Application Insights Node.js 3.x collectent les données de télémétrie à partir de l’API Classique Application Insights. Ce comportement simplifie les mises à niveau et prend temporairement en charge les données de télémétrie personnalisées jusqu’à ce que l’API OpenTelemetry inclut tous les types de données de télémétrie personnalisés.
Ajouter des métriques personnalisées
Dans ce contexte, le terme de métriques personnalisées fait référence à l’instrumentation manuelle de votre code pour collecter des métriques supplémentaires au-delà de ce que les bibliothèques d’instrumentation OpenTelemetry collectent automatiquement.
L’API OpenTelemetry propose six « instruments » de métriques pour couvrir différents scénarios de métriques et vous devez choisir le « Type d’agrégation » correct lors de la visualisation des métriques dans Metrics Explorer. Cette exigence est vraie lors de l’utilisation de l’API de métrique OpenTelemetry pour envoyer des métriques et lors de l’utilisation d’une bibliothèque d’instrumentation.
Le tableau suivant présente les types d’agrégation recommandés pour chacun des instruments de métriques OpenTelemetry.
Instrumentation OpenTelemetry |
Type d’agrégation Azure Monitor |
Compteur |
Somme |
Compteur asynchrone |
Somme |
Histogramme |
Min, Max, Moyenne, Somme et Nombre |
Jauge asynchrone |
Moyenne |
UpDownCounter |
Somme |
UpDownCounter asynchrone |
Somme |
Attention
Les autres types d’agrégation ne sont pas significatifs dans la plupart des cas.
La Spécification OpenTelemetry décrit les instruments et fournit des exemples de cas où vous pouvez utiliser chacun d’eux.
Conseil
L’histogramme est l’équivalent le plus versatile et le plus proche de l’API classique Application Insights GetMetric. Azure Monitor aplatit actuellement l’instrumentation de l’histogramme dans nos cinq types d’agrégation pris en charge. La prise en charge des centiles est en cours. Bien que moins polyvalent, d’autres instruments OpenTelemetry ont un moindre effet sur les performances de votre application.
Exemple d’histogramme
Le start-up de l’application doit s’abonner à un compteur par nom :
// Create a new ASP.NET Core web application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry meter provider to add a meter named "OTel.AzureMonitor.Demo".
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddMeter("OTel.AzureMonitor.Demo"));
// Add the Azure Monitor telemetry service to the application.
// This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core web application.
var app = builder.Build();
// Start the ASP.NET Core web application.
app.Run();
Meter
doit être initialisé à l’aide de ce même nom :
// Create a new meter named "OTel.AzureMonitor.Demo".
var meter = new Meter("OTel.AzureMonitor.Demo");
// Create a new histogram metric named "FruitSalePrice".
Histogram<long> myFruitSalePrice = meter.CreateHistogram<long>("FruitSalePrice");
// Create a new Random object.
var rand = new Random();
// Record a few random sale prices for apples and lemons, with different colors.
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
{
// Create a static readonly Meter object named "OTel.AzureMonitor.Demo".
// This meter will be used to track metrics about the application.
private static readonly Meter meter = new("OTel.AzureMonitor.Demo");
public static void Main()
{
// Create a new MeterProvider object using the OpenTelemetry SDK.
// The MeterProvider object is responsible for managing meters and sending
// metric data to exporters.
// It is important to keep the MetricsProvider instance active
// throughout the process lifetime.
//
// The MeterProviderBuilder is configured to add a meter named
// "OTel.AzureMonitor.Demo" and an Azure Monitor metric exporter.
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("OTel.AzureMonitor.Demo")
.AddAzureMonitorMetricExporter()
.Build();
// Create a new Histogram metric named "FruitSalePrice".
// This metric will track the distribution of fruit sale prices.
Histogram<long> myFruitSalePrice = meter.CreateHistogram<long>("FruitSalePrice");
// Create a new Random object. This object will be used to generate random sale prices.
var rand = new Random();
// Record a few random sale prices for apples and lemons, with different colors.
// Each record includes a timestamp, a value, and a set of attributes.
// The attributes can be used to filter and analyze the metric data.
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"));
// Display a message to the user and wait for them to press Enter.
// This allows the user to see the message and the console before the
// application exits.
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);
}
}
Injecter OpenTelemetry
:
Créer un histogramme :
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.Meter;
Meter meter = openTelemetry.getMeter("OTEL.AzureMonitor.Demo");
DoubleHistogram histogram = meter.histogramBuilder("histogram").build();
histogram.record(1.0);
histogram.record(100.0);
histogram.record(30.0);
// Import the Azure Monitor OpenTelemetry plugin and OpenTelemetry API
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { metrics } = require("@opentelemetry/api");
// Enable Azure Monitor integration
useAzureMonitor();
// Get the meter for the "testMeter" namespace
const meter = metrics.getMeter("testMeter");
// Create a histogram metric
let histogram = meter.createHistogram("histogram");
// Record values to the histogram metric with different tags
histogram.record(1, { "testKey": "testValue" });
histogram.record(30, { "testKey": "testValue2" });
histogram.record(100, { "testKey2": "testValue" });
# Import the `configure_azure_monitor()` and `metrics` functions from the appropriate packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import metrics
import os
# Configure OpenTelemetry to use Azure Monitor with the specified connection string.
# Replace `<your-connection-string>` with the connection string to your Azure Monitor Application Insights resource.
configure_azure_monitor(
connection_string="<your-connection-string>",
)
# Opt in to allow grouping of your metrics via a custom metrics namespace in app insights metrics explorer.
# Specify the namespace name using get_meter("namespace-name")
os.environ["APPLICATIONINSIGHTS_METRIC_NAMESPACE_OPT_IN"] = "true"
# Get a meter provider and a meter with the name "otel_azure_monitor_histogram_demo".
meter = metrics.get_meter_provider().get_meter("otel_azure_monitor_histogram_demo")
# Record three values to the histogram.
histogram = meter.create_histogram("histogram")
histogram.record(1.0, {"test_key": "test_value"})
histogram.record(100.0, {"test_key2": "test_value"})
histogram.record(30.0, {"test_key": "test_value2"})
# Wait for background execution.
input()
Contre-exemple
Le start-up de l’application doit s’abonner à un compteur par nom :
// Create a new ASP.NET Core web application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry meter provider to add a meter named "OTel.AzureMonitor.Demo".
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddMeter("OTel.AzureMonitor.Demo"));
// Add the Azure Monitor telemetry service to the application.
// This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core web application.
var app = builder.Build();
// Start the ASP.NET Core web application.
app.Run();
Meter
doit être initialisé à l’aide de ce même nom :
// Create a new meter named "OTel.AzureMonitor.Demo".
var meter = new Meter("OTel.AzureMonitor.Demo");
// Create a new counter metric named "MyFruitCounter".
Counter<long> myFruitCounter = meter.CreateCounter<long>("MyFruitCounter");
// Record the number of fruits sold, grouped by name and color.
myFruitCounter.Add(1, new("name", "apple"), new("color", "red"));
myFruitCounter.Add(2, new("name", "lemon"), new("color", "yellow"));
myFruitCounter.Add(1, new("name", "lemon"), new("color", "yellow"));
myFruitCounter.Add(2, new("name", "apple"), new("color", "green"));
myFruitCounter.Add(5, new("name", "apple"), new("color", "red"));
myFruitCounter.Add(4, new("name", "lemon"), new("color", "yellow"));
public class Program
{
// Create a static readonly Meter object named "OTel.AzureMonitor.Demo".
// This meter will be used to track metrics about the application.
private static readonly Meter meter = new("OTel.AzureMonitor.Demo");
public static void Main()
{
// Create a new MeterProvider object using the OpenTelemetry SDK.
// The MeterProvider object is responsible for managing meters and sending
// metric data to exporters.
// It is important to keep the MetricsProvider instance active
// throughout the process lifetime.
//
// The MeterProviderBuilder is configured to add a meter named
// "OTel.AzureMonitor.Demo" and an Azure Monitor metric exporter.
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("OTel.AzureMonitor.Demo")
.AddAzureMonitorMetricExporter()
.Build();
// Create a new counter metric named "MyFruitCounter".
// This metric will track the number of fruits sold.
Counter<long> myFruitCounter = meter.CreateCounter<long>("MyFruitCounter");
// Record the number of fruits sold, grouped by name and color.
myFruitCounter.Add(1, new("name", "apple"), new("color", "red"));
myFruitCounter.Add(2, new("name", "lemon"), new("color", "yellow"));
myFruitCounter.Add(1, new("name", "lemon"), new("color", "yellow"));
myFruitCounter.Add(2, new("name", "apple"), new("color", "green"));
myFruitCounter.Add(5, new("name", "apple"), new("color", "red"));
myFruitCounter.Add(4, new("name", "lemon"), new("color", "yellow"));
// Display a message to the user and wait for them to press Enter.
// This allows the user to see the message and the console before the
// application exits.
System.Console.WriteLine("Press Enter key to exit.");
System.Console.ReadLine();
}
}
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
public class Program {
public static void main(String[] args) {
Meter meter = GlobalOpenTelemetry.getMeter("OTEL.AzureMonitor.Demo");
LongCounter myFruitCounter = meter
.counterBuilder("MyFruitCounter")
.build();
myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "green"));
myFruitCounter.add(5, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
myFruitCounter.add(4, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
}
}
Injecter OpenTelemetry
:
Créer le compteur :
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
Meter meter = openTelemetry.getMeter("OTEL.AzureMonitor.Demo");
LongCounter myFruitCounter = meter.counterBuilder("MyFruitCounter")
.build();
myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
myFruitCounter.add(1, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
myFruitCounter.add(2, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "green"));
myFruitCounter.add(5, Attributes.of(AttributeKey.stringKey("name"), "apple", AttributeKey.stringKey("color"), "red"));
myFruitCounter.add(4, Attributes.of(AttributeKey.stringKey("name"), "lemon", AttributeKey.stringKey("color"), "yellow"));
// Import the Azure Monitor OpenTelemetry plugin and OpenTelemetry API
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { metrics } = require("@opentelemetry/api");
// Enable Azure Monitor integration
useAzureMonitor();
// Get the meter for the "testMeter" namespace
const meter = metrics.getMeter("testMeter");
// Create a counter metric
let counter = meter.createCounter("counter");
// Add values to the counter metric with different tags
counter.add(1, { "testKey": "testValue" });
counter.add(5, { "testKey2": "testValue" });
counter.add(3, { "testKey": "testValue2" });
# Import the `configure_azure_monitor()` and `metrics` functions from the appropriate packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import metrics
import os
# Configure OpenTelemetry to use Azure Monitor with the specified connection string.
# Replace `<your-connection-string>` with the connection string to your Azure Monitor Application Insights resource.
configure_azure_monitor(
connection_string="<your-connection-string>",
)
# Opt in to allow grouping of your metrics via a custom metrics namespace in app insights metrics explorer.
# Specify the namespace name using get_meter("namespace-name")
os.environ["APPLICATIONINSIGHTS_METRIC_NAMESPACE_OPT_IN"] = "true"
# Get a meter provider and a meter with the name "otel_azure_monitor_counter_demo".
meter = metrics.get_meter_provider().get_meter("otel_azure_monitor_counter_demo")
# Create a counter metric with the name "counter".
counter = meter.create_counter("counter")
# Add three values to the counter.
# The first argument to the `add()` method is the value to add.
# The second argument is a dictionary of dimensions.
# Dimensions are used to group related metrics together.
counter.add(1.0, {"test_key": "test_value"})
counter.add(5.0, {"test_key2": "test_value"})
counter.add(3.0, {"test_key": "test_value2"})
# Wait for background execution.
input()
Exemple de jauge
Le start-up de l’application doit s’abonner à un compteur par nom :
// Create a new ASP.NET Core web application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry meter provider to add a meter named "OTel.AzureMonitor.Demo".
builder.Services.ConfigureOpenTelemetryMeterProvider((sp, builder) => builder.AddMeter("OTel.AzureMonitor.Demo"));
// Add the Azure Monitor telemetry service to the application.
// This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core web application.
var app = builder.Build();
// Start the ASP.NET Core web application.
app.Run();
Meter
doit être initialisé à l’aide de ce même nom :
// Get the current process.
var process = Process.GetCurrentProcess();
// Create a new meter named "OTel.AzureMonitor.Demo".
var meter = new Meter("OTel.AzureMonitor.Demo");
// Create a new observable gauge metric named "Thread.State".
// This metric will track the state of each thread in the current process.
ObservableGauge<int> myObservableGauge = meter.CreateObservableGauge("Thread.State", () => GetThreadState(process));
private static IEnumerable<Measurement<int>> GetThreadState(Process process)
{
// Iterate over all threads in the current process.
foreach (ProcessThread thread in process.Threads)
{
// Create a measurement for each thread, including the thread state, process ID, and thread ID.
yield return new((int)thread.ThreadState, new("ProcessId", process.Id), new("ThreadId", thread.Id));
}
}
public class Program
{
// Create a static readonly Meter object named "OTel.AzureMonitor.Demo".
// This meter will be used to track metrics about the application.
private static readonly Meter meter = new("OTel.AzureMonitor.Demo");
public static void Main()
{
// Create a new MeterProvider object using the OpenTelemetry SDK.
// The MeterProvider object is responsible for managing meters and sending
// metric data to exporters.
// It is important to keep the MetricsProvider instance active
// throughout the process lifetime.
//
// The MeterProviderBuilder is configured to add a meter named
// "OTel.AzureMonitor.Demo" and an Azure Monitor metric exporter.
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("OTel.AzureMonitor.Demo")
.AddAzureMonitorMetricExporter()
.Build();
// Get the current process.
var process = Process.GetCurrentProcess();
// Create a new observable gauge metric named "Thread.State".
// This metric will track the state of each thread in the current process.
ObservableGauge<int> myObservableGauge = meter.CreateObservableGauge("Thread.State", () => GetThreadState(process));
// Display a message to the user and wait for them to press Enter.
// This allows the user to see the message and the console before the
// application exits.
System.Console.WriteLine("Press Enter key to exit.");
System.Console.ReadLine();
}
private static IEnumerable<Measurement<int>> GetThreadState(Process process)
{
// Iterate over all threads in the current process.
foreach (ProcessThread thread in process.Threads)
{
// Create a measurement for each thread, including the thread state, process ID, and thread ID.
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"));
});
}
}
Injecter OpenTelemetry
:
Créer une jauge :
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter;
Meter meter = openTelemetry.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"));
});
// Import the useAzureMonitor function and the metrics module from the @azure/monitor-opentelemetry and @opentelemetry/api packages, respectively.
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { metrics } = require("@opentelemetry/api");
// Enable Azure Monitor integration.
useAzureMonitor();
// Get the meter for the "testMeter" meter name.
const meter = metrics.getMeter("testMeter");
// Create an observable gauge metric with the name "gauge".
let gauge = meter.createObservableGauge("gauge");
// Add a callback to the gauge metric. The callback will be invoked periodically to generate a new value for the gauge metric.
gauge.addCallback((observableResult: ObservableResult) => {
// Generate a random number between 0 and 99.
let randomNumber = Math.floor(Math.random() * 100);
// Set the value of the gauge metric to the random number.
observableResult.observe(randomNumber, {"testKey": "testValue"});
});
# Import the necessary packages.
from typing import Iterable
import os
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import metrics
from opentelemetry.metrics import CallbackOptions, Observation
# Configure OpenTelemetry to use Azure Monitor with the specified connection string.
# Replace `<your-connection-string>` with the connection string to your Azure Monitor Application Insights resource.
configure_azure_monitor(
connection_string="<your-connection-string>",
)
# Opt in to allow grouping of your metrics via a custom metrics namespace in app insights metrics explorer.
# Specify the namespace name using get_meter("namespace-name")
os.environ["APPLICATIONINSIGHTS_METRIC_NAMESPACE_OPT_IN"] = "true"
# Get a meter provider and a meter with the name "otel_azure_monitor_gauge_demo".
meter = metrics.get_meter_provider().get_meter("otel_azure_monitor_gauge_demo")
# Define two observable gauge generators.
# The first generator yields a single observation with the value 9.
# The second generator yields a sequence of 10 observations with the value 9 and a different dimension value for each observation.
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
# Create two observable gauges using the defined generators.
gauge = meter.create_observable_gauge("gauge", [observable_gauge_generator])
gauge2 = meter.create_observable_gauge("gauge2", [observable_gauge_sequence])
# Wait for background execution.
input()
Ajoutez des exceptions personnalisées
Sélectionnez des bibliothèques d’instrumentation qui signalent automatiquement les exceptions à Application Insights.
Toutefois, vous pourriez signaler manuellement des exceptions au-delà du rapport des bibliothèques d’instrumentation.
Par exemple, les exceptions interceptées par votre code ne sont généralement pas signalées. Vous pourriez les signaler pour attirer l’attention sur les expériences pertinentes, notamment la section relative aux défaillances et les vues des transactions de bout en bout.
Pour enregistrer une exception à l’aide d’une activité :
// Start a new activity named "ExceptionExample".
using (var activity = activitySource.StartActivity("ExceptionExample"))
{
// Try to execute some code.
try
{
throw new Exception("Test exception");
}
// If an exception is thrown, catch it and set the activity status to "Error".
catch (Exception ex)
{
activity?.SetStatus(ActivityStatusCode.Error);
activity?.RecordException(ex);
}
}
Pour enregistrer une exception à l’aide de ILogger
:
// Create a logger using the logger factory. The logger category name is used to filter and route log messages.
var logger = loggerFactory.CreateLogger(logCategoryName);
// Try to execute some code.
try
{
throw new Exception("Test Exception");
}
catch (Exception ex)
{
// Log an error message with the exception. The log level is set to "Error" and the event ID is set to 0.
// The log message includes a template and a parameter. The template will be replaced with the value of the parameter when the log message is written.
logger.Log(
logLevel: LogLevel.Error,
eventId: 0,
exception: ex,
message: "Hello {name}.",
args: new object[] { "World" });
}
Pour enregistrer une exception à l’aide d’une activité :
// Start a new activity named "ExceptionExample".
using (var activity = activitySource.StartActivity("ExceptionExample"))
{
// Try to execute some code.
try
{
throw new Exception("Test exception");
}
// If an exception is thrown, catch it and set the activity status to "Error".
catch (Exception ex)
{
activity?.SetStatus(ActivityStatusCode.Error);
activity?.RecordException(ex);
}
}
Pour enregistrer une exception à l’aide de ILogger
:
// Create a logger using the logger factory. The logger category name is used to filter and route log messages.
var logger = loggerFactory.CreateLogger("ExceptionExample");
try
{
// Try to execute some code.
throw new Exception("Test Exception");
}
catch (Exception ex)
{
// Log an error message with the exception. The log level is set to "Error" and the event ID is set to 0.
// The log message includes a template and a parameter. The template will be replaced with the value of the parameter when the log message is written.
logger.Log(
logLevel: LogLevel.Error,
eventId: 0,
exception: ex,
message: "Hello {name}.",
args: new object[] { "World" });
}
Vous pouvez utiliser opentelemetry-api
pour mettre à jour l’état d’une étendue et d’enregistrer des exceptions.
Ajoutez opentelemetry-api-1.0.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Définissez l’état sur error
et enregistrez une exception dans votre code :
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
Span span = Span.current();
span.setStatus(StatusCode.ERROR, "errorMessage");
span.recordException(e);
Définissez l’état sur error
et enregistrez une exception dans votre code :
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
Span span = Span.current();
span.setStatus(StatusCode.ERROR, "errorMessage");
span.recordException(e);
Le SDK Node.js exporte les exceptions enregistrées manuellement sur la base des étendues vers Application Insights uniquement si elles sont enregistrées sur une étendue de niveau supérieur ou une étendue enfant d’une étendue distante ou interne.
// Import the Azure Monitor OpenTelemetry plugin and OpenTelemetry API
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { trace } = require("@opentelemetry/api");
// Enable Azure Monitor integration
useAzureMonitor();
// Get the tracer for the "testTracer" namespace
const tracer = trace.getTracer("testTracer");
// Start a span with the name "hello"
let span = tracer.startSpan("hello");
// Try to throw an error
try {
throw new Error("Test Error");
}
// Catch the error and record it to the span
catch(error){
span.recordException(error);
}
Le Kit de développement logiciel (SDK) Python OpenTelemetry est implémenté de telle sorte que les exceptions levées soient capturées et enregistrées automatiquement. Consultez l’exemple de code suivant pour obtenir un exemple de ce comportement :
# Import the necessary packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
# Configure OpenTelemetry to use Azure Monitor with the specified connection string.
# Replace `<your-connection-string>` with the connection string to your Azure Monitor Application Insights resource.
configure_azure_monitor(
connection_string="<your-connection-string>",
)
# Get a tracer for the current module.
tracer = trace.get_tracer("otel_azure_monitor_exception_demo")
# Exception events
try:
# Start a new span with the name "hello".
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")
Si vous souhaitez enregistrer manuellement des exceptions, vous pouvez désactiver cette option dans le gestionnaire de contexte et directement utiliser record_exception()
comme dans l’exemple suivant :
...
# Start a new span with the name "hello" and disable exception recording.
with tracer.start_as_current_span("hello", record_exception=False) as span:
try:
# Raise an exception.
raise Exception("Custom exception message.")
except Exception as ex:
# Manually record exception
span.record_exception(ex)
...
Ajouter des plages personnalisées
Vous pourriez ajouter une période personnalisée dans deux cas. Tout d’abord, lorsqu’une requête de dépendance n’est pas encore collectée par une bibliothèque d’instrumentation. Deuxièmement, lorsque vous souhaitez modéliser un processus d’application en tant qu’étendue sur la vue transactionnelle de bout en bout.
Remarque
Les classes Activity
et ActivitySource
de l’espace de noms System.Diagnostics
représentent les concepts OpenTelemetry de Span
et Tracer
respectivement. Vous créez ActivitySource
directement à l’aide de son constructeur à la place de TracerProvider
. Chaque classe ActivitySource
doit être explicitement connectée àTracerProvider
à l’aide de AddSource()
. Cela est dû au fait que les parties de l’API de suivi OpenTelemetry sont incorporées directement dans le runtime .NET. Pour plus d’informations, consultez Présentation de l’API de suivi .NET OpenTelemetry.
// Define an activity source named "ActivitySourceName". This activity source will be used to create activities for all requests to the application.
internal static readonly ActivitySource activitySource = new("ActivitySourceName");
// Create an ASP.NET Core application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry tracer provider to add a source named "ActivitySourceName". This will ensure that all activities created by the activity source are traced.
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddSource("ActivitySourceName"));
// Add the Azure Monitor telemetry service to the application. This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core application.
var app = builder.Build();
// Map a GET request to the root path ("/") to the specified action.
app.MapGet("/", () =>
{
// Start a new activity named "CustomActivity". This activity will be traced and the trace data will be sent to Azure Monitor.
using (var activity = activitySource.StartActivity("CustomActivity"))
{
// your code here
}
// Return a response message.
return $"Hello World!";
});
// Start the ASP.NET Core application.
app.Run();
StartActivity
a la valeur par défaut ActivityKind.Internal
, mais vous pouvez fournir n’importe quel autre ActivityKind
.
ActivityKind.Client
, ActivityKind.Producer
et ActivityKind.Internal
sont mappés sur Application Insights dependencies
.
ActivityKind.Server
et ActivityKind.Consumer
sont mappés sur Application Insights requests
.
Remarque
Les classes Activity
et ActivitySource
de l’espace de noms System.Diagnostics
représentent les concepts OpenTelemetry de Span
et Tracer
respectivement. Vous créez ActivitySource
directement à l’aide de son constructeur à la place de TracerProvider
. Chaque classe ActivitySource
doit être explicitement connectée àTracerProvider
à l’aide de AddSource()
. Cela est dû au fait que les parties de l’API de suivi OpenTelemetry sont incorporées directement dans le runtime .NET. Pour plus d’informations, consultez Présentation de l’API de suivi .NET OpenTelemetry.
// Create an OpenTelemetry tracer provider builder.
// It is important to keep the TracerProvider instance active throughout the process lifetime.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("ActivitySourceName")
.AddAzureMonitorTraceExporter()
.Build();
// Create an activity source named "ActivitySourceName".
var activitySource = new ActivitySource("ActivitySourceName");
// Start a new activity named "CustomActivity". This activity will be traced and the trace data will be sent to Azure Monitor.
using (var activity = activitySource.StartActivity("CustomActivity"))
{
// your code here
}
StartActivity
a la valeur par défaut ActivityKind.Internal
, mais vous pouvez fournir n’importe quel autre ActivityKind
.
ActivityKind.Client
, ActivityKind.Producer
et ActivityKind.Internal
sont mappés sur Application Insights dependencies
.
ActivityKind.Server
et ActivityKind.Consumer
sont mappés sur Application Insights requests
.
Utiliser l’annotation OpenTelemetry
La façon la plus simple d'ajouter vos propres spans est d'utiliser l'annotation OpenTelemetry @WithSpan
.
Les étendues remplissent les tables requests
et dependencies
dans Application Insights.
Ajoutez opentelemetry-instrumentation-annotations-1.32.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
<version>1.32.0</version>
</dependency>
Utilisez l’annotation @WithSpan
pour émettre une étendue chaque fois que votre méthode est exécutée :
import io.opentelemetry.instrumentation.annotations.WithSpan;
@WithSpan(value = "your span name")
public void yourMethod() {
}
Par défaut, l’étendue apparaît dans le tableau dependencies
avec le type de dépendance InProc
.
Pour les méthodes représentant une tâche en arrière-plan non capturée par l’instrumentation automatique, nous vous recommandons d’appliquer l’attribut kind = SpanKind.SERVER
à l’annotation @WithSpan
pour vous assurer que cela apparaît dans le tableau requests
Application Insights.
Utiliser l’API OpenTelemetry
Si la précédente annotation @WithSpan
OpenTelemetry ne répond pas à vos besoins, vous pouvez ajouter vos étendues à l’aide de l’API OpenTelemetry.
Ajoutez opentelemetry-api-1.0.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Utilisez la classe GlobalOpenTelemetry
afin de créer un Tracer
:
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
static final Tracer tracer = GlobalOpenTelemetry.getTracer("com.example");
Créez une étendue, définissez-la comme étendue actuelle, puis terminez-la :
Span span = tracer.spanBuilder("my first span").startSpan();
try (Scope ignored = span.makeCurrent()) {
// do stuff within the context of this
} catch (Throwable t) {
span.recordException(t);
} finally {
span.end();
}
Injecter OpenTelemetry
:
Créez un Tracer
:
import io.opentelemetry.api.trace.Tracer;
static final Tracer tracer = openTelemetry.getTracer("com.example");
Créez une étendue, définissez-la comme étendue actuelle, puis terminez-la :
Span span = tracer.spanBuilder("my first span").startSpan();
try (Scope ignored = span.makeCurrent()) {
// do stuff within the context of this
} catch (Throwable t) {
span.recordException(t);
} finally {
span.end();
}
// Import the Azure Monitor OpenTelemetry plugin and OpenTelemetry API
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { trace } = require("@opentelemetry/api");
// Enable Azure Monitor integration
useAzureMonitor();
// Get the tracer for the "testTracer" namespace
const tracer = trace.getTracer("testTracer");
// Start a span with the name "hello"
let span = tracer.startSpan("hello");
// End the span
span.end();
L’API OpenTelemetry peut servir à ajouter vos propres étendues qui apparaissent dans les tableaux requests
et dependencies
dans Application Insights.
L’exemple de code montre comment utiliser la méthode tracer.start_as_current_span()
pour démarrer, rendre l’étendue actuelle et terminer l’étendue dans son contexte.
...
# Import the necessary packages.
from opentelemetry import trace
# Get a tracer for the current module.
tracer = trace.get_tracer(__name__)
# Start a new span with the name "my first span" and make it the current span.
# 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 span.
# All telemetry generated within this scope will be attributed to this span.
except Exception as ex:
# Record the exception on the span.
span.record_exception(ex)
...
Par défaut, l’étendue apparaît dans le tableau dependencies
avec le type de dépendance InProc
.
Si votre méthode représente une tâche en arrière-plan qui n’est pas encore capturée par instrumentation automatique, il est recommandé de définir l’attribut kind = SpanKind.SERVER
afin qu’il apparaisse dans le tableau requests
Application Insights.
...
# Import the necessary packages.
from opentelemetry import trace
from opentelemetry.trace import SpanKind
# Get a tracer for the current module.
tracer = trace.get_tracer(__name__)
# Start a new span with the name "my request span" and the kind set to SpanKind.SERVER.
with tracer.start_as_current_span("my request span", kind=SpanKind.SERVER) as span:
# Do stuff within the context of this span.
...
Envoyer des événements personnalisés
Application Insights stocke des événements personnalisés dans la customEvents
table. Une façon d’analyser, de filtrer et de les visualiser consiste à utiliser les expériences d’utilisation d’Application Insights.
Si vous souhaitez automatiser la collection d’événements d’interaction côté client, vous pouvez utiliser le plug-in dans le Kit de développement logiciel (SDK) JavaScript.
Les événements personnalisés sont en préversion publique, et utilisent la version 1.3.0-beta.3 de Azure.Monitor.OpenTelemetry.AspNetCore
.
Pour envoyer une CustomEvent
en utilisant ILogger
, définissez l’attribut "microsoft.custom_event.name"
dans le modèle de message.
// Create a logger factory and configure OpenTelemetry with Azure Monitor
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddOpenTelemetry(options =>
{
options.AddAzureMonitorLogExporter();
});
});
// Create a logger for the specified category
var logger = loggerFactory.CreateLogger(logCategoryName);
// Log a custom event with a custom name and additional attribute
// The 'microsoft.custom_event.name' value will be used as the name of the customEvent
logger.LogInformation("{microsoft.custom_event.name} {additional_attrs}", "test-event-name", "val1");
Les événements personnalisés sont en préversion publique et utilisent Azure.Monitor.OpenTelemetry.Exporter
1.4.0-beta.3.
Pour envoyer une CustomEvent
en utilisant ILogger
, définissez l’attribut "microsoft.custom_event.name"
dans le modèle de message.
// Create a logger factory and configure OpenTelemetry with Azure Monitor
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddOpenTelemetry(options =>
{
options.AddAzureMonitorLogExporter();
});
});
// Create a logger for the specified category
var logger = loggerFactory.CreateLogger(logCategoryName);
// Log a custom event with a custom name and additional attribute
// The 'microsoft.custom_event.name' value will be used as the name of the customEvent
logger.LogInformation("{microsoft.custom_event.name} {additional_attrs}", "test-event-name", "val1");
Pour envoyer un customEvent
avec l’agent Java, définissez l’attribut "microsoft.custom_event.name"
dans l’enregistrement du journal OpenTelemetry.
Selon que le kit SDK de configuration automatique ou l’agent Java Application Insights est en cours d’utilisation, la manière d’extraire l’enregistreur OpenTelemetry est légèrement différente. Ce détail est expliqué plus en détail dans les exemples suivants.
Pour l’agent Java Application Insights :
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.logs.Severity;
Logger logger = GlobalOpenTelemetry.get().getLogsBridge().get("opentelemetry-logger");
logger.logRecordBuilder()
.setAttribute(AttributeKey.stringKey("microsoft.custom_event.name"),"test-event-name")
.setSeverity(Severity.INFO)
.emit();
Pour le Kit de développement logiciel (SDK) de configuration automatique :
import com.azure.monitor.opentelemetry.autoconfigure.AzureMonitorAutoConfigure;
import com.azure.monitor.opentelemetry.autoconfigure.AzureMonitorAutoConfigureOptions;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder;
AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = AutoConfiguredOpenTelemetrySdk.builder();
AzureMonitorAutoConfigureOptions options = new AzureMonitorAutoConfigureOptions();
options.connectionString("<your connection string>");
AzureMonitorAutoConfigure.customize(sdkBuilder, options);
OpenTelemetry openTelemetry = sdkBuilder.build().getOpenTelemetrySdk();
Logger logger = openTelemetry.getLogsBridge().get("opentelemetry-logger");
logger.logRecordBuilder()
.setAttribute(AttributeKey.stringKey("microsoft.custom_event.name"),"test-event-name")
.setSeverity(Severity.INFO)
.emit();
Pour émettre des événements personnalisés de manière fiable, utilisez directement l’API OpenTelemetry. Certaines infrastructures de journalisation ne prennent pas en charge l’ajout ou l’analyse de l’attribut d’événements personnalisés.
Il n’est pas possible d’envoyer un customEvent
avec l’attribut "microsoft.custom_event.name"
en Java natif.
Pour envoyer un customEvent
en utilisant logger.emit
, définissez l’attribut "microsoft.custom_event.name"
dans l’objet de journal attributes
. D’autres attributs peuvent également être inclus en fonction des besoins.
// Send a customEvent by including the microsoft attribute key in the log.
// The customEvent name uses the value of that attribute.
logger.emit({
body: 'Hello World!',
attributes: {
"microsoft.custom_event.name": "test-event-name",
"additional_attrs": "val1"
},
});
// You can also populate fields like client_IP with attribute `client.address`
logger.emit({
body: 'This entry will have a custom client_IP',
attributes: {
"microsoft.custom_event.name": "test_event",
"client.address": "192.168.1.1"
},
});
Pour envoyer un customEvent
en Python, utilisez la bibliothèque logging avec l’attribut "microsoft.custom_event.name"
dans le paramètre extra
.
import logging
from azure.monitor.opentelemetry import configure_azure_monitor
# Set up your application logger
logger = logging.getLogger("my-app-logger")
# Configure Azure Monitor to collect logs from the specified logger name
configure_azure_monitor(
logger_name="my-app-logger", # Collect logs from your namespaced logger
)
# Log a custom event with a custom name and additional attribute
# The 'microsoft.custom_event.name' value will be used as the name of the customEvent
logger.warning(
"Hello World!",
extra={
"microsoft.custom_event.name": "test-event-name",
"additional_attrs": "val1"
}
)
# You can also populate fields like client_IP with attribute `client.address`
logger.info(
"This entry will have a custom client_IP",
extra={
"microsoft.custom_event.name": "test_event",
"client.address": "192.168.1.1"
}
)
Modifier la télémétrie
Cette section explique comment modifier la télémétrie.
Ajouter des attributs d’étendue
Ces attributs peuvent inclure l’ajout d’une propriété personnalisée à votre télémétrie. Vous pouvez également utiliser des attributs pour définir des champs facultatifs dans le schéma Application Insights, comme une adresse IP de client.
Ajoutez une propriété personnalisée à une étendue
Tous les attributs que vous ajoutez aux étendues sont exportés en tant que propriétés personnalisées. Ils remplissent le champ customDimensions dans la table des requêtes, des dépendances, des traces ou des exceptions.
Pour ajouter des attributs span, utilisez l’une des deux méthodes suivantes :
Conseil
L’avantage de l’utilisation des options fournies par les bibliothèques d’instrumentation, lorsqu’elles sont disponibles, est que tout le contexte est disponible. Par conséquent, les utilisateurs peuvent choisir d’ajouter ou de filtrer davantage d’attributs. Par exemple, l’option enrichir de la bibliothèque d’instrumentation HttpClient permet aux utilisateurs d’accéder au HttpRequestMessage et au HttpResponseMessage eux-mêmes. Ils peuvent sélectionner n’importe quoi et le stocker en tant qu’attribut.
De nombreuses bibliothèques d’instrumentation fournissent une option d’enrichissement. Pour obtenir des conseils, consultez les fichiers README des bibliothèques d'instrumentation individuelles.
Utilisation d’un processeur personnalisé :
Conseil
Ajoutez le processeur indiqué ici avant d’ajouter Azure Monitor.
// Create an ASP.NET Core application builder.
var builder = WebApplication.CreateBuilder(args);
// Configure the OpenTelemetry tracer provider to add a new processor named ActivityEnrichingProcessor.
builder.Services.ConfigureOpenTelemetryTracerProvider((sp, builder) => builder.AddProcessor(new ActivityEnrichingProcessor()));
// Add the Azure Monitor telemetry service to the application. This service will collect and send telemetry data to Azure Monitor.
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// Build the ASP.NET Core application.
var app = builder.Build();
// Start the ASP.NET Core application.
app.Run();
Ajoutez ActivityEnrichingProcessor.cs
à votre projet avec le code ci-dessous :
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");
}
}
Pour ajouter des attributs span, utilisez l’une des deux méthodes suivantes :
- Utilisez les options fournies par les bibliothèques d’instrumentation.
- Ajout d’un processeur d’étendue personnalisé.
Conseil
L’avantage de l’utilisation des options fournies par les bibliothèques d’instrumentation, lorsqu’elles sont disponibles, est que tout le contexte est disponible. Par conséquent, les utilisateurs peuvent choisir d’ajouter ou de filtrer davantage d’attributs. Par exemple, l’option enrichir de la bibliothèque d’instrumentation HttpClient permet aux utilisateurs d’accéder au httpRequestMessage lui-même. Ils peuvent sélectionner n’importe quoi et le stocker en tant qu’attribut.
De nombreuses bibliothèques d’instrumentation fournissent une option d’enrichissement. Pour obtenir des conseils, consultez les fichiers README des bibliothèques d'instrumentation individuelles.
Utilisation d’un processeur personnalisé :
Conseil
Ajoutez le processeur indiqué ci-dessous avant Azure Monitor Exporter.
// Create an OpenTelemetry tracer provider builder.
// It is important to keep the TracerProvider instance active throughout the process lifetime.
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
// Add a source named "OTel.AzureMonitor.Demo".
.AddSource("OTel.AzureMonitor.Demo") // Add a new processor named ActivityEnrichingProcessor.
.AddProcessor(new ActivityEnrichingProcessor()) // Add the Azure Monitor trace exporter.
.AddAzureMonitorTraceExporter() // Add the Azure Monitor trace exporter.
.Build();
Ajoutez ActivityEnrichingProcessor.cs
à votre projet avec le code ci-dessous :
public class ActivityEnrichingProcessor : BaseProcessor<Activity>
{
// The OnEnd method is called when an activity is finished. This is the ideal place to enrich the activity with additional data.
public override void OnEnd(Activity activity)
{
// Update the activity's display name.
// The updated activity will be available to all processors which are called after this processor.
activity.DisplayName = "Updated-" + activity.DisplayName;
// Set custom tags on the activity.
activity.SetTag("CustomDimension1", "Value1");
activity.SetTag("CustomDimension2", "Value2");
}
}
Vous pouvez utiliser opentelemetry-api
pour ajouter des attributs à des étendues.
L’ajout d’un ou de plusieurs attributs d’étendue permet de renseigner le champ customDimensions
dans la table requests
, dependencies
, traces
ou exceptions
.
Ajoutez opentelemetry-api-1.0.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Ajoutez des dimensions personnalisées dans votre code :
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.common.AttributeKey;
AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension");
Span.current().setAttribute(attributeKey, "myvalue1");
Ajoutez des dimensions personnalisées dans votre code :
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.common.AttributeKey;
AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension");
Span.current().setAttribute(attributeKey, "myvalue1");
// Import the necessary packages.
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const { ReadableSpan, Span, SpanProcessor } = require("@opentelemetry/sdk-trace-base");
const { SemanticAttributes } = require("@opentelemetry/semantic-conventions");
// Create a new SpanEnrichingProcessor class.
class SpanEnrichingProcessor implements SpanProcessor {
forceFlush(): Promise<void> {
return Promise.resolve();
}
shutdown(): Promise<void> {
return Promise.resolve();
}
onStart(_span: Span): void {}
onEnd(span: ReadableSpan) {
// Add custom dimensions to the span.
span.attributes["CustomDimension1"] = "value1";
span.attributes["CustomDimension2"] = "value2";
}
}
// Enable Azure Monitor integration.
const options: AzureMonitorOpenTelemetryOptions = {
// Add the SpanEnrichingProcessor
spanProcessors: [new SpanEnrichingProcessor()]
}
useAzureMonitor(options);
Utilisation d’un processeur personnalisé :
...
# Import the necessary packages.
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
# Create a SpanEnrichingProcessor instance.
span_enrich_processor = SpanEnrichingProcessor()
# Configure OpenTelemetry to use Azure Monitor with the specified connection string.
# Replace `<your-connection-string>` with the connection string to your Azure Monitor Application Insights resource.
configure_azure_monitor(
connection_string="<your-connection-string>",
# Configure the custom span processors to include span enrich processor.
span_processors=[span_enrich_processor],
)
...
Ajoutez SpanEnrichingProcessor
à votre projet avec le code ci-dessous :
# Import the SpanProcessor class from the opentelemetry.sdk.trace module.
from opentelemetry.sdk.trace import SpanProcessor
class SpanEnrichingProcessor(SpanProcessor):
def on_end(self, span):
# Prefix the span name with the string "Updated-".
span._name = "Updated-" + span.name
# Add the custom dimension "CustomDimension1" with the value "Value1".
span._attributes["CustomDimension1"] = "Value1"
# Add the custom dimension "CustomDimension2" with the value "Value2".
span._attributes["CustomDimension2"] = "Value2"
Définir l’IP utilisateur
Vous pouvez renseigner le champ client_IP pour les requêtes en définissant un attribut sur l’étendue. Application Insights utilise l’adresse IP pour générer des attributs d’emplacement utilisateur, puis la supprime par défaut.
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes dans ActivityEnrichingProcessor.cs
:
// Add the client IP address to the activity as a tag.
// only applicable in case of activity.Kind == Server
activity.SetTag("client.address", "<IP Address>");
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes dans ActivityEnrichingProcessor.cs
:
// Add the client IP address to the activity as a tag.
// only applicable in case of activity.Kind == Server
activity.SetTag("client.address", "<IP Address>");
Java remplit automatiquement ce champ.
Ce champ est automatiquement renseigné.
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes :
...
// Import the SemanticAttributes class from the @opentelemetry/semantic-conventions package.
const { SemanticAttributes } = require("@opentelemetry/semantic-conventions");
// Create a new SpanEnrichingProcessor class.
class SpanEnrichingProcessor implements SpanProcessor {
onEnd(span) {
// Set the HTTP_CLIENT_IP attribute on the span to the IP address of the client.
span.attributes[SemanticAttributes.HTTP_CLIENT_IP] = "<IP Address>";
}
}
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes dans SpanEnrichingProcessor.py
:
# Set the `http.client_ip` attribute of the span to the specified IP address.
span._attributes["http.client_ip"] = "<IP Address>"
Définir l’ID utilisateur ou l’ID utilisateur authentifié
Vous pouvez remplir le champ user_Id ou user_AuthenticatedId pour les requêtes à l’aide des instructions ci-dessous. L’ID d’utilisateur est un identificateur d’utilisateur anonyme. L’ID d’utilisateur authentifié est un identificateur d’utilisateur connu.
Important
Consultez les lois en vigueur inhérentes à la protection des données personnelles avant de définir l’ID d’utilisateur authentifié.
Utilisez l’exemple de propriété personnalisée :
// Add the user ID to the activity as a tag, but only if the activity is not null.
activity?.SetTag("enduser.id", "<User Id>");
Utilisez l’exemple de propriété personnalisée :
// Add the user ID to the activity as a tag, but only if the activity is not null.
activity?.SetTag("enduser.id", "<User Id>");
Renseignez le champ user ID
dans la table requests
, dependencies
ou exceptions
.
Ajoutez opentelemetry-api-1.0.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Définissez user_Id
dans votre code :
import io.opentelemetry.api.trace.Span;
Span.current().setAttribute("enduser.id", "myuser");
Renseignez le champ user ID
dans la table requests
, dependencies
ou exceptions
.
Définissez user_Id
dans votre code :
import io.opentelemetry.api.trace.Span;
Span.current().setAttribute("enduser.id", "myuser");
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes :
...
// Import the SemanticAttributes class from the @opentelemetry/semantic-conventions package.
import { SemanticAttributes } from "@opentelemetry/semantic-conventions";
// Create a new SpanEnrichingProcessor class.
class SpanEnrichingProcessor implements SpanProcessor {
onEnd(span: ReadableSpan) {
// Set the ENDUSER_ID attribute on the span to the ID of the user.
span.attributes[SemanticAttributes.ENDUSER_ID] = "<User ID>";
}
}
Utilisez l’exemple de propriété personnalisée, mais remplacez les lignes de code suivantes :
# Set the `enduser.id` attribute of the span to the specified user ID.
span._attributes["enduser.id"] = "<User ID>"
Ajouter des attributs de fichier de log
OpenTelemetry utilise le ILogger
de .NET.
Vous pouvez joindre des dimensions personnalisées aux journaux à l’aide d’un modèle de message.
OpenTelemetry utilise le ILogger
de .NET.
Vous pouvez joindre des dimensions personnalisées aux journaux à l’aide d’un modèle de message.
Logback, Log4j et java.util.logging sont automatiquement instrumentés. L’attachement de dimensions personnalisées à vos journaux peut s’effectuer des manières suivantes :
Pour les applications natives Spring Boot, Logback est instrumenté prêt à l’emploi.
const { useAzureMonitor } = require("@azure/monitor-opentelemetry");
const bunyan = require('bunyan');
// Instrumentations configuration
const options: AzureMonitorOpenTelemetryOptions = {
instrumentationOptions: {
// Instrumentations generating logs
bunyan: { enabled: true },
}
};
// Enable Azure Monitor integration
useAzureMonitor(options);
var log = bunyan.createLogger({ name: 'testApp' });
log.info({
"testAttribute1": "testValue1",
"testAttribute2": "testValue2",
"testAttribute3": "testValue3"
}, 'testEvent');
La bibliothèque de journalisation Python est instrumentée automatiquement. Vous pouvez lier des dimensions personnalisées à vos journaux en passant un dictionnaire dans l’argument extra
de vos journaux :
...
# Create a warning log message with the properties "key1" and "value1".
logger.warning("WARNING: Warning log with properties", extra={"key1": "value1"})
...
Obtenir l’ID de trace ou l’ID d’étendue
Vous pouvez obtenir les Trace ID
et Span ID
de l’étendue actuellement active en suivant ces étapes.
Remarque
Les classes Activity
et ActivitySource
de l’espace de noms System.Diagnostics
représentent les concepts OpenTelemetry de Span
et Tracer
respectivement. Cela est dû au fait que les parties de l’API de suivi OpenTelemetry sont incorporées directement dans le runtime .NET. Pour plus d’informations, consultez Présentation de l’API de suivi .NET OpenTelemetry.
// Get the current activity.
Activity activity = Activity.Current;
// Get the trace ID of the activity.
string traceId = activity?.TraceId.ToHexString();
// Get the span ID of the activity.
string spanId = activity?.SpanId.ToHexString();
Remarque
Les classes Activity
et ActivitySource
de l’espace de noms System.Diagnostics
représentent les concepts OpenTelemetry de Span
et Tracer
respectivement. Cela est dû au fait que les parties de l’API de suivi OpenTelemetry sont incorporées directement dans le runtime .NET. Pour plus d’informations, consultez Présentation de l’API de suivi .NET OpenTelemetry.
// Get the current activity.
Activity activity = Activity.Current;
// Get the trace ID of the activity.
string traceId = activity?.TraceId.ToHexString();
// Get the span ID of the activity.
string spanId = activity?.SpanId.ToHexString();
Vous pouvez utiliser opentelemetry-api
pour obtenir l’ID de trace ou l’ID de segment.
Ajoutez opentelemetry-api-1.0.0.jar
(ou version ultérieure) à votre application :
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Obtenez l’ID de trace et l’ID d’étendue de la requête dans votre code :
import io.opentelemetry.api.trace.Span;
Span span = Span.current();
String traceId = span.getSpanContext().getTraceId();
String spanId = span.getSpanContext().getSpanId();
Obtenez l’ID de trace et l’ID d’étendue de la requête dans votre code :
import io.opentelemetry.api.trace.Span;
Span span = Span.current();
String traceId = span.getSpanContext().getTraceId();
String spanId = span.getSpanContext().getSpanId();
Obtenez l’ID de trace et l’ID d’étendue de la requête dans votre code :
// Import the trace module from the OpenTelemetry API.
const { trace } = require("@opentelemetry/api");
// Get the span ID and trace ID of the active span.
let spanId = trace.getActiveSpan().spanContext().spanId;
let traceId = trace.getActiveSpan().spanContext().traceId;
Obtenez l’ID de trace et l’ID d’étendue de la requête dans votre code :
# Import the necessary libraries.
from opentelemetry import trace
# Get the trace ID and span ID of the current span.
trace_id = trace.get_current_span().get_span_context().trace_id
span_id = trace.get_current_span().get_span_context().span_id
Étapes suivantes
- Pour configurer davantage la distribution OpenTelemetry, consultez Configuration d'Azure Monitor OpenTelemetry.
- Pour passer en revue le code source, consultez Référentiel GitHub Azure Monitor AspNetCore .
- Pour installer le package NuGet, recherchez les mises à jour ou affichez les notes de publication, et consultez la page Package NuGet Azure Monitor AspNetCore.
- Pour se familiariser davantage à Azure Monitor et OpenTelemetry grâce à l’exemple d’application Azure Monitor.
- Pour en savoir plus sur OpenTelemetry et sa communauté, consultez le référentiel GitHub OpenTelemetry .NET.
- Pour activer les expériences d’utilisation, consultez Activer la surveillance des utilisateurs web ou de navigateur.
- Pour passer en revue le forum aux questions, les étapes de résolution des problèmes et les options de support, ou pour fournir des commentaires sur OpenTelemetry, consultez Aide, support et commentaires d’OpenTelemetry pour Azure Monitor Application Insights.
- Pour configurer davantage la distribution OpenTelemetry, consultez Configuration d’Azure Monitor OpenTelemetry
- Pour examiner le code source, consultez référentiel GitHub Azure Monitor Exporter.
- Pour installer le package NuGet, recherchez les mises à jour ou affichez les notes de publication, visitez la page Package NuGet Azure Monitor Exporter.
- Pour se familiariser davantage à Azure Monitor et OpenTelemetry grâce à l’exemple d’application Azure Monitor.
- Pour en savoir plus sur OpenTelemetry et sa communauté, consultez le référentiel GitHub OpenTelemetry .NET.
- Pour activer les expériences d’utilisation, consultez Activer la surveillance des utilisateurs web ou de navigateur.
- Pour passer en revue le forum aux questions, les étapes de résolution des problèmes et les options de support, ou pour fournir des commentaires sur OpenTelemetry, consultez Aide, support et commentaires d’OpenTelemetry pour Azure Monitor Application Insights.
- Pour passer en revue le code source et la documentation supplémentaire, consultez le Référentiel GitHub de Distribution Azure Monitor.
- Pour afficher des exemples et cas d’usage supplémentaires, consultez les Exemples Distribution Azure Monitor.
- Pour afficher les notes de publication, consultez les notes de publication sur GitHub.
- Pour installer le package PyPI, recherchez les mises à jour ou affichez les notes de publication, consultez la page Package PyPI pour distribution Azure Monitor.
- Familiarisez-vous davantage avec Azure Monitor Application Insights et OpenTelemetry grâce à l’exemple d’application Azure Monitor.
- Pour en savoir plus sur OpenTelemetry et sa communauté, consultez le référentiel GitHub OpenTelemetry Python.
- Pour voir les composants et instrumentations OpenTelemetry disponibles, consultez le Référentiel GitHub OpenTelemetry Contributor Python.
- Pour activer les expériences d’utilisation, consultez Activer la surveillance des utilisateurs web ou de navigateur.
- Pour passer en revue le forum aux questions, les étapes de résolution des problèmes et les options de support, ou pour fournir des commentaires sur OpenTelemetry, consultez Aide, support et commentaires d’OpenTelemetry pour Azure Monitor Application Insights.