Python OpenTracing(非推奨)

OpenTracing は非推奨となっており、 Instana、 Python、 2.5.3 が、 OpenTracing をサポートする最新バージョンです。

このバージョンのインストール方法については、 OpenTracing サポート付きの Instana Python パッケージのインストール」を参照してください。

OpenTracing 分散トレーシングのためのベンダー中立なAPIと計測機能を提供します。 OpenTracing,に馴染みのない方は、OpenTracingポータルで詳細をご覧ください。

OpenTracing API を使用する既存のアプリケーション、またはサポートの追加を望んでいるユーザーは、この Python パッケージを容易に統合できます。

このパッケージを使用すると、OpenTracingTracer (opentracing.tracer) は自動的に 'InstanaTracer に設定されます。

OpenTracing, を最大限に活用するには、こちらの OpenTracing ページに記載されているベストプラクティスもご参照ください。

OpenTracing に対応した「 Instana 」パッケージ( Python )のインストール

さまざまなバージョンの Python 向けに、 Instana ( Python )パッケージを手動でインストールできます。

Python 3.8 以降を搭載したランタイムの場合

Instana の Python パッケージをvirtualenv、pipenv、またはコンテナに手動でインストールするには、次のコマンドを実行してください:

pip install instana==2.5.4

あるいは、次のコマンドを実行して、 GitHub リポジトリから直接 Instana Python パッケージをインストールすることもできます:

pip install git+https://github.com/instana/python-sensor@v2.5.4

Python を含むランタイムについては 3.7

Instana の Python パッケージをvirtualenv、pipenv、またはコンテナに手動でインストールするには、次のコマンドを実行してください:

pip install git+https://github.com/instana/python-sensor@v2.4.0

import opentracing

with opentracing.tracer.start_active_span('asteroid 💫') as pscope:
    pscope.span.set_tag(ext.COMPONENT, "Python simple example app")
    pscope.span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_SERVER)
    pscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
    pscope.span.set_tag(ext.HTTP_URL, "/python/simple/one")
    pscope.span.set_tag(ext.HTTP_METHOD, "GET")
    pscope.span.set_tag(ext.HTTP_STATUS_CODE, 200)
    pscope.span.log_kv({"foo": "bar"})
    # ... work ...

    with opentracing.tracer.start_active_span('spacedust 🌚', child_of=pscope.span) as cscope:
        cscope.span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_CLIENT)
        cscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
        cscope.span.set_tag(ext.HTTP_URL, "/python/simple/two")
        cscope.span.set_tag(ext.HTTP_METHOD, "POST")
        cscope.span.set_tag(ext.HTTP_STATUS_CODE, 204)
        cscope.span.set_baggage_item("someBaggage", "someValue")
        # ... work ...

Instana Python OpenTracing に対応したTracing SDK

Instana の Python モジュールは、アプリケーションの任意の部分を追跡するための API を提供します。

API を使用して、コードの一部にトレース用のインストルメンテーションを適用するには、次のようにします

from instana.singletons import tracer

try:
  span = tracer.start_span("mywork")
  # The code to be instrumented
  id = user.find_by_name('john.smith')
  span.set_tag('user_id', id)
except Exception as e:
  span.log_exception(e)
finally:
  span.finish()

また、コンテキスト・マネージャーを'with-asステートメントと一緒に使うこともできる。この場合、発生した例外は自動的に捕捉され、次のようにログに記録される:

from instana.singletons import tracer

with tracer.start_active_span("mywork") as scope:
  # The code to be instrumented
  id = user.find_by_name('john.smith')
  scope.span.set_tag('user_id', id)

非同期トレース

トレースしたい操作の中には、非同期的なものがあるかもしれない。つまり、即座にリターンするものの、メインの命令シーケンスとは別に動作し続けるようなものだ。 これらの操作をトレースするには、例えばasyncioライブラリを使って、以下のように'async_tracer関連のトレースメソッドを使用することができる:

import asyncio
from instana.singletons import tracer, async_tracer


async def do_work(parent_span):
    with async_tracer.start_active_span('launch_async_work', child_of=parent_span):
        print('Work stared')
        await asyncio.sleep(1)
        print('Work finished!')

with tracer.start_active_span('launch_uvloop') as sync_scope:
    asyncio.run(do_work(sync_scope.span))

分岐したプロセスにおけるスパンを追跡する

フォークされたプロセスのスパンをトレースしたい場合は、'span.finish()後に期間を追加する。 例:

 def forked_process(num):
    print(f'in forked process {num}')
    try:
        span = tracer.start_span(f"forked process {num}")
        print(f'sleep 10 for forked process {num}')
        time.sleep(10)
    except Exception as e:
        span.log_exception(e)
    finally:
        span.finish()

    logger.warning(f'sleep 2 for forked process {num}')
    time.sleep(2)   ##  < -- with a sleep after span.finish(), the span can be collected

新規スレッドへのコンテキストの伝達

トレースはスレッドにローカルに行われる。 新しいスレッドを作成した場合、コンテキストはその新しいスレッドに運ばれ、ピックアップされなければならない。 新しいスレッドにコンテキストを転送するには、以下のようにコードをインスツルメンテーションすればよい:

from threading import Thread

def child_thread_function(parent_span):
    with tracer.start_active_span('child_thread_span', child_of=parent_span) as child_scope:
        print('Thread offloaded work goes here')

with tracer.start_active_span('parent_thread_span') as parent_scope:
    thread = Thread(target = child_thread_function, args = (parent_scope.span, ))
    thread.start()
    thread.join()

後で実行されるジョブの追跡

後で実行するためにキューに入れられたジョブは、以下のようにして実行することができます:

# Python 3.8
import asyncio
import datetime
import uvloop
import aiohttp

from instana.singletons import tracer, async_tracer

uvloop.install()

async def launch_async_calls(parent_span):
    with async_tracer.start_active_span('launch_async_calls', child_of=parent_span):
        async with aiohttp.ClientSession() as session:
            async with session.get('https://wikipedia.org') as resp:
               print(resp.status)
               print(await resp.text())

async def run_at(dt, coro):
    await asyncio.sleep((dt - datetime.datetime.now()).total_seconds())
    return await coro

with tracer.start_active_span('launch_uvloop') as sync_scope:
    sync_scope.span.set_tag('span.kind', 'entry')
    asyncio.run(
      run_at(datetime.datetime.now() + datetime.timedelta(seconds=5),
             launch_async_calls(sync_scope.span)))

Instana のスパンにカスタムタグを追加する

Instana のspan要素にカスタムタグを追加するには、` set_tag `メソッドを使用して以下のコードを実装してください:

with tracer.start_active_span('well_chosen_span_name_here') as scope:
    scope.span.set_tag('custom_tag', 'custom_value')