클라우드 네이티브 애플리케이션에 가시성 추가
이제 관찰 가능성의 중요성을 이해했으므로 클라우드 네이티브 애플리케이션에 이를 포함할 수 있는 방법을 확인할 수 있습니다. 앱에 OpenTelemetry를 추가하여 이 단계를 수행합니다.
앱에 OpenTelemetry 추가
.NET에는 로깅, 메트릭 및 추적 데이터를 생성하는 기본 제공 관찰 도구의 풍부한 에코시스템이 있습니다. 이러한 도구를 사용하여 클라우드 네이티브 애플리케이션에 가시성을 추가할 수 있습니다. 이러한 라이브러리는 다음과 같습니다.
-
로깅:
Microsoft.Extensions.Logging.ILogger -
메트릭:
System.Diagnostics.Metrics.Meter -
추적:
System.Diagnostics.Activity및System.Diagnostics.ActivitySource
OpenTelemetry는 이전의 모든 원격 분석을 사용하지만 먼저 클라우드 네이티브 앱은 NuGet 패키지를 통해 OpenTelemetry 지원을 추가해야 합니다. 이러한 패키지는 다음 세 그룹으로 분류할 수 있습니다.
| 카테고리 | 패키지 | 설명 |
|---|---|---|
| 핵심 API | OpenTelemetry | 핵심 OpenTelemetry 기능을 제공하는 기본 라이브러리입니다. |
| 핵심 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 CoreWebApplicationBuilder에 서비스로 추가할 수 있는 클래스를 반환 IServiceCollection 합니다.
그런 다음 OpenTelemetry 작성기를 저장하는 변수 var otelBuilder = services.AddOpenTelemetry() 를 만듭니다. 그런 다음, 코드에서 메트릭 및 추적을 추가할 수 있습니다 otelBuilder.
예를 들어 이 구성은 다음을 위한 계측을 추가합니다.
- ASP.NET Core
- C# 런타임
- HttpCLient
- Kestrel 웹 서버
이러한 메트릭은 콘솔에 표시됩니다. 이 메서드는 .AddConsoleExporter() 작성기에서 내보내기를 추가합니다.
또한 다음을 위해 추적을 콘솔에 추가합니다.
- ASP.NET Core
- HttpClient
- SQL 클라이언트
마지막 줄은 클래스를 반환합니다 IServiceCollection .
진단 프로젝트가 완료되면 프로젝트에 대한 참조와 한 줄의 코드를 서비스에 추가하는 것만큼 간단합니다. 예를 들어 Products 서비스에 OpenTelemetry를 포함하려면 파일에 프로젝트 참조를 추가합니다 Product.csproj .
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
그런 다음, 다음 줄을 선언 아래의 Program.cs 파일에 추가합니다 builder.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
eShopLite 앱의 Products 서비스에 이 코드를 추가해 보겠습니다.