Python OpenTracing (veraltet)

OpenTracing ist veraltet, und Instana Python 2.5.3 ist die neueste Version, die OpenTracing unterstützt.

Informationen zur Installation dieser Version finden Sie unter „Installation des Pakets ‚ Instana ‘ Python mit Unterstützung für OpenTracing “.

OpenTracing bietet herstellerneutrale APIs und Instrumentierung für die verteilte Ablaufverfolgung. Wenn Sie mit " OpenTracing, nicht vertraut sind, finden Sie weitere Informationen unter " OpenTracing Portal.

Vorhandene Anwendungen, die die OpenTracing-API verwenden, oder solche, die Unterstützung dafür hinzufügen möchten, können mit diesem Python-Paket problemlos eine Integration durchführen.

Wenn Sie dieses Paket verwenden, wird der OpenTracing Tracer (opentracing.tracer) automatisch auf den ' InstanaTracer gesetzt.

Um bei der Nutzung von OpenTracing, optimale Ergebnisse zu erzielen, beachten Sie bitte auch unsere Best Practices, die auf dieser Seite beschrieben sind: OpenTracing.

Installation des Pakets „ Instana “ ( Python ) mit Unterstützung für „ OpenTracing “

Sie können das Paket „ Instana “ ( Python ) für verschiedene Versionen von „ Python “ manuell installieren.

Für Laufzeitumgebungen mit „ Python “ ( 3.8 ) und höher

Um das Paket „ Instana “ ( Python ) manuell in einer Virtualenv, einem Pipenv oder einem Container zu installieren, führen Sie den folgenden Befehl aus:

pip install instana==2.5.4

Alternativ können Sie das Paket „ Instana “ Python direkt aus dem Repository GitHub installieren, indem Sie den folgenden Befehl ausführen:

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

Für Laufzeitumgebungen mit Python 3.7

Um das Paket „ Instana “ ( Python ) manuell in einer Virtualenv, einem Pipenv oder einem Container zu installieren, führen Sie den folgenden Befehl aus:

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

Beispiel

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 Tracing-SDK mit Unterstützung für „ OpenTracing “

Das Modul „ Instana “ ( Python ) bietet eine Schnittstelle ( API ), mit der sich beliebige Teile Ihrer Anwendung verfolgen lassen.

Sie können einen Codeabschnitt wie folgt mit einem „ API “ zur Ablaufverfolgung instrumentieren:

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()

Alternativ können Sie den Kontextmanager mit der Anweisung " with-as verwenden, die automatisch alle aufgetretenen Ausnahmen erfasst und protokolliert, wie folgt:

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)

Asynchrones Tracing

Einige Operationen, die Sie verfolgen möchten, können asynchron sein, d. h. sie kehren sofort zurück, arbeiten aber getrennt von der Hauptanweisungssequenz weiter. Um diese Vorgänge zu verfolgen, zum Beispiel mit der asyncio-Bibliothek, können Sie die ' async_tracer verwandten Verfolgungsmethoden wie folgt verwenden:

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))

Verfolgung von Spannen in verzweigten Prozessen

Wenn Sie die Zeitspannen in einem geforkten Prozess verfolgen wollen, fügen Sie einen Zeitraum nach ' span.finish() ein. Zum Beispiel:

 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

Kontext in neue Threads übertragen

Die Rückverfolgung erfolgt lokal für einen Thread. Wenn Sie einen neuen Thread erstellen, muss der Kontext in diesen neuen Thread übertragen und dann wieder aufgenommen werden. Sie können den Code wie folgt instrumentieren, um den Kontext in neue Threads zu übertragen:

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()

Aufträge nachverfolgen, deren Ausführung für später geplant ist

Sie können Aufträge, die für eine spätere Ausführung in der Warteschlange stehen, wie folgt instrumentieren:

# 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)))

Hinzufügen benutzerdefinierter Tags zu „ Instana “-Spans

Um einem „ Instana “-Element benutzerdefinierte Tags hinzuzufügen, binden Sie den folgenden Code mithilfe der set_tag Methode ein:

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