AWS Distro for OpenTelemetry (ADOT) Collector 운영
ADOT collector는 CNCF의 오픈소스 OpenTelemetry Collector의 다운 스트림 배포판입니다.
고객은 ADOT Collector를 사용하여 온프레미스, AWS 및 기타 클라우드 제공자를 포함한 다양한 환경에서 metrics와 traces 같은 신호를 수집할 수 있습니다.
실제 환경에서 대규모로 ADOT Collector를 운영하려면 운영자가 collector의 상태를 모니터링하고 필요에 따라 확장해야 합니다. 이 가이드에서는 프로덕션 환경에서 ADOT Collector를 운영하기 위해 취할 수 있는 조치에 대해 알아봅니다.
배포 아키텍처
요구 사항에 따라 고려할 수 있는 몇 가지 배포 옵션이 있습니다.
- No Collector
- Agent
- Gateway
이러한 개념에 대한 추가 정보는 OpenTelemetry 문서를 확인하세요.
No Collector
이 옵션은 기본적으로 collector를 완전히 건너뜁니다. 알고 계시겠지만, OTEL SDK에서 직접 대상 서비스에 API 호출을 하여 신호를 보낼 수 있습니다. ADOT Collector와 같은 프로세스 외부 에이전트로 spans를 보내는 대신 애플리케이션 프로세스에서 직접 AWS X-Ray의 PutTraceSegments API를 호출하는 것을 생각해 보세요.
이 접근 방식에 대한 지침을 변경하는 AWS 특정 측면이 없으므로, 업스트림 문서의 해당 섹션을 참조하시기를 강력히 권장합니다.

Agent
이 접근 방식에서는 collector를 분산 방식으로 실행하고 대상으로 신호를 수집합니다. No Collector 옵션과 달리, 여기서는 관심사를 분리하고 애플리케이션이 원격 API 호출을 위해 자원을 사용할 필요 없이 로컬로 접근 가능한 에이전트와 통신하도록 분리합니다.
Amazon EKS 환경에서 collector를 Kubernetes 사이드카로 실행하면 기본적으로 다음과 같습니다:

이 아키텍처에서는 collector가 애플리케이션 컨테이너와 동일한 pod에서 실행되므로 localhost에서 대상을 스크래핑하기 때문에 서비스 디스커버리 메커니즘을 사용할 필요가 없습니다.
동일한 아키텍처가 traces 수집에도 적용됩니다. 여기에 표시된 것처럼 OTEL 파이프라인을 생성하기만 하면 됩니다.
장단점
-
이 설계를 지지하는 한 가지 주장은 대상이 localhost 소스로 제한되므로 Collector가 작업을 수행하기 위해 비정상적인 양의 리소스(CPU, 메모리)를 할당할 필요가 없다는 것입니다.
-
이 접근 방식의 단점은 collector pod 구성에 대한 다양한 구성의 수가 클러스터에서 실행 중인 애플리케이션의 수에 직접 비례한다는 것입니다. 이는 Pod에 예상되는 워크로드에 따라 각 Pod의 CPU, 메모리 및 기타 리소스 할당을 개별적으로 관리해야 함을 의미합니다. 이를 주의하지 않으면 Collector Pod에 리소스를 과다 또는 과소 할당하여 성능 저하가 발생하거나 노드의 다른 Pod에서 사용할 수 있는 CPU 사이클과 메모리를 잠그게 될 수 있습니다.
필요에 따라 Deployments, Daemonset, Statefulset 등의 다른 모델로도 collector를 배포할 수 있습니다.
Amazon EKS에서 Daemonset으로 collector 실행
EKS 노드 전체에 collector의 부하(스크래핑 및 Amazon Managed Service for Prometheus workspace로 metrics 전송)를 균등하게 분배하려면 collector를 Daemonset으로 실행할 수 있습니다.

collector가 자체 호스트/노드의 대상만 스크래핑하도록 하는 keep 액션이 있는지 확인하세요.
참고용 샘플은 아래와 같습니다. 추가 구성 세부 사항은 여기에서 확인할 수 있습니다.
scrape_configs:
- job_name: kubernetes-apiservers
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: $K8S_NODE_NAME
source_labels: [__meta_kubernetes_endpoint_node_name]
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
동일한 아키텍처를 traces 수집에도 사용할 수 있습니다. 이 경우 Collector가 엔드포인트에 접근하여 Prometheus metrics를 스크래핑하는 대신, 애플리케이션 pods가 trace spans를 Collector로 보냅니다.
장단점
장점
- 확장에 대한 우려가 최소화됨
- 고가용성 구성이 어려움
- 너무 많은 Collector 복사본 사용
- 로그 지원에 유리할 수 있음
단점
- 리소스 활용 측면에서 최적이 아님
- 불균형한 리소스 할당
Amazon EC2에서 collector 실행
EC2에서는 사이드카 접근 방식이 없으므로, EC2 인스턴스에서 에이전트로 collector를 실행합니다. 인스턴스에서 스크래핑할 대상을 검색하기 위해 아래와 같은 정적 스크래핑 구성을 설정할 수 있습니다.
아래 구성은 localhost의 포트 9090과 8081에서 엔드포인트를 스크래핑합니다.
이 주제에 대한 실습 경험은 One Observability Workshop의 EC2 중심 모듈을 참조 하세요.
global:
scrape_interval: 15s # 기본적으로 15초마다 대상을 스크래핑합니다.
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090', 'localhost:8081']
Amazon EKS에서 Deployment로 collector 실행
Deployment로 collector를 실행하는 것은 collector에 고가용성을 제공하려는 경우에 특히 유용합니다. 대상 수, 스크래핑 가능한 metrics 등에 따라 Collector의 리소스를 조정하여 collector가 부족하여 신호 수집에 문제가 발생하지 않도록 해야 합니다.
다음 아키텍처는 워크로드 노드 외부의 별도 노드에 collector가 배포되어 metrics와 traces를 수집하는 방법을 보여줍니다.

metrics 수집을 위한 고가용성 설정에 대해서는 자세한 설명을 제공하는 문서를 읽어보세요.
Amazon ECS에서 중앙 task로 collector를 실행하여 metrics 수집
ECS Observer extension을 사용하여 ECS 클러스터 또는 여러 클러스터의 다른 tasks에서 Prometheus metrics를 수집할 수 있습니다.

extension을 위한 샘플 collector 구성:
extensions:
ecs_observer:
refresh_interval: 60s # 형식은 https://golang.org/pkg/time/#ParseDuration
cluster_name: 'Cluster-1' # 클러스터 이름은 수동 설정 필요
cluster_region: 'us-west-2' # 리전은 직접 설정하거나 AWS_REGION 환경 변수 사용 가능
result_file: '/etc/ecs_sd_targets.yaml' # 파일의 디렉토리가 이미 존재해야 합니다
services:
- name_pattern: '^retail-.*$'
docker_labels:
- port_label: 'ECS_PROMETHEUS_EXPORTER_PORT'
task_definitions:
- job_name: 'task_def_1'
metrics_path: '/metrics'
metrics_ports:
- 9113
- 9090
arn_pattern: '.*:task-definition/nginx:[0-9]+'
장단점
- 이 모델의 장점은 직접 관리해야 할 collector와 구성이 적다는 것입니다.
- 클러스터가 상당히 크고 스크래핑할 대상이 수천 개인 경우, collector 간에 부하가 분산되도록 아키텍처를 신중하게 설계해야 합니다. HA를 위해 동일한 collector의 거의 동일한 복제본을 실행해야 하는 것도 운영 문제를 피하기 위해 주의 깊게 수행해야 합니다.