[Infra] OpenTelemetry 및 Prometheus 연동하기

참고


개요

OpenTelemetry 는 클라우드 네이티브 소프트웨어에 관한 원격 분석 생성 및 수집의 표준화를 목표로 하는 Cloud Native Computing Foundation에서 지원하는 공급업체 중립 오픈 소스 프로젝트입니다. 기본 제공 플랫폼 메트릭 API는 이 표준을 사용하려는 .NET 개발자가 쉽게 통합할 수 있도록 이 표준과 호환되도록 설계되었습니다. 작성 당시에는 OpenTelemetry 메트릭에 대한 지원이 비교적 새로웠지만 Azure Monitor 및 많은 주요 APM 공급업체가 이를 승인했으며 통합 계획이 진행 중입니다.

다음 예제에서는 널리 사용되는 OSS Prometheus 및 Grafana 프로젝트를 사용하여 OpenTelemetry 메트릭에 사용할 수 있는 통합 중 하나를 보여줍니다. 메트릭 데이터는 다음과 같이 흐릅니다.

  1. .NET 메트릭 API 는 예제 애플리케이션에서 측정값을 수집합니다.
  2. 동일한 프로세스 내에서 실행되는 OpenTelemetry 라이브러리는 이러한 측정값을 집계합니다.
  3. Prometheus exporter 라이브러리는 HTTP 메트릭 엔드포인트를 통해 집계된 데이터를 사용할 수 있게 합니다. 'Exporter' 는 OpenTelemetry 가 공급업체별 백 엔드에 원격 분석을 전송하는 라이브러리라고 부르는 것입니다.
  4. 다른 컴퓨터에서 실행될 수 있는 Prometheus 서버는 메트릭 엔드포인트를 풀링하고, 데이터를 읽고, 장기 지속성을 위해 데이터베이스에 저장합니다. Prometheus 는 이것을 엔트포인트 '스크래핑' 이라고 합니다.
  5. 다른 컴퓨터에서 실행될 수 있는 Grafana 서버는 Prometheus 에 저장된 데이터를 쿼리하고 웹 기반 모니터링 대시보드에서 엔지니어에게 표시합니다.

OpenTelemetry 의 Prometheus exporter 를 사용하도록 예제 애플리케이션 구성

  • OpenTelemetry Prometheus exporter 에 대한 참조를 예제 애플리케이션에 추가합니다.
> dotnet add package OpenTelemetry.Exporter.Prometheus --version 1.2.0-beta1

Prometheus 내보내기 라이브러리에는 OpenTelemetry의 공유 라이브러리에 대한 참조가 포함되어 있으므로 이 명령은 두 라이브러리를 애플리케이션에 암시적으로 추가합니다.

  • Main() 시작 부분에 OpenTelemetry 를 구성하는 추가 코드가 포함되도록 Program.cs 코드를 수정합니다.
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
using System.Diagnostics.Metrics;

namespace Sample.DistributedTracing
{
    class Program
    {
        static Meter s_meter = new Meter("HatCo.HatStore", "1.0.0");
        static Counter<int> s_hatsSold = s_meter.CreateCounter<int>(name: "hats-sold",
                                                                    unit: "Hats",
                                                                    description: "The number of hats sold in our store");

        static void Main(string[] args)
        {
            using MeterProvider meterProvider = Sdk.CreateMeterProviderBuilder()
                    .AddMeter("HatCo.HatStore")
                    .AddPrometheusExporter(opt =>
                    {
                        opt.StartHttpListener = true;
                        opt.HttpListenerPrefixes = new string[] { $"http://localhost:9184/" };
                    })
                    .Build();

            Console.WriteLine("Press any key to exit");
            while (!Console.KeyAvailable)
            {
                // Pretend our store has a transaction each second that sells 4 hats
                Thread.Sleep(1000);
                s_hatsSold.Add(4);
            }
        }
    }
}

AddMeter("HatCo.HatStore")는 앱에서 정의한 미터에서 수집한 모든 메트릭을 전송하도록 OpenTelemetry를 구성합니다. AddPrometheusExporter(...)는 포트 9184에서 Prometheus의 메트릭 엔드포인트를 노출하고 HttpListener를 사용하도록 OpenTelemetry를 구성합니다. OpenTelemetry 구성 옵션, 특히 ASP.NET 애플리케이션에 유용한 대체 호스팅 옵션에 대한 자세한 내용은 OpenTelemetry 설명서를 참조하세요.


Prometheus Docker Compose 파일 구성

  • Prometheus 서버를 실행하기 위해서 Docker Compose 구성을 다음과 같이 작성하였습니다.
version: '3.4'

services:
    prometheus:
        image: prom/prometheus
        container_name: prometheus
        ports:
        -  9090:9090
        volumes:
        - D:/postgresql/prometheus/data/:/prometheus
        - D:/postgresql/prometheus/:/etc/prometheus/
        command: # web.enalbe-lifecycle은 api 재시작없이 설정파일들을 reload 할 수 있게 해줌
        - '--config.file=/etc/prometheus/prometheus.yml'
        - '--storage.tsdb.path=/prometheus'
        - '--web.console.libraries=/usr/share/prometheus/console_libraries'
        - '--web.console.templates=/usr/share/prometheus/consoles'
        restart: always

Prometheus 설정 및 구성

  • Prometheus가 예제 앱이 노출하는 메트릭 엔드포인트를 스크래핑하도록 prometheus.yml 구성 파일을 수정합니다. scrape_configs 섹션에 다음 텍스트를 추가합니다.
 - job_name: 'OpenTelemetryTest'
    scrape_interval: 1s # poll very quickly for a more responsive demo
    static_configs:
      - targets: ['localhost:9184']
  • 기본 구성에서 시작하는 경우 scrape_configs는 다음과 같이 표시됩니다.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: 'OpenTelemetryTest'
    scrape_interval: 1s # poll very quickly for a more responsive demo
    static_configs:
      - targets: ['localhost:9184']

프로메테우스 확인

  • Prometheus 웹 포털의 그래프 페이지에서 표현식 텍스트 상자에 hats_sold 를 입력합니다.
  • 그래프 탭에서 Prometheus 는 예제 애플리케이션에서 내보내는 "hats-sold" 카운터 값이 지속적으로 증가하는 것이 보여집니다.

728x90

'인프라' 카테고리의 다른 글

[인프라] Loki 란?  (0) 2022.08.19
[인프라] Jaeger, OpenTelemetry, Grafana 연동  (0) 2022.07.31
[인프라]Jaeger 란?  (0) 2022.07.30
[인프라] Zipkin 이란?  (0) 2022.07.29

이 글을 공유하기

댓글

Designed by JB FACTORY