이 가이드에서는 Cloud de Confiance by S3NS Python 클라이언트 라이브러리에서 OpenTelemetry 분산 추적을 구성하고 사용하는 방법을 보여줍니다.
개요
Cloud de Confiance by S3NS Python 클라이언트 라이브러리는 기본 제공 OpenTelemetry 분산 추적을 제공합니다. 이 계측은 수동 몽키 패치 없이도 클라이언트 작업, RPC 호출, 재시도 동작, 네트워크 지연 시간, 서비스 응답에 대한 심층적인 가시성을 제공합니다.
주요 특징:
- 백엔드 중립적: 표준 OpenTelemetry 스팬을 내보냅니다. Cloud Trace, 온프레미스 OpenTelemetry 수집기 또는 서드 파티 모니터링 가능성 플랫폼으로 trace를 직접 내보낼 수 있습니다.
- 선택: 원격 분석이 필요하지 않은 애플리케이션의 런타임 오버헤드를 방지하기 위해 분산 추적은 기본적으로 사용 중지되어 있습니다.
- 컨텍스트 전파: 스팬은 Python의 기본 제공
contextvars를 사용하여 활성 OpenTelemetry trace 컨텍스트에 자동으로 바인딩되어 클라이언트 호출을 수신 HTTP/gRPC 요청과 연결합니다.
추적 작동 방식 (스팬 계층 구조)
사용 설정하면 Cloud de Confiance by S3NS Python 클라이언트 라이브러리가 사용자 대상 메서드 실행을 기본 유선 시도와 명확하게 구분하는 계층적 2단계 스팬 아키텍처를 내보냅니다.
[Logical Client Method Span] (Parent: covers full method duration, retries, and backoff)
│
├── [Network Attempt Span #1] (Child: First wire call; e.g. transient 503 UNAVAILABLE)
└── [Network Attempt Span #2] (Child: Retry wire call; succeeds 200 OK)
1. 논리적 클라이언트 메서드 스팬 (상위)
- 범위: 호출부터 완료까지 전체 클라이언트 라이브러리 메서드 호출 수명 주기를 캡슐화합니다.
- 기간: 모든 재시도, 지수 백오프 일시중지, 제한 시간 정책을 포함합니다.
- ID: 정규화된 RPC 메서드 (예:
google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion)의 이름을 따서 지정됩니다. - 속성: 논리적 RPC 메타데이터, 대상 서비스, 최종 상위 수준 결과를 캡처합니다.
2. 네트워크 시도 스팬 (하위)
- 범위: 논리적 메서드 스팬의 하위 스팬으로 생성되며 개별 HTTP/REST 또는 gRPC 물리적 네트워크 시도를 나타냅니다.
- 수명 주기: 네트워크 시도마다 새 스팬이 생성됩니다. 첫 번째 시도에서 작업이 성공하면 하위 스팬이 정확히 하나 기록됩니다. 작업에서 일시적인 오류가 발생하여 재시도하는 경우 각 시도는 자체 타이밍과 상태가 있는 독립적인 하위 스팬으로 기록됩니다.
- 속성: 하위 수준 유선 상태 코드, 대상 서버 주소, 전송 세부정보를 캡처합니다.
기본 요건 및 설치
Cloud de Confiance by S3NS Python 클라이언트 라이브러리 추적은 표준 OpenTelemetry Python 패키지를 사용합니다.
1. 패키지 설치
클라이언트 라이브러리 및 gRPC 전송 계측:
opentelemetry-api는 논리적 메서드 스팬과HTTP/REST(rest) 전송 스팬을 지원하기 위해google-api-core와 함께 자동으로 설치됩니다.- 하위 수준
gRPC전송 스팬도 기록하려면google-api-core[tracing](opentelemetry-instrumentation-grpc설치)과 함께 클라이언트 라이브러리를 설치합니다.
pip install google-cloud-secret-manager "google-api-core[tracing]"OpenTelemetry SDK (독립형 앱 및 코드 샘플용):
- 환경에서 이미
TracerProvider를 제공하는 경우 클라이언트 라이브러리에opentelemetry-sdk가 필요하지 않습니다. - 하지만
TracerProvider를 구성하고 자체 코드(이 페이지의 샘플 포함)에서 스팬을 내보내려면opentelemetry-sdk를 설치합니다.
pip install opentelemetry-sdk- 환경에서 이미
프로덕션에서 Cloud Trace 또는 OpenTelemetry Collector로 스팬을 전송하도록 OpenTelemetry 내보내기 도구를 구성하는 방법은 OpenTelemetry로 Python 설정 및 계측 방식 선택을 참조하세요.
추적 사용 설정
분산 추적은 환경 변수를 사용하여 전역적으로 사용 설정하거나 클라이언트별로 프로그래매틱 방식으로 사용 설정할 수 있습니다. ClientOptions를 사용하여 전달된 클라이언트별 구성은 환경 변수 설정보다 우선 적용됩니다.
옵션 1: 전역 구성 (환경 변수)
환경에서 지원되는 모든 Cloud de Confiance by S3NS Python 클라이언트 라이브러리에서 trace를 사용 설정하려면 애플리케이션을 시작하기 전에 다음 환경 변수를 설정합니다.
export GOOGLE_SDK_PYTHON_TRACING_ENABLED=true
true로 설정하면 클라이언트 라이브러리가 전역적으로 등록된 OpenTelemetry TracerProvider를 자동으로 감지하고 모든 클라이언트 호출에 대해 스팬을 내보냅니다.
옵션 2: 클라이언트별 구성 (코드)
세분화된 제어 또는 멀티 테넌트 애플리케이션의 경우 ClientOptions를 사용하여 tracer_provider를 전달하여 특정 클라이언트 인스턴스를 구성합니다.
from google.api_core.client_options import ClientOptions
from google.cloud import secretmanager
options = ClientOptions(tracer_provider=my_tracer_provider)
client = secretmanager.SecretManagerServiceClient(client_options=options)
코드 예시
클라이언트 라이브러리는 애플리케이션 기본 사용자 인증 정보를 사용하여 간편하게 Google API를 인증하고 API에 요청을 보낼 수 있습니다. 애플리케이션 기본 사용자 인증 정보를 사용하면 애플리케이션을 로컬에서 테스트하고 기본 코드를 변경하지 않은 상태로 배포할 수 있습니다. 자세한 내용은 클라이언트 라이브러리 사용을 위한 인증을 참조하세요.
1. 빠른 시작 예시 (SecretManagerServiceClient)
다음의 독립적인 예시에서는 표준 OpenTelemetry를 구성하고, 환경 변수를 사용하여 클라이언트 라이브러리 trace를 사용 설정하고, ConsoleSpanExporter를 사용하여 내보낸 스팬을 JSON으로 터미널에 직접 출력하는 방법을 보여줍니다.
import os from google.cloud import secretmanager from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor def get_secret_version_with_tracing( project_id: str, secret_id: str, version_id: str = "latest", ) -> secretmanager.SecretVersion: """Get a secret version in Secret Manager with OpenTelemetry tracing enabled. Args: project_id: Google Cloud project ID. secret_id: ID of the secret. version_id: ID of the secret version (defaults to "latest"). Returns: The SecretVersion metadata object. """ # NOTE: In standalone scripts or CLI tools, initialize and shut down the # TracerProvider within the script workflow. In long-running production # applications (e.g., web servers), configure the TracerProvider once at # application startup. # # Initialize the OpenTelemetry TracerProvider with a Console exporter provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) trace.set_tracer_provider(provider) # Enable Google Cloud client library tracing os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" # Instantiate the client (automatically discovers the active TracerProvider) client = secretmanager.SecretManagerServiceClient() # Construct the resource name and invoke the RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: print("--- OpenTelemetry Trace Spans (JSON) ---") response = client.get_secret_version(request={"name": name}) state_name = response.state.name print( f"\nAPI Result: Retrieved secret version {response.name} (state: {state_name})" ) return response finally: # Flush buffered spans before program completion provider.shutdown()
2. 프로그래매틱 구성 (ClientOptions)
환경 변수를 사용하지 않거나 다른 TracerProvider 인스턴스를 다른 클라이언트에 전달해야 하는 경우 ClientOptions를 사용하여 tracer_provider를 전달하여 프로그래매틱 방식으로 클라이언트를 구성합니다.
from google.api_core.client_options import ClientOptions from google.cloud import secretmanager from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor def get_secret_version_with_client_options( project_id: str, secret_id: str, version_id: str = "latest", ) -> secretmanager.SecretVersion: """Get a secret version configuring tracing programmatically via ClientOptions. Args: project_id: Google Cloud project ID. secret_id: ID of the secret. version_id: ID of the secret version (defaults to "latest"). Returns: The SecretVersion metadata object. """ # Initialize an independent TracerProvider (no global registration required) provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) # Pass the TracerProvider directly via ClientOptions # Tracing is activated specifically for this client instance, even without # setting the GOOGLE_SDK_PYTHON_TRACING_ENABLED environment variable. options = ClientOptions(tracer_provider=provider) client = secretmanager.SecretManagerServiceClient(client_options=options) # Construct resource name and invoke RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: print("--- OpenTelemetry Trace Spans (JSON) ---") response = client.get_secret_version(request={"name": name}) state_name = response.state.name print( f"\nAPI Result: Retrieved secret version {response.name} (state: {state_name})" ) return response finally: # Flush buffered spans before program completion provider.shutdown()
3. 비동기 클라이언트 예시 (SecretManagerServiceAsyncClient)
다음 샘플은 SecretManagerServiceAsyncClient를 사용하여 비동기 코루틴 (async def get_secret_version_with_tracing_async)을 정의합니다. 이 클라이언트는 비동기식이므로 활성 asyncio 이벤트 루프 내에서 실행해야 합니다.
import asyncio import os from google.cloud import secretmanager from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor async def get_secret_version_with_tracing_async( project_id: str, secret_id: str, version_id: str = "latest", ) -> secretmanager.SecretVersion: """Get a secret version using SecretManagerServiceAsyncClient with OpenTelemetry tracing. Args: project_id: Google Cloud project ID. secret_id: ID of the secret. version_id: ID of the secret version (defaults to "latest"). Returns: The SecretVersion metadata object. """ # NOTE: In standalone scripts or CLI tools, initialize and shut down the # TracerProvider within the script workflow. In long-running production # applications (e.g., web servers), configure the TracerProvider once at # application startup. # # Initialize the OpenTelemetry TracerProvider with a Console exporter provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) trace.set_tracer_provider(provider) # Enable Google Cloud client library tracing os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" # Instantiate the async client client = secretmanager.SecretManagerServiceAsyncClient() # Construct resource name and invoke the async RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: print("--- OpenTelemetry Trace Spans (JSON) ---") response = await client.get_secret_version(request={"name": name}) state_name = response.state.name print( f"\nAPI Result: Retrieved secret version {response.name} (state: {state_name})" ) return response finally: # Flush buffered spans before program completion provider.shutdown()
시맨틱 속성 참조
Cloud de Confiance by S3NS Python 클라이언트 라이브러리에서 내보낸 스팬은 표준 RPC 스팬에 대한 OpenTelemetry 시맨틱 규칙을 준수하여 전송 프로토콜, RPC 메서드 ID, 대상 서버 주소, 응답 상태 코드, 오류 세부정보에 대한 표준 메타데이터를 기록합니다. 이러한 속성을 사용하여 모니터링 가능성 또는 Cloud Trace 대시보드에서 알림 정책을 필터링, 집계, 생성할 수 있습니다.
보안 및 민감한 정보
Cloud de Confiance by S3NS Python 클라이언트 라이브러리 계측은 엄격한 보안 및 개인 정보 보호 표준에 따라 설계되었습니다.
- 페이로드 보호: 클라이언트 라이브러리는 trace 스팬에서 요청 또는 응답 페이로드 데이터(예: 파일 콘텐츠, 보안 비밀 값, 데이터베이스 쿼리 결과)를 절대 기록하지 않습니다.
- 식별자 공개 상태: 리소스 이름 (예: 프로젝트 ID, 데이터 세트 ID, 보안 비밀 이름)은 메서드 매개변수 및 URL 엔드포인트 속성에 표시됩니다. 리소스 식별자에 민감한 비즈니스 정보가 포함된 경우 trace 스토리지가 내부 규정 준수 정책을 준수하는지 확인하세요.
- 서드 파티 내보내기 도구: 서드 파티 모니터링 가능성 서비스 또는 SaaS 공급업체로 trace를 내보낼 때는 조직의 데이터 보호 계약을 검토하고 필요한 경우 내보내기 도구 속성 필터링을 구성합니다.