Files
llm-wiki/raw/official-docs/otel-exceptions-semantic-conventions.md

99 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "official-doc / OpenTelemetry — Semantic Conventions for Exceptions on Spans + Recording Errors + Trace API Set Status"
source_type: official-doc
url: https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/
archive_url:
related_branches: [feature-operational-error-observability-foundation]
related_projects: [ca-skeleton]
tags: [official-doc, ca-skeleton, observability, error-handling, opentelemetry, span-event, trace-status]
created: 2026-06-01
---
# official-doc / OpenTelemetry — Semantic Conventions for Exceptions on Spans + Recording Errors + Trace API Set Status
> Layer: `raw/official-docs/` — OpenTelemetry 공식 사양 3개 페이지의 원문 발췌·출처 기록.
> 검증된 요약은 `/ingest` 후 `wiki/concepts/`에 별도 작성. 원본은 raw에 영구 보관.
## Parent / 활용 branch (필수)
| Branch | 이 자료가 정당화하는 결정 |
|---|---|
| [[raw/branch-notes/feature-operational-error-observability-foundation]] | D16 — 운영 오류(5xx/INTERNAL) 발생 시 서버 측 span 에 `exception` 이벤트 기록 (`exception.type`, `exception.message`, `exception.stacktrace`) + span status ERROR 설정 (서버 측 telemetry 전용, 클라이언트 HTTP 응답에 stack trace 미포함) |
## 출처 / Source
- 원본 URL 1 (예외 span): https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/
- 원본 URL 2 (에러 기록): https://opentelemetry.io/docs/specs/semconv/general/recording-errors/
- 원본 URL 3 (Trace API Set Status): https://opentelemetry.io/docs/specs/otel/trace/api/#set-status
- 아카이브 URL:
- 저자 / 조직: OpenTelemetry Authors (CNCF)
- 사양 버전: Semantic conventions 1.41.0 (exceptions-spans: Status Deprecated → logs 이전 권고; recording-errors: Status Development)
- 마지막 확인일: 2026-06-01
## 왜 저장했는지 / Why archived
`feature-operational-error-observability-foundation` branch 의 결정 D16 은 서버 측 span 에 `exception` 이벤트를 기록하고 span status 를 ERROR 로 설정하는 기준을 정의한다. 이 자료는 그 기준의 공식 사양 근거 — `exception` 이벤트의 속성 정의(`exception.type`, `exception.message`, `exception.stacktrace`), 에러 발생 시 span status ERROR 설정 의무(`SHOULD`), 그리고 Instrumentation Library 가 아닌 **Application 코드**가 status 를 설정해야 하는 맥락을 제공한다. 스택 트레이스는 서버 측 telemetry 속성으로만 정의되며, 클라이언트 HTTP 응답 노출 여부는 이 사양 범위 밖이다.
## 핵심 인용 / Key quotes (verbatim, 3~5문장)
> [§ Exception event — exceptions-spans] "The event name MUST be `exception`."
> (source: https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/ — line 48 in fetched text)
> [§ Exception event attributes — exceptions-spans] "A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG."
> (attribute: `exception.stacktrace`, Requirement Level: Recommended — line 102 in fetched text)
> [§ Recording errors on spans — recording-errors] "Span Status Code MUST be left unset if the instrumented operation has ended without any errors. When the operation ends with an error, instrumentation: SHOULD set the span status code to `Error`"
> (source: https://opentelemetry.io/docs/specs/semconv/general/recording-errors/ — lines 5459 in fetched text)
> [§ Recording exceptions — recording-errors] "Exceptions which are propagated to the caller should be recorded (or logged) once."
> (source: https://opentelemetry.io/docs/specs/semconv/general/recording-errors/ — line 111 in fetched text)
> [§ Set Status — trace/api] "When the status is set to `Error` by Instrumentation Libraries, the `Description` SHOULD be documented and predictable. The status code should only be set to `Error` according to the rules defined within the semantic conventions. [...] Application developers and Operators may set the status code to `Ok`."
> (source: https://opentelemetry.io/docs/specs/otel/trace/api/#set-status — lines 612623 in fetched text)
## Claims Extracted / 추출된 주장
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|---|---|---|---|---|---|
| OTEL-EXC-C1 | span 위에 예외를 기록할 때 이벤트 이름은 반드시 `exception` 이어야 한다 | [§ Exception event] "The event name MUST be `exception`." | `official-vendor-doc` | OTel Semantic Conventions 를 따르는 모든 계측 코드 | 이벤트를 어느 시점에 호출해야 하는지(API 호출 순서) 는 정의하지 않음 |
| OTEL-EXC-C2 | `exception` 이벤트에는 `exception.type`, `exception.message`, `exception.stacktrace` 세 속성이 정의되어 있으며, `exception.type`/`exception.message` 는 Conditionally Required, `exception.stacktrace` 는 Recommended | [§ Exception event attributes] "`exception.type` Conditionally Required [...] `exception.message` Conditionally Required [1] [...] `exception.stacktrace` Recommended" + "[1] `exception.message`: Required if `exception.type` is not set, recommended otherwise." | `official-vendor-doc` | OTel SDK 에서 `Span.recordException()` 또는 `addEvent("exception", ...)` 를 호출하는 모든 코드 | 세 속성 모두 클라이언트 HTTP 응답에 포함되어야 한다는 의미가 아님 — 이 속성들은 telemetry 신호(span) 안의 속성 |
| OTEL-EXC-C3 | `exception.stacktrace` 는 "언어 런타임의 자연스러운 표현 방식으로 된 문자열 스택 트레이스" 로 Recommended 속성이다 | [§ Exception event attributes] "A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG." | `official-vendor-doc` | Java 는 `Throwable.printStackTrace()` 내용을 사용 | 스택 트레이스를 클라이언트 응답에 포함해야 한다거나 포함해도 된다는 의미 아님 — span 속성 전용 |
| OTEL-EXC-C4 | 오류로 끝나는 작업에서 계측 코드는 span status code 를 `Error` 로 설정해야 하며(SHOULD), 오류 없이 종료된 작업의 Span Status Code 는 반드시(MUST) unset 으로 두어야 한다 | [§ Recording errors on spans] "Span Status Code MUST be left unset if the instrumented operation has ended without any errors. When the operation ends with an error, instrumentation: SHOULD set the span status code to `Error`" | `official-vendor-doc` | 에러를 반환하거나 예외를 던지는 모든 계측 작업 | HTTP 5xx 응답이 항상 span status ERROR 를 의미한다는 것을 직접 정의하지 않음 — HTTP 상태 코드 매핑은 HTTP 전용 semconv 별도 참조 필요 |
| OTEL-EXC-C5 | 호출자에게 전파되는 예외는 span/log 에 정확히 한 번 기록되어야 한다; 계측 라이브러리가 내부적으로 처리하는 예외는 기록을 권장하지 않는다 | [§ Recording exceptions] "Exceptions which are propagated to the caller should be recorded (or logged) once." + "It's NOT RECOMMENDED to record exceptions that are handled by the instrumented library." | `official-vendor-doc` | span/log 에서 예외를 기록하는 모든 계측 코드 | 예외가 완전히 처리된 경우에도 반드시 기록해야 한다는 뜻 아님 |
| OTEL-EXC-C6 | Instrumentation Library 는 semantic convention 이 정의한 규칙에 따라서만 status 를 `Error` 로 설정해야 하며, Application developer 와 Operator 는 자유롭게 status 를 설정할 수 있다 | [§ Set Status] "The status code should only be set to `Error` according to the rules defined within the semantic conventions. [...] Application developers and Operators may set the status code to `Ok`." | `official-vendor-doc` | OTel SDK 를 사용하는 애플리케이션 코드와 계측 라이브러리의 역할 분리 | "Application developers may set status to `Error`" 를 직접 명시하지 않음 — `Ok` 에 대해서만 명시. `Error` 설정 권한은 semconv 규칙을 따르면 누구나 가능 (의미 추론 필요) |
### Strength 허용값 참고
`official-vendor-doc` 를 사용한 이유: OpenTelemetry Semantic Conventions 는 CNCF 에서 관리하는 공식 벤더 사양이며, RFC 수준의 표준과는 다르지만 업계 광범위하게 채택된 공식 스펙이다.
## Usage Boundaries / 적용 경계
- 이 자료가 직접 증명하는 것:
- `OTEL-EXC-C1`: `exception` span 이벤트의 이름 규약
- `OTEL-EXC-C2`: `exception.type`, `exception.message`, `exception.stacktrace` 속성의 존재와 requirement level
- `OTEL-EXC-C3`: `exception.stacktrace` 가 telemetry 전용 span 속성임 (클라이언트 응답 포함 여부는 이 사양 범위 밖)
- `OTEL-EXC-C4`: 오류 발생 시 span status SHOULD ERROR, 오류 없으면 MUST unset
- `OTEL-EXC-C5`: 전파되는 예외는 한 번만 기록; 처리된 예외는 기록 비권장
- `OTEL-EXC-C6`: Instrumentation Library 는 semconv 규칙만, Application developer 는 자유롭게 status 설정 가능
- 이 자료가 증명하지 않는 것:
- HTTP 5xx 응답이 span status ERROR 를 항상 의미한다는 것 (HTTP semconv 별도 참조 필요)
- `exception.stacktrace` 를 클라이언트 HTTP 응답에 포함하면 안 된다는 것 — 이 사양은 telemetry 속성만 정의. 클라이언트 응답 보안은 별도 가이드라인 (ca-tmpl 의 Forbidden: stack trace in response 는 자체 정책)
- span `recordException` API 의 구체적인 호출 시점이나 순서
- exceptions-spans 사양이 deprecated 된 이후 대체 사양(exceptions in logs) 의 세부 내용
- 내 프로젝트에 적용하려면 추가 확인이 필요한 것:
- Micrometer Tracing (Spring Boot 기반) 에서 `recordException` / `setStatus(ERROR)` API 의 정확한 호출 패턴
- `OTEL_SEMCONV_EXCEPTION_SIGNAL_OPT_IN` 환경변수 설정 여부 (deprecated span events → logs 전환 시 영향)
- ca-tmpl 의 `error.category=INTERNAL` 시 span status ERROR + exception 이벤트 설정이 GlobalExceptionHandler 에서 자동으로 처리되는지 여부
## 메모 / Notes
- exceptions-spans 사양은 **Status: Deprecated** — 새 계측 코드는 exceptions-in-logs 로 이전 권고. 단, 기존 span event 방식은 `OTEL_SEMCONV_EXCEPTION_SIGNAL_OPT_IN` 없이도 계속 동작하므로 단기 적용에는 문제 없음.
- recording-errors 사양은 **Status: Development** — 안정화되지 않았음. 변경 가능성 있으므로 주기적 확인 필요 (`last_reviewed` 관리).
- `OTEL-EXC-C6` 에서 Application developer 의 `Error` status 설정 권한은 명시적 문장으로 확인되지 않음 (Ok 에 대해서만 명시). wiki 추출 시 별도 공식 문서에서 확인 권장.
- 추가로 봐야 할 동일 출처 페이지: https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-logs/ (새 표준), https://opentelemetry.io/docs/specs/semconv/http/http-spans/ (HTTP 5xx → span ERROR 매핑)
## Related / 관련
- 같은 주제 다른 official-doc: [[raw/official-docs/tracing-otel-sampling-tail-vs-head-spec]] (OTel sampling)
- 이 자료를 인용한 wiki 요약: (생성 시 링크)