99 lines
11 KiB
Markdown
99 lines
11 KiB
Markdown
---
|
||
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 54–59 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 612–623 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 요약: (생성 시 링크)
|