본문으로 건너뛰기
버전: In Development

분산 트레이싱

모든 데이터 오퍼레이션에 대한 내장 OpenTelemetry 트레이싱을 제공합니다. Span은 Database Client Semantic Conventions를 따르며 OTLP gRPC로 내보냅니다.

빠른 시작

pip install aerospike-py            # 트레이싱 내장
pip install aerospike-py[otel] # + Python span에서 컨텍스트 전파
import aerospike_py

# 1. 초기화
aerospike_py.init_tracing()

# 2. 클라이언트 사용 -- 모든 오퍼레이션이 자동으로 트레이싱됨
client = aerospike_py.client({"hosts": [("127.0.0.1", 3000)]}).connect()
client.put(("test", "users", "user1"), {"name": "Alice"})
client.get(("test", "users", "user1"))
client.close()

# 3. 종료 전 대기 중인 span 플러시
aerospike_py.shutdown_tracing()

API

함수설명
init_tracing()OTLP 트레이서를 초기화합니다. OTEL_* 환경변수를 읽습니다.
shutdown_tracing()플러시 후 종료합니다. 프로세스 종료 전에 호출하세요.

두 함수 모두 스레드 안전하며 멱등(idempotent)합니다.

환경변수

변수기본값설명
OTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4317OTLP gRPC 엔드포인트
OTEL_SERVICE_NAMEaerospike-py서비스 이름
OTEL_SDK_DISABLEDfalse트레이싱 완전 비활성화
OTEL_TRACES_EXPORTERotlpnone으로 설정하면 내보내기 비활성화

Span 속성

속성예시
db.system.nameaerospike
db.namespacetest
db.collection.nameusers
db.operation.namePUT, GET, REMOVE

Span 이름: {OPERATION} {namespace}.{set} (예: PUT test.users)

에러 발생 시: error.type, db.response.status_code, otel.status_code=ERROR

계측 대상: put, get, select, exists, remove, touch, append, prepend, increment, operate, batch_read, batch_operate, batch_remove, query

컨텍스트 전파

aerospike-py[otel]을 설치하면 W3C TraceContext가 Python 활성 span에서 Rust span으로 자동 전파됩니다:

설정동작
aerospike-py[otel] + 활성 spanPython span이 부모가 됨
aerospike-py[otel] + 활성 span 없음루트 span 생성
aerospike-py (기본)루트 span (전파 없음)

프레임워크 연동

FastAPI

from contextlib import asynccontextmanager
import aerospike_py
from fastapi import FastAPI

@asynccontextmanager
async def lifespan(app: FastAPI):
aerospike_py.init_tracing()
client = aerospike_py.AsyncClient({"hosts": [("127.0.0.1", 3000)]})
await client.connect()
app.state.aerospike = client
yield
await client.close()
aerospike_py.shutdown_tracing()

app = FastAPI(lifespan=lifespan)

HTTP부터 Aerospike까지 엔드투엔드 트레이스를 구성하려면:

pip install opentelemetry-instrumentation-fastapi
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
FastAPIInstrumentor.instrument_app(app)

Django

# apps.py
from django.apps import AppConfig
import aerospike_py

class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
aerospike_py.init_tracing()

# settings.py
import atexit, aerospike_py
atexit.register(aerospike_py.shutdown_tracing)

Jaeger 설정

docker run -d --name jaeger \
-p 4317:4317 -p 16686:16686 \
jaegertracing/all-in-one:latest

export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_SERVICE_NAME=my-aerospike-app

http://localhost:16686에서 트레이스를 확인할 수 있습니다.

트레이싱 비활성화

export OTEL_SDK_DISABLED=true          # 완전 비활성화
export OTEL_TRACES_EXPORTER=none # span은 생성되지만 내보내지 않음

장애 허용 동작

시나리오동작
OTLP 엔드포인트 접근 불가경고 로그, 트레이싱 비활성화
init_tracing() 미호출No-op span
opentelemetry-api 미설치루트 span (전파 없음)
shutdown_tracing() 미호출일부 대기 중인 span이 유실될 수 있음

성능 영향

시나리오오버헤드
Span 생성~1-5 us
컨텍스트 전파~10-50 us
네트워크 round-trip 대비< 1%
OTEL_SDK_DISABLED=true~30-80 ns (메트릭만)