설정
Sophonz Python SDK 설정 레퍼런스 — init()/init_sdk() 옵션, 계측 설정, PostgreSQL용 SQLCommenter, SOPHONZ_* / OTEL_* 환경 변수.
SDK는 init() / init_sdk()에 전달하는 키워드 인자 또는 환경 변수로 설정합니다. 인자가 항상 환경 변수보다 우선하며, 환경 변수는 폴백입니다(그리고 opentelemetry-instrument로 실행할 때 SDK를 설정하는 유일한 방법입니다).
init() vs init_sdk()
from sophonz.opentelemetry import init, init_sdkinit(**options)— 권장 진입점. Sophonz 기본값(console_capture=True,experimental_exception_capture=True)을 적용하고 그 위에 인자를 적용합니다.init_sdk(**options)— 저수준. 아래 옵션별 기본값(인자, 환경 변수, 내장 기본값 순)만 적용하며 추가 동작은 켜지 않습니다.
둘 다 트레이서, 미터, 로거 프로바이더를 시작해 OpenTelemetry 전역으로 설정하고, 설치된 모든 OpenTelemetry 계측을 로드합니다. SDK가 시작되면 True를, API 키가 없어 건너뛰었거나 이미 실행 중이면 False를 반환합니다.
옵션
핵심
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
service | str | unknown_service:python | OTEL_SERVICE_NAME | 서비스 이름(service.name). |
api_key | str | — | SOPHONZ_API_KEY | API 키. authorization 헤더와 service.key 리소스 속성으로 전송됩니다. |
service_version | str | — | OTEL_SERVICE_VERSION | service.version. |
service_namespace | str | — | SOPHONZ_SERVICE_NAMESPACE | service.namespace. OTEL_RESOURCE_ATTRIBUTES=service.namespace=...도 동작합니다. |
deployment_environment | str | — | SOPHONZ_DEPLOYMENT_ENVIRONMENT | deployment.environment.name. |
캡처 토글
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
console_capture | bool | True | SOPHONZ_PYTHON_CONSOLE_CAPTURE | 표준 라이브러리 logging 레코드를 내보냅니다. 로그 참고. |
experimental_exception_capture | bool | False* | SOPHONZ_PYTHON_EXPERIMENTAL_EXCEPTION_CAPTURE | sys.excepthook, threading.excepthook, asyncio 이벤트 루프에서 처리되지 않은 예외를 기록합니다. |
error_log_capture | bool | True | SOPHONZ_PYTHON_ERROR_LOG_CAPTURE | ERROR 상태로 끝난 스팬마다 에러 로그 레코드를 남깁니다. |
advanced_network_capture | bool | False | SOPHONZ_PYTHON_ADVANCED_NETWORK_CAPTURE | HTTP 헤더와 본문을 캡처합니다. 고급 네트워크 캡처 참고. |
beta_mode | bool | False | SOPHONZ_PYTHON_BETA_MODE | Node.js SDK와 맞추기 위해 받는 옵션입니다. 현재는 아무것도 바꾸지 않으며, 트레이스 속성은 항상 켜져 있습니다. |
NOTE — * init()과 init_sdk()의 기본값 차이
experimental_exception_capture는 init_sdk()에서 False가 기본값이지만 init()은 이를 켭니다. console_capture는 둘 다 True입니다.
시그널 토글
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
disable_tracing | bool | False | OTEL_TRACES_EXPORTER=none | 트레이싱을 설정하지 않습니다. |
disable_logs | bool | False | OTEL_LOGS_EXPORTER=none | 로그 전송을 설정하지 않습니다. |
disable_metrics | bool | False | OTEL_METRICS_EXPORTER=none | 메트릭을 설정하지 않습니다. https://in.sophonz.ai는 아직 메트릭을 받지 않습니다. 배포 참고. |
detect_resources | bool | True | SOPHONZ_PYTHON_DETECT_RESOURCES | 프로세스, OS, 호스트 리소스 속성을 추가합니다. |
수명 주기와 진단
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
stop_on_termination_signals | bool | True | SOPHONZ_PYTHON_STOP_ON_TERMINATION_SIGNALS | SIGTERM / SIGINT에서 flush한 뒤 이전 핸들러를 실행합니다. 정상 종료 참고. |
disable_startup_logs | bool | False | SOPHONZ_STARTUP_LOGS=false | stderr에 출력되는 시작 요약을 끕니다. |
debug | bool | False | SOPHONZ_DEBUG | SDK 자체 로거(opentelemetry, sophonz)를 DEBUG로 설정합니다. log_level보다 우선합니다. |
debug_payload | bool | False | SOPHONZ_DEBUG_PAYLOAD | 전송되는 모든 스팬, 메트릭, 로그 레코드를 stdout에도 출력합니다. |
log_level | str | — | OTEL_LOG_LEVEL | SDK 자체 로거의 레벨: NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL. 루트 로거는 바꾸지 않습니다. |
고급과 확장
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
instrumentations | dict[str, dict] | {} | SOPHONZ_PYTHON_INSTRUMENTATIONS (JSON) | 계측별 instrument() 인자, 또는 계측을 건너뛰는 {"enabled": False}. 같은 계측에 대해서는 인자 항목이 환경 변수 항목 위에 병합됩니다. 계측 참고. |
additional_instrumentations | list | [] | — | 설치된 계측 다음에 instrument()할 계측기 인스턴스. |
promote_baggage_keys | list[str] | ["session.id"] | — | 자기 이름의 속성으로도 복사할 baggage 키. 목록을 주면 기본값을 대체합니다. |
sampler | Sampler | — | OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG | 샘플러 인스턴스. 주지 않으면 OTEL_TRACES_SAMPLER가 지정한 샘플러를 쓰며, 기본값은 parentbased_always_on입니다. |
전송
| 옵션 | 타입 | 기본값 | 환경 변수 | 설명 |
|---|---|---|---|---|
endpoint | str | https://in.sophonz.ai | OTEL_EXPORTER_OTLP_ENDPOINT | 컬렉터 기본 URL. http/protobuf이면 /v1/traces, /v1/metrics, /v1/logs가 붙습니다. |
traces_endpoint, metrics_endpoint, logs_endpoint | str | 기본 URL + /v1/<signal> | OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_ENDPOINT | 시그널별 전체 엔드포인트. 그대로 사용됩니다. |
exporter_protocol | str | http/protobuf | OTEL_EXPORTER_OTLP_PROTOCOL | http/protobuf 또는 grpc(grpc extra 필요). 알 수 없는 값이면 경고를 남기고 http/protobuf를 씁니다. |
traces_exporter_protocol, metrics_exporter_protocol, logs_exporter_protocol | str | exporter_protocol | OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_PROTOCOL | 시그널 하나의 프로토콜. |
endpoint_insecure | bool | False | OTEL_EXPORTER_OTLP_INSECURE | gRPC 전용: TLS 없이 연결합니다. |
traces_endpoint_insecure, metrics_endpoint_insecure, logs_endpoint_insecure | bool | endpoint_insecure | OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_INSECURE | gRPC 전용: 시그널 하나의 TLS 설정. |
엔드포인트 결정 순서(높은 것부터): 시그널별 인자, endpoint(시그널 경로 추가), 시그널별 환경 변수, OTEL_EXPORTER_OTLP_ENDPOINT(시그널 경로 추가), 기본값. 시그널 경로(/v1/traces, /v1/metrics, /v1/logs)는 http/protobuf에서만 붙고, gRPC 엔드포인트는 주어진 그대로 사용됩니다.
init()과 init_sdk()는 이 표의 모든 옵션을 키워드 인자로 받습니다. None을 전달하면 설정하지 않은 것으로 보고 환경 변수를 적용합니다.
불리언 환경 변수는 true/false, 1/0, yes/no, on/off를 받습니다.
예시
import os
from sophonz.opentelemetry import init_sdk
init_sdk(
service="checkout-api",
api_key=os.getenv("SOPHONZ_API_KEY"),
service_version="2.4.1",
deployment_environment="production",
console_capture=True,
experimental_exception_capture=True,
advanced_network_capture=True,
instrumentations={
# 시끄러운 계측 끄기
"urllib3": {"enabled": False},
# 트레이스를 PostgreSQL까지 전달
"psycopg": {"enable_commenter": True},
},
)계측
init()은 opentelemetry-instrument처럼 환경에 설치된 모든 OpenTelemetry 계측을 로드합니다. instrumentations 맵의 키는 계측의 엔트리 포인트 이름입니다 — flask, fastapi, django, psycopg, psycopg2, sqlalchemy, requests, httpx 등. 패키지 이름(opentelemetry-instrumentation-psycopg)도 받습니다. 각 값은 해당 계측기의 instrument()에 키워드 인자로 전달되며, "enabled": False는 그 계측을 건너뜁니다.
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=requests,urllib3로도 계측을 건너뛸 수 있고, *는 전부 건너뜁니다. 계측별로 기록하는 내용은 계측에 정리되어 있습니다.
opentelemetry-instrument에서는 같은 맵을 SOPHONZ_PYTHON_INSTRUMENTATIONS에서 JSON으로 읽습니다.
export SOPHONZ_PYTHON_INSTRUMENTATIONS='{"psycopg": {"enable_commenter": true}, "urllib3": {"enabled": false}}'데이터베이스 쿼리 트레이싱
psycopg, psycopg2, sqlalchemy extra를 설치하면 모든 쿼리가 클라이언트 스팬으로 트레이스됩니다. 트레이스를 PostgreSQL 안까지 이어가려면 SQLCommenter가 필요하며, 기본적으로 꺼져 있습니다.
init(
service="checkout-api",
api_key=os.getenv("SOPHONZ_API_KEY"),
instrumentations={"psycopg": {"enable_commenter": True}},
)SOPHONZ_PYTHON_SQLCOMMENTER=true는 opentelemetry-instrument에서도 psycopg와 psycopg2에 이를 켜며, 명시한 instrumentations 항목이 이보다 우선합니다. 드라이버별 옵션, 주석을 traceparent만으로 줄이는 방법, SQLAlchemy와 Django ORM, 준비된 문은 데이터베이스 트레이싱에서 다룹니다.
서비스 식별 정보
모든 시그널은 하나의 리소스를 공유합니다. SDK는 값이 있을 때 다음 속성을 추가합니다.
| 속성 | 출처 |
|---|---|
service.key | api_key / SOPHONZ_API_KEY |
service.name | service / OTEL_SERVICE_NAME |
service.version | service_version / OTEL_SERVICE_VERSION |
service.namespace | service_namespace / SOPHONZ_SERVICE_NAMESPACE |
deployment.environment.name | deployment_environment / SOPHONZ_DEPLOYMENT_ENVIRONMENT |
telemetry.distro.name, telemetry.distro.version | sophonz와 패키지 버전 |
process.runtime.name, process.runtime.version | Python 구현체(cpython)와 버전 |
OTEL_RESOURCE_ATTRIBUTES도 계속 동작하며, SDK가 설정하지 않는 속성을 채웁니다.
export OTEL_RESOURCE_ATTRIBUTES="service.namespace=sophonz,team=payments"OTEL_EXPORTER_OTLP_HEADERS와 시그널별 헤더 변수의 헤더는 전송 헤더에 병합됩니다. API 키가 설정되어 있으면 그 변수들의 authorization 헤더를 대체합니다.
CAUTION — 키 누락
API 키도, OTEL_EXPORTER_OTLP_HEADERS도, OTEL_RESOURCE_ATTRIBUTES의 service.key도 없으면 SDK는 Node.js SDK처럼 경고를 남기고 초기화를 건너뜁니다. 어차피 Sophonz 컬렉터가 그 텔레메트리를 버리기 때문입니다.
service, OTEL_SERVICE_NAME, OTEL_RESOURCE_ATTRIBUTES의 service.name이 모두 없으면 SDK는 시작하되 경고를 남기고, 텔레메트리는 unknown_service:python으로 보고됩니다.
detect_resources(기본값 켜짐)가 켜져 있으면 프로세스, OS, 호스트 속성이 아래에 더해지며, 위 표의 속성이 감지된 값보다 우선합니다.
컨텍스트 전파와 샘플링
전파기는 OpenTelemetry 기본값인 tracecontext,baggage(OTEL_PROPAGATORS)입니다. 들어온 traceparent는 서버 스팬이 이어받고, 기본 샘플러 parentbased_always_on은 브라우저가 샘플링한 트레이스를 모두 유지합니다.
모든 baggage 항목은 모든 스팬에 baggage.<key>로 복사됩니다. Sophonz 브라우저 SDK가 보내는 session.id는 session.id로도 복사되어, 브라우저와 서버 스팬을 하나의 속성으로 조회할 수 있습니다. 승격할 키는 promote_baggage_keys로 바꿀 수 있습니다. 브라우저 쪽 설정, CORS, 확인 방법은 브라우저-백엔드 트레이싱에서 다룹니다.
로그
console_capture가 켜져 있으면 SDK는 루트 로거에 OTLP 핸들러를 붙입니다. 레코드는 로깅 설정이 루트 로거에서 허용하는 레벨로 내보내지며(Python 기본값은 WARNING), 스팬 안에서 남긴 레코드는 해당 트레이스 ID와 스팬 ID를 가지고, extra={...} 필드는 속성이 됩니다. print()는 캡처하지 않습니다. logging.basicConfig, dictConfig, fileConfig는 init() 전후 모두 그대로 동작합니다.
error_log_capture가 켜져 있으면 ERROR 상태로 끝난 스팬은 그 스팬과 연결된 에러 로그 레코드 하나도 만듭니다. 둘 다 계측을 참고하세요.
고급 네트워크 캡처
advanced_network_capture=True(또는 SOPHONZ_PYTHON_ADVANCED_NETWORK_CAPTURE=true)는 서버·클라이언트 스팬의 요청·응답 헤더를 캡처하되 authorization, proxy-authorization, cookie, set-cookie, x-api-key는 [REDACTED]로 기록하고, requests, urllib(요청 본문만), FastAPI/Starlette의 본문을 캡처합니다. 본문은 16KiB로 잘리고, 민감한 키워드가 들어 있으면 [Filtered]로 대체됩니다. 어떤 스팬에 무엇이 붙는지, 설정되는 변수, 전체 키워드 목록은 계측에 있습니다.
WARNING — 민감한 데이터
본문에는 여전히 개인정보가 들어 있을 수 있습니다. 허용되는 환경에서만 켜세요.
제외 URL
SDK는 자신의 전송 URL을 OTEL_PYTHON_REQUESTS_EXCLUDED_URLS, OTEL_PYTHON_URLLIB_EXCLUDED_URLS, OTEL_PYTHON_URLLIB3_EXCLUDED_URLS, OTEL_PYTHON_HTTPX_EXCLUDED_URLS에 추가하며, 이미 설정한 값(OTEL_PYTHON_EXCLUDED_URLS 포함)은 유지합니다. 전송 요청이 나가는 HTTP 스팬으로 기록되지 않게 하기 위함입니다.
환경 변수
Sophonz 전용
| 변수 | 기본값 | 설명 |
|---|---|---|
SOPHONZ_API_KEY | — | API 키(authorization과 service.key). |
SOPHONZ_SERVICE_NAMESPACE | — | service.namespace. |
SOPHONZ_DEPLOYMENT_ENVIRONMENT | — | deployment.environment.name. |
SOPHONZ_PYTHON_CONSOLE_CAPTURE | true | logging 레코드 전송. |
SOPHONZ_PYTHON_EXPERIMENTAL_EXCEPTION_CAPTURE | false | 처리되지 않은 예외 기록. |
SOPHONZ_PYTHON_ERROR_LOG_CAPTURE | true | 실패한 스팬의 에러 로그 레코드. |
SOPHONZ_PYTHON_ADVANCED_NETWORK_CAPTURE | false | HTTP 헤더와 본문 캡처. |
SOPHONZ_PYTHON_STOP_ON_TERMINATION_SIGNALS | true | SIGTERM / SIGINT에서 flush. |
SOPHONZ_PYTHON_BETA_MODE | false | Node.js SDK와 맞추기 위한 예약 옵션. |
SOPHONZ_PYTHON_DETECT_RESOURCES | true | 프로세스, OS, 호스트 리소스 속성. |
SOPHONZ_PYTHON_INSTRUMENTATIONS | — | 계측별 설정 JSON 맵. |
SOPHONZ_PYTHON_SQLCOMMENTER | false | psycopg와 psycopg2의 SQLCommenter. |
SOPHONZ_STARTUP_LOGS | true | 시작 요약 출력. |
SOPHONZ_DEBUG | false | SDK 로거를 DEBUG로. |
SOPHONZ_DEBUG_PAYLOAD | false | 전송되는 텔레메트리를 stdout에 출력. |
OpenTelemetry
| 변수 | 기본값 | 설명 |
|---|---|---|
OTEL_SERVICE_NAME | unknown_service:python | 서비스 이름. |
OTEL_SERVICE_VERSION | — | 서비스 버전. |
OTEL_RESOURCE_ATTRIBUTES | — | 추가 리소스 속성. |
OTEL_EXPORTER_OTLP_ENDPOINT | https://in.sophonz.ai | OTLP 기본 엔드포인트. |
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_ENDPOINT | 기본 URL + /v1/<signal> | 시그널별 엔드포인트. |
OTEL_EXPORTER_OTLP_PROTOCOL | http/protobuf | http/protobuf 또는 grpc. |
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_PROTOCOL | OTEL_EXPORTER_OTLP_PROTOCOL | 시그널별 프로토콜. |
OTEL_EXPORTER_OTLP_HEADERS | — | 추가 전송 헤더(key=value,key2=value2). 키 확인도 충족합니다. |
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_HEADERS | — | 시그널별 전송 헤더. OTEL_EXPORTER_OTLP_HEADERS 위에 병합됩니다. |
OTEL_EXPORTER_OTLP_INSECURE | false | TLS 없는 gRPC. |
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_INSECURE | OTEL_EXPORTER_OTLP_INSECURE | 시그널별 gRPC TLS 설정. |
OTEL_TRACES_SAMPLER / OTEL_TRACES_SAMPLER_ARG | parentbased_always_on | 트레이스 샘플러. |
OTEL_PROPAGATORS | tracecontext,baggage | 컨텍스트 전파기. |
OTEL_TRACES_EXPORTER / OTEL_METRICS_EXPORTER / OTEL_LOGS_EXPORTER | — | none이면 해당 시그널을 끕니다. |
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS | — | 건너뛸 계측(쉼표 구분) 또는 *. |
OTEL_PYTHON_EXCLUDED_URLS | — | 서버·클라이언트 계측이 트레이스하지 않을 URL 패턴. SDK 자신의 전송 URL은 HTTP 클라이언트에서 항상 제외됩니다. |
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_* | 고급 네트워크 캡처가 설정 | 헤더 캡처와 마스킹 목록. 계측 참고. |
OTEL_PYTHON_LOG_AUTO_INSTRUMENTATION | 콘솔 캡처가 켜져 있으면 false | opentelemetry-instrumentation-logging이 레코드를 한 번 더 전송하지 않게 합니다. |
OTEL_BSP_SCHEDULE_DELAY | 5000 | 스팬 전송 간격(밀리초). |
OTEL_METRIC_EXPORT_INTERVAL | 60000 | 메트릭 전송 간격(밀리초). |
OTEL_LOG_LEVEL | — | SDK 로깅 레벨. |
OTEL_PYTHON_DISTRO | — | 배포판이 둘 이상 설치되어 있으면 sophonz로 설정합니다. |
TIP — 우선순위
disable_logs / disable_tracing / disable_metrics 인자와 대응하는 OTEL_*_EXPORTER=none은 모두 시그널을 끕니다. 둘 다 있으면 인자가 우선합니다 — OTEL_TRACES_EXPORTER=none이어도 disable_tracing=False면 트레이싱은 켜집니다.