클라우드 네이티브 애플리케이션에 가시성 추가
이제 가시성의 중요도를 이해했으므로 이를 클라우드 네이티브 애플리케이션에 포함할 수 있는 방법을 살펴보겠습니다. 이 단계는 앱에 OpenTelemetry를 추가하여 수행합니다.
앱에 OpenTelemetry 추가
.NET에는 로깅, 메트릭 및 추적 데이터를 생성하는 기본 제공된 가시성 도구로 구성된 풍부한 에코시스템이 있습니다. 이러한 도구를 사용하여 클라우드 네이티브 애플리케이션에 가시성을 추가할 수 있습니다. 이러한 라이브러리는 다음과 같습니다.
- 로깅:
Microsoft.Extensions.Logging.ILogger
- 메트릭:
System.Diagnostics.Metrics.Meter
- 추적:
System.Diagnostics.Activity
및System.Diagnostics.ActivitySource
OpenTelemetry는 이전 원격 분석을 모두 사용하지만 먼저 클라우드 네이티브 앱에서 NuGet 패키지를 통해 OpenTelemetry 지원을 추가해야 합니다. 이러한 패키지는 세 가지 그룹으로 분류될 수 있습니다.
범주 | 패키지 | 설명 |
---|---|---|
Core API | OpenTelemetry | 핵심 OpenTelemetry 기능을 제공하는 기본 라이브러리입니다. |
Core API | OpenTelemetry.Extensions.Hosting | ASP.NET Core 호스트에서 OpenTelemetry 추적을 자동으로 시작 및 중지하기 위한 확장 메서드를 제공합니다. |
계측 | OpenTelemetry.Instrumentation.AspNetCore | ASP.NET Core 애플리케이션을 위한 계측입니다. 이 패키지는 코드를 작성하지 않고도 앱에 대한 수많은 메트릭을 수집합니다. |
내보내기 | OpenTelemetry.Exporter.Console | 콘솔용 내보내기 도구를 사용하면 앱이 원격 분석을 콘솔에 쓸 수 있습니다. |
클라우드 네이티브 앱에 포함할 수 있는 더 많은 계측 및 내보내기 도구 패키지가 있습니다. 자세한 내용은 OpenTelemetry를 통한 .NET 가시성을 참조하세요. 빌드 중인 앱 형식에 따라 가장 관련성이 높은 패키지를 추가할 수 있습니다.
이 모듈에서는 eShopLite 클라우드 기반 앱과 함께 OpenTelemetry를 사용하는 데 중점을 둡니다. 이 앱은 .NET Core 및 Blazor WebAssembly로 빌드되었으므로 모든 코드 예가 종속성 주입 활용을 기반으로 함을 의미합니다.
마이크로 서비스 앱의 제품 및 저장소 서비스 모두에 모든 OpenTelemetry
패키지를 포함하도록 선택할 수 있습니다. 그러나 실제 앱에는 더 많은 서비스가 있습니다. 이러한 모든 패키지를 각각에 추가하면 불필요한 중복이 발생합니다. 더 나은 방식은 모든 마이크로 서비스가 참조하여 관찰할 수 있는 새로운 진단 프로젝트를 솔루션에 추가하는 것입니다.
다음은 마이크로 서비스가 OpenTelemetry를 사용하기 위해 호출할 수 있는 메서드 AddObservability
를 만드는 몇 가지 코드 예입니다.
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();
}
}
이 메서드는 ASP.NET Core WebApplicationBuilder
에 서비스로 추가할 수 있는 IServiceCollection
클래스를 반환합니다.
그런 다음 이 작업은 OpenTelemetry 작성기를 저장하기 위해 변수 var otelBuilder = services.AddOpenTelemetry()
를 만듭니다. 그런 다음 코드는 메트릭과 추적을 otelBuilder
에 추가할 수 있습니다.
예를 들어, 이 구성은 다음에 대한 계측을 추가합니다.
- ASP.NET Core
- C# 런타임
- HttpCLient
- Kestrel 웹 서버
이러한 메트릭은 콘솔에 표시됩니다. .AddConsoleExporter()
메서드는 내보내기 도구를 작성기에 추가합니다.
또한 다음에 대한 추적을 콘솔에 추가합니다.
- ASP.NET Core
- HttpClient
- SQL 클라이언트
마지막 줄은 IServiceCollection
클래스를 반환합니다.
진단 프로젝트가 완료되면 프로젝트에 대한 참조를 추가하고 서비스에 코드 한 줄만 추가하면 됩니다. 예를 들어, 제품 서비스에 OpenTelemetry를 포함하려면 Product.csproj
파일에 프로젝트 참조를 추가합니다.
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
그런 다음 builder
선언 아래의 Program.cs
파일에 다음 줄을 추가합니다.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
이 코드를 eShopLite 앱의 제품 서비스에 추가해 보겠습니다.