Tato příručka obsahuje pokyny k integraci a přizpůsobení instrumentace OpenTelemetry (OTel) v rámci služby Azure Monitor Application Insights.
Další informace o konceptech OpenTelemetry najdete v přehledu OpenTelemetry nebo nejčastějších dotazech k OpenTelemetry.
Automatické shromažďování dat
Distribuce automaticky shromažďují data sdružením instrumentačních knihoven OpenTelemetry.
Zahrnuté knihovny instrumentace
Žádosti
Závislosti
Protokolování
Pokud chcete snížit nebo zvýšit počet protokolů odesílaných do služby Azure Monitor, nakonfigurujte protokolování tak, aby nastavil odpovídající úroveň protokolu nebo použil filtry. Například můžete odesílat jenom Warning a Error protokoly do OpenTelemetry/Azure Monitoru. OpenTelemetry neřídí směrování protokolů ani filtrování – vaše ILogger konfigurace provádí tato rozhodnutí. Další informace o konfiguraci ILoggernaleznete v tématu Konfigurace protokolování.
Další informace o ILoggerpoužití naleznete v tématu Protokolování v jazyce C# a .NET a příklady kódu.
Exportér služby Azure Monitor neobsahuje žádné knihovny instrumentace.
Pomocí následující ukázky kódu můžete shromažďovat závislosti ze sady Azure Software Development Kits (SDK) a ručně se přihlásit k odběru zdroje.
// 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();
Pokud chcete snížit nebo zvýšit počet protokolů odesílaných do služby Azure Monitor, nakonfigurujte protokolování tak, aby nastavil odpovídající úroveň protokolu nebo použil filtry. Například můžete odesílat jenom Warning a Error protokoly do OpenTelemetry/Azure Monitoru. OpenTelemetry neřídí směrování protokolů ani filtrování – vaše ILogger konfigurace provádí tato rozhodnutí. Další informace o konfiguraci ILoggernaleznete v tématu Konfigurace protokolování.
Žádosti
- Příjemci služby Java Message Service (JMS)
- Příjemci Kafka
- Netty
- Křemen
- RabbitMQ
- Servlety
- Plánování pružiny
Poznámka:
Servlety a autoinstrumentace Netty pokrývají většinu služeb Java HTTP, včetně Java EE, Jakarta EE, Spring Boot, Quarkus a Micronaut.
Závislosti (plus šíření distribuovaného trasování podřízené)
- Apache HttpClient
- Apache HttpAsyncClient
- AsyncHttpClient
- Google HttpClient
- gRPC
- java.net.HttpURLConnection
- Java 11 HttpClient
- Klient JAX-RS
- Jetty HttpClient
- JMS
- Kafka
- Klient Netty
- OkHttp
- RabbitMQ
Závislosti (bez šíření distribuovaného trasování podřízené)
- Podporuje Cassandru
- Podporuje připojení databáze Java (JDBC)
- Podporuje MongoDB (asynchronní a synchronizační)
- Podporuje Redis (Lettuce a Jedis).
Metriky
- Metriky mikrometrů, včetně metrik poháněcího zařízení Spring Boot
- Metriky rozšíření pro správu Java (JMX)
Protokoly
- Logback (včetně vlastností MDC) ¹
- Log4j (včetně vlastností kontextu MDC/vlákna) ¹
- Protokolování JBoss (včetně vlastností MDC) ¹
- java.util.logging ¹
Pokud chcete snížit nebo zvýšit počet protokolů, které Azure Monitor shromažďuje, nejprve nastavte požadovanou úroveň protokolování (například WARNING ) ERRORv knihovně protokolování aplikace.
Výchozí kolekce
Telemetrie generovaná následujícími sadami Azure SDK se ve výchozím nastavení automaticky shromažďuje:
[//]: # "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)"
Žádosti o nativní aplikace Spring Boot
- Spring Web
- Spring Web MVC (model-View-Controller)
- Spring WebFlux
Závislosti pro nativní aplikace Spring Boot
Metriky
Protokoly pro nativní aplikace Spring Boot
Pokud chcete snížit nebo zvýšit počet protokolů, které Azure Monitor shromažďuje, nejprve nastavte požadovanou úroveň protokolování (například WARNING ) ERRORv knihovně protokolování aplikace.
Informace o nativních aplikacích Quartz najdete v dokumentaci k Quarkus.
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
Následující knihovny instrumentace OpenTelemetry jsou součástí distro služby Azure Monitor Application Insights. Další informace najdete v tématu Sada Azure SDK pro JavaScript.
Žádosti
Závislosti
Protokoly
Pokud chcete snížit nebo zvýšit počet protokolů, které Azure Monitor shromažďuje, nejprve nastavte požadovanou úroveň protokolování (například WARNING ) ERRORv knihovně protokolování aplikace.
Instrumentace je možné nakonfigurovat pomocí AzureMonitorOpenTelemetryOptions:
export class BunyanInstrumentationSample {
static async run() {
// Dynamically import Azure Monitor and Bunyan
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const bunyanMod = await import("bunyan");
const bunyan = (bunyanMod as any).default ?? bunyanMod;
// Enable Azure Monitor integration and bunyan instrumentation
const options = {
instrumentationOptions: {
bunyan: { enabled: true },
},
};
const monitor = useAzureMonitor(options);
// Emit a test log entry
const log = (bunyan as any).createLogger({ name: "testApp" });
log.info(
{
testAttribute1: "testValue1",
testAttribute2: "testValue2",
testAttribute3: "testValue3",
},
"testEvent"
);
console.log("Bunyan log emitted");
}
}
Žádosti
Závislosti
Protokoly
Pokud chcete snížit nebo zvýšit počet protokolů, které Azure Monitor shromažďuje, nejprve nastavte požadovanou úroveň protokolování (například WARNING ) ERRORv knihovně protokolování aplikace.
Příklady použití knihovny protokolování Pythonu najdete na GitHubu.
Telemetrie, kterou generují sady SDK (Software Development Kit), se ve výchozím nastavení automaticky shromažďuje.
Poznámka pod čarou
- ¹: Podporuje automatické hlášení neošetřených nebo nezachycených výjimek.
- ²: Podporuje metriky OpenTelemetry
Poznámka:
Distribuce OpenTelemetry služby Azure Monitor zahrnují vlastní mapování a logiku pro automatické generování standardních metrik Application Insights.
Návod
Všechny metriky OpenTelemetry, ať už se automaticky shromažďují z knihoven instrumentace nebo ručně shromažďované z vlastního kódování, se v současné době považují za vlastní metriky Application Insights pro účely fakturace.
Další informace.
Pokud zahrnete knihovny instrumentace z komunity OpenTelemetry, můžete automaticky shromažďovat další data.
Upozornění
Nepodporujeme ani nezaručujeme kvalitu komunitních instrumentačních knihoven. Pokud ho chcete navrhnout pro naši distribuci, publikujte nebo hlasujte v naší komunitě pro zpětnou vazbu. Mějte na paměti, že některé jsou založené na experimentálních specifikacích OpenTelemetry a můžou představovat budoucí zásadní změny.
Pokud chcete přidat knihovnu komunity ConfigureOpenTelemetryMeterProvider , po přidání balíčku NuGet pro knihovnu použijte tyto metody ConfigureOpenTelemetryTracerProvider .
Následující příklad ukazuje, jak lze instrumentaci modulu runtime přidat ke shromažďování dalších metrik:
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();
Následující příklad ukazuje, jak lze instrumentaci modulu runtime přidat ke shromažďování dalších metrik:
// 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();
Distribuci Javy nemůžete rozšířit o komunitní instrumentační knihovny. Pokud chcete požádat, abychom zahrnuli jinou knihovnu instrumentace, otevřete problém na naší stránce GitHubu. Odkaz na naši stránku GitHubu najdete v dalších krocích.
Knihovny instrumentace komunity nemůžete používat s nativními aplikacemi GraalVM v Javě.
export class RegisterExpressInstrumentationSample {
static async run() {
// Dynamically import Azure Monitor and Express instrumentation
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { registerInstrumentations } = await import("@opentelemetry/instrumentation");
const { ExpressInstrumentation } = await import("@opentelemetry/instrumentation-express");
// Initialize Azure Monitor (uses env var if set)
const monitor = useAzureMonitor();
// Register the Express instrumentation
registerInstrumentations({
instrumentations: [new ExpressInstrumentation()],
});
console.log("Express instrumentation registered");
}
}
Pokud chcete přidat komunitní instrumentační knihovnu (není oficiálně podporovaná nebo zahrnutá v distribucích služby Azure Monitor), můžete instrumentovat přímo s instrumentacemi. Seznam knihoven instrumentace komunity najdete tady.
Poznámka:
Nedoporučuje se ručně provádět instrumentaci pomocí podporované knihovny instrumentace a distribuce instrument(). Nejedná se o podporovaný scénář a může dojít k nežádoucímu chování vaší telemetrie.
# 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())
Detektory prostředků
Detektory prostředků při spuštění zjišťují metadata prostředí a naplňují atributy prostředků OpenTelemetry, jako jsou service.name, cloud.provider a cloud.resource_id. Tato metadata umožňují funkce v Application Insights, jako je Mapování aplikací a propojení výpočetních prostředků, a zlepšují korelaci mezi trasami, metrikami a protokoly.
Návod
Atributy prostředků popisují proces a jeho prostředí. Atributy Span popisují jednu operaci. Použijte atributy prostředků pro vlastnosti na úrovni aplikace, jako je service.name.
Podporovaná prostředí
| Životní prostředí |
Jak funguje detekce |
Poznámky |
| Azure App Service |
Jazyková sada SDK nebo distribuce služby Azure Monitor čte známé proměnné prostředí Služby App Service a metadata hostitele. |
Pracuje s .NET, Javou, Node.jsa Pythonem při použití pokynů v tomto článku. |
| Azure Functions |
Podívejte se na Azure Functions OpenTelemetry jak‑na‑to |
Veškeré pokyny pro Azure Functions jsou umístěny tam. |
| Azure Virtual Machines |
Jazyková sada SDK nebo distribuce se dotazuje na službu Azure Instance Metadata Service. |
Ujistěte se, že má virtuální počítač přístup ke koncovému bodu služby Instance Metadata Service. |
| Azure Kubernetes Service (AKS) |
Použijte procesor Kolektoru OpenTelemetry k8sattributes k přidání metadat Kubernetes |
Doporučuje se pro všechny jazyky, které běží v AKS. |
| Azure Container Apps |
Detektory mapují proměnné prostředí a identifikátory prostředků, pokud jsou k dispozici. |
Můžete také nastavit OTEL_RESOURCE_ATTRIBUTES k vyplnění mezer. |
Ruční a automatická instrumentace
Automatická instrumentace a distribuce softwaru Azure Monitor umožňují detekci prostředků při provozu v prostředích Azure, kde je to podporováno.
Pro ruční nastavení můžete nastavit atributy prostředků přímo pomocí standardních možností OpenTelemetry:
# Applies to .NET (ASP.NET/ASP.NET Core), Java, Node.js, and Python
export OTEL_SERVICE_NAME="my-service"
export OTEL_RESOURCE_ATTRIBUTES="cloud.provider=azure,cloud.region=westus,cloud.resource_id=/subscriptions/<SUB>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<APP>"
Ve Windows PowerShellu:
$Env:OTEL_SERVICE_NAME="my-service"
$Env:OTEL_RESOURCE_ATTRIBUTES="cloud.provider=azure,cloud.region=westus,cloud.resource_id=/subscriptions/<SUB>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<APP>"
Aspekty příjmu OTLP
- Application Insights používá
service.name k odvození názvu cloudové role. Zvolte stabilní název pro každou službu, abyste se vyhnuli fragmentovaným uzlům v mapě aplikace.
-
cloud.resource_id zlepšuje propojení výpočetních prostředků s prostředky Azure. Pokud tento atribut chybí, některá prostředí nemusí ukazovat prostředek Azure, který tato data vytvořil.
Shromažďování vlastních telemetrických dat
Tato část vysvětluje, jak shromažďovat vlastní telemetrická data z vaší aplikace.
V závislosti na vašem jazyce a typu signálu existují různé způsoby shromažďování vlastních telemetrických dat, mezi které patří:
- OpenTelemetry API
- Knihovny protokolování/metrik pro konkrétní jazyk
- Klasické rozhraní API Application Insights
Následující tabulka představuje aktuálně podporované vlastní typy telemetrie:
| Jazyk |
Vlastní události |
Vlastní metriky |
Závislosti |
Výjimky |
Zobrazení stránek |
Žádosti |
Trasování |
|
ASP.NET Core |
|
|
|
|
|
|
|
| OpenTelemetry API |
|
Ano |
Ano |
Ano |
|
Ano |
|
ILogger Rozhraní api |
|
|
|
|
|
|
Ano |
| Klasické rozhraní API AI |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Java |
|
|
|
|
|
|
|
| OpenTelemetry API |
|
Ano |
Ano |
Ano |
|
Ano |
|
Logback, Log4j, JUL |
|
|
|
Ano |
|
|
Ano |
| Metriky v mikrometrech |
|
Ano |
|
|
|
|
|
| Klasické rozhraní API AI |
Ano |
Ano |
Ano |
Ano |
Ano |
Ano |
Ano |
|
|
|
|
|
|
|
|
|
Node.js |
|
|
|
|
|
|
|
| OpenTelemetry API |
|
Ano |
Ano |
Ano |
|
Ano |
|
|
|
|
|
|
|
|
|
|
Python |
|
|
|
|
|
|
|
| OpenTelemetry API |
|
Ano |
Ano |
Ano |
|
Ano |
|
| Modul protokolování Pythonu |
|
|
|
|
|
|
Ano |
| Rozšíření událostí |
Ano |
|
|
|
|
|
Ano |
Poznámka:
Application Insights Java 3.x a Application Insights Node.js 3.x shromažďují telemetrii z klasického rozhraní API Application Insights. Toto chování zjednodušuje upgrady a dočasně podporuje vlastní telemetrii, dokud rozhraní API OpenTelemetry neobsahuje všechny vlastní typy telemetrie.
Přidání vlastních metrik
V tomto kontextu termín vlastních metrik odkazuje na ruční instrumentaci kódu za účelem shromažďování dalších metrik nad rámec toho, co knihovny Instrumentace OpenTelemetry automaticky shromažďují. Další informace o používání metrik najdete v tématu Metriky v Application Insights.
Rozhraní Api OpenTelemetry nabízí šest "nástrojů" pro pokrytí různých scénářů metrik a při vizualizaci metrik v Průzkumníku metrik musíte vybrat správný typ agregace. Tento požadavek platí při použití rozhraní API metriky OpenTelemetry k odesílání metrik a při použití knihovny instrumentace.
Následující tabulka uvádí doporučené typy agregace pro jednotlivé nástroje metriky OpenTelemetry.
| OpenTelemetry nástroj |
Typ agregace služby Azure Monitor |
| Čítač |
Suma |
| Asynchronní čítač |
Suma |
| Histogram |
Min, Max, Average, Sum a Count |
| Asynchronní měřidlo |
Průměr |
| UpDownCounter |
Suma |
| Asynchronní upDownCounter |
Suma |
Upozornění
Ve většině případů nejsou jiné typy agregace smysluplné.
Specifikace OpenTelemetry popisuje nástroje a poskytuje příklady, kdy je možné jednotlivé nástroje použít.
Návod
Histogram je nejuniverzálnější a nejpodřenější ekvivalent rozhraní API GetMetric GetMetric. Azure Monitor v současné době zploštěná instrument histogramu do pěti podporovaných typů agregace a podpora percentilů probíhá. I když méně všestranné, jiné nástroje OpenTelemetry mají menší vliv na výkon vaší aplikace.
Příklad histogramu
Spuštění aplikace se musí přihlásit k odběru měřiče podle názvu:
// 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();
Musí Meter být inicializován pomocí stejného názvu:
// 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);
}
}
Vložit OpenTelemetry:
Vytvoření histogramu:
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);
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
export class HistogramSample {
static async run() {
// Dynamically import Azure Monitor and metrics API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { metrics } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor({
azureMonitorExporterOptions: {
connectionString:
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<your-connection-string>",
},
});
// Create a histogram and record values
const meter = metrics.getMeter("testMeter");
const histogram = meter.createHistogram("histogram");
histogram.record(1, { testKey: "testValue" });
histogram.record(30, { testKey: "testValue2" });
histogram.record(100, { testKey2: "testValue" });
console.log("Histogram metrics recorded");
}
}
# 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()
Příklad čítače
Spuštění aplikace se musí přihlásit k odběru měřiče podle názvu:
// 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();
Musí Meter být inicializován pomocí stejného názvu:
// 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"));
}
}
Vložit OpenTelemetry:
Vytvořte čítač:
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"));
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
export class CounterSample {
static async run() {
// Dynamically import Azure Monitor and metrics API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { metrics } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor({
azureMonitorExporterOptions: {
connectionString:
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<your-connection-string>",
},
});
// Create a counter and add some sample values
const meter = metrics.getMeter("otel_azure_monitor_counter_demo");
const counter = meter.createCounter("MyFruitCounter");
counter.add(1, { name: "apple", color: "red" });
counter.add(2, { name: "lemon", color: "yellow" });
counter.add(1, { name: "lemon", color: "yellow" });
counter.add(2, { name: "apple", color: "green" });
counter.add(5, { name: "apple", color: "red" });
counter.add(4, { name: "lemon", color: "yellow" });
console.log("Counter metrics recorded");
}
}
# 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()
Příklad měřidla
Spuštění aplikace se musí přihlásit k odběru měřiče podle názvu:
// 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();
Musí Meter být inicializován pomocí stejného názvu:
// 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"));
});
}
}
Vložit OpenTelemetry:
Vytvoření měřidla:
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"));
});
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
export class GaugeSample {
static async run() {
// Dynamically import Azure Monitor and metrics API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { metrics } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor({
azureMonitorExporterOptions: {
connectionString:
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<your-connection-string>",
},
});
// Create an observable gauge and register a callback
const meter = metrics.getMeter("testMeter");
const gauge = meter.createObservableGauge("gauge");
gauge.addCallback((observableResult) => {
const randomNumber = Math.floor(Math.random() * 100);
observableResult.observe(randomNumber, { testKey: "testValue" });
});
console.log("Observable gauge registered");
}
}
# 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()
Přidání vlastních výjimek
Výběr knihoven instrumentace automaticky hlásí výjimky do Application Insights.
Můžete ale chtít ručně hlásit výjimky nad rámec sestavy knihoven instrumentace.
Například výjimky zachycené vaším kódem nejsou obvykle hlášeny. Můžete je chtít nahlásit, aby upoutat pozornost v relevantních prostředích, včetně části selhání a zobrazení komplexních transakcí.
Protokolování výjimky pomocí aktivity:
// 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);
}
}
Protokolování výjimky pomocí 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" });
}
Protokolování výjimky pomocí aktivity:
// 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);
}
}
Protokolování výjimky pomocí 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" });
}
Můžete použít opentelemetry-api k aktualizaci stavu výjimek rozsahu a záznamů.
Přidejte opentelemetry-api-1.0.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Nastavení stavu error a zaznamenání výjimky v kódu:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
Span span = Span.current();
span.setStatus(StatusCode.ERROR, "errorMessage");
span.recordException(e);
Nastavení stavu error a zaznamenání výjimky v kódu:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
Span span = Span.current();
span.setStatus(StatusCode.ERROR, "errorMessage");
span.recordException(e);
Sada Node.js SDK exportuje ručně zaznamenané výjimky na základě úseku do Application Insights jako výjimky jenom když jsou zaznamenány na úseku nejvyšší úrovně nebo jako potomci vzdálených či interních úseků.
export class CustomExceptionSample {
static async run() {
// Dynamically import Azure Monitor and tracing API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { trace } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor({
azureMonitorExporterOptions: {
connectionString:
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<your-connection-string>",
},
});
// Create a span and record an exception
const tracer = trace.getTracer("testTracer");
const span = tracer.startSpan("hello");
try {
throw new Error("Test Error");
} catch (error) {
span.recordException(error as Error);
} finally {
span.end();
}
console.log("Exception recorded on span");
}
}
Sada OpenTelemetry Python SDK se implementuje tak, aby se výjimky vyvolané automaticky zaznamenávaly a zaznamenávaly. Příklad tohoto chování najdete v následující ukázce kódu:
# 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")
Pokud chcete zaznamenat výjimky ručně, můžete tuto možnost zakázat v rámci správce kontextu a použít record_exception() ji přímo, jak je znázorněno v následujícím příkladu:
...
# 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)
...
Přidání vlastních rozsahů
Vlastní rozsah můžete přidat ve dvou scénářích. Za prvé, pokud už knihovna instrumentace neshromažďuje požadavek na závislost. Za druhé, pokud chcete modelovat proces aplikace jako rozsah v zobrazení komplexní transakce.
Poznámka:
Třídy Activity a ActivitySource z System.Diagnostics oboru názvů představují koncepty Span OpenTelemetry a Tracer, v uvedeném pořadí. Vytváříte ActivitySource přímo pomocí jeho konstruktoru místo pomocí .TracerProvider Každá ActivitySource třída musí být explicitně připojena TracerProvider pomocí .AddSource() Je to proto, že části rozhraní API trasování OpenTelemetry jsou začleněny přímo do modulu runtime .NET. Další informace najdete v tématu Úvod k rozhraní API pro trasování .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 výchozí hodnota ActivityKind.Internalje , ale můžete poskytnout jakékoli jiné ActivityKind.
ActivityKind.Client, ActivityKind.Producera ActivityKind.Internal jsou mapovány na Application Insights dependencies.
ActivityKind.Server a ActivityKind.Consumer jsou mapovány na Application Insights requests.
Poznámka:
Třídy Activity a ActivitySource z System.Diagnostics oboru názvů představují koncepty Span OpenTelemetry a Tracer, v uvedeném pořadí. Vytváříte ActivitySource přímo pomocí jeho konstruktoru místo pomocí .TracerProvider Každá ActivitySource třída musí být explicitně připojena TracerProvider pomocí .AddSource() Je to proto, že části rozhraní API trasování OpenTelemetry jsou začleněny přímo do modulu runtime .NET. Další informace najdete v tématu Úvod k rozhraní API pro trasování .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 výchozí hodnota ActivityKind.Internalje , ale můžete poskytnout jakékoli jiné ActivityKind.
ActivityKind.Client, ActivityKind.Producera ActivityKind.Internal jsou mapovány na Application Insights dependencies.
ActivityKind.Server a ActivityKind.Consumer jsou mapovány na Application Insights requests.
Použití poznámky OpenTelemetry
Nejjednodušší způsob, jak přidat vlastní rozsahy, je použití anotace OpenTelemetry @WithSpan .
Zaplní tabulky requests a dependencies tabulky v Application Insights.
Přidejte opentelemetry-instrumentation-annotations-1.32.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-annotations</artifactId>
<version>1.32.0</version>
</dependency>
@WithSpan K vygenerování rozsahu při každém spuštění metody použijte poznámku:
import io.opentelemetry.instrumentation.annotations.WithSpan;
@WithSpan(value = "your span name")
public void yourMethod() {
}
Ve výchozím nastavení končí rozsah v dependencies tabulce s typem InProczávislosti .
U metod představujících úlohu na pozadí, kterou autoinstrumentace nezachytí, doporučujeme použít atribut kind = SpanKind.SERVER na @WithSpan anotaci, aby se zajistilo, že se zobrazí v tabulce Application Insights requests .
Použití rozhraní OpenTelemetry API
Pokud předchozí poznámka OpenTelemetry @WithSpan nevyhovuje vašim potřebám, můžete rozsahy přidat pomocí rozhraní API OpenTelemetry.
Přidejte opentelemetry-api-1.0.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
GlobalOpenTelemetry Pomocí třídy vytvořte Tracer:
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
static final Tracer tracer = GlobalOpenTelemetry.getTracer("com.example");
Vytvořte rozsah, nastavte ho jako aktuální a pak ho ukončete:
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();
}
Vložit OpenTelemetry:
Vytvořit Tracer:
import io.opentelemetry.api.trace.Tracer;
static final Tracer tracer = openTelemetry.getTracer("com.example");
Vytvořte rozsah, nastavte ho jako aktuální a pak ho ukončete:
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();
}
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
export class CustomTraceSample {
static async run() {
// Dynamically import Azure Monitor and tracing API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { trace } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor({
azureMonitorExporterOptions: {
connectionString:
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<your-connection-string>",
},
});
// Create a custom span, add attributes/events, then end
const tracer = trace.getTracer("otel_azure_monitor_custom_trace_demo");
const span = tracer.startSpan("doWork");
try {
span.setAttribute("component", "worker");
span.setAttribute("operation.id", "42");
span.addEvent("invoking doWork");
for (let i = 0; i < 1_000_000; i++) { /* simulate work */ }
} catch (err) {
span.recordException(err as Error);
} finally {
span.end();
}
console.log("Custom span recorded");
}
}
Rozhraní API OpenTelemetry se dá použít k přidání vlastních rozsahů, které se zobrazují v requests tabulkách a dependencies v Application Insights.
Příklad kódu ukazuje, jak použít metodu tracer.start_as_current_span() ke spuštění, nastavit rozsah jako aktuální a ukončit rozsah v kontextu.
...
# 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)
...
Ve výchozím nastavení je rozsah v dependencies tabulce s typem InProczávislosti .
Pokud vaše metoda představuje úlohu na pozadí, která ještě není zachycena automatickou instruací, doporučujeme nastavit atribut kind = SpanKind.SERVER , aby se zajistilo, že se zobrazí v tabulce Application Insights requests .
...
# 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.
...
Odesílání vlastních událostí
Application Insights ukládá vlastní události v customEvents tabulce. Jedním ze způsobů, jak je analyzovat, filtrovat a vizualizovat, je použití Application Insights.
Pokud chcete automatizovat kolekci událostí interakce na straně klienta, můžete použít modul plug-in v sadě JavaScript SDK.
Vlastní události jsou ve verzi Public Preview a používají Azure.Monitor.OpenTelemetry.AspNetCore 1.3.0-beta.3.
Pokud chcete odeslat CustomEvent pomocí ILogger, nastavte atribut "microsoft.custom_event.name" v šabloně zprávy.
// 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");
Vlastní události jsou ve verzi Public Preview a používají Azure.Monitor.OpenTelemetry.Exporter 1.4.0-beta.3.
Pokud chcete odeslat CustomEvent pomocí ILogger, nastavte atribut "microsoft.custom_event.name" v šabloně zprávy.
// 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");
Pro odeslání customEvent s Java agentem nastavte "microsoft.custom_event.name" atribut na záznam protokolu OpenTelemetry.
V závislosti na tom, jestli se používá agent Java Application Insights nebo sada SDK pro automatickou konfiguraci, se způsob načtení protokolovacího nástroje OpenTelemetry mírně liší. Tento detail je podrobněji vysvětlen v následujících příkladech.
Pro java agenta služby 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();
Pro autokonfigurační SDK:
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();
Pokud chcete spolehlivě generovat vlastní události, použijte přímo rozhraní API OpenTelemetry. Některé logovací frameworky nepodporují připojení nebo zpracování atributu vlastních událostí.
Pomocí atributu customEvent v nativní javě není možné odeslat"microsoft.custom_event.name".
Chcete-li odeslat customEvent pomocí logger.emit, nastavte "microsoft.custom_event.name" atribut v objektu attributes protokolu. Podle potřeby je možné zahrnout i další atributy.
export class CustomEventSample {
static async run() {
// Dynamically import Azure Monitor and the OpenTelemetry logs API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { logs, SeverityNumber } = await import("@opentelemetry/api-logs");
// Initialize Azure Monitor (enables logs bridge)
const monitor = useAzureMonitor();
// Get a logger and emit a customEvent by setting the microsoft attribute key
const logger = logs.getLogger("my-app-logger");
logger.emit({
body: "Hello World!",
severityNumber: SeverityNumber.INFO,
attributes: {
"microsoft.custom_event.name": "test-event-name",
"additional_attrs": "val1",
},
});
// Example: populate client_IP via attribute 'client.address'
logger.emit({
body: "This entry will have a custom client_IP",
severityNumber: SeverityNumber.INFO,
attributes: {
"microsoft.custom_event.name": "test_event",
"client.address": "192.168.1.1",
},
});
console.log("Custom events emitted");
}
}
Pokud chcete odeslat v Pythonu customEvent , použijte knihovnu protokolování s atributem "microsoft.custom_event.name" v parametru 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"
}
)
Úprava telemetrie
Tato část vysvětluje, jak upravit telemetrii.
Přidání atributů span
Mezi tyto atributy může patřit přidání vlastní vlastnosti do telemetrie. Pomocí atributů můžete také nastavit volitelná pole ve schématu Application Insights, jako je IP adresa klienta.
Přidání vlastní vlastnosti do spanu
Všechny atributy , které přidáte do rozsahů, se exportují jako vlastní vlastnosti.
Naplní pole customDimensions v tabulce požadavků, závislostí, trasování nebo výjimek.
Pokud chcete přidat atributy span, použijte jeden z následujících dvou způsobů:
- Použijte možnosti poskytované knihovnami instrumentace.
- Přidání vlastního procesoru span
Návod
Výhodou použití možností poskytovaných knihovnami instrumentace, pokud jsou k dispozici, je, že je k dispozici celý kontext. V důsledku toho mohou uživatelé vybrat přidání nebo filtrování dalších atributů. Například možnost rozšiřování v knihovně instrumentace HttpClient poskytuje uživatelům přístup k HttpRequestMessage a samotné httpResponseMessage . Můžou z něj vybrat cokoli a uložit ho jako atribut.
Mnoho knihoven instrumentace nabízí možnost obohacení. Pokyny najdete v souborech readme jednotlivých knihoven instrumentace:
Použití vlastního procesoru:
Návod
Před přidáním služby Azure Monitor přidejte procesor uvedený tady.
// 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();
Do projektu přidejte ActivityEnrichingProcessor.cs následující kód:
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");
}
}
Pokud chcete přidat atributy span, použijte jeden z následujících dvou způsobů:
- Použijte možnosti poskytované knihovnami instrumentace.
- Přidání vlastního procesoru span
Návod
Výhodou použití možností poskytovaných knihovnami instrumentace, pokud jsou k dispozici, je, že je k dispozici celý kontext. V důsledku toho mohou uživatelé vybrat přidání nebo filtrování dalších atributů. Například možnost rozšiřování v knihovně instrumentace HttpClient poskytuje uživatelům přístup k samotné httpRequestMessage. Můžou z něj vybrat cokoli a uložit ho jako atribut.
Mnoho knihoven instrumentace nabízí možnost obohacení. Pokyny najdete v souborech readme jednotlivých knihoven instrumentace:
Použití vlastního procesoru:
Návod
Před exportérem služby Azure Monitor přidejte procesor uvedený zde.
// 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();
Do projektu přidejte ActivityEnrichingProcessor.cs následující kód:
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");
}
}
Můžete použít opentelemetry-api k přidání atributů do rozsahů.
Přidání jednoho nebo více atributů span naplní customDimensions pole v requeststabulce , dependencies, tracesnebo exceptions tabulce.
Přidejte opentelemetry-api-1.0.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Přidejte do kódu vlastní dimenze:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.common.AttributeKey;
AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension");
Span.current().setAttribute(attributeKey, "myvalue1");
Přidejte do kódu vlastní dimenze:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.common.AttributeKey;
AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension");
Span.current().setAttribute(attributeKey, "myvalue1");
export class SpanAttributeEnrichmentSample {
static async run() {
// Dynamically import the Azure Monitor integration
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
// Create a SpanEnrichingProcessor to add custom dimensions
class SpanEnrichingProcessor {
forceFlush() { return Promise.resolve(); }
shutdown() { return Promise.resolve(); }
onStart() {}
onEnd(span: any) {
(span as any).attributes = (span as any).attributes || {};
(span as any).attributes["CustomDimension1"] = "value1";
(span as any).attributes["CustomDimension2"] = "value2";
}
}
// Initialize Azure Monitor with the custom processor
const monitor = useAzureMonitor({
spanProcessors: [new SpanEnrichingProcessor()],
});
console.log("Span enrichment processor registered");
}
}
Použití vlastního procesoru:
...
# 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],
)
...
Do projektu přidejte SpanEnrichingProcessor následující kód:
# 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"
Nastavení IP adresy uživatele
Pole client_IP pro žádosti můžete naplnit nastavením atributu v rozsahu. Application Insights používá IP adresu k vygenerování atributů umístění uživatele a ve výchozím nastavení ji zahodí.
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu vActivityEnrichingProcessor.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>");
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu vActivityEnrichingProcessor.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 toto pole automaticky naplní.
Toto pole se vyplní automaticky.
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu:
export class SetUserIpSample {
static async run() {
// Dynamically import Azure Monitor and tracing API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { trace } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor();
// Framework-agnostic helper to set client IP on the active server span
const setIpForRequest = (clientIp: string) => {
const span = trace.getActiveSpan();
if (span) {
// Preferred attribute for client IP
span.setAttribute("client.address", clientIp);
// Optional: legacy/alternate attribute
span.setAttribute("http.client_ip", clientIp);
}
};
// Call setIpForRequest("<IP Address>") from within your web framework's request pipeline
console.log("Use setIpForRequest('<IP Address>') inside your request handler to stamp the active span.");
}
}
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu vSpanEnrichingProcessor.py:
# Set the `http.client_ip` attribute of the span to the specified IP address.
span._attributes["http.client_ip"] = "<IP Address>"
Nastavení ID uživatele nebo ověřeného ID uživatele
Pole user_Id nebo user_AuthenticatedId pro žádosti můžete naplnit pomocí následujících doprovodných materiálů. ID uživatele je anonymní identifikátor uživatele. Ověřené ID uživatele je známý identifikátor uživatele.
Důležité
Než nastavíte ID ověřeného uživatele, obraťte se na příslušné zákony o ochraně osobních údajů.
Použijte příklad vlastní vlastnosti:
// Add the user ID to the activity as a tag, but only if the activity is not null.
activity?.SetTag("enduser.id", "<User Id>");
Použijte příklad vlastní vlastnosti:
// Add the user ID to the activity as a tag, but only if the activity is not null.
activity?.SetTag("enduser.id", "<User Id>");
Naplňte user ID pole v tabulce requests, dependenciesnebo exceptions tabulce.
Přidejte opentelemetry-api-1.0.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Nastavte user_Id v kódu:
import io.opentelemetry.api.trace.Span;
Span.current().setAttribute("enduser.id", "myuser"); // (user_AuthenticatedId)
Span.current().setAttribute("enduser.pseudo.id", "myuser"); // (user_Id)
Naplňte user ID pole v tabulce requests, dependenciesnebo exceptions tabulce.
Nastavte user_Id v kódu:
import io.opentelemetry.api.trace.Span;
Span.current().setAttribute("enduser.id", "myuser"); // (user_AuthenticatedId)
Span.current().setAttribute("enduser.pseudo.id", "myuser"); // (user_Id)
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu:
export class SetUserIdSample {
static async run() {
// Dynamically import Azure Monitor and tracing API
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const { trace } = await import("@opentelemetry/api");
// Initialize Azure Monitor
const monitor = useAzureMonitor();
// Framework-agnostic helper to set user identifiers on the active server span
const setUserForRequest = (authenticatedId?: string, anonymousId?: string) => {
const span = trace.getActiveSpan();
if (span) {
if (authenticatedId) span.setAttribute("enduser.id", authenticatedId); // user_AuthenticatedId
if (anonymousId) span.setAttribute("enduser.pseudo.id", anonymousId); // user_Id
}
};
// Call setUserForRequest("<authenticated-id>", "<anonymous-id>") inside your request handler
console.log("Use setUserForRequest('<auth-id>', '<anon-id>') inside your request handler to stamp the active span.");
}
}
Použijte příklad vlastní vlastnosti, ale nahraďte následující řádky kódu:
# Set the `enduser.id` attribute of the span to the specified user ID.
span._attributes["enduser.id"] = "<User ID>"
Přidání atributů protokolu
OpenTelemetry používá . ILoggerNET .
Připojení vlastních dimenzí k protokolům lze provést pomocí šablony zprávy.
OpenTelemetry používá . ILoggerNET .
Připojení vlastních dimenzí k protokolům lze provést pomocí šablony zprávy.
Logback, Log4j a java.util.logging se automaticky instrumentují. Připojení vlastních dimenzí k protokolům lze provést těmito způsoby:
U nativních aplikací Spring Boot je odsunutá funkce Logback.
export class BunyanLogAttributesSample {
static async run() {
// Dynamically import Azure Monitor and Bunyan
const { useAzureMonitor } = await import("@azure/monitor-opentelemetry");
const bunyanMod = await import("bunyan");
const bunyan = (bunyanMod as any).default ?? bunyanMod;
// Enable Azure Monitor integration and bunyan instrumentation
const monitor = useAzureMonitor({
instrumentationOptions: { bunyan: { enabled: true } },
});
// Emit a log with custom attributes
const log = (bunyan as any).createLogger({ name: "testApp" });
log.info({ key1: "value1", feature: "demo" }, "Warning log with properties");
console.log("Bunyan log with attributes emitted");
}
}
Knihovna protokolování Pythonu se automaticky implementuje. Vlastní dimenze můžete k protokolům připojit předáním slovníku do argumentu extra protokolů:
...
# Create a warning log message with the properties "key1" and "value1".
logger.warning("WARNING: Warning log with properties", extra={"key1": "value1"})
...
Získání ID trasování nebo ID rozsahu
Aktuálně aktivní span můžete získat Trace IDSpan ID pomocí následujícího postupu.
Poznámka:
Třídy Activity a ActivitySource z System.Diagnostics oboru názvů představují koncepty Span OpenTelemetry a Tracer, v uvedeném pořadí. Je to proto, že části rozhraní API trasování OpenTelemetry jsou začleněny přímo do modulu runtime .NET. Další informace najdete v tématu Úvod k rozhraní API pro trasování .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();
Poznámka:
Třídy Activity a ActivitySource z System.Diagnostics oboru názvů představují koncepty Span OpenTelemetry a Tracer, v uvedeném pořadí. Je to proto, že části rozhraní API trasování OpenTelemetry jsou začleněny přímo do modulu runtime .NET. Další informace najdete v tématu Úvod k rozhraní API pro trasování .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();
Můžete použít opentelemetry-api k získání ID trasování nebo ID rozsahu.
Přidejte opentelemetry-api-1.0.0.jar do aplikace (nebo novější):
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.0.0</version>
</dependency>
Získejte ID trasování požadavku a ID rozsahu v kódu:
import io.opentelemetry.api.trace.Span;
Span span = Span.current();
String traceId = span.getSpanContext().getTraceId();
String spanId = span.getSpanContext().getSpanId();
Získejte ID trasování požadavku a ID rozsahu v kódu:
import io.opentelemetry.api.trace.Span;
Span span = Span.current();
String traceId = span.getSpanContext().getTraceId();
String spanId = span.getSpanContext().getSpanId();
Získejte ID trasování požadavku a ID rozsahu v kódu:
export class GetTraceAndSpanIdSample {
static async run() {
// Dynamically import tracing API
const { trace } = await import("@opentelemetry/api");
// Read the span/trace id from the active span (if any)
const activeSpan = trace.getActiveSpan();
const spanId = activeSpan?.spanContext().spanId;
const traceId = activeSpan?.spanContext().traceId;
console.log("SpanId:", spanId, "TraceId:", traceId);
}
}
Získejte ID trasování požadavku a ID rozsahu v kódu:
# 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
Další kroky
- Další konfiguraci distribuce OpenTelemetry najdete v tématu Konfigurace OpenTelemetry služby Azure Monitor.
- Informace o zdrojovém kódu najdete v úložišti Azure Monitor AspNetCore na GitHubu.
- Pokud chcete nainstalovat balíček NuGet, vyhledat aktualizace nebo zobrazit poznámky k verzi, podívejte se na stránku balíčku NuGet AspNetCore služby Azure Monitor.
- Pokud se chcete seznámit se službou Azure Monitor a OpenTelemetry, podívejte se na ukázkovou aplikaci Azure Monitoru.
- Další informace o OpenTelemetry a její komunitě najdete v úložišti OpenTelemetry .NET Na GitHubu.
- Pokud chcete povolit používání, povolte monitorování uživatelů ve webovém nebo prohlížeči.
- Pokud chcete zkontrolovat nejčastější dotazy, postup řešení potíží, možnosti podpory nebo poskytnout zpětnou vazbu k OpenTelemetry, přečtěte si nápovědu k OpenTelemetry, podporu a zpětnou vazbu pro Azure Monitor Application Insights.
Poznámka:
Komunita Quarkus podporuje a udržuje rozšíření Quarkus. Pokud potřebujete pomoc, použijte kanály podpory komunity Quarkus. Microsoft neposkytuje technickou podporu pro tuto integraci.
- Informace o zdrojovém kódu a další dokumentaci najdete v úložišti Azure Monitor Distro Na GitHubu.
- Další ukázky a případy použití najdete v ukázkách distribuce služby Azure Monitor.
- Poznámky k verzi najdete v poznámkách k verzi na GitHubu.
- Pokud chcete nainstalovat balíček PyPI, vyhledat aktualizace nebo zobrazit poznámky k verzi, podívejte se na stránku balíčku Azure Monitor Distro PyPI.
- Pokud se chcete seznámit se službou Azure Monitor Application Insights a OpenTelemetry, podívejte se na ukázkovou aplikaci služby Azure Monitor.
- Další informace o OpenTelemetry a její komunitě najdete v úložišti GitHub v Pythonu OpenTelemetry.
- Informace o dostupných instrumentacích a komponentách OpenTelemetry najdete v úložišti GitHubu pro Přispěvatel OpenTelemetry v Pythonu.
- Pokud chcete povolit používání, povolte monitorování uživatelů ve webovém nebo prohlížeči.
- Pokud chcete zkontrolovat nejčastější dotazy, postup řešení potíží, možnosti podpory nebo poskytnout zpětnou vazbu k OpenTelemetry, přečtěte si nápovědu k OpenTelemetry, podporu a zpětnou vazbu pro Azure Monitor Application Insights.