Python OpenTracing (obsoleto)
OpenTracing está obsoleto, e Instana Python 2.5.3 é a versão mais recente que oferece suporte a OpenTracing.
Para obter informações sobre como instalar esta versão, consulte a seção “Instalação do pacote Instana Python com suporte a OpenTracing ”.
OpenTracing fornece APIs e ferramentas de instrumentação independentes de fornecedor para rastreamento distribuído. Se você não estiver familiarizado com o OpenTracing, consulte o portalOpenTracing para obter mais detalhes.
Os aplicativos existentes que utilizam a API OpenTracing ou aqueles que desejam incluir suporte podem se integrar facilmente a esse pacote Python.
Quando você usa esse pacote, o OpenTracing Tracer (opentracing.tracer) é automaticamente definido como " InstanaTracer.
Para obter melhores resultados ao utilizar OpenTracing,, consulte também as nossas recomendações descritas nesta página: OpenTracing.
Instalando o pacote Instana Python com suporte para OpenTracing
Você pode instalar manualmente o pacote Instana Python para diferentes versões do Python.
Para ambientes de execução com o Python 3.8 e versões posteriores
Para instalar manualmente o pacote Instana Python em um virtualenv, pipenv ou contêiner, execute o seguinte comando:
pip install instana==2.5.4
Como alternativa, você pode instalar o pacote Instana Python diretamente do repositório GitHub executando o seguinte comando:
pip install git+https://github.com/instana/python-sensor@v2.5.4
Para ambientes de execução com o Python 3.7
Para instalar manualmente o pacote Instana Python em um virtualenv, pipenv ou contêiner, execute o seguinte comando:
pip install git+https://github.com/instana/python-sensor@v2.4.0
Exemplo
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 rastreamento com suporte a OpenTracing
O módulo Instana Python fornece uma interface de programação de aplicativos ( API ) para rastrear qualquer parte da sua aplicação.
Você pode instrumentar uma seção de código para rastreamento usando um ` API ` da seguinte maneira:
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()
Como alternativa, é possível usar o gerenciador de contexto com a instrução ' with-as, que captura e registra automaticamente todas as exceções levantadas, da seguinte forma:
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)
Rastreio assíncrono
Algumas operações que você deseja rastrear podem ser assíncronas, o que significa que elas retornam imediatamente, mas continuam a funcionar separadamente da sequência principal de instruções. Para rastrear essas operações, por exemplo, com a biblioteca asyncio, você pode usar os métodos de rastreamento relacionados a ' async_tracer da seguinte forma:
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))
Rastreando intervalos em processos bifurcados
Se quiser rastrear os intervalos em um processo bifurcado, adicione um período de tempo após ' span.finish(). Por exemplo:
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
Carregando o contexto em novos encadeamentos
O rastreamento é local para um thread. Se você criar um novo tópico, o contexto deverá ser transportado para esse novo tópico e, em seguida, retomado. Você pode instrumentar o código para transportar o contexto para novos threads da seguinte forma:
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()
Rastrear tarefas programadas para serem executadas posteriormente
Você pode instrumentar os trabalhos que estão na fila para serem executados mais tarde da seguinte forma:
# 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)))
Adicionando tags personalizadas aos elementos ` Instana `
Para adicionar tags personalizadas a um elemento ` Instana `, implemente o código a seguir utilizando o set_tag método:
with tracer.start_active_span('well_chosen_span_name_here') as scope:
scope.span.set_tag('custom_tag', 'custom_value')