Добавление наблюдаемости в облачное приложение
Теперь, когда вы понимаете важность наблюдаемости, вы увидите, как его можно включить в облачное приложение. На этом шаге добавьте OpenTelemetry в приложение.
Добавление OpenTelemetry в приложение
.NET имеет богатую экосистему встроенных средств наблюдения, которые создают ведение журнала, метрики и данные трассировки. Эти средства можно использовать для добавления наблюдаемости в облачное приложение. Эти библиотеки:
- Ведение журнала:
Microsoft.Extensions.Logging.ILogger
- Метрики:
System.Diagnostics.Metrics.Meter
- Трассировка:
System.Diagnostics.Activity
иSystem.Diagnostics.ActivitySource
OpenTelemetry использует все предыдущие данные телеметрии, но сначала ваше облачное приложение должно добавить поддержку OpenTelemetry через пакеты NuGet. Эти пакеты можно разделить на три группы:
Категория | Пакет | Description |
---|---|---|
Core API | OpenTelemetry | Основная библиотека, предоставляющая основные функции OpenTelemetry. |
Core API | OpenTelemetry.Extensions.Hosting | Предоставляет методы расширения для автоматического запуска и остановки трассировки OpenTelemetry в ASP.NET узлах Core. |
Инструментирование | OpenTelemetry.Instrumentation.AspNetCore | Инструментирование для приложений ASP.NET Core. Этот пакет собирает большое количество метрик о приложении без необходимости писать код. |
Экспортер | OpenTelemetry.Exporter.Console | Экспортер консоли позволяет приложению записывать данные телеметрии в консоль. |
Многие другие пакеты инструментирования и экспортера доступны для включения в облачное приложение. Дополнительные сведения см. в разделе о наблюдаемости .NET с помощью OpenTelemetry. В зависимости от типа создаваемого приложения можно добавить пакеты, наиболее важные для вас.
В этом модуле основное внимание уделяется использованию OpenTelemetry с приложением eShopLite для облака. Это приложение создано с помощью .NET Core и Blazor WebAssembly, поэтому это означает, что все примеры кода основаны на использовании внедрения зависимостей.
Вы можете включить все OpenTelemetry
пакеты в службы "Продукты " и "Магазин " в приложение микрослужб. Однако в реальном приложении у вас есть много служб. Добавление всех этих пакетов к каждому из них включает в себя ненужное дублирование. Лучший подход заключается в добавлении нового проекта диагностика в решение, на которое может ссылаться любая микрослужба.
Ниже приведен пример кода, который создает метод AddObservability
, который микрослужба может вызывать для использования OpenTelemetry:
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.DependencyInjection;
public static class DiagnosticServiceCollectionExtensions
{
public static IServiceCollection AddObservability(this IServiceCollection services,
string serviceName,
IConfiguration configuration)
{
// create the resource that references the service name passed in
var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");
// add the OpenTelemetry services
var otelBuilder = services.AddOpenTelemetry();
otelBuilder
// add the metrics providers
.WithMetrics(metrics =>
{
metrics
.SetResourceBuilder(resource)
.AddRuntimeInstrumentation()
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddEventCountersInstrumentation(c =>
{
c.AddEventSources(
"Microsoft.AspNetCore.Hosting",
"Microsoft-AspNetCore-Server-Kestrel",
"System.Net.Http",
"System.Net.Sockets");
})
.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
.AddConsoleExporter();
})
// add the tracing providers
.WithTracing(tracing =>
{
tracing.SetResourceBuilder(resource)
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSqlClientInstrumentation();
});
return services;
}
// Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
public static void MapObservability(this IEndpointRouteBuilder routes)
{
routes.MapPrometheusScrapingEndpoint();
}
}
Метод возвращает IServiceCollection
класс, который можно добавить как службу в ASP.NET Core WebApplicationBuilder
.
Затем это действие создает переменную var otelBuilder = services.AddOpenTelemetry()
для хранения построителя OpenTelemetry. Затем код может добавлять в нее метрики и трассировки otelBuilder
.
Например, эта конфигурация добавляет инструментирование для:
- ASP.NET Core
- Среда выполнения C#
- HttpCLient
- Веб-сервер Kestrel
Эти метрики отображаются в консоли. Метод .AddConsoleExporter()
добавляет экспортера в построитель.
Она также добавляет трассировку в консоль для:
- ASP.NET Core
- HttpClient
- Клиент SQL
Последняя строка возвращает IServiceCollection
класс.
После завершения диагностического проекта просто добавить ссылку на проект и одну строку кода в службу. Например, чтобы включить OpenTelemetry в службу продуктов , добавьте ссылку на проект в Product.csproj
файл:
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
Затем добавьте следующую строку в Program.cs
файл под объявлением builder
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
Давайте добавим этот код в службы Products в приложении eShopLite .