OpenTelemetry Python으로 마이그레이션 - AWS X-Ray

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

OpenTelemetry Python으로 마이그레이션

이 가이드는 Python 애플리케이션을 X-Ray SDK에서 OpenTelemetry 계측으로 마이그레이션하는 데 도움이 됩니다. 일반적인 시나리오에 대한 코드 예제와 함께 자동 및 수동 계측 접근 방식을 모두 다룹니다.

제로 코드 자동 계측 솔루션

X-Ray SDK를 사용하면 요청을 추적하도록 애플리케이션 코드를 수정해야 했습니다. OpenTelemetry는 요청을 추적하기 위한 제로 코드 자동 계측 솔루션을 제공합니다. OpenTelemetry를 사용하면 제로 코드 자동 계측 솔루션을 사용하여 요청을 추적할 수 있습니다.

OpenTelemetry 기반 자동 계측을 사용하는 제로 코드

  1. Python용 AWS Distro for OpenTelemetry(ADOT) 자동 계측 사용 - Python 애플리케이션에 대한 자동 계측은 AWS Distro for OpenTelemetry Python 자동 계측을 사용한 추적 및 지표를 참조하세요.

    (선택 사항) ADOT Python 자동 계측 AWS 을 사용하여에서 애플리케이션을 자동으로 계측할 때 CloudWatch Application Signals를 활성화하여 현재 애플리케이션 상태를 모니터링하고 비즈니스 목표에 따라 장기 애플리케이션 성능을 추적할 수도 있습니다. Application Signals는 애플리케이션, 서비스 및 종속성에 대한 통합 애플리케이션 중심 보기를 제공하고 애플리케이션 상태를 모니터링하고 분류하는 데 도움이 됩니다.

  2. OpenTelemetry Python 제로 코드 자동 계측 사용 - OpenTelemetry Python을 사용한 자동 계측은 Python 제로 코드 계측을 참조하세요.

애플리케이션을 수동으로 계측

pip 명령을 사용하여 애플리케이션을 수동으로 계측할 수 있습니다.

With X-Ray SDK
pip install aws-xray-sdk
With OpenTelemetry SDK
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp opentelemetry-propagator-aws-xray

추적 설정 초기화

With X-Ray SDK

X-Ray에서는 전역xray_recorder이 초기화되고 이를 사용하여 세그먼트 및 하위 세그먼트를 생성합니다.

With OpenTelemetry SDK
참고

X-Ray 원격 샘플링은 현재 OpenTelemetry Python에 대해 구성할 수 없습니다. 그러나 X-Ray 원격 샘플링에 대한 지원은 현재 Python용 ADOT 자동 계측을 통해 제공됩니다.

OpenTelemetry에서는 글로벌를 초기화해야 합니다TracerProvider. 이를 사용하면 애플리케이션의 모든 위치에서 스팬을 생성하는 데 사용할 수 있는 추적기를 얻을 TracerProvider수 있습니다. 다음 구성 요소를 구성하는 것이 좋습니다.

  • OTLPSpanExporter - CloudWatch Agent/OpenTelemetry Collector로 트레이스를 내보내는 데 필요합니다.

  • AWS X-Ray 전파기 - 추적 컨텍스트를 X-Ray와 통합된 AWS 서비스로 전파하는 데 필요합니다.

from opentelemetry import ( trace, propagate ) from opentelemetry.sdk.trace import TracerProvider from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.propagators.aws import AwsXRayPropagator # Sends generated traces in the OTLP format to an OTel Collector running on port 4318 otlp_exporter = OTLPSpanExporter(endpoint="http://localhost:4318/v1/traces") # Processes traces in batches as opposed to immediately one after the other span_processor = BatchSpanProcessor(otlp_exporter) # More configurations can be done here. We will visit them later. # Sets the global default tracer provider provider = TracerProvider(active_span_processor=span_processor) trace.set_tracer_provider(provider) # Configures the global propagator to use the X-Ray Propagator propagate.set_global_textmap(AwsXRayPropagator()) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") # Use this tracer to create Spans

Python용 ADOT 자동 계측 사용

Python용 ADOT 자동 계측을 사용하여 Python 애플리케이션에 대해 OpenTelemetry를 자동으로 구성할 수 있습니다. ADOT 자동 계측을 사용하면 수신 요청을 추적하거나 AWS SDK 또는 HTTP 클라이언트와 같은 라이브러리를 추적하기 위해 수동으로 코드를 변경할 필요가 없습니다. 자세한 내용은 AWS Distro for OpenTelemetry Python Auto-Instrumentation을 사용한 추적 및 지표를 참조하세요.

Python용 ADOT 자동 계측은 다음을 지원합니다.

  • 환경 변수를 통한 X-Ray 원격 샘플링 export OTEL_TRACES_SAMPLER=xray

  • X-Ray 추적 컨텍스트 전파(기본적으로 활성화됨)

  • 리소스 감지(Amazon EC2, Amazon ECS 및 Amazon EKS 환경에 대한 리소스 감지는 기본적으로 활성화되어 있음)

  • 지원되는 모든 OpenTelemetry 계측에 대한 자동 라이브러리 계측은 기본적으로 활성화됩니다. OTEL_PYTHON_DISABLED_INSTRUMENTATIONS 환경 변수를 통해 선택적으로를 비활성화할 수 있습니다(모두 기본적으로 활성화되어 있음).

  • 스팬 수동 생성

X-Ray 서비스 플러그인에서 OpenTelemetry AWS 리소스 공급자로

X-Ray SDK는 Amazon EC2, Amazon ECS 및 Elastic Beanstalk와 같은 호스팅 서비스에서 플랫폼별 정보를 캡처xray_recorder하기 위해에 추가할 수 있는 플러그인을 제공합니다. 이는 정보를 리소스 속성으로 캡처하는 OpenTelemetry의 리소스 공급자와 유사합니다. 다양한 AWS 플랫폼에서 사용할 수 있는 리소스 공급자가 여러 개 있습니다.

  • AWS 확장 패키지를 설치하여 시작합니다. pip install opentelemetry-sdk-extension-aws

  • 원하는 리소스 감지기를 구성합니다. 다음 예제는 OpenTelemetry SDK에서 Amazon EC2 리소스 공급자를 구성하는 방법을 보여줍니다.

    from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.extension.aws.resource.ec2 import ( AwsEc2ResourceDetector, ) from opentelemetry.sdk.resources import get_aggregated_resources provider = TracerProvider( active_span_processor=span_processor, resource=get_aggregated_resources([ AwsEc2ResourceDetector(), ])) trace.set_tracer_provider(provider)

수신 요청 추적

With X-Ray SDK

X-Ray Python SDK는 Django, Flask 및 Bottle과 같은 애플리케이션 프레임워크를 지원하여 실행 중인 Python 애플리케이션에 대한 수신 요청을 추적합니다. 이는 각 프레임워크의 애플리케이션에 XRayMiddleware를 추가하여 수행됩니다.

With OpenTelemetry SDK

OpenTelemetry는 특정 계측 라이브러리를 통해 DjangoFlask에 대한 계측을 제공합니다. OpenTelemetry에서 사용할 수 있는 Bottle에 대한 계측은 없으며 OpenTelemetry WSGI 계측 을 사용하여 애플리케이션을 추적할 수 있습니다.

다음 코드 예제의 경우 다음 종속성이 필요합니다.

pip install opentelemetry-instrumentation-flask

애플리케이션 프레임워크에 계측을 추가하기 전에 OpenTelemetry SDK를 초기화하고 글로벌 TracerProvider를 등록해야 합니다. 그렇지 않으면 추적 작업은가 됩니다no-ops. 글로벌를 구성한 후에는 애플리케이션 프레임워크에 계측기를 사용할 TracerProvider수 있습니다. 다음 예제에서는 Flask 애플리케이션을 보여줍니다.

from flask import Flask from opentelemetry import trace from opentelemetry.instrumentation.flask import FlaskInstrumentor from opentelemetry.sdk.extension.aws.resource import AwsEc2ResourceDetector from opentelemetry.sdk.resources import get_aggregated_resources from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter provider = TracerProvider(resource=get_aggregated_resources( [ AwsEc2ResourceDetector(), ])) processor = BatchSpanProcessor(ConsoleSpanExporter()) provider.add_span_processor(processor) trace.set_tracer_provider(provider) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") app = Flask(__name__) # Instrument the Flask app FlaskInstrumentor().instrument_app(app) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()

AWS SDK 계측

With X-Ray SDK

X-Ray Python SDK는 botocore 라이브러리를 패치하여 AWS SDK 클라이언트 요청을 추적합니다. 자세한 내용은 Python용 X-Ray AWS SDK를 사용하여 SDK 호출 추적을 참조하세요. 애플리케이션에서 patch_all() 메서드는를 사용하여 또는 라이브러리를 사용하여 모든 boto3라이브러리 botocore 또는 패치를 선택적으로 계측하는 데 사용됩니다patch((['botocore'])). 선택한 메서드는 애플리케이션의 모든 Boto3 클라이언트를 계측하고 이러한 클라이언트를 사용하여 이루어진 모든 호출에 대해 하위 세그먼트를 생성합니다.

With OpenTelemetry SDK

다음 코드 예제의 경우 다음 종속성이 필요합니다.

pip install opentelemetry-instrumentation-botocore

프로그래밍 방식으로 OpenTelemetry Botocore 계측을 사용하여 애플리케이션의 모든 Boto3 클라이언트를 계측합니다. 다음 예제에서는 botocore 계측을 보여줍니다.

import boto3 import opentelemetry.trace as trace from botocore.exceptions import ClientError from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.resources import get_aggregated_resources from opentelemetry.sdk.trace.export import ( BatchSpanProcessor, ConsoleSpanExporter, ) from opentelemetry.instrumentation.botocore import BotocoreInstrumentor provider = TracerProvider() processor = BatchSpanProcessor(ConsoleSpanExporter()) provider.add_span_processor(processor) trace.set_tracer_provider(provider) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") # Instrument BotoCore BotocoreInstrumentor().instrument() # Initialize S3 client s3 = boto3.client("s3", region_name="us-east-1") # Your bucket name bucket_name = "my-example-bucket" # Get bucket location (as an example of describing it) try: response = s3.get_bucket_location(Bucket=bucket_name) region = response.get("LocationConstraint") or "us-east-1" print(f"Bucket '{bucket_name}' is in region: {region}") # Optionally, get bucket's creation date via list_buckets buckets = s3.list_buckets() for bucket in buckets["Buckets"]: if bucket["Name"] == bucket_name: print(f"Bucket created on: {bucket['CreationDate']}") break except ClientError as e: print(f"Failed to describe bucket: {e}")

요청을 통해 발신 HTTP 호출 계측

With X-Ray SDK

X-Ray Python SDK는 요청 라이브러리를 패치하여 요청을 통해 발신 HTTP 호출을 추적합니다. 자세한 내용은 Python용 X-Ray SDK를 사용하여 다운스트림 HTTP 웹 서비스에 대한 호출 추적을 참조하세요. 애플리케이션에서 patch_all() 메서드를 사용하여 모든 라이브러리를 계측하거나를 사용하여 요청 라이브러리를 선택적으로 패치할 수 있습니다patch((['requests'])). 모든 옵션은 requests 라이브러리를 계측하여를 통해 이루어진 모든 호출에 대해 하위 세그먼트를 생성합니다requests.

With OpenTelemetry SDK

다음 코드 예제의 경우 다음 종속성이 필요합니다.

pip install opentelemetry-instrumentation-requests

프로그래밍 방식으로 OpenTelemetry Requests Instrumentation을 사용하여 요청 라이브러리를 계측하여 애플리케이션에서 수행한 HTTP 요청에 대한 트레이스를 생성합니다. 자세한 내용은 OpenTelemetry 요청 계측을 참조하세요. 다음 예제에서는 requests 라이브러리 계측을 보여줍니다.

from opentelemetry.instrumentation.requests import RequestsInstrumentor # Instrument Requests RequestsInstrumentor().instrument() ... example_session = requests.Session() example_session.get(url="https://example.com")

또는 기본 urllib3 라이브러리를 계측하여 HTTP 요청을 추적할 수도 있습니다.

# pip install opentelemetry-instrumentation-urllib3 from opentelemetry.instrumentation.urllib3 import URLLib3Instrumentor # Instrument urllib3 URLLib3Instrumentor().instrument() ... example_session = requests.Session() example_session.get(url="https://example.com")

다른 라이브러리에 대한 계측 지원

지원되는 라이브러리, 프레임워크, 애플리케이션 서버 및 JVM에서 OpenTelemetry Python에 지원되는 라이브러리 계측의 전체 목록을 찾을 수 있습니다. JVMs

또는 OpenTelemetry 레지스트리를 검색하여 OpenTelemetry가 계측을 지원하는지 확인할 수 있습니다. 검색을 시작하려면 레지스트리를 참조하세요.

추적 데이터 수동 생성

Python 애플리케이션에서를 사용하여 세그먼트 및 하위 세그먼트를 생성할 수 xray_recorder 있습니다. 자세한 내용은 Python 코드 수동 계측을 참조하세요. 트레이스 데이터에 주석과 메타데이터를 수동으로 추가할 수도 있습니다.

OpenTelemetry SDK를 사용하여 스팬 생성

start_as_current_span API를 사용하여 스팬을 시작하고 스팬 생성을 위해 스팬을 설정합니다. 스팬 생성에 대한 예제는 스팬 생성을 참조하세요. 스팬이 시작되고 현재 범위에 있으면 속성, 이벤트, 예외, 링크 등을 추가하여 더 많은 정보를 추가할 수 있습니다. X-Ray에 세그먼트와 하위 세그먼트가 있는 방식과 마찬가지로 OpenTelemetry에는 다양한 종류의 스팬이 있습니다. SERVER 종류 범위만 X-Ray 세그먼트로 변환되고 나머지는 X-Ray 하위 세그먼트로 변환됩니다.

from opentelemetry import trace from opentelemetry.trace import SpanKind import time tracer = trace.get_tracer("my.tracer.name") # Create a new span to track some work with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: time.sleep(1) # Create a nested span to track nested work with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: time.sleep(2) # the nested span is closed when it's out of scope # Now the parent span is the current span again time.sleep(1) # This span is also closed when it goes out of scope

OpenTelemetry SDK를 사용하여 트레이스에 주석 및 메타데이터 추가

X-Ray Python SDK는 트레이스에 주석put_annotation과 메타데이터를 추가하기 put_metadata 위한 별도의 APIs와를 제공합니다. OpenTelemetry SDK에서 주석과 메타데이터는 단순히 스팬의 속성이며 set_attribute API를 통해 추가됩니다.

트레이스의 주석으로 사용할 범위 속성은 값이 주석의 키-값 페어 목록aws.xray.annotations인 예약된 키 아래에 추가됩니다. 다른 모든 스팬 속성은 변환된 세그먼트 또는 하위 세그먼트의 메타데이터가 됩니다.

또한 ADOT 수집기를 사용하는 경우 수집기 구성indexed_attributes에서를 지정하여 X-Ray 주석으로 변환해야 하는 스팬 속성을 구성할 수 있습니다.

아래 예제에서는 OpenTelemetry SDK를 사용하여 트레이스에 주석과 메타데이터를 추가하는 방법을 보여줍니다.

with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: parent_span.set_attribute("TransactionId", "qwerty12345") parent_span.set_attribute("AccountId", "1234567890") # This will convert the TransactionId and AccountId to be searchable X-Ray annotations parent_span.set_attribute("aws.xray.annotations", ["TransactionId", "AccountId"]) with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: # The MicroTransactionId will be converted to X-Ray metadata for the child subsegment child_span.set_attribute("MicroTransactionId", "micro12345")

Lambda 계측

X-Ray에서 Lambda 함수를 모니터링하려면 X-Ray를 활성화하고 함수 호출 역할에 적절한 권한을 추가해야 합니다. 또한 함수의 다운스트림 요청을 추적하는 경우 X-Ray Python SDK로 코드를 계측합니다.

OpenTelemetry for X-Ray에서는 Application Signals가 꺼진 상태에서 CloudWatch Application Signals lambda 계층을 사용하는 것이 좋습니다. 이렇게 하면 함수가 자동으로 계측되고 함수 호출 및 함수의 다운스트림 요청에 대한 스팬이 생성됩니다. 추적 외에도 Application Signals를 사용하여 함수의 상태를 모니터링하는 데 관심이 있는 경우 Lambda에서 애플리케이션 활성화를 참조하세요.

Lambda 계측을 사용하여 수동으로 스팬 생성

또한 함수 내에서 사용자 지정 스팬을 생성하여 작업을 추적할 수 있습니다. Application Signals Lambda 계층 자동 계측과 함께 opentelemetry-api 패키지만 사용하면 됩니다.

  1. 함수에를 종속성opentelemetry-api으로 포함

  2. 다음 코드 조각은 사용자 지정 스팬을 생성하는 샘플입니다.

    from opentelemetry import trace # Get the tracer (auto‑configured by the Application Signals layer) tracer = trace.get_tracer(__name__) def handler(event, context): # This span is a child of the layer's root span with tracer.start_as_current_span("my-custom-span") as span: span.set_attribute("key1", "value1") span.add_event("custom-event", {"detail": "something happened"}) # Any logic you want to trace result = some_internal_logic() return { "statusCode": 200, "body": result }