튜토리얼: .NET 애플리케이션과 GitLab Observability 사용하기

이 기능의 가용성은 피처 플래그로 제어됩니다. 자세한 정보는 분산 추적 기능의 이력을 참조하십시오.

이 튜토리얼에서는 GitLab Observability 기능을 사용하여 .NET Core 애플리케이션을 만들고 구성, 계기화 및 모니터링하는 방법을 배웁니다.

시작하기 전에

이 튜토리얼을 따라가려면 다음이 있어야 합니다:

  • GitLab.com이나 GitLab self-managed의 GitLab Ultimate 구독
  • .NET의 로컬 설치
  • Git, .NET 및 OpenTelemetry의 핵심 개념에 대한 기본 지식

GitLab 프로젝트 생성

먼저 GitLab 프로젝트와 해당 액세스 토큰을 만듭니다.

  1. 왼쪽 사이드바에서 위쪽에 있는 새로 만들기 () 및 새 프로젝트/저장소 만들기를 선택합니다.
  2. 빈 프로젝트 만들기를 선택합니다.
  3. 프로젝트 세부정보를 입력합니다.
    • 프로젝트 이름 필드에 dotnet-O11y-tutorial을 입력합니다.
  4. 프로젝트 만들기를 선택합니다.
  5. dotnet-O11y-tutorial 프로젝트에서 왼쪽 사이드바에서 설정 > 액세스 토큰을 선택합니다.
  6. api 스코프와 개발자 역할을 가진 액세스 토큰을 만듭니다. 토큰 값을 안전한 곳에 저장합니다. 나중에 필요합니다.

.NET 애플리케이션 만들기

다음으로 계기화할 .NET 웹 애플리케이션을 만듭니다. 이 튜토리얼에서는 동물 이모지를 반환하는 장난감 응용프로그램을 만들어보겠습니다.

  1. dotnet-O11y-tutorial 프로젝트를 복제하고 dotnet-O11y-tutorial 디렉토리로 이동합니다.
  2. 다음을 실행하여 웹 애플리케이션을 만듭니다:

    dotnet new web
    
  3. 다음을 실행하여 동물 컨트롤러 파일을 만듭니다:

    touch AnimalController.cs
    
  4. AnimalController.cs의 내용을 다음과 같이 대체합니다:

    using Microsoft.AspNetCore.Mvc;
    
    public class AnimalsController : ControllerBase
    {
        private Dictionary<string, string> animals = new Dictionary<string, string>
        {
            { "dog", "🐶" },
            { "cat", "🐱" },
            { "fish", "🐟" }
        };
    
        private ILogger<AnimalsController> logger;
    
        public AnimalsController(ILogger<AnimalsController> logger)
        {
            this.logger = logger;
        }
    
        [HttpGet("/animals/{animal}")]
        public IActionResult GetAnimal([FromRoute] string animal)
        {
            if (animals.TryGetValue(animal, out string? emoji))
            {
                logger.LogInformation("Animal emoji found for: {animal}", animal);
                return Ok(emoji);
            }
            else
            {
                logger.LogInformation("Could not find animal emoji for: {animal}", animal);
                return NotFound("Animal not found");
            }
        }
    }
    
  5. launchSettings.json의 내용을 다음과 같이 대체합니다(Properties 하위 디렉토리 내):

    {
      "$schema": "http://json.schemastore.org/launchsettings.json",
      "profiles": {
        "http": {
          "commandName": "Project",
          "dotnetRunMessages": true,
          "launchBrowser": true,
          "applicationUrl": "http://localhost:8080",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }
    
  6. Program.cs의 내용을 다음과 같이 대체합니다:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddControllers();
    
    var app = builder.Build();
    
    app.MapControllers();
    
    app.Run();
    
  7. 애플리케이션을 빌드하고 실행합니다:

    dotnet build
    dotnet run
    
  8. http://localhost:8080/animals/dog를 방문하면 이모지 🐶를 볼 수 있습니다.

애플리케이션 계기화

  1. 필요한 OpenTelemetry 패키지를 설치합니다:

    dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Exporter.Console
    dotnet add package OpenTelemetry.Instrumentation.AspNetCore --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Http --prerelease
    
  2. Program.cs의 내용을 다음과 같이 대체합니다:

    using OpenTelemetry.Exporter;
    using OpenTelemetry.Logs;
    using OpenTelemetry.Metrics;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    
    var builder = WebApplication.CreateBuilder(args);
    
    const string serviceName = "dotnet-O11y-tutorial";
    
    string otelHeaders = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_HEADERS") ?? "empty";
    string otelBaseUrl = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "empty";
    
    builder.Services.AddOpenTelemetry()
        .ConfigureResource(resource => resource.AddService(serviceName))
        .WithTracing(tracing => tracing
            .AddSource(serviceName)
            .AddHttpClientInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddOtlpExporter(options =>
            {
                options.Endpoint = new Uri(otelBaseUrl + "/traces");
                options.Headers = otelHeaders;
                options.Protocol = OtlpExportProtocol.HttpProtobuf;
            }))
        .WithMetrics(metrics => metrics
            .AddMeter(serviceName)
            .AddHttpClientInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddOtlpExporter(options =>
            {
                options.Endpoint = new Uri(otelBaseUrl + "/metrics");
                options.Headers = otelHeaders;
                options.Protocol = OtlpExportProtocol.HttpProtobuf;
            }))
        .WithLogging(logging => logging
            .AddConsoleExporter()
            .AddOtlpExporter(options =>
            {
                options.Endpoint = new Uri(otelBaseUrl + "/logs");
                options.Headers = otelHeaders;
                options.Protocol = OtlpExportProtocol.HttpProtobuf;
            }));
    
    builder.Services.AddControllers();
    
    var app = builder.Build();
    
    app.MapControllers();
    
    app.Run();
    
  3. 프로젝트 ID를 찾습니다:
    1. dotnet-O11y-tutorial 프로젝트 개요 페이지에서 오른쪽 상단에 있는 작업 ()을 선택합니다.
    2. 프로젝트 ID 복사를 선택합니다. 나중에 사용할 수 있도록 복사한 ID를 저장합니다.
  4. 계기화로 애플리케이션을 구성합니다. 자체 관리형 GitLab을 사용하는 경우 gitlab.com을 자체 관리형 인스턴스 호스트명으로 대체합니다.
  5. 애플리케이션을 실행합니다.

    env OTEL_EXPORTER_OTLP_ENDPOINT="https://gitlab.com/api/v4/projects/{{PROJECT_ID}}/observability" \
    OTEL_EXPORTER_OTLP_HEADERS="PRIVATE-TOKEN={{ACCESS_TOKEN}}" \
    OTEL_LOG_LEVEL="debug" \
    dotnet run
    
  6. 이벤트를 생성하려면 http://localhost:8080/animals/dog을 방문합니다.

GitLab에서 정보 보기

테스트 프로젝트에서 내보낸 정보를 보려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 모니터를 선택한 다음 로그, 메트릭, 또는 추적 중 하나를 선택합니다.