Melhores práticas para o rastreio customizado
Se você deseja ampliar o Instana AutoTrace™ ou importar spans instrumentados manualmente, recomendamos que siga as práticas recomendadas a seguir.
Para mais informações, consulte Instana AutoTrace.
Usar períodos bem anotados
Para melhor monitorar, aprender e alertar sobre seus aplicativos e infraestrutura, a Instana executa processamento avançado e análise em todos os dados recebidos. Isso inclui todos os períodos recebidos de todas as origens.
Para obter o maior benefício da análise e do processamento automáticos da Instana, a inclusão de tags apropriadas em seus períodos permite que a Instana analise e aja melhor com os períodos recebidos.
Por exemplo, o código a seguir Python OpenTracing fornece menos informações.
import opentracing
with opentracing.tracer.start_active_span('vanilla') as pscope:
# ...
# do something that takes 50ms
# ...
pscope.span.log_kv({"foo": "bar"})
A partir deste código, só sabemos que é uma amplitude denominada vanilla que levou 50 ms de tempo. Não sabemos qual era o tipo de período: HTTP, RPC ou um período de sistema de mensagens. Não sabemos o que aconteceu durante esse tempo, como a comunicação com qualquer outro componente em sua infraestrutura.
Ao fornecer tags contextuais apropriadas do OpenTracing, a Instana analisa e extrai informações desse período para agir com base nelas.
import opentracing
import opentracing.ext.tags as ext
with opentracing.tracer.start_active_span('webserver') as pscope:
pscope.span.set_tag(ext.SPAN_KIND, "entry")
pscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
pscope.span.set_tag(ext.HTTP_URL, "/python/simple/two")
pscope.span.set_tag(ext.HTTP_METHOD, "POST")
pscope.span.log_kv({"foo": "bar"})
# ...
# work that took 50ms
# ...
pscope.span.set_tag(ext.HTTP_STATUS_CODE, 204)
Esse período bem anotado informa à Instana muito mais sobre o que aconteceu no contexto do período. Nas tags fornecidas, sabemos que se trata de uma solicitação de servidor da web recebida para /python/simple/two e que o código de status HTTP resultante é 204.
Um trecho bem anotado, como o trecho anterior, permite que o Instana extraia serviços, monitore conexões e seu estado de integridade, o que proporciona uma experiência mais rica no seu painel.
Para obter detalhes sobre este exemplo, consulte a especificação OpenTracing, que define a lista oficial de todas as tags OpenTracing compatíveis. Uma lista abrangente de tags suportadas pela Instana (que é um superconjunto de tags do OpenTracing) está disponível no final desta página.
Anotando spans "integrados"
Em alguns casos, pode fazer sentido adicionar mais metadados a um span existente fornecido por uma biblioteca disponibilizada pelo Instana. Para que esses dados sejam exibidos, eles precisam estar dentro do objeto sdk.custom.tags no rastreio.
Cada biblioteca manipula isso de forma diferente. Para entender como incluir este objeto, verifique a documentação do SDK de sua linguagem.
Iniciar novos rastreios com períodos de entrada
Dentro do rastreio distribuído, há três grandes tipos de spans:
- Entrada: anota a recepção de uma solicitação, o início de uma nova tarefa ou o consumo de uma mensagem
- Intermediário: Annotates trabalho interno que não faz ou recebe chamadas (por exemplo, visualização de visualização)
- Exit: Annotates trabalho que faz uma chamada para um serviço remoto ou publica uma mensagem para uma fila
A tag span.kind marca o tipo de span que está sendo relatado. Consulte span.kind a tabela no final desta página ou, em alternativa, a especificação do OpenTracing para obter mais detalhes.
Ao iniciar novos rastreios, comece com um período Entrada. Se você não especificar a tag span.kind, o período será considerado do tipo Entrada. Configurar essa tag com o valor apropriado permite um melhor processamento, extração de chamada de back-end de visualização e mapeamento na Instana.
Consulte o exemplo de Go a seguir:
// Start a new entry span and set 'kind' to Consumer (entry)
entrySpan := ot.StartSpan("RPCJobRunner")
entrySpan.SetTag(string(ext.SpanKind), string(ext.SpanKindConsumerEnum))
// Now the RPC exit span
spanName := fmt.Sprintf("%s %s", request.Service, request.Method)
clientSpan := ot.StartSpan(spanName, ot.ChildOf(entrySpan.Context()))
clientSpan.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCClientEnum))
clientSpan.SetTag("rpc.call", request.Method)
// Make the RPC call
clientSpan.Finish()
entrySpan.Finish()
Marcando um período com um erro
Os períodos que representam trabalho que continha um erro, como uma exceção, devem incluir as tags error e message. Para definições dessas tags, veja a definição na tabela da seguinte forma.
Transmitindo contexto entre os microsserviços
Para transmitir contexto além dos limites como hosts, filas e serviços, o rastreio distribuído inclui um método. Isso é feito geralmente com transportadores, como cabeçalhos de HTTP ou cabeçalhos da fila de mensagens.
Para obter mais detalhes, consulte a nossa documentação sobre HTTP Headers.
Configurar um nome de serviço
Isto é opcional. Nomes de serviço são aqueles aplicados a processos de aplicativo monitorado. Em muitas linguagens, o melhor nome de serviço pode ser detectado automaticamente com base na Estrutura em uso ou na linha de comandos do processo.
Se você quiser substituir isso, configure um nome de serviço por Rastreador. Consulte o exemplo a seguir para a linguagem Go.
serviceName := "default"
if *isServer {
serviceName = "rpc-client"
} else {
serviceName = "rpc-server"
}
opts := instana.Options{Service: serviceName})
opentracing.InitGlobalTracer(instana.NewTracerWithOptions(&opts)
Todos os rastreadores do OpenTracing da Instana também suportam essa configuração por meio de variável de ambiente. Se você configurar a variável de ambiente INSTANA_SERVICE_NAME para o processo, o valor será usado como nome de serviço para o processo. Isso substitui qualquer configuração de nome do serviço no nível de código.
Consulte também a documentação sobre as técnicas e regras gerais de extração de serviços do Instana.
Configurar um terminal e um nome de chamada
Isto é opcional. Em muitas linguagens, os nomes de terminais e de chamadas são detectados automaticamente com base no tipo de serviço.
Se você quiser substituir isso, configure os nomes de terminais e de chamadas por Rastreador. Consulte o exemplo a seguir para a linguagem Java.
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "endpoint", "endpoint-name");
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "call.name", "call-name");
Para obter mais informações sobre as técnicas e regras gerais de extração de terminais do Instana, consulte nossa documentação sobre terminais.
Sobrescrever a duração do span
O SDK de rastreio calcula automaticamente a duração do span desde o início e o término do span.
Geralmente representa o que você deseja medir, no entanto, quando ele não o faz, é possível sobrescrevê-lo usando a tag duration.
O formato esperado está em milissegundos.
// Overwrite the span duration with 15 milliseconds.
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "duration", "15");
Modelos de caminho: agrupamento visual de terminais HTTP
A Instana suporta agrupamento automático de terminais com modelos de caminho. Isso é suportado prontamente com o rastreio da Instana para muitas estruturas. No caso do ` OpenTracing, `, é necessário um passo adicional, conforme descrito a seguir.
Várias estruturas geralmente têm um padrão de caminho de REST semelhante ao seguinte:
/api/query/1956-01-31/Guido-van-Rossum
/api/query/1976-04-18/Andrew-Ng
/api/query/1912-06-23/Alan-Turing
Esses pontos de extremidade semelhantes podem ser agrupados informando uma http.path_tpl chave com o valor em seus intervalos do HTTP/api/query/{birthdate}/{name}; o Instana usa esse modelo para agrupar automaticamente os pontos de extremidade que correspondem ao padrão fornecido. No painel do Instana, os pontos de extremidade HTTP serão agrupados como um único ponto de extremidade:
/api/query/{birthdate}/{name}
Consulte a seguir um exemplo de Go:
span := ot.GlobalTracer().StartSpan("myTemplatedSpan", ext.RPCServerOption(incomingContext))
span.SetTag("http.path_tpl", "/api/query/{birthdate}/{name}")
span.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCServerEnum))
span.SetTag(string(ext.HTTPUrl), req.URL.Path)
span.SetTag(string(ext.HTTPMethod), req.Method)
span.SetTag(string(ext.HTTPStatusCode), 200)
Observe que esse recurso é específico da Instana e não compatível com o OpenTracing.
Tags processadas
Esta seção lista as tags específicas que a Instana procura ao identificar e processar períodos. Quando um subconjunto das tags a seguir é encontrado para um span, o Instana pode processar, analisar, visualizar e emitir alertas sobre os spans recebidos com maior eficácia.
Observe que as tags listadas a seguir são um superconjunto das tags OpenTracing padrão. Cada tag é marcada se ela é OpenTracing compatível com um ✓ ou x se não for.
Algumas descrições de tags a seguir foram extraídas diretamente do documento de convenções semânticas do OpenTracing.
Tipo
No mundo de rastreio distribuído, há três principais categorias de períodos:
- Vãos de entrada : vãos que recebem solicitações (como servidores HTTP ou RPC ), consomem mensagens de uma fila ou executam uma tarefa
- Vãos de saída : vãos que realizam solicitações de cliente (por exemplo, HTTP, RPC ou banco de dados), enviam mensagens para uma fila ou fazem chamadas ao banco de dados do cliente
- Períodos intermediários: períodos que representam o trabalho feito nos aplicativos, como renderização de visualização ou processamento de ação/controlador.
A tag span.kind para um período identifica o tipo de período que está sendo relatado. O envio desta tag permite que o Instana extraia, processe e mapeie as comunicações entre os spans. Na Instana, referimo-nos a essa comunicação como uma "chamada".
Ter essas informações permite que a Instana não apenas monitore os períodos, mas também monitore as chamadas entre os períodos fornecendo maior insight sobre a conectividade entre seus sistemas. Com isso em vigor, a Instana também pode monitorar e alertar sobre o funcionamento dessas chamadas, à medida que os períodos estão sendo relatados.
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
span.kind |
Sequência | ✓ | client ou server para as funções apropriadas em uma solicitação de RPC ou HTTP e producer ou consumer para as funções apropriadas em um cenário de sistema de mensagens. Outros valores aceitos são: entry, exit ou intermediate, que não são compatíveis com o OpenTracing. |
HTTP
Os períodos HTTP representam uma chamada de cliente HTTP ou um processamento de solicitação do servidor HTTP.
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
http.url |
Sequência | ✓ | A URL de HTTP totalmente qualificada usada nesta solicitação do cliente HTTP ou no processamento do servidor. |
http.method |
Sequência | ✓ | O método de HTTP usado nesta solicitação do cliente HTTP ou no processamento do servidor. Exemplos incluem "GET", " POST ", "PUT" e assim por diante. |
http.status_code |
Número Inteiro | ✓ | O código de status HTTP desta solicitação de HTTP. |
http.status |
Número Inteiro | x | Alternativa para http.status_code. Ambos são suportados, embora apenas um deva ser enviado. |
http.path |
Sequência | x | O caminho de HTTP da solicitação. |
http.host |
Sequência | x | O host remoto no caso de uma solicitação do cliente ou o host que manipula uma solicitação de HTTP recebida. |
http.params |
Sequência | x | Os parâmetros de consulta da solicitação de HTTP |
http.error |
Sequência | x | No caso de um erro, uma mensagem de erro associada a esse período. Por exemplo, erro interno do servidor. |
http.header |
Sequência | x | Usado para relatar cabeçalhos customizados em relação a esse período, como "X-My-Custom-Header=afd812cab" |
http.path_tpl |
Sequência | x | Permite agrupamento visual de terminais. Veja a documentação do Templates do Caminho para obter detalhes |
http.route_id |
Sequência | x | Um identificador exclusivo para sua rota, como blog.show; útil com estruturas nas quais um terminal distinto é referenciado por ID |
Notas:
- Um
span.kindapropriado deve sempre ser enviado com essas tags. http.host,http.pathehttp.paramsdevem ser enviados apenas no lugar dehttp.url. O envio de uma combinação dessas tags comhttp.urlnão é suportado e os resultados são indefinidos.
RPC
Os períodos RPC são aqueles que representam trabalho feito em uma chamada RPC ou processamento de chamada do servidor RPC.
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
rpc.call |
Sequência | ✓ | A chamada RPC que está sendo chamada ou atendida (depende do valor de span.kind) |
rpc.host |
Sequência | ✓ | O host remoto RPC para chamadas do cliente ou o host RPC que manipula a solicitação no caso de um servidor RPC. |
rpc.params |
Sequência | x | Parâmetros para a chamada RPC |
rpc.port |
Sequência | x | Porta para a chamada RPC |
rpc.flavor |
Sequência | x | Tipo de biblioteca do ` RPC ` utilizada, como XMLRPC, GRPCIO e assim por diante |
rpc.error |
Sequência | x | Mensagem de erro associada à chamada RPC |
GraphQL
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
graphql.operationType |
Sequência | x | Query ou Mutation |
graphql.operationName |
Sequência | x | Nome da consulta ou da mutação |
graphql.fields |
JSON /objeto ou JSON convertido em string (veja a seguir) | x | Campos usados como parte da consulta ou da mutação |
graphql.arguments |
JSON /objeto ou JSON convertido em string (veja a seguir) | x | Argumentos usados como parte da consulta |
Em relação a graphql.fields e graphql.arguments, é necessário escolher o tipo de dados apropriado (JSON ou sequência), dependendo do que o rastreador suportar.
Exemplos:
// NodeJS SDK => JSON
span.annotate('sdk.custom.tags.graphql.fields', {
Account: [ 'id', 'name' ],
User: [ 'id', 'name' ]
})
span.annotate('sdk.custom.tags.graphql.arguments', {
User: [ 'where', 'orderBy' ]
})
// Java SDK => String
SpanSupport.annotate("graphql.fields", "{ \"Account\": [\"id\", \"name\"], \"User\": [\"id\", \"name\"] }");
SpanSupport.annotate("graphql.arguments", "{ \"User\": ["\where\", \"orderBy\"] }");
Banco de dados
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
db.instance |
Sequência | ✓ | O nome da instância do banco de dados. Como exemplo em Java, se jdbc.url="jdbc:mysql://127.0.0.1:3306/customers", o nome da instância será "customers" |
db.type |
Sequência | ✓ | Para qualquer banco de dados SQL, "sql". Para outros, a categoria do banco de dados em minúsculas, por exemplo, "cassandra", "hbase" ou "redis". |
db.statement |
Sequência | ✓ | Uma instrução de banco de dados para o tipo de banco de dados especificado. Por exemplo, quando db.type é "SQL" - SELECT * FROM user_table; quando db.type é "redis" - SET mykey 'WuValue'. |
db.user |
Sequência | ✓ | Nome do usuário para acessar o banco de dados. Por exemplo, "readonly_user" ou "reporting_user" |
db.connection_string |
Sequência | Cadeia de conexão, por exemplo, jdbc:mysql://127.0.0.1:3306/customers |
Sistema de mensagens
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
message_bus.destination |
Sequência | ✓ | Um endereço no qual as mensagens podem ser trocadas. Pode ser um tópico ou fila e assim por diante. |
Lote
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
batch.job |
Sequência | x | O nome da tarefa que está sendo executada. |
Peer
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
peer.hostname |
Sequência | ✓ | O host remoto de um período de saída para uma chamada realizada. |
peer.address |
Sequência | ✓ | O endereço remoto de um período de saída para uma chamada realizada. |
peer.service |
Sequência | ✓ | O nome do serviço do lado remoto de um período de saída para uma chamada realizada. Observe que isso é opcional e pode ser usado quando o lado remoto ainda não foi instrumentado. |
Erros
| Marcar | Tipo | Compatível com o OpenTracing? | Descrição |
|---|---|---|---|
error |
Booleano | ✓ | Indica se um erro foi encontrado durante o tempo representado por esse período. |
message |
Sequência | x | Uma mensagem associada ao erro |