Pulsar 클러스터 모니터링

Pulsar 클러스터 모니터링 (Monitor)

Pulsar 클러스터가 잘 돌아가는지 확인하려면 토픽 사용량과 각 구성 요소의 상태를 보여주는 지표(metrics)를 수집해야 해요. 브로커, 메타데이터 저장소, BookKeeper 각각에서 지표를 수집하고 Prometheus로 모아 Grafana 대시보드에 띄울 수 있어요. 이 글에서는 지표 수집 방법부터 Prometheus 구성, 그리고 실험적인 OpenTelemetry 지원까지 정리해 드릴게요.

출처: 문서

본문

Pulsar 클러스터를 모니터링하는 방법은 여러 가지가 있어요. 토픽 사용량과 관련된 지표와 클러스터 개별 구성 요소의 전반적인 상태를 모두 노출할 수 있어요.

지표 수집

브로커 stats, 메타데이터 저장소 stats, BookKeeper stats를 수집할 수 있어요.

브로커 stats

브로커에서 Pulsar 브로커 지표를 수집하고 JSON 형식으로 내보낼 수 있어요. Pulsar 브로커 지표는 주로 두 가지 유형이 있어요:

  • Destination dumps: 각 토픽에 대한 stats를 담아요. 다음 명령으로 destination dumps를 가져올 수 있어요: bin/pulsar-admin broker-stats destinations
  • 브로커 지표: 네임스페이스 수준에서 집계된 브로커 정보와 토픽 stats를 담아요. 다음 명령으로 브로커 지표를 가져올 수 있어요: bin/pulsar-admin broker-stats monitoring-metrics

모든 메시지 비율은 1분마다 갱신돼요.

집계된 브로커 지표는 Prometheus 형식으로도 다음 위치에서 노출돼요:

http://$BROKER_ADDRESS:8080/metrics/

메타데이터 저장소 stats

메타데이터 저장소로 Oxia를 사용하면(새 클러스터에 권장) Oxia가 자체 지표를 노출해요. 제공하는 지표와 스크랩 방법은 Oxia 문서를 참조하세요.

아래 설명하는 stats는 메타데이터 저장소가 ZooKeeper일 때 적용돼요. Pulsar와 함께 번들로 제공되는 로컬 ZooKeeper, 구성 저장소 서버, 클라이언트는 Prometheus를 통해 상세 stats를 노출할 수 있어요.

http://$LOCAL_ZK_SERVER:8000/metrics
http://$GLOBAL_ZK_SERVER:8001/metrics

로컬 ZooKeeper의 기본 포트는 8000이고 구성 저장소의 기본 포트는 8001이에요. conf/zookeeper.conf 파일에서 metricsProvider.httpPort를 구성해 다른 stats 포트를 사용할 수 있어요.

BookKeeper stats

conf/bookkeeper.conf 파일에서 statsProviderClass를 수정해 BookKeeper의 stats 프레임워크를 구성할 수 있어요.

기본 BookKeeper 구성은 Prometheus exporter를 활성화해요. 이 구성은 Pulsar 배포판에 포함돼 있어요.

http://$BOOKIE_ADDRESS:8000/metrics

bookie의 기본 포트는 8000이에요. conf/bookkeeper.conf 파일에서 prometheusStatsHttpPort를 구성해 포트를 변경할 수 있어요.

관리 커서 확인(acknowledgment) 상태

확인 상태는 먼저 ledger에 영구 저장돼요. ledger에 확인 상태가 영구 저장되지 못하면 ZooKeeper에 저장돼요. 확인의 stats를 추적하려면 관리 커서에 대한 지표를 구성할 수 있어요.

pulsar_ml_cursor_persistLedgerSucceed(namespace=", ledger_name="", cursor_name:")
pulsar_ml_cursor_persistLedgerErrors(namespace="", ledger_name="", cursor_name:"")
pulsar_ml_cursor_persistZookeeperSucceed(namespace="", ledger_name="", cursor_name:"")
pulsar_ml_cursor_persistZookeeperErrors(namespace="", ledger_name="", cursor_name:"")
pulsar_ml_cursor_nonContiguousDeletedMessagesRange(namespace="", ledger_name="", cursor_name:"")

이 지표들은 Prometheus 인터페이스에 추가돼 있으며, Grafana에서 지표 stats를 모니터링하고 확인할 수 있어요.

함수 및 커넥터 stats

functions-worker에서 functions worker stats를 수집하고 JSON 형식으로 내보낼 수 있는데, functions worker JVM 지표를 포함해요.

pulsar-admin functions-worker monitoring-metrics

functions-worker에서 함수 및 커넥터 지표를 수집하고 JSON 형식으로 내보낼 수 있어요.

pulsar-admin functions-worker function-stats

집계된 함수 및 커넥터 지표는 아래와 같이 Prometheus 형식으로 노출할 수 있어요. FUNCTIONS_WORKER_ADDRESSWORKER_PORTfunctions_worker.yml 파일에서 얻을 수 있어요.

http://$FUNCTIONS_WORKER_ADDRESS:$WORKER_PORT/metrics:

Prometheus 구성

Prometheus를 사용해 Pulsar 구성 요소에 노출된 모든 지표를 수집하고, Grafana 대시보드를 설정해 지표를 표시하고 Pulsar 클러스터를 모니터링할 수 있어요. 자세한 내용은 Prometheus 가이드를 참조하세요.

바메탈에서 Pulsar를 실행하면 프로빙할 노드 목록을 제공할 수 있어요. Kubernetes 클러스터에 Pulsar를 배포하면 모니터링이 자동으로 설정돼요. 자세한 내용은 Kubernetes 지침을 참조하세요.

대시보드

시계열 통계를 수집할 때 가장 큰 문제는 데이터에 붙는 차원 수가 폭발하지 않도록 하는 거예요. 따라서 네임스페이스 수준에서 집계된 지표의 시계열만 수집하면 돼요.

Pulsar 토픽별 대시보드

토픽별 대시보드 지침은 Pulsar manager에서 확인할 수 있어요.

Grafana

Grafana를 사용해 Prometheus에 저장된 데이터로 구동되는 대시보드를 만들 수 있어요.

Pulsar Helm Chart로 Kubernetes에 Pulsar를 배포하면 pulsar-grafana Docker 이미지가 기본적으로 활성화돼요. 주요 대시보드와 함께 이 docker 이미지를 사용할 수 있어요.

다음은 몇 가지 Grafana 대시보드 예시예요:

  • pulsar-grafana: Kubernetes에서 실행되는 Pulsar 클러스터에 대해 Prometheus에서 수집된 지표를 표시하는 Grafana 대시보드예요.
  • apache-pulsar-grafana-dashboard: Kubernetes와 온프레미스 머신 모두에서 실행되는 다양한 Pulsar 구성 요소에 대한 Grafana 대시보드 템플릿 모음이에요.

알림 규칙

Pulsar 환경에 따라 알림 규칙을 설정할 수 있어요. Apache Pulsar에 대한 알림 규칙을 구성하려면 alerting rules를 참조하세요.

OpenTelemetry

상태

Pulsar는 버전 3.3.0부터 OpenTelemetry 지표를 내보내요. OpenTelemetry 로그와 트레이스 신호는 Pulsar가 노출하지 않아요. OpenTelemetry 지원은 현재 실험적이며 기존 Prometheus 지표 시스템을 보완하고, 궁극적으로는 대체하는 것이 목표예요. 노출하는 지표는 Prometheus 지표와 의미적으로 동일해요.

Pulsar가 노출하는 OpenTelemetry 지표의 상세 목록은 OpenTelemetry 지표를 참조하세요.

범위

Pulsar OpenTelemetry 지표는 현재 브로커에 대해서만 점진적으로 추가되고 있어요. 프록시와 function worker 지원은 향후 릴리스에서 계획 중이에요.

OpenTelemetry 구성

Pulsar는 OpenTelemetry 자동 계측 에이전트에 의존하지 않고 수동 계측을 통해 OpenTelemetry를 네이티브 지원해요. Pulsar는 OpenTelemetry의 자동 구성 확장을 사용해 SDK 구성을 관리해요. 이 확장은 환경 변수와 Java 시스템 속성에서 파라미터 입력을 허용해요. 아래 지침은 환경 변수에 의존하지만 시스템 속성을 사용하도록 적용할 수도 있어요. 이 변수들은 해당 배포 방식으로 Pulsar 프로세스에 노출해야 해요.

실험적인 파일 기반 구성은 현재 Pulsar가 지원하지 않는다는 점에 유의하세요.

텔레메트리 활성화

실험적인 OpenTelemetry 기능은 기본적으로 Pulsar에서 명시적으로 비활성화돼 있어요. SDK를 활성화하려면 환경 변수 OTEL_SDK_DISABLED=false를 설정하세요. 비활성화하면 지표가 수집되거나 내보내지지 않아요.

Exporter 구성

네이티브 OpenTelemetry 프로토콜과 Prometheus를 사용하는 Exporter는 기본적으로 Pulsar 배포 어셈블리에 포함돼 있어 바로 사용할 수 있어요. 다른 exporter는 현재 지원되지 않아요.

OTLP

네이티브 OTLP exporter는 Pulsar에서 지표를 얻는 권장 방식이에요. Apache Pulsar 커뮤니티가 (Prometheus가 아닌) OTLP exporter를 고성능으로 만들기 위해 작업하고 있기 때문이에요. Pulsar는 환경 변수 OTEL_METRICS_EXPORTER로 재정의하지 않는 한 기본적으로 OTLP exporter를 사용해요.

exporter를 사용하려면 환경 변수 OTEL_EXPORTER_OTLP_ENDPOINT를 해당 URL 엔드포인트로 설정하세요. 이 값은 OpenTelemetry Collector의 위치를 나타내야 해요. Pulsar는 gRPC와 HTTP 엔드포인트를 모두 지원해요.

exporter는 주기적으로 지표를 수집해 보내요. 이 과정은 기본적으로 60초마다 일어나며, 환경 변수 OTEL_METRIC_EXPORT_INTERVAL을 변경해 제어할 수 있어요.

인증, 압축, 타임아웃 같은 추가 구성 가능한 파라미터는 exporter 문서에 설명돼 있어요.

원격 Collector 고려 사항

원격 OTLP collector가 데이터를 Prometheus 또는 Prometheus 유사 시스템으로 다운스트림 전송한다면, OpenTelemetry 리소스 속성 pulsar.cluster를 각 시계열(지표)의 Prometheus 레이블로 복사하는 것을 권장해요. 이는 collector 변환으로 할 수 있어요.

아래 예시는 이를 위해 OpenTelemetry Transformation Languagetransform processor를 활용해요.

metrics:
  set(attributes["pulsar_cluster"], resource.attributes["pulsar.cluster"])
Prometheus

Pulsar는 OpenTelemetry 지표를 Prometheus 형식으로 내보내는 것을 지원해요. 이 exporter는 pull 기반이며 로컬 Pulsar 프로세스에 서버를 열어 동작해요. 사용하려면 OTEL_METRICS_EXPORTER=prometheus로 설정하고, 다음 환경 변수로 Prometheus 리스너 세부 정보를 설정하세요:

OTEL_EXPORTER_PROMETHEUS_HOST
OTEL_EXPORTER_PROMETHEUS_PORT

이 엔드포인트는 원격 Prometheus 스크랩 서버가 접근할 수 있어야 해요. 이 exporter는 OTLP exporter보다 리소스 효율이 낮다는 점에 유의하세요.

모든 OpenTelemetry 리소스 속성이 각 시계열의 Prometheus 레이블로 자동 복사돼요.

추가 구성 세부 사항은 exporter 문서를 참조하세요.

리소스 속성 구성

Pulsar는 다음 리소스 속성을 자동으로 설정해요:

속성 설명
pulsar.cluster Pulsar 클러스터의 이름.
service.name Pulsar 서비스의 이름. 브로커의 경우 기본값은 pulsar-broker.
service.version Pulsar 서비스의 버전.

이 속성들 중 어느 것이든 환경 변수 OTEL_RESOURCE_ATTRIBUTES로 재정의할 수 있어요. 추가 속성도 더할 수 있어요. 예를 들어:

OTEL_RESOURCE_ATTRIBUTES=pulsar.cluster=my-cluster,service.name=my-broker,service.version=1.0.0,custom.attr=custom-value

리소스 속성 구성에 대한 자세한 내용은 SDK 문서를 참조하세요.

호스트 이름, 프로세스 ID, 운영 체제 같은 추가 런타임 리소스 속성은 SDK가 Resource Provider를 사용해 자동으로 유추해요. 이 속성에 대한 설명은 각각의 문서를 참조하세요. Resource Provider 구성에 대한 자세한 내용은 문서에서 얻을 수 있어요.

속성 카디널리티 구성

OpenTelemetry는 속성의 최대 카디널리티를 제어하는 실험적 메커니즘을 제공해요. 이는 exporter의 리소스 사용량을 제한하는 데 유용해요. Pulsar는 기본적으로 이 값을 10000개 속성으로 설정해요. 토픽이 많은 브로커의 경우 이 값이 부족할 수 있어요. 이 값은 환경 변수 OTEL_EXPERIMENTAL_METRICS_CARDINALITY_LIMIT로 제어해요.

메모리 재사용 구성

OpenTelemetry는 지표 속성의 재사용을 제어하는 실험적 메커니즘을 제공해요. 이는 높은 카디널리티 지표를 가진 시스템에서 특히 유용한데, collector 실행으로 인한 메모리 할당 수를 줄여주기 때문이에요. 이 메커니즘은 Pulsar에서 기본적으로 활성화되어 있으며, 환경 변수 OTEL_JAVA_EXPERIMENTAL_EXPORTER_MEMORY_MODE로 재정의할 수 있어요. 자세한 내용과 유효한 구성 값은 exporter 구성 문서를 참조하세요.

더 알아보기 (Learn more)