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


이 기능의 가용성은 기능 플래그에 의해 제어됩니다.
자세한 내용은 분산 추적 기능의 역사를 참고하세요.

이 튜토리얼에서는 GitLab Observability 기능을 사용하여 .NET Core 애플리케이션을 생성, 구성, 계측 및 모니터링하는 방법을 알아봅니다.

시작하기 전에

이 튜토리얼을 따라 하려면 다음이 필요합니다:

  • GitLab.com 또는 GitLab 셀프 관리용 GitLab Ultimate 구독
  • .NET의 로컬 설치
  • Git, .NET 및 OpenTelemetry의 기본 개념 대한 기본 지식

GitLab 프로젝트 생성

첫 번째로, GitLab 프로젝트와 해당 액세스 토큰을 생성합니다.

  1. 왼쪽 사이드바에서 상단의 Create new ( ) 및 New project/repository를 선택합니다.
  2. Create blank project를 선택합니다.
  3. 프로젝트 세부 정보를 입력합니다.
    • Project name 필드에 dotnet-O11y-tutorial을 입력합니다.
  4. Create project를 선택합니다.
  5. dotnet-O11y-tutorial 프로젝트에서 왼쪽 사이드바에 있는 Settings > Access tokens를 선택합니다.
  6. api 범위와 Developer 역할로 액세스 토큰을 생성합니다. 토큰 값을 안전한 곳에 보관하세요.
    나중에 필요합니다.

.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}", animal);
                return Ok(emoji);
            }
            else
            {
                logger.LogInformation("동물 이모지를 찾을 수 없습니다: {animal}", animal);
                return NotFound("동물을 찾을 수 없습니다");
            }
        }
    }
    
  5. Properties 하위 디렉토리에서 launchSettings.json의 내용을 다음으로 교체합니다:

    {
      "$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. 계측으로 애플리케이션을 구성합니다.
    Self-managed 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. 모니터를 선택한 다음 로그, 메트릭, 또는 트레이스를 선택합니다.