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