안녕하세요! 오늘은 쿠버네티스(Kubernetes) 환경에서 시스템을 모니터링하고 추적할 때 누구나 한 번쯤 마주쳤을 법한 문제를 해결해 줄 OpenTelemetry Collector의 핵심 프로세서(Processor)들에 대해 깊이 파고드는 시간을 갖겠습니다.
혹시 이런 경험 없으신가요? 🤔
"애플리케이션 로그와 트레이스 데이터가 쏟아져 들어오는데... 대체 어떤 Pod, 어떤 Namespace에서 온 데이터인지 알 수가 없네! 디버깅 너무 힘들다... 😭"
이런 막막한 상황을 한 방에 해결해 줄 영웅이 바로 오늘 우리가 함께 알아볼 프로세서들입니다. 특히, 질문에 대한 정답인 k8sattributes를 중심으로 다른 프로세서들은 어떤 역할을 하는지, 어떻게 함께 사용하는지 모두 알려드릴게요!

⭐ 오늘의 주인공: Kubernetes Attributes Processor (k8sattributes)
질문의 정답이었던 k8sattributes 프로세서는 이름 그대로 쿠버네티스 환경을 위한 전용 프로세서입니다. 이 친구가 하는 역할은 아주 명확하고 강력합니다.
- 역할: OTel Collector로 들어오는 텔레메트리 데이터(Traces, Metrics, Logs)에 쿠버네티스 메타데이터를 자동으로 풍성하게 추가해 줍니다.
- 동작 방식: Collector가 실행되는 환경의 Kubernetes API 서버와 통신합니다. 데이터가 발생한 IP 주소를 기반으로 해당 IP가 어떤 Pod에 속하는지 API 서버에 물어본 뒤, 그 Pod의 이름, 네임스페이스, 레이블, 어노테이션, 배포 정보 등을 알아내어 데이터에 '꼬리표'처럼 붙여줍니다. 🕵️♂️
이 프로세서를 거치고 나면, 우리의 데이터는 아래와 같은 멋진 속성들을 갖게 됩니다.
- k8s.pod.name
- k8s.pod.uid
- k8s.pod.ip
- k8s.namespace.name
- k8s.node.name
- k8s.deployment.name
- k8s.replicaset.name
- ... 등등!
이 정보들 덕분에 우리는 Grafana, Jaeger 같은 도구에서 "특정 Namespace에서 발생한 에러 로그만 보기" 또는 "특정 Deployment에 속한 Pod들의 평균 응답 시간 측정하기"와 같은 강력한 필터링과 그룹화를 할 수 있게 됩니다.
📝 설정 예시 (otel-collector-config.yaml)
processors:
k8sattributes:
# passthrough 모드를 false로 하면 Collector가 직접 K8s API와 통신하여
# IP 주소를 기반으로 메타데이터를 찾아냅니다.
passthrough: false
# API 서버로부터 가져올 메타데이터 규칙을 정의할 수 있습니다.
extract:
metadata:
- k8s.pod.name
- k8s.pod.uid
- k8s.deployment.name
- k8s.namespace.name
- k8s.node.name
service:
pipelines:
traces:
receivers: [otlp]
# 파이프라인에 k8sattributes 프로세서를 추가합니다.
processors: [k8sattributes, batch]
exporters: [logging]
🎛️ 다른 후보들도 알아볼까요? (Resource, Filter, Attributes)
k8sattributes가 정답인 이유는 알았지만, 다른 프로세서들은 어떤 역할을 하는지 알아야 진정한 전문가겠죠?
1. Resource Processor (resource) 🏷️
이 프로세서는 들어오는 모든 데이터에 정적(Static)인 리소스 속성을 추가하는 역할을 합니다. k8sattributes처럼 동적으로 무언가를 찾아내는 것이 아니라, 설정 파일에 미리 정의해 둔 값을 일괄적으로 붙여줍니다.
- 사용 예시:
- service.name: my-awesome-app (우리 서비스 이름)
- service.version: 1.2.3 (현재 배포 버전)
- environment: production (운영 환경인지 개발 환경인지)
k8sattributes가 "데이터가 온 곳"을 알려준다면, resource 프로세서는 "데이터를 처리하는 시스템의 정체성"을 알려준다고 생각하면 쉽습니다.
📝 설정 예시
processors:
resource:
attributes:
- key: service.version
value: "1.2.3"
action: insert
- key: environment
value: "production"
action: insert
2. Filter Processor (filter) 🚫
이름에서 알 수 있듯이, 이 프로세서는 데이터를 필터링하는 역할을 합니다. 특정 조건에 맞는 데이터를 포함시키거나 제외할 수 있습니다.
- 사용 예시:
- 너무 많이 들어오는 /healthz 같은 헬스 체크 트레이스는 제외하고 싶을 때
- 특정 IP 대역에서 들어오는 테스트 데이터는 수집하지 않고 싶을 때
디버깅에 필요 없거나 저장 비용만 차지하는 데이터를 초반에 쳐내는 '문지기' 역할을 합니다.
📝 설정 예시
processors:
filter:
# traces 데이터에 대한 필터링 규칙
traces:
# /healthz 라는 이름을 가진 span은 제외(exclude)
span:
- 'name == "/healthz"'
action: exclude
3. Attributes Processor (attributes) 🔧
이 프로세서는 이미 데이터에 존재하는 속성(Attribute)들을 조작하는 범용 도구입니다. 특정 속성을 추가, 수정, 삭제하는 등 다양한 작업을 할 수 있습니다.
- 사용 예시:
- user.id 속성값이 개인정보보호를 위해 필요하다면, 해당 값을 해시(hash) 처리해서 user.id_hashed 라는 새로운 속성으로 바꿀 때
- 여러 속성을 조합해서 새로운 속성을 만들 때
- 더 이상 필요 없는 속성을 삭제(delete)해서 데이터 크기를 줄일 때
k8sattributes가 쿠버네티스 메타데이터 '추가'에 특화되어 있다면, attributes 프로세서는 이미 있는 속성들을 '가공'하는 데 더 초점이 맞춰져 있습니다.
📝 설정 예시
processors:
attributes:
actions:
# http.url 속성을 http.full_url로 이름 변경 (rename)
- key: http.url
action: update
new_key: http.full_url
# user.email 속성은 민감하므로 삭제 (delete)
- key: user.email
action: delete
🔗 파이프라인: 프로세서들을 함께 사용하기
실제 환경에서는 이 프로세서들을 파이프라인(Pipeline)에 엮어서 순차적으로 사용합니다.
데이터 수신(Receiver) -> k8sattributes -> filter -> attributes -> 데이터 전송(Exporter)
- k8sattributes: 먼저 쿠버네티스 메타데이터를 풍부하게 추가하고,
- filter: 추가된 메타데이터를 기반으로 "A 네임스페이스의 헬스 체크 데이터는 제외해줘" 와 같이 더 정교한 필터링을 하고,
- attributes: 필요한 속성들을 정리하고 가공한 뒤,
- Exporter: 최종 목적지로 데이터를 보냅니다.
✨ 결론
이제 왜 쿠버네티스 환경에서 k8sattributes 프로세서가 필수적인지, 그리고 다른 프로세서들과 어떻게 협력하여 우리의 데이터를 더욱 가치있게 만드는지 이해되셨나요?
- Kubernetes Attributes Processor: 쿠버네티스 환경의 자동 메타데이터 추가 담당
- Resource Processor: 서비스 버전, 환경 등 정적 정보 추가 담당
- Filter Processor: 불필요한 데이터 제외 담당
- Attributes Processor: 기존 속성 편집 및 가공 담당
이 프로세서들을 잘 활용하면 복잡한 마이크로서비스 환경에서도 데이터의 출처를 명확히 하고, 원하는 데이터만 효율적으로 수집하여 문제 해결 능력을 비약적으로 향상시킬 수 있습니다. 이제 여러분도 OTel Collector 전문가입니다!
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| 📊 트레이스 데이터로 우리 서비스 완벽하게 모니터링하기: RED 지표 활용법 (0) | 2025.10.14 |
|---|---|
| 🕵️♂️ 분산 추적의 핵심! 헤드 기반 vs 테일 기반 샘플링, 완벽 정리 (0) | 2025.10.14 |
| 메트릭과 트레이스, 따로 보면 손해! 함께 봐야 하는 진짜 이유 🧐 (0) | 2025.10.14 |
| 백엔드 장애에도 끄떡없는 데이터 파이프라인의 비밀 🤫: Queued Retry Processor (0) | 2025.10.13 |
| ⛓️ 파이프라인과 파이프라인을 잇는 특별한 다리, 커넥터(Connector) 완벽 이해하기 (0) | 2025.10.13 |