Instrumentación personalizada de .NET con la API de OpenTelemetry
Overview
There are a few reasons to manually instrument your applications with the OpenTelemetry API:
- You are not using Datadog supported library instrumentation.
- You want to extend the
ddtrace
library’s functionality. - You need finer control over instrumenting your applications.
The ddtrace
library provides several techniques to help you achieve these goals. The following sections demonstrate how to use the OpenTelemetry API for custom instrumentation to use with Datadog.
Configuración
Para configurar OpenTelemetry para utilizar el proveedor de traza de Datadog:
Añade la instrumentación manual de OpenTelemetry deseada a tu código .NET siguiendo la documentación de la Instrumentación manual de OpenTelemetry .NET. Nota: Cuando esas instrucciones indiquen que tu código debe llamar al SDK de OpenTelemetry, llama a la biblioteca de rastreo de Datadog en su lugar.
Instala la biblioteca de rastreo de .NET y activa el rastreador para tu servicio .NET Framework o tu servicio .NET Core (y .NET 5+). Fase beta: puedes hacerlo opcionalmente con la Instrumentación de paso único de APM.
Establece la variable de entorno DD_TRACE_OTEL_ENABLED
en true
.
Ejecuta tu aplicación.
Datadog combina estos tramos de OpenTelemetry con otros tramos de Datadog APM en una traza única de tu aplicación. También es compatible con la biblioteca de instrumentación de OpenTelemetry.
Creación de tramos personalizados
Para crear tramos manualmente que inicien una nueva traza independiente:
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
// Iniciar un nuevo tramo
using (Activity? activity = Telemetry.ActivitySource.StartActivity("<RESOURCE NAME>"))
{
activity?.SetTag("operation.name", "custom-operation");
// Hacer algo
}
Creación de tramos
Para crear tramos personalizados dentro de un contexto de traza existente:
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using (Activity? parentScope = Telemetry.ActivitySource.StartActivity("<RESOURCE NAME>"))
{
parentScope?.SetTag("operation.name", "manual.sortorders");
using (Activity? childScope = Telemetry.ActivitySource.StartActivity("<RESOURCE NAME>"))
{
// Anidar con sentencias en el código para rastrear
childScope?.SetTag("operation.name", "manual.sortorders.child");
SortOrders();
}
}
Añadir etiquetas al tramo
Añade etiquetas personalizadas a tus tramos para proporcionar un contexto adicional:
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
public class ShoppingCartController : Controller
{
private IShoppingCartRepository _shoppingCartRepository;
[HttpGet]
public IActionResult Index(int customerId)
{
Activity? activity =
Telemetry.ActivitySource.StartActivity("<RESOURCE NAME>")
// Añadir una etiqueta al tramo para usarlo en la interfaz de usuario web de Datadog
activity?.SetTag("customer.id", customerId.ToString());
var cart = _shoppingCartRepository.Get(customerId);
return View(cart);
}
}
Errores de ajuste en tramos
Establece la información de error en un tramo cuando se produce un error durante su ejecución.
try
{
// hacer el trabajo que pueda arrojar una excepción
}
catch(Exception e)
{
activity?.SetTag("error", 1);
activity?.SetTag("error.msg", exception.Message);
activity?.SetTag("error.stack", exception.ToString());
activity?.SetTag("error.type", exception.GetType().ToString());
}
Puedes configurar la propagación de contexto para trazas distribuidas al inyectar y extraer encabezados. Consulta Propagación de contexto de traza para obtener información.
Leer más
Más enlaces, artículos y documentación útiles: