AWS 환경에서의 OpenTelemetry Collector 활용에 대해 정리한 글입니다
특히 AWS Distro for OpenTelemetry(이하 ADOT)를 중심으로 Collector를 어떻게 구성하고 활용할 수 있는지 정리했습니다.
OpenTelemetry Collector란?
OpenTelemetry Collector(이하 OTEL Collector)는 로그, 메트릭, 트레이스와 같은 관측성 데이터(observability data)를 수집하고 처리한 후, 외부 백엔드(예: AWS CloudWatch, X-Ray, Prometheus 등)로 전송해주는 오픈소스 컴포넌트 입니다. Collector는 관측성 파이프라인의 중심에 위치하며, 다양한 수집기(Receiver)와 전처리기(Processor), 전송기(Exporter)를 플러그인처럼 조합하여 동작합니다.
애플리케이션에서 나오는 다양한 관측성 데이터를 표준화된 방식으로 모아서 필요한 곳으로 넘겨주는 역할이라고 볼 수 있습니다.
AWS가 배포하는 ADOT란?
AWS는 OpenTelemetry 프로젝트의 주요 기여자 중 하나로, OpenTelemetry Collector를 AWS에 최적화하여 배포한 것이 바로 ADOT(AWS Distro for OpenTelemetry)다. ADOT는 다음과 같은 특징을 가집니다
- AWS 서비스(CW Logs, X-Ray 등)와의 연동 기능이 내장돼 있음
- OpenTelemetry Collector를 기반으로 하되 AWS 인증, 네트워크, 모니터링에 최적화된 구성 제공
- 사용자가 직접 컴포넌트를 조합하여 Collector를 커스터마이징할 수 있도록 제공
Collector 구성요소 상세 설명
OTEL Collector는 크게 세 가지 핵심 컴포넌트로 구성됩니다
- Receivers
- 데이터를 수신하는 컴포넌트
- 예: OTLP, Prometheus, Jaeger, Zipkin, FluentForward 등 다양한 프로토콜을 지원
- Processors
- 수신된 데이터를 전처리하는 컴포넌트
- 데이터 필터링, 속성 추가, 배치 처리, 샘플링 등을 수행한다.
- Exporters
- 데이터를 외부 시스템으로 전송하는 컴포넌트
- 예: awscloudwatchlogs, awsxray, prometheusremotewrite 등
ADOT Collector의 빌드 종류
Collector는 사용 환경에 따라 다양한 빌드로 나뉘어 제공됩니다
- otelcol-otlp: OTLP 프로토콜만 수신 가능한 최소 구성
- otelcol: 일반적인 오픈소스 Collector 표준 빌드
- otelcol-k8s: Kubernetes 환경 전용 빌드 (k8s observer, kubeletstats 등 포함)
- otelcol-contrib: 모든 기여자 컴포넌트를 포함한 풀 옵션 빌드
AWS에서는 보통 otelcol 또는 otelcol-contrib을 사용하고, EKS 환경이라면 otelcol-k8s를 DaemonSet 또는 sidecar 형태로 배포하는 것이 일반적입니다.
Collector는 왜 필요한가? CloudWatch Agent랑 뭐가 다른가?
"로그나 메트릭을 CloudWatch에 보낼 거면 그냥 CloudWatch Agent 쓰면 되는 거 아닌가?"라는 생각을 할 수 있는데 아래와 같은 차이점이 있습니다.
- CloudWatch Agent는 단순히 로그/시스템 메트릭만 전송하는 역할
- OTEL Collector는 앱 수준의 트레이스, 커스텀 메트릭, 구조화 로그까지 수집 가능
- Collector는 수집한 데이터를 가공, 필터링, re라우팅 할 수 있음
- Collector를 통해 AWS뿐 아니라 Datadog, Grafana, New Relic 등 다양한 백엔드에 동시에 데이터 전송 가능
즉, Collector는 단순 에이전트를 넘어서는 관측성 파이프라인 플랫폼이라고 볼 수 있습니다.
Collector를 배포할 때 고려할 점
- 인프라 환경: EC2, ECS, EKS 어디에 배포할지에 따라 구성 방식이 달라짐
- IAM 권한 설정: CloudWatch Logs, X-Ray, EMF 등을 사용하는 경우 Collector 실행 주체에 적절한 IAM 권한이 부여되어야 함
- 리소스 사용량: Collector 자체가 CPU/메모리를 차지하므로, 수집량이 많은 경우 성능 최적화가 필요함
- 비용 관리: 필터링 없이 모든 데이터를 AWS로 전송하면 CloudWatch 비용이 급증할 수 있음. Processor 설정에서 불필요한 데이터 제거 및 샘플링 적용 권장
Amazon EC2 환경에서 ADOT Collector로 OTLP 로그/트레이스를 수집하여 CloudWatch Logs 및 X-Ray로 전송 가이드
1. ADOT Collector /파이썬 설치
EC2 인스턴스에 python과 ADOT Collector를 설치합니다.
- ADOT Collector 설치
sudo yum install -y https://aws-otel-collector.s3.amazonaws.com/amazon_linux/amd64/v0.43.1/aws-otel-collector.rpm
출처 : Releases · aws-observability/aws-otel-collector

- 필요한 라이브러리 설치
pip install opentelemetry-api opentelemetry-sdk \
opentelemetry-exporter-otlp \
opentelemetry-instrumentation-requests \
opentelemetry-sdk-logs
2. Collector/파이썬 설정 파일 작성
- Collectort 설정 파일 작성
/opt/aws/aws-otel-collector/etc/config.yaml 경로에 yaml 파일을 만들어 줍니다.
receivers:
otlp:
protocols:
grpc:
http:
filelog:
include: [ /var/log/myapp/application.log ]
start_at: beginning
operators:
type: json_parser
timestamp:
parse_from: attributes.time
layout: '%Y-%m-%d %H:%M:%S'
severity:
parse_from: attributes.level
processors:
batch:
exporters:
awscloudwatchlogs:
log_group_name: "adot-ec2-logs"
log_stream_name: "ec2-instance"
region: ap-northeast-2
awsxray:
region: ap-northeast-2
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [awsxray]
logs:
receivers: [otlp, filelog]
processors: [batch]
exporters: [awscloudwatchlogs]
- python 코드 생성
OpenTelemetry를 이용해 HTTP 요청을 수행하고 트레이스를 생성하여 OTLP Collector로 전송하는 실습용 Python 스크립트를 작성합니다.
/opt/aws/otel_trace_demo.py 경로에 파이썬 파일을 만들어 줍니다.
import time
import requests
import logging
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.requests import RequestsInstrumentor
# 로그 설정
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler("/var/log/myapp/application.log"), # Collector가 읽을 파일 경로
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Trace Provider 초기화
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
# OTLP Exporter 설정
otlp_exporter = OTLPSpanExporter(endpoint="localhost:4317", insecure=True)
span_processor = BatchSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
# 외부 요청 트레이싱
RequestsInstrumentor().instrument()
# 애플리케이션 로직
def make_request():
with tracer.start_as_current_span("main-workflow"):
logger.info("SY opentelemetry")
logger.info("외부 API 호출 중...")
response = requests.get("https://httpbin.org/get")
logger.info("응답 코드: %s", response.status_code)
time.sleep(0.5)
if __name__ == "__main__":
for _ in range(3):
make_request()
time.sleep(1)
3. IAM Role 역할 설정
새로운 IAM 역할을 생성해 대상 EC2에 연결합니다.


4. Collector 서비스 시작
sudo systemctl start aws-otel-collector
sudo systemctl status aws-otel-collector

5. 애플리케이션에서 Collector로 데이터 전송
OpenTelemetry SDK를 통해 자동으로 Collector에 데이터가 전송됩니다.
CloudWatch Logs → 로그 그룹 adot-ec2-logs로 전송된 로그 확인
AWS X-Ray → Trace ID 기반으로 요청 흐름 시각화 가능
6. 로그 확인
application 로그를 저장하는 위치
/var/log/myapp

- Cloudwatch Logs 확인


- x-ray 확인





OpenTelemetry Collector는 단순한 로그 수집기 수준을 넘어서 클라우드 환경에서의 통합 관측성 플랫폼으로 진화하고 있습니다. AWS에서 제공하는 ADOT는 이를 쉽게 구현할 수 있도록 다양한 최적화와 구성을 제공하며, 특히 멀티 서비스/멀티 포맷 환경에서 매우 유용합니다.
단순한 모니터링에서 벗어나 의미 있는 관측성과 운영 인사이트를 구축할 수 있습니다.
Made by 이승연 (LEE SEUNGYEON)
참고 문서
OpenTelemetry Collector の中身と種類を知ろう - builders.flash☆ - 変化を求めるデベロッパーを応援するウェブマガジン | AWS
GitHub - open-telemetry/opentelemetry-collector: OpenTelemetry Collector
'AWS > 운영' 카테고리의 다른 글
| 폐쇄망 환경에서 운영 문서를 위한 AWS 자산 목록 추출 방법 (0) | 2025.09.21 |
|---|---|
| 가비아 도메인을 AWS ACM에 등록하기 (0) | 2024.05.22 |
댓글