OpenTelemetry 트레이싱
n8n v2.25n8n은 워크플로 및 노드 실행에 대한 OpenTelemetry{:target="_blank" .external-link} 트레이스를 내보낼 수 있습니다. OpenTelemetry 워크플로 트레이싱은 셀프 호스팅 n8n에서만 사용할 수 있습니다.
- 2.19.0부터 최초 제공
- OpenTelemetry 형식의 메트릭은 곧 제공될 예정입니다
n8n은 워크플로 및 노드 실행에 대한 OpenTelemetry{:target="_blank" .external-link} 트레이스를 내보낼 수 있습니다. 이 트레이스를 사용하여 실행 지연 시간을 모니터링하고, 장애를 디버그하며, 옵저버빌리티 스택 내 서비스 간 요청을 추적할 수 있습니다.
OpenTelemetry 워크플로 트레이싱은 셀프 호스팅 n8n에서만 사용할 수 있습니다.
n8n의 OpenTelemetry 트레이싱 개요를 동영상으로 확인하세요:
제공 내용#
트레이싱을 활성화하면 n8n은 각 실행에 대해 두 가지 종류의 스팬을 내보냅니다:
workflow.execute: 워크플로 실행당 하나의 스팬. 워크플로 ID, 이름, 버전, 노드 수, 실행 모드, 상태, 오류 유형을 기록합니다.node.execute: 노드 실행당 하나의 스팬으로, 해당 워크플로 스팬 안에 중첩됩니다. 노드 ID, 이름, 유형, 버전, 입력 및 출력 항목 수를 기록합니다.
각 스팬에는 n8n 인스턴스를 식별하는 리소스 속성이 포함됩니다:
service.name(기본값n8n)service.version(n8n 버전)n8n.instance.idn8n.instance.role(예:main,worker,webhook)
n8n은 트레이스 컨텍스트 전파도 처리합니다:
- 인바운드: 웹훅 요청에 W3C
traceparent헤더{:target="_blank" .external-link}가 포함되어 있으면, n8n은 이를 워크플로 스팬의 부모로 사용합니다. 이를 통해 n8n 워크플로 트레이스를 업스트림 호출자와 연결합니다. - 아웃바운드: HTTP Request node(및 n8n HTTP 헬퍼를 사용하는 다른 노드들)는 아웃바운드 요청에
traceparent헤더를 주입할 수 있습니다. W3C 트레이스 컨텍스트를 지원하는 다운스트림 서비스는 트레이스를 이어받을 수 있습니다. - 서브 워크플로: 서브 워크플로의 스팬은 상위 워크플로의 스팬을 부모로 사용합니다.
- 재개된 워크플로: 대기 후 워크플로가 재개될 때, 새 스팬은 스팬 링크를 사용하여 이전 스팬과 연결됩니다.
트레이싱 활성화#
워크플로 트레이싱을 활성화하려는 각 n8n 인스턴스(main, worker, webhook 프로세서)에 다음 환경 변수를 설정하세요:
export N8N_OTEL_ENABLED=true
export N8N_OTEL_EXPORTER_OTLP_ENDPOINT=http://<your-collector-host>:4318
n8n을 재시작하면, 인스턴스가 Protobuf 인코딩을 사용하는 OTLP HTTP를 통해 스팬을 내보내기 시작합니다.
n8n은 기본적으로 엔드포인트에 /v1/traces를 추가합니다. N8N_OTEL_EXPORTER_OTLP_ENDPOINT는 트레이스 경로가 아닌 컬렉터의 기본 URL을 가리켜야 합니다.
컬렉터에 인증이 필요한 경우, N8N_OTEL_EXPORTER_OTLP_HEADERS를 쉼표로 구분된 key=value 쌍 목록으로 설정하세요:
export N8N_OTEL_EXPORTER_OTLP_HEADERS="authorization=Bearer <your-token>,x-tenant=acme"
// 보안 강화를 위해 — 토큰을 입력할 경우 `_FILE` 접미사를 사용하는 것을 권장합니다:
export N8N_OTEL_EXPORTER_OTLP_HEADERS_FILE=/mnt/otel-headers
지원되는 변수의 전체 목록은 OpenTelemetry 환경 변수를 참조하세요.
큐 모드에서는 OpenTelemetry 변수를 모든 인스턴스에 설정해야 합니다. 트레이스 컨텍스트는 인스턴스 간에 전파됩니다.
샘플링#
기본적으로 n8n은 모든 트레이스를 내보냅니다. 사용량이 많은 인스턴스에서 볼륨을 줄이려면 N8N_OTEL_TRACES_SAMPLE_RATE를 0에서 1 사이의 값으로 설정하세요:
# 트레이스의 10%만 내보내기
export N8N_OTEL_TRACES_SAMPLE_RATE=0.1
n8n은 트레이스 ID 비율 샘플러를 사용하므로, 동일한 트레이스 ID는 트레이스 내 모든 스팬에서 완전히 샘플링되거나 완전히 제외됩니다.
기본적으로 n8n은 프로덕션 실행에 대해서만 트레이스를 출력합니다. 모든 워크플로 실행에 대해 트레이스를 출력하려면 N8N_OTEL_TRACES_PRODUCTION_ONLY=false로 설정하세요.
스팬 볼륨 줄이기#
워크플로의 각 노드는 자체 스팬을 생성합니다. 노드가 많은 워크플로에서는 필요 이상으로 많은 데이터가 생성될 수 있습니다. 워크플로 수준의 스팬만 내보내려면 다음을 설정하세요:
export N8N_OTEL_TRACES_INCLUDE_NODE_SPANS=false
n8n이 아웃바운드 HTTP 요청에 traceparent 헤더를 주입하지 않도록 하려면 다음을 설정하세요:
export N8N_OTEL_TRACES_INJECT_OUTBOUND=false
커스텀 스팬 속성#
프로젝트, 워크플로, 노드 스팬에 커스텀 속성을 추가할 수 있습니다. n8n은 각 커스텀 속성을 OpenTelemetry 스팬 속성으로 구성된 옵저버빌리티 백엔드에 내보냅니다.
커스텀 스팬 속성은 Enterprise 플랜에서 사용할 수 있습니다.
속성 값에 시크릿, 개인 정보 또는 기타 민감한 값을 포함하지 마세요.
n8n은 다음과 같은 커스텀 속성 레벨을 지원합니다:
| 레벨 | 설정 위치 | 내보내는 스팬 | 속성 접두사 |
|---|---|---|---|
| 프로젝트 | 프로젝트 설정 | workflow.execute |
n8n.project.custom.<key> |
| 워크플로 | 워크플로 설정 | workflow.execute |
n8n.workflow.custom.<key> |
| 노드 | 노드 Settings 탭 | node.execute |
n8n.node.custom.<key> |
프로젝트 및 워크플로 커스텀 스팬 속성은 n8n 2.24.0부터 제공됩니다. 노드 커스텀 스팬 속성은 n8n 2.22.0부터 제공됩니다.
프로젝트 스팬 속성 추가#
프로젝트 수준의 스팬 속성을 추가하려면:
- 프로젝트를 엽니다.
- Project settings를 선택합니다.
- Custom Span Attributes 아래에서 하나 이상의 스팬 속성을 추가합니다.
- Save를 선택합니다.
프로젝트 속성 값에는 일반 텍스트를 사용하세요.
워크플로 스팬 속성 추가#
워크플로 수준의 스팬 속성을 추가하려면:
- 워크플로를 엽니다.
- Workflow settings를 엽니다.
- Custom Span Attributes 아래에서 Configure를 선택합니다.
- 하나 이상의 스팬 속성을 추가합니다.
- Save를 선택합니다.
워크플로 속성 값에는 일반 텍스트를 사용하세요.
노드 스팬 속성 추가#
노드 수준의 스팬 속성을 추가하려면:
- 노드를 열고 Settings 탭을 선택합니다.
- Custom Span Attributes 아래에서 Add Attribute를 선택합니다.
- Key를 입력합니다. 키는 일반 텍스트여야 합니다.
- Value를 입력합니다. 값은 일반 텍스트 또는
={{ $json.environment }}와 같은 표현식이 될 수 있습니다.
노드 속성 값은 문자열, 숫자, 또는 부울(boolean)로 결정되어야 합니다.
커스텀 노드에서 프로그래밍 방식으로 속성 추가#
커스텀 노드를 빌드하는 경우, 코드에서 커스텀 키-값 쌍을 연결할 수 있습니다. 노드의 execute 메서드에서 setMetadata를 호출하세요:
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
this.setMetadata({
tracing: {
'llm.model': 'gpt-4o',
'llm.token.input': 1500,
'llm.token.output': 340,
},
});
return [this.getInputData()];
}
n8n은 내보낸 스팬에서 각 키 앞에 n8n.node.custom.을 붙입니다. 값은 문자열, 숫자, 또는 부울(boolean)이어야 합니다.
이 API는 Code node에서는 사용할 수 없습니다. 도메인별 데이터로 스팬을 풍부하게 만들려는 노드 개발자를 위한 것입니다.
노드가 여기서 설정한 속성 키가 커스텀 노드 스팬 속성으로도 구성되어 있는 경우, 프로그래밍 방식의 값이 우선합니다.
Jaeger로 테스트해보기#
로컬 Jaeger{:target="_blank" .external-link} 인스턴스로 트레이스를 전송하여 실제로 확인할 수 있습니다.
- 다음 내용을
docker-compose.yml로 저장하세요:
services:
jaeger:
image: jaegertracing/jaeger:latest
ports:
- "16686:16686" # UI
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- Jaeger를 시작하세요:
docker compose up -d
- 트레이싱을 활성화하고 Jaeger를 가리키도록 n8n을 시작하세요. 설정 세부 사항은 n8n 시작하기를 참조하세요:
N8N_OTEL_ENABLED=true N8N_OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318 n8n start
- 워크플로를 실행한 후, http://localhost:16686에서 Jaeger UI를 열어 서비스로 "n8n"을 선택하고 "Find traces"를 클릭하면 n8n이 내보낸 OpenTelemetry 트레이스를 확인할 수 있습니다.
스팬 속성#
워크플로 및 노드 스팬에는 다음과 같은 n8n 전용 속성이 포함됩니다.
워크플로 스팬 (workflow.execute)#
| 속성 | 설명 |
|---|---|
n8n.workflow.id |
워크플로 ID. |
n8n.workflow.name |
워크플로 이름. |
n8n.workflow.version_id |
워크플로 버전 ID. |
n8n.workflow.node_count |
워크플로의 노드 수. |
n8n.project.id |
프로젝트 ID. n8n 2.23.0부터 제공. |
n8n.execution.id |
실행 ID. |
n8n.execution.mode |
실행 모드 (예: manual, webhook, trigger, retry). |
n8n.execution.status |
최종 실행 상태. |
n8n.execution.is_retry |
실행이 재시도인 경우 true. |
n8n.execution.retry_of |
실행이 재시도인 경우, 원래 실행 ID. |
n8n.execution.error_type |
실행이 실패할 때 설정되는 오류 클래스 이름. |
n8n.continuation.reason |
워크플로가 대기 후 재개될 때 스팬 링크에 설정됨. |
n8n.project.custom.<key> |
프로젝트 수준 커스텀 스팬 속성을 통해 설정된 커스텀 속성. |
n8n.workflow.custom.<key> |
워크플로 수준 커스텀 스팬 속성을 통해 설정된 커스텀 속성. |
노드 스팬 (node.execute)#
| 속성 | 설명 |
|---|---|
n8n.node.id |
노드 ID. |
n8n.node.name |
노드 이름. |
n8n.node.type |
노드 유형 (예: n8n-nodes-base.httpRequest). |
n8n.node.type_version |
노드 유형 버전. |
n8n.node.items.input |
노드가 수신한 입력 항목 수. |
n8n.node.items.output |
노드가 생성한 출력 항목 수. |
n8n.node.termination_reason |
노드 스팬이 정상 완료 없이 종료된 이유 (예: workflow_cancelled). |
n8n.node.custom.<key> |
노드 설정의 노드 수준 커스텀 스팬 속성 또는 커스텀 노드 코드의 metadata.tracing을 통해 설정된 커스텀 속성. |
노드가 실패하면 n8n은 표준 OpenTelemetry 예외 속성(exception.type, exception.message, exception.stacktrace)과 함께 스팬에 exception 이벤트를 기록합니다.
문제 해결#
백엔드에 트레이스가 나타나지 않는 경우#
n8n이 시작 시 OTLP 엔드포인트에 연결할 수 없으면 다음 오류를 기록합니다:
Failed to connect to OpenTelemetry OTLP endpoint during startup
다음을 확인하세요:
N8N_OTEL_ENABLED가true로 설정되어 있는지.N8N_OTEL_EXPORTER_OTLP_ENDPOINT가 컬렉터의 기본 URL을 가리키는지 (/v1/traces경로 제외).- 컬렉터가 n8n 컨테이너 또는 호스트에서 접근 가능한지.
- 필요한
N8N_OTEL_EXPORTER_OTLP_HEADERS(예: 인증 토큰)가 설정되어 있는지.
n8n은 기본적으로 OpenTelemetry 진단을 warn 레벨로 기록합니다. 더 자세한 내용을 보려면 N8N_LOG_LEVEL=debug로 설정하세요.
커스텀 스팬 속성이 없는 경우#
다음을 확인하세요:
- Enterprise 라이선스가 있는지.
N8N_OTEL_ENABLED가true로 설정되어 있는지.- 노드 수준 스팬 속성의 경우,
N8N_OTEL_TRACES_INCLUDE_NODE_SPANS가false로 설정되지 않았는지.
워커 트레이스에 상위 컨텍스트가 없는 경우#
큐 모드에서 워커는 데이터베이스에서 상위 트레이스 컨텍스트를 읽습니다. main 인스턴스에만 OpenTelemetry 환경 변수를 설정한 경우, 워커 스팬은 상위 워크플로 트레이스와 연결되지 않습니다. 모든 인스턴스 유형에 동일한 변수를 설정하세요.
관련 리소스#
- OpenTelemetry 환경 변수
- W3C 트레이스 컨텍스트 명세{:target="_blank" .external-link}
- OpenTelemetry 컬렉터 문서{:target="_blank" .external-link}
- n8n 로깅
- 모니터링