설정

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_sdk
  • init(**options) — 권장 진입점. Sophonz 기본값(console_capture=True, experimental_exception_capture=True)을 적용하고 그 위에 인자를 적용합니다.
  • init_sdk(**options) — 저수준. 아래 옵션별 기본값(인자, 환경 변수, 내장 기본값 순)만 적용하며 추가 동작은 켜지 않습니다.

둘 다 트레이서, 미터, 로거 프로바이더를 시작해 OpenTelemetry 전역으로 설정하고, 설치된 모든 OpenTelemetry 계측을 로드합니다. SDK가 시작되면 True를, API 키가 없어 건너뛰었거나 이미 실행 중이면 False를 반환합니다.

옵션

핵심

옵션타입기본값환경 변수설명
servicestrunknown_service:pythonOTEL_SERVICE_NAME서비스 이름(service.name).
api_keystr—SOPHONZ_API_KEYAPI 키. authorization 헤더와 service.key 리소스 속성으로 전송됩니다.
service_versionstr—OTEL_SERVICE_VERSIONservice.version.
service_namespacestr—SOPHONZ_SERVICE_NAMESPACEservice.namespace. OTEL_RESOURCE_ATTRIBUTES=service.namespace=...도 동작합니다.
deployment_environmentstr—SOPHONZ_DEPLOYMENT_ENVIRONMENTdeployment.environment.name.

캡처 토글

옵션타입기본값환경 변수설명
console_captureboolTrueSOPHONZ_PYTHON_CONSOLE_CAPTURE표준 라이브러리 logging 레코드를 내보냅니다. 로그 참고.
experimental_exception_captureboolFalse*SOPHONZ_PYTHON_EXPERIMENTAL_EXCEPTION_CAPTUREsys.excepthook, threading.excepthook, asyncio 이벤트 루프에서 처리되지 않은 예외를 기록합니다.
error_log_captureboolTrueSOPHONZ_PYTHON_ERROR_LOG_CAPTUREERROR 상태로 끝난 스팬마다 에러 로그 레코드를 남깁니다.
advanced_network_captureboolFalseSOPHONZ_PYTHON_ADVANCED_NETWORK_CAPTUREHTTP 헤더와 본문을 캡처합니다. 고급 네트워크 캡처 참고.
beta_modeboolFalseSOPHONZ_PYTHON_BETA_MODENode.js SDK와 맞추기 위해 받는 옵션입니다. 현재는 아무것도 바꾸지 않으며, 트레이스 속성은 항상 켜져 있습니다.

NOTE — * init()과 init_sdk()의 기본값 차이

experimental_exception_capture는 init_sdk()에서 False가 기본값이지만 init()은 이를 켭니다. console_capture는 둘 다 True입니다.

시그널 토글

옵션타입기본값환경 변수설명
disable_tracingboolFalseOTEL_TRACES_EXPORTER=none트레이싱을 설정하지 않습니다.
disable_logsboolFalseOTEL_LOGS_EXPORTER=none로그 전송을 설정하지 않습니다.
disable_metricsboolFalseOTEL_METRICS_EXPORTER=none메트릭을 설정하지 않습니다. https://in.sophonz.ai는 아직 메트릭을 받지 않습니다. 배포 참고.
detect_resourcesboolTrueSOPHONZ_PYTHON_DETECT_RESOURCES프로세스, OS, 호스트 리소스 속성을 추가합니다.

수명 주기와 진단

옵션타입기본값환경 변수설명
stop_on_termination_signalsboolTrueSOPHONZ_PYTHON_STOP_ON_TERMINATION_SIGNALSSIGTERM / SIGINT에서 flush한 뒤 이전 핸들러를 실행합니다. 정상 종료 참고.
disable_startup_logsboolFalseSOPHONZ_STARTUP_LOGS=falsestderr에 출력되는 시작 요약을 끕니다.
debugboolFalseSOPHONZ_DEBUGSDK 자체 로거(opentelemetry, sophonz)를 DEBUG로 설정합니다. log_level보다 우선합니다.
debug_payloadboolFalseSOPHONZ_DEBUG_PAYLOAD전송되는 모든 스팬, 메트릭, 로그 레코드를 stdout에도 출력합니다.
log_levelstr—OTEL_LOG_LEVELSDK 자체 로거의 레벨: NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL. 루트 로거는 바꾸지 않습니다.

고급과 확장

옵션타입기본값환경 변수설명
instrumentationsdict[str, dict]{}SOPHONZ_PYTHON_INSTRUMENTATIONS (JSON)계측별 instrument() 인자, 또는 계측을 건너뛰는 {"enabled": False}. 같은 계측에 대해서는 인자 항목이 환경 변수 항목 위에 병합됩니다. 계측 참고.
additional_instrumentationslist[]—설치된 계측 다음에 instrument()할 계측기 인스턴스.
promote_baggage_keyslist[str]["session.id"]—자기 이름의 속성으로도 복사할 baggage 키. 목록을 주면 기본값을 대체합니다.
samplerSampler—OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG샘플러 인스턴스. 주지 않으면 OTEL_TRACES_SAMPLER가 지정한 샘플러를 쓰며, 기본값은 parentbased_always_on입니다.

전송

옵션타입기본값환경 변수설명
endpointstrhttps://in.sophonz.aiOTEL_EXPORTER_OTLP_ENDPOINT컬렉터 기본 URL. http/protobuf이면 /v1/traces, /v1/metrics, /v1/logs가 붙습니다.
traces_endpoint, metrics_endpoint, logs_endpointstr기본 URL + /v1/<signal>OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_ENDPOINT시그널별 전체 엔드포인트. 그대로 사용됩니다.
exporter_protocolstrhttp/protobufOTEL_EXPORTER_OTLP_PROTOCOLhttp/protobuf 또는 grpc(grpc extra 필요). 알 수 없는 값이면 경고를 남기고 http/protobuf를 씁니다.
traces_exporter_protocol, metrics_exporter_protocol, logs_exporter_protocolstrexporter_protocolOTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_PROTOCOL시그널 하나의 프로토콜.
endpoint_insecureboolFalseOTEL_EXPORTER_OTLP_INSECUREgRPC 전용: TLS 없이 연결합니다.
traces_endpoint_insecure, metrics_endpoint_insecure, logs_endpoint_insecureboolendpoint_insecureOTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_INSECUREgRPC 전용: 시그널 하나의 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.keyapi_key / SOPHONZ_API_KEY
service.nameservice / OTEL_SERVICE_NAME
service.versionservice_version / OTEL_SERVICE_VERSION
service.namespaceservice_namespace / SOPHONZ_SERVICE_NAMESPACE
deployment.environment.namedeployment_environment / SOPHONZ_DEPLOYMENT_ENVIRONMENT
telemetry.distro.name, telemetry.distro.versionsophonz와 패키지 버전
process.runtime.name, process.runtime.versionPython 구현체(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_CAPTUREtruelogging 레코드 전송.
SOPHONZ_PYTHON_EXPERIMENTAL_EXCEPTION_CAPTUREfalse처리되지 않은 예외 기록.
SOPHONZ_PYTHON_ERROR_LOG_CAPTUREtrue실패한 스팬의 에러 로그 레코드.
SOPHONZ_PYTHON_ADVANCED_NETWORK_CAPTUREfalseHTTP 헤더와 본문 캡처.
SOPHONZ_PYTHON_STOP_ON_TERMINATION_SIGNALStrueSIGTERM / SIGINT에서 flush.
SOPHONZ_PYTHON_BETA_MODEfalseNode.js SDK와 맞추기 위한 예약 옵션.
SOPHONZ_PYTHON_DETECT_RESOURCEStrue프로세스, OS, 호스트 리소스 속성.
SOPHONZ_PYTHON_INSTRUMENTATIONS—계측별 설정 JSON 맵.
SOPHONZ_PYTHON_SQLCOMMENTERfalsepsycopg와 psycopg2의 SQLCommenter.
SOPHONZ_STARTUP_LOGStrue시작 요약 출력.
SOPHONZ_DEBUGfalseSDK 로거를 DEBUG로.
SOPHONZ_DEBUG_PAYLOADfalse전송되는 텔레메트리를 stdout에 출력.

OpenTelemetry

변수기본값설명
OTEL_SERVICE_NAMEunknown_service:python서비스 이름.
OTEL_SERVICE_VERSION—서비스 버전.
OTEL_RESOURCE_ATTRIBUTES—추가 리소스 속성.
OTEL_EXPORTER_OTLP_ENDPOINThttps://in.sophonz.aiOTLP 기본 엔드포인트.
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_ENDPOINT기본 URL + /v1/<signal>시그널별 엔드포인트.
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobufhttp/protobuf 또는 grpc.
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_PROTOCOLOTEL_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_INSECUREfalseTLS 없는 gRPC.
OTEL_EXPORTER_OTLP_{TRACES,METRICS,LOGS}_INSECUREOTEL_EXPORTER_OTLP_INSECURE시그널별 gRPC TLS 설정.
OTEL_TRACES_SAMPLER / OTEL_TRACES_SAMPLER_ARGparentbased_always_on트레이스 샘플러.
OTEL_PROPAGATORStracecontext,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콘솔 캡처가 켜져 있으면 falseopentelemetry-instrumentation-logging이 레코드를 한 번 더 전송하지 않게 합니다.
OTEL_BSP_SCHEDULE_DELAY5000스팬 전송 간격(밀리초).
OTEL_METRIC_EXPORT_INTERVAL60000메트릭 전송 간격(밀리초).
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면 트레이싱은 켜집니다.