コンテンツにスキップ

Python@OpenTelemetryクライアントパッケージ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. 概要

otelクライアントパッケージ

記入中...


拡張otelクライアントパッケージ

記入中...


分散トレースSDK

記入中...


02. アプリでgRPCを使用しない場合

宛先がGoogle Cloud Traceの場合

▼ パッケージの初期化

ここでは、FlaskというフレームワークでPythonのアプリケーションを作成したとする。

otelクライアントパッケージを初期化する。

初期化の段階で、トレースコンテキストを抽出する。

import time

from opentelemetry import trace
from opentelemetry.propagate import set_global_textmap
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.propagators.cloud_trace_propagator import (CloudTraceFormatPropagator,)

# ダウンストリーム側マイクロサービスのリクエストからトレースコンテキストを抽出する。
set_global_textmap(CloudTraceFormatPropagator())

# 任意のトレースコンテキストを設定する
resource = Resource.create({
        "service.name": "flask_e2e_client",
        "service.namespace": "examples",
        "service.instance.id": "instance554",
    })

tracer_provider = TracerProvider()

# Exporter (スパンの宛先) として、Google Cloud Traceを設定する。
cloud_trace_exporter = CloudTraceSpanExporter()

tracer_provider.add_span_processor(BatchSpanProcessor(cloud_trace_exporter))

trace.set_tracer_provider(tracer_provider)

tracer = trace.get_tracer(__name__)

ここでは、requestsパッケージでリクエストを送信するため、RequestsInstrumentor関数による初期化も必要である。

import requests
from opentelemetry.instrumentation.requests import RequestsInstrumentor

RequestsInstrumentor().instrument()

response = requests.get("http://flask-app:6000")

print(response.text)

▼ 親スパン作成

親スパンを作成する。

なお、親スパンであっても子スパンであっても、スパン作成の実装方法は同じである。

ここでは、Flaskでリクエストを受信するため、FlaskInstrumentor関数でスパンを処理している。

from opentelemetry.instrumentation.flask import FlaskInstrumentor
from flask import Flask

tracer = trace.get_tracer(__name__)

app = Flask(__name__)

FlaskInstrumentor().instrument_app(app)

@app.route("/")
def hello_world():

    ...

    # Carrierにトレースコンテキストを注入する。
    with tracer.start_as_current_span("do_work"):
        time.sleep(0.1)

    ...

▼ トレースコンテキスト注入と子スパン作成

Carrierにトレースコンテキストを注入し、また子スパンを作成する。

なお、親スパンであっても子スパンであっても、スパン作成の実装方法は同じである。

from opentelemetry.instrumentation.flask import FlaskInstrumentor
from flask import Flask

tracer = trace.get_tracer(__name__)

app = Flask(__name__)

FlaskInstrumentor().instrument_app(app)

@app.route("/")
def hello_world():

    ...

    # Carrierにトレースコンテキストを注入する。
    with tracer.start_as_current_span("do_work"):
        time.sleep(0.1)

    ...