Splunk Observability Cloud 用の Python アプリケーションを手動でインストルメンテーションする 🔗
OpenTelemetry Python の Splunk ディストリビューションのエージェントを使用して、アプリケーションを自動的にインストルメンテーションすることで、ほとんどのニーズに対応できます。アプリケーションを手動でインストルメンテーションする必要があるのは、たとえばスパンにカスタム属性を追加する必要がある場合や、スパンを手動で生成する必要がある場合のみです。
Start tracing using code 🔗
If you can’t use the splunk-py-trace
command to launch the application, you can instead import and configure start_tracing
by adding the following snippet to your application code:
from splunk_otel.tracing import start_tracing start_tracing() # Also accepts optional settings. For example: # # start_tracing( # service_name='<my-python-service>', # span_exporter_factories=[OTLPSpanExporter] # access_token='<access_token>', # max_attr_length=12000, # trace_response_header_enabled=True, # resource_attributes={ # 'service.version': '<your_version>', # 'deployment.environment': '<your_environment>', # })
注釈
アプリケーションの起動に splunk-py-trace
コマンドを使っている場合は、このコードをアプリケーションに追加しないでください。
カスタムトレースの作成 🔗
自動インストルメンテーションの上に手動インストルメンテーションを追加する場合、以下のように追加スパンをキャプチャすることができる:
Import the OpenTelemetry SDK:
from opentelemetry import trace
スパンのトレーサーを作成します:
tracer = trace.get_tracer("tracer.name")
現在のスパンとしてスパンを作成します:
def reticulate_splines(): with tracer.start_as_current_span("span-name") as span: print("Reticulating splines...") # When the 'with' block goes out of scope, the 'span' is closed
Alternatively, if you’re not using auto-instrumentation, use the following steps instead:
Import the OpenTelemetry SDK:
from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ( BatchSpanProcessor, ConsoleSpanExporter, )
スパンのトレーサーを作成します:
provider = TracerProvider() processor = BatchSpanProcessor(ConsoleSpanExporter()) provider.add_span_processor(processor) trace.set_tracer_provider(provider) tracer = trace.get_tracer("tracer.name")
現在のスパンとしてスパンを作成します:
def reticulate_splines(): with tracer.start_as_current_span("span-name") as span: print("Reticulating splines...") # When the 'with' block goes out of scope, the 'span' is closed
その他の例については、OpenTelemetry 公式ドキュメント を参照してください。
カスタムメトリクスの作成 🔗
Splunk Distribution of OpenTelemetry Python は、以下のインストルメンテーションをサポートしています:
カウンター(同期)
カウンター(非同期)
ゲージ(非同期)
UpDownCounter(同期)
UpDownCounter (非同期)
カスタムメトリクスを作成するには、メトリクス・インストルメンテーションのタイプに応じた手順に従います。
同期インストルメンテーショントは、カウンターと同様、ビジネスロジックとインラインで呼び出されます。同期インスツルメントの例としては、サーバーに送信されたバイト数のカウンターがあります。これらはコンテキスト伝搬をサポートします。
OpenTelemetry API をインポートします:
from opentelemetry import metrics from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import ( ConsoleMetricExporter, PeriodicExportingMetricReader, )
メータープロバイダーを作成します:
meter := otel.Meter("ExampleService")
測定を行うインストルメンテーションを作成します:
metric_reader = PeriodicExportingMetricReader(ConsoleMetricExporter()) provider = MeterProvider(metric_readers=[metric_reader]) metrics.set_meter_provider(provider) meter = metrics.get_meter("my.meter.name")
測定を行います:
peanut_counter = meter.create_counter( "peanut.counter", unit="1", description="Counts the number of consumed peanuts" ) def do_stuff(work_item): peanut_counter.add(1, {"work.type": work_item.work_type}) print("Collecting peanuts...")
非同期インストルメンテーションは、非同期ゲージと同様に、OTel SDKがバックグラウンドで実行するコールバック関数を提供します。非同期インストルメンテーションの例としては、湿度センサーがあり、1分ごとに新しいデータをポーリングします。これらはコンテキスト伝搬をサポートしていません。
OpenTelemetry API をインポートします:
from typing import Iterable from opentelemetry.metrics import CallbackOptions, Observation
データを要求するコールバックを記述します:
def get_temp_data(options: CallbackOptions) -> Iterable[Temperature]: r = requests.get( "http://weather/data/city", timeout=options.timeout_millis / 10**3 ) for metadata in r.json(): yield Temperature( metadata["temperature"], {"city.name": metadata["temperature"]} )
非同期測定を行うインストルメンテーションを作成します:
meter.create_observable_gauge( "city.temperature", callbacks=[get_temp_data], description="Mean temperature of the city", )
その他の例については、OpenTelemetry 公式ドキュメント を参照してください。
手動インストルメンテーションを必要とするフレームワーク 🔗
Python フレームワークの中には、手動インストルメンテーションしかサポートしていないものがあります。具体的な手順については、こちらを参照してください:
注釈
手動 OTel インストルメンテーションは Splunk 自動 Python インストルメンテーションと完全に互換性があり、Splunk によって完全にサポートされています。