Collector 역할
- Agent - Agent 인스턴스는 서버나 Kubernetes 노드 같은 에지에서 데이터를 수집하거나, OpenTelemetry SDK로 계측된 애플리케이션으로부터 이벤트를 직접 수신합니다. 후자의 경우 Agent 인스턴스는 애플리케이션과 함께 또는 애플리케이션과 동일한 호스트(예: 사이드카 또는 데몬셋)에서 실행됩니다. Agent는 데이터를 직접 ClickHouse로 보내거나 gateway 인스턴스로 보낼 수 있습니다. 전자의 방식은 Agent 배포 패턴이라고 합니다.
- Gateway - Gateway 인스턴스는 독립적으로 실행되는 서비스를 제공합니다(예: Kubernetes의 배포). 일반적으로 클러스터, 데이터 센터 또는 리전 단위로 배포됩니다. 이 인스턴스는 단일 OTLP endpoint를 통해 애플리케이션(또는 agent 역할을 하는 다른 collector)으로부터 이벤트를 수신합니다. 일반적으로 여러 gateway 인스턴스를 배포하고, 기본 제공 로드 밸런서를 사용해 이들 사이에 부하를 분산합니다. 모든 agent와 애플리케이션이 이 단일 endpoint로 신호를 보내는 경우, 이를 흔히 Gateway 배포 패턴이라고 합니다.
collector 배포
- 관리형 ClickStack
- 오픈 소스 ClickStack
Managed ClickStack로 전송할 때는 가능하면 gateway 역할에 공식 ClickStack 배포판의 collector를 사용하시기를 권장합니다. 직접 구성한 collector를 사용하는 경우, ClickHouse exporter가 포함되어 있는지 확인하십시오.collector는 Helm(Kubernetes 환경 권장) 또는 Docker를 통해 배포할 수 있습니다. 공식 ClickStack Helm 차트는 업스트림 OpenTelemetry Collector Helm 차트를 서브차트로 내장하고 있으며, ClickStack 배포판 이미지가 사전 구성되어 있습니다. HyperDX를 포함한 전체 스택을 설치하려면 ClickStack Helm 배포 가이드를 참조하십시오. 독립형(standalone) collector만 배포하는 경우에는 아래와 같이 업스트림 차트를 ClickStack 이미지와 함께 직접 사용할 수 있습니다.대상 ClickHouse 인스턴스는 환경 변수 ClickStack에서 제공하는 OTel collector 배포판은 사용자 지정 설정 파일을 마운트하고 환경 변수를 설정하여 기본 구성을 확장할 수 있습니다.사용자 지정 수신기, processor 또는 파이프라인을 추가하려면 다음을 수행하세요:독립 실행형 collector로 배포:더 복잡한 구성이 필요하면 기본 ClickStack collector 구성과 ClickHouse exporter 문서를 참조하십시오.
- Helm
- Docker
OpenTelemetry의 업스트림 Helm 리포지토리를 추가합니다:ClickStack 이미지와 Managed ClickStack 자격 증명을 구성하는 차트를 설치합니다:프로덕션 배포에서는 값을 직접 넣는 대신
values.yaml을 생성합니다:CLICKHOUSE_PASSWORD를 Kubernetes 시크릿에 저장하고 extraEnvsFrom을 통해 참조하는 것을 권장합니다.CLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME, CLICKHOUSE_PASSWORD를 통해 구성됩니다. CLICKHOUSE_ENDPOINT에는 프로토콜과 포트를 포함한 전체 ClickHouse Cloud HTTP 엔드포인트를 지정해야 합니다(예시: https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443).Managed ClickStack 자격 증명을 확인하는 방법에 대한 자세한 내용은 여기를 참조하십시오.운영 환경 사용자운영 환경에서는 적절한 자격 증명을 갖춘 사용자를 사용해야 합니다.
구성 수정
Managed ClickStack 인스턴스 설정
OpenTelemetry collector는 환경 변수CLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME, CLICKHOUSE_PASSWORD를 통해 Managed ClickStack 인스턴스를 사용하도록 구성할 수 있습니다. 이 변수들을 설정하는 방법은 배포 방식에 따라 다릅니다.- Helm
- Docker
values.yaml의 extraEnvs에서 관련 항목을 재정의한 다음, 릴리스를 업그레이드합니다:collector 구성 확장하기
- 추가 구성이 포함된 사용자 지정 설정 파일을 생성합니다
- 파일을
/etc/otelcol-contrib/custom.config.yaml에 마운트합니다 - 환경 변수
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml를 설정합니다
사용자 지정 구성에서는 새 수신기, 프로세서, 파이프라인만 정의해야 합니다. 기본 프로세서(
memory_limiter, batch)와 익스포터(clickhouse)는 이미 정의되어 있으므로 이름으로 참조하십시오. 사용자 지정 구성은 기본 구성과 병합되며, 기존 구성 요소를 재정의할 수 없습니다.구성 구조
receivers, operators, processors를 포함해 OTel collector 구성에 대한 자세한 내용은 OpenTelemetry collector 공식 문서를 참조하십시오.Docker Compose
Docker Compose를 사용하는 경우 위와 동일한 환경 변수를 사용하여 collector 구성을 수정하십시오:collector 보안 설정
- Managed ClickStack
- 오픈 소스 ClickStack
기본적으로 ClickStack OpenTelemetry collector는 Open Source 배포판이 아닌 환경에 배포할 경우 보안이 적용되지 않으며, 해당 OTLP 포트에서는 인증이 필요하지 않습니다.수집을 보호하려면 collector를 배포할 때 프로덕션 배포에서는 추가로 다음 사항을 권장합니다.이는 collector가 데이터베이스
OTLP_AUTH_TOKEN 환경 변수를 사용해 인증 토큰을 지정하십시오. 설정 방법은 배포 방식에 따라 다릅니다.- Helm
- Docker
values.yaml의 extraEnvs에 OTLP_AUTH_TOKEN을 추가한 다음 release를 업그레이드하십시오.OTLP_AUTH_TOKEN과 CLICKHOUSE_PASSWORD를 Kubernetes 시크릿에 저장하고 extraEnvsFrom을 통해 참조하는 것을 권장합니다.- collector가 HTTPS를 통해 ClickHouse와 통신하도록 구성합니다.
- 수집 전용 사용자를 제한된 권한으로 생성하십시오. 자세한 내용은 아래를 참조하십시오.
- SDK/agent와 collector 간 통신이 암호화되도록 OTLP endpoint에 TLS를 활성화합니다. 이는 사용자 지정 collector 구성을 통해 설정할 수 있습니다.
수집 사용자 생성
Managed ClickStack로 수집할 때는 OTel collector 전용 데이터베이스와 사용자를 생성하는 것이 좋습니다. 이 사용자에게는 ClickStack가 생성하여 사용하는 테이블을 생성하고 데이터를 삽입할 수 있는 권한이 있어야 합니다.otel을 사용하도록 구성되어 있다고 가정합니다. 이 설정은 환경 변수 HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE로 제어할 수 있습니다. 다른 환경 변수와 마찬가지로 이 값을 collector에 전달하십시오.처리 - 필터링, 변환 및 보강
- 필터링 및 처리를 수행하는 자체 OTel collector를 배포하고, 이벤트를 OTLP를 통해 ClickStack collector로 보내 ClickHouse에 수집되도록 합니다.
- 자체 OTel collector를 배포하고, ClickHouse exporter를 사용해 이벤트를 ClickHouse로 직접 전송합니다.
-
프로세서 - 프로세서는 수신기에서 수집한 데이터를 수정하거나 변환한 후 exporter로 전송합니다. 프로세서는 collector 구성의
processors섹션에 설정된 순서대로 적용됩니다. 이는 선택 사항이지만, 일반적으로는 최소한의 프로세서 집합을 권장합니다. ClickHouse와 함께 OTel collector를 사용할 때는 프로세서를 다음 항목으로 제한하는 것을 권장합니다. - memory_limiter는 collector에서 메모리 부족 상황이 발생하지 않도록 하는 데 사용됩니다. 권장 사항은 리소스 추정을 참조하십시오.
- Context를 기반으로 보강을 수행하는 프로세서. 예를 들어 Kubernetes Attributes Processor는 k8s 메타데이터를 사용해 스팬, 메트릭, 로그의 리소스 속성을 자동으로 설정할 수 있으며, 예를 들어 이벤트에 소스 파드 ID를 추가해 보강할 수 있습니다.
- trace에 필요한 경우 tail 또는 head 샘플링
- 기본 필터링 - 연산자로 처리할 수 없는 경우, 필요하지 않은 이벤트를 삭제합니다(아래 참조).
- 배칭 - 데이터가 배치 단위로 전송되도록 보장하기 위해 ClickHouse와 함께 사용할 때 필수적입니다. “삽입 최적화”를 참조하십시오.
- 연산자 - 연산자는 수신기에서 사용할 수 있는 가장 기본적인 처리 단위를 제공합니다. 기본적인 파싱이 지원되므로 Severity 및 Timestamp와 같은 필드를 설정할 수 있습니다. 여기에서는 JSON 및 regex 파싱과 함께 이벤트 필터링 및 기본 변환도 지원됩니다. 이벤트 필터링은 여기에서 수행할 것을 권장합니다.
예시
regex_parser)하고 이벤트를 필터링하는 데 연산자를 사용하며, 이벤트를 batch로 묶고 메모리 사용량을 제한하는 processor도 함께 사용한다는 점에 유의하십시오.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
삽입 최적화
배칭
- (1) 데이터를 수신하는 노드에 문제가 생기면 삽입 쿼리가 timeout되거나(또는 더 구체적인 오류가 반환되거나) 확인 응답을 받지 못합니다.
- (2) 데이터가 노드에 기록되었지만 네트워크 중단으로 인해 확인 응답을 쿼리 전송자에게 반환할 수 없는 경우, 전송자는 timeout 또는 네트워크 오류를 받게 됩니다.
timeout에 도달하기 전에 batch를 플러시하므로, 파이프라인의 종단 간 지연 시간은 낮게 유지되고 batch 크기도 일관되게 유지됩니다.
비동기 삽입 사용
timeout이 만료되면 batch processor가 작은 배치를 전송합니다. 이로 인해 문제가 발생할 수 있으며, 이런 경우 비동기 삽입이 필요합니다. 다만 Gateway 역할을 하는 ClickStack collector로 데이터를 전송하는 경우에는 이 문제가 드뭅니다. 이들이 집계기 역할을 하며 이 문제를 완화하기 때문입니다. 자세한 내용은 Collector roles를 참조하십시오.
큰 배치를 보장할 수 없다면 Asynchronous Inserts를 사용해 ClickHouse에 배칭을 맡길 수 있습니다. 비동기 삽입을 사용하면 데이터는 먼저 버퍼에 삽입되고, 이후 나중에 또는 비동기적으로 데이터베이스 저장소에 기록됩니다.
비동기 삽입을 활성화하면, ClickHouse가 ① 삽입 쿼리를 수신할 때 해당 쿼리의 데이터는 ② 즉시 인메모리 버퍼에 먼저 기록됩니다. 이후 ③ 다음 버퍼 플러시가 발생하면 버퍼의 데이터가 정렬되어 파트로 데이터베이스 저장소에 기록됩니다. 데이터는 데이터베이스 저장소로 플러시되기 전까지 쿼리로 검색할 수 없으며, 버퍼 플러시는 구성할 수 있습니다.
collector에 비동기 삽입을 활성화하려면 connection string에 async_insert=1을 추가하십시오. 전달 보장을 위해 wait_for_async_insert=1(기본값)을 사용하는 것을 권장합니다. 자세한 내용은 여기를 참조하십시오.
async insert의 데이터는 ClickHouse 버퍼가 플러시되면 삽입됩니다. 이는 async_insert_max_data_size를 초과한 후 또는 첫 번째 INSERT 쿼리 이후 async_insert_busy_timeout_ms밀리초가 지나면 발생합니다. async_insert_stale_timeout_ms가 0이 아닌 값으로 설정된 경우, 마지막 쿼리 이후 async_insert_stale_timeout_ms milliseconds가 지나면 데이터가 삽입됩니다. 이러한 설정을 조정해 파이프라인의 end-to-end 지연 시간을 제어할 수 있습니다. 버퍼 플러시를 조정하는 데 사용할 수 있는 추가 설정은 여기에 설명되어 있습니다. 일반적으로는 기본값이 적절합니다.
적응형 비동기 삽입 고려사용 중인 agent 수가 적고 처리량은 낮지만 엄격한 end-to-end 지연 시간 요구 사항이 있는 경우, adaptive asynchronous inserts가 유용할 수 있습니다. 일반적으로 이는 ClickHouse에서 볼 수 있는 고처리량 관측성 사용 사례에는 적합하지 않습니다.
async_insert_deduplicate 설정을 참조하십시오.
이 기능 구성에 대한 자세한 내용은 이 docs page 또는 심층 설명이 담긴 blog post에서 확인할 수 있습니다.
스케일링
Kafka 추가
OTel collector 구성ClickStack OpenTelemetry collector 배포판은 사용자 지정 collector 구성을 사용해 Kafka와 함께 구성할 수 있습니다.
리소스 추정
| 로깅 속도 | collector agent에 필요한 리소스 |
|---|---|
| 1k/second | 0.2CPU, 0.2GiB |
| 5k/second | 0.5 CPU, 0.5GiB |
| 10k/second | 1 CPU, 1GiB |
스키마 선택: Map vs JSON
Map(LowCardinality(String), String) 컬럼에 저장하는 테이블을 생성합니다. 이는 관측성 워크로드에 권장되는 스키마입니다. JSON 타입 스키마는 속성 키 집합이 작고 안정적인 워크로드에서 평가할 수 있도록 베타로 제공됩니다.
전체 비교, 각각이 적합한 경우, JSON 타입 스키마를 활성화하는 데 필요한 환경 변수, 그리고 마이그레이션 절차는 Map vs JSON 타입을 참조하십시오.