O Moleculer possui um módulo de rastreamento integrado que coleta informações de rastreamento dentro de uma aplicação Moleculer. Além disso, você pode definir facilmente seus módulos de rastreamento personalizados. Existem vários geradores de rastreamento integrados como Zipkin, Jaeger, Datadog, etc.
Habilitar rastreamento
// moleculer.config.js |
Habilitar rastreamento com opções
// moleculer.config.js |
Opções
Nome | Tipo | Padrão | Descrição |
---|---|---|---|
enabled |
Boolean |
false |
Ativar recurso de rastreamento. |
exporter |
Object or Array<Object> |
null |
Configuração do gerador de rastreamento. Mais informações |
sampling |
Object |
Configurações de amostragem. Mais informações | |
actions |
Boolean |
true |
Rastreando as ações do serviço. |
events |
Boolean |
false |
Rastreando os eventos do serviço. |
errorFields |
Array<String> |
["name", "message", "code", "type", "data"] |
Campos de objetos de erro que foram adicionados em tags span. |
stackTrace |
Boolean |
false |
Adicione informações sobre rastreamento de pilha em span tags em caso de erro. |
tags |
Object |
null |
Adicione tags personalizadas de span para todas as ações e eventos de spam. Mais informações |
defaultTags |
Objeto |
null |
Tags padrão. Será adicionado a todas as spans. |
Amostragem
O módulo de rastreamento do Moleculer suporta vários métodos de amostragem. A determinação de amostrar ou não é feita no span raiz e propagada a todas as spans dependentes. Isso garante que um rastreamento completo seja sempre exportado, independentemente do método de amostra ou da taxa selecionada.
Amostragem constante
Este método de amostragem usa um valor de taxa de amostragem constante de 0
para 1
. O 1
significa que todos os spans serão amostrais, o 0
significa nenhum deles.
Amostras de todas as spans
// moleculer.config.js |
Amostras de metade de todas as spans
// moleculer.config.js |
Taxa de limitação de amostragem
Este método de amostragem usa uma taxa de limitação. Você pode configurar quantas spans serão distribuídas em um segundo.
Amostragem com 2 spans por segundo
// moleculer.config.js |
Amostragem com 1 spans a cada 10 segundos
// moleculer.config.js |
Geradores de Rastreamento
O módulo de rastreamento suporta vários geradores, spans personalizadas de rastreamento e integração com bibliotecas de instrumentação (como dd-trace
).
Console
Este é um gerador para debug que imprime o rastreamento local completo no console.
O gerador do console não pode rastrear chamadas remotas, apenas locais.
// moleculer.config.js |
Datadog
O gerador para Datadog envia dados de rastreamento para o servidor Datadog via dd-trace
.
// moleculer.config.js |
Para usar este gerador, instale o módulo
dd-trace
com o comandonpm install dd-trace --save
.
Event
O gerador para eventos do Moleculer envia eventos ($tracing.spans
) com dados de rastreamento.
// moleculer.config.js |
Event (legacy)
O gerador para evento legado envia eventos métricos legados do Moleculer (metrics.trace.span.start
& metrics.trace.span.finish
) a cada requisição. Esses eventos também são usados para gerar métricas na solução legada (<= v0.13
) de métricas.
// moleculer.config.js |
Payload de início de Requisição legada
O broker emite um evento metrics.trace.span.start
quando uma nova requisição é iniciada. O payload se parece com o seguinte:
{ |
Payload de conclusão de Requisição legada
O broker emite um evento metrics.trace.span.end
quando a chamada/requisição for finalizada. O payload se parece com o seguinte:
{ |
Jaeger
O gerador para Jaeger envia informações de rastreamento para um servidor Jaeger.
// moleculer.config.js |
Para usar esse gerador, instale o módulo
jaeger-client
com o comandonpm install jaeger-client --save
.
Zipkin
O exportador Zipkin envia informações de rastreamento para um servidor Zipkin.
// moleculer.config.js |
NewRelic
O exportador NewRelic envia informações de rastreamento no formato Zipkin v2 para um servidor NewRelic.
// moleculer.config.js |
Gerador personalizado
Um módulo personalizado de rastreamento pode ser criado. Recomendamos copiar o código fonte do Console e implementar os métodos init
, stop
, spanStarted
e spanFinished
.
Criar rastreamento personalizado
const TracerBase = require("moleculer").TracerExporters.Base; |
Usar rastreamento personalizado
// moleculer.config.js |
Múltiplos geradores
Você pode definir vários geradores de rastreamento.
// moleculer.config.js |
Spans de rastreamento definidos pelo usuário
Para adicionar novos spans dentro de uma ação ou manipulador de eventos, basta chamar os métodos ctx.startSpan
e ctx.finishSpan
.
// posts.service.js |
Criar span sem context
Se o Context
não estiver disponível, você pode criar spans via broker.tracer
.
// posts.service.js |
Conectar spans durante o uso do módulo de comunicação externo
É possível conectar os spans mesmo quando se comunica através de uma fila externa (por exemplo, moleculer-channels). Para fazer isso, você só precisa passar o parentID
e requestID
para o manipulador e, em seguida, usar esses IDs para iniciar um span personalizado.
Conectando spans
module.exports = { |
Personalizando
Nomes de Span Personalizados
Você pode personalizar o nome do span de seu rastreamento. Nesse caso, você deve especificar o spanName
que deve ser uma String
estática ou uma Function
.
Criando um nome personalizado para um rastreamento via Function
// posts.service.js |
Adicionando Tags do Context
Você pode personalizar quais valores de params
ou meta
são adicionados às tags span.
Default O comportamento padrão adiciona todas as propriedades de ctx.params
apenas.
// posts.service.js |
Exemplo de parâmetros personalizados
// posts.service.js |
Exemplo com função personalizada Você pode definir uma function
personalizada para preencher as tags de span do Context
.
// posts.service.js |
Por favor, note que, quando usado com uma ação, a função será chamada duas vezes no caso de execução bem-sucedida. Primeiro com
ctx
e segunda vez comctx
&response
como resposta da chamada da ação.
Ações globais e tags de eventos
Tags de span personalizadas de ações e eventos podem ser definidas usando a propriedade tags
nas options do gerador de rastreamento. Estas serão aplicadas a todas as ações e eventos a menos que sejam sobrescritas nas definições de eventos e ações no esquema do serviço. Todos os tipos de tags personalizados definidos acima são válidos. Quaisquer tags definidas na ação do esquema do serviço e as definições de eventos terão precedência, mas a mesclagem das definições de tags de params
, meta
, e response
são superáveis, o que significa que é possível fazer coisas como definir tags com meta
globalmente e com response
localmente em cada serviço.
// moleculer.config.js |
Tags personalizadas definidas usando a propriedade
tags
tem acesso actx
e, se usado com uma ação, oresponse
. As tags definidas emdefaultTags
devem ser um objeto estático ou uma função que aceita a instância dotracer
e retorna um objeto. Ele também tem acesso à instânciabroker
através da instânciatracer
mas não tem acesso actx
.
Exemplo de rastreamento de eventos Você pode rastrear os eventos também. Para habilitar isso, defina events: true
nas opções do broker.
// moleculer.config.js |
safetyTags e o erro Maximum call stack
Em geral, não é recomendado enviar parâmetros não serializáveis (por exemplo, http request, instância de socket, etc.) em ctx.params
ou ctx.meta
. Se o tracing estiver habilitado, o tracer tentará de forma recursiva achatar estes parâmetros (com o método flattenTags
) que causará o erro Maximum call stack
.
Para evitar esse problema, você pode usar a opção safetyTags
nas opções do tracer. Se definido como true
, os exportadores removem as propriedades cíclicas antes de achatar as tags nos spans. Esta opção está disponível em todos os exportadores integrados.
Performance impactPor favor, note que esta opção tem um significativo impacto no desempenho. Por essa razão não é habilitado por padrão.
Habilitando globalmente as Tags de Segurança
// moleculer.config.js |
Para evitar afetar todas as ações, você pode habilitar essa função no nível de ação. Neste caso, as outras ações não serão afetadas. Habilitando tags de segurança no nível da ação
broker.createService({ |