Python OpenTracing (obsolète)
OpenTracing est obsolète, et Instana Python 2.5.3 est la dernière version prenant en charge OpenTracing.
Pour savoir comment installer cette version, consultez la section « Installation du paquet Instana Python avec prise en charge d' OpenTracing ».
OpenTracing fournit des API et des outils d'instrumentation indépendants des fournisseurs pour le traçage distribué. Si vous n'êtes pas familier avec OpenTracing, consultez le portailOpenTracing pour plus de détails.
Les applications existantes qui utilisent l'API OpenTracing ou celles qui souhaitent la prendre en charge peuvent facilement s'intégrer à ce package Python.
Lorsque vous utilisez ce paquet, le traceur OpenTracing (opentracing.tracer) est automatiquement remplacé par le " InstanaTracer.
Pour obtenir les meilleurs résultats lors de l'utilisation de OpenTracing,, veuillez également prendre connaissance des bonnes pratiques décrites sur cette page : OpenTracing.
Installation du paquet « Instana » ( Python ) avec prise en charge d' OpenTracing
Vous pouvez installer manuellement le paquet Instana Python pour différentes versions d' Python.
Pour les environnements d'exécution utilisant Python 3.8 et versions ultérieures
Pour installer manuellement le paquet Instana Python dans un virtualenv, un pipenv ou un conteneur, exécutez la commande suivante :
pip install instana==2.5.4
Vous pouvez également installer le paquet Instana Python directement depuis le dépôt GitHub en exécutant la commande suivante :
pip install git+https://github.com/instana/python-sensor@v2.5.4
Pour les environnements d'exécution avec Python 3.7
Pour installer manuellement le paquet Instana Python dans un virtualenv, un pipenv ou un conteneur, exécutez la commande suivante :
pip install git+https://github.com/instana/python-sensor@v2.4.0
Exemple
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 SDK de traçage avec prise en charge d' OpenTracing
Le module Python Instana fournit une API permettant de tracer n'importe quelle partie de votre application.
Vous pouvez instrumenter une section de code à des fins de traçage à l'aide d'une balise ` API ` comme suit :
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()
Vous pouvez également utiliser le gestionnaire de contexte avec l'instruction " with-as, qui capture et consigne automatiquement toutes les exceptions soulevées, comme suit :
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)
Traçage asynchrone
Certaines opérations que vous souhaitez suivre peuvent être asynchrones, ce qui signifie qu'elles reviennent immédiatement mais continuent à fonctionner séparément de la séquence principale d'instructions. Pour tracer ces opérations, par exemple avec la bibliothèque asyncio, vous pouvez utiliser les méthodes de traçage liées à 'async_tracer comme suit :
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))
Suivi des intervalles dans les processus bifurqués
Si vous souhaitez retracer des périodes de temps dans un processus fourchu, ajoutez une période de temps après " span.finish(). Par exemple :
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
Transmission du contexte aux nouvelles unités d'exécution
Le traçage est local à un fil de discussion. Si vous créez un nouveau fil de discussion, le contexte doit être transféré dans ce nouveau fil, puis repris. Vous pouvez instrumenter le code pour transférer le contexte dans de nouveaux threads de la manière suivante :
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()
Suivi des tâches dont l'exécution est prévue ultérieurement
Vous pouvez instrumenter les travaux qui sont mis en file d'attente pour être exécutés ultérieurement de la manière suivante :
# 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)))
Ajouter des balises personnalisées aux balises « span » d' Instana
Pour ajouter des balises personnalisées à un élément `span` d' Instana, intégrez le code suivant à l'aide de la set_tag méthode :
with tracer.start_active_span('well_chosen_span_name_here') as scope:
scope.span.set_tag('custom_tag', 'custom_value')