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