🛟 Não hesite em entrar em contato se você encontrar
algum problema ao implementar instrumentações customizadas. Estamos aqui para ajudar!
Configuração
Para usar as funções helper do AppSignal na sua instrumentação, primeiro você precisa importaropentelemetry e definir um objeto tracer. Dependendo da sua instrumentação, talvez também seja necessário criar spans adicionais.
Nossos Exemplos de uso demonstram como você pode usar tracers, spans e helpers para criar sua instrumentação personalizada.
Importar OpenTelemetry e definir o Tracer
A integração do AppSignal para Node.js utiliza objetos tracer do OpenTelemetry. Esses tracers contêm várias funções para criar instrumentações personalizadas. O Tracer expõe funções para criar novos spans. Esta documentação descreve como você pode usar tracers e spans para implementar sua integração personalizada. Primeiro, você precisa importar o objeto trace de@opentelemetry/api antes de trabalhar com tracers e spans. Ao invocar a função getTracer no objeto trace, um novo objeto tracer pode ser criado. Você precisa dar um nome ao seu objeto tracer nesta função, como visto no exemplo abaixo, onde a função getTracer é usada para definir um tracer com o nome "my interesting app".
Spans
Um span é o nome do objeto que utilizamos para capturar dados sobre a performance da sua aplicação, quaisquer erros e qualquer contexto ao redor. Um span faz parte de um trace mais amplo, uma representação hierárquica do fluxo de dados pela sua aplicação. Spans mantêm registro do horário de início e fim de um evento, junto com outras informações, como o nome ou outros dados relacionados a ele. Você pode ler mais sobre spans na Documentação de Tracing do OpenTelemetry.Criando um span ativo
Novos spans podem ser invocados via objeto trace. Código instrumentado dentro de um handler de Express ou Koa já estará dentro de um span. Você pode criar novos spans invocando a funçãostartActiveSpan() no objeto tracer. Spans recém-criados serão filhos do span no qual foram criados, se houver um. Você pode usar spans filhos para medir a performance de tarefas executadas dentro de um span pai.
Você deve dar ao seu span um nome que torne sua finalidade clara. Execute todas as tarefas que deseja monitorar dentro da função startActiveSpan(), como no exemplo abaixo.
span.end()
Exemplos de uso
Ao implementar instrumentação personalizada, você pode querer entender o comportamento de funções específicas, por exemplo, quanto tempo elas levam para executar.Usando helpers
No exemplo abaixo, estamos curiosos sobre a performance do nosso endpoint GET “order-coffee” para diferentes torras de café. Para investigar isso, usamos a funçãosetAttribute para criar uma tag chamada flavor, cujo valor obtemos dos parâmetros da requisição.
Nota: Como isso está dentro de um handler de requisição do Express, um span raiz já foi criado.
"picking coffee beans" definido na função pickCoffeeBeans.
Depois que o atributo for atribuído e todas as funções executadas, chamamos .end() no span para garantir que o AppSignal receba o horário de início e fim e os atributos que atribuímos:

Spans ativos
Embora as tags sejam úteis para analisar diferenças de performance na mesma função, elas não nos dão visibilidade sobre a performance de quaisquer funções chamadas a partir da nossa função. Para obter mais insights sobre o que está acontecendo dentro depickCoffeeBeans(), criamos um novo activeSpan e o nomeamos como “picking coffee beans”. Toda a lógica que queremos rastrear é executada dentro de uma função async.
Usamos await na promise retornada por retrieveDrinkTypes(), para que possamos rastrear sua performance como um span filho do span "picking coffee beans" que criamos em pickCoffeeBeans().
pickCoffeeBeans(), o que incluirá os dados de performance da função retrieveDrinkTypes(), oferecendo maior visibilidade sobre quais fatores estão impactando a performance geral de uma função.
Helpers
Para usar as funções helper, primeiro você precisa importá-las de@appsignal/nodejs. No exemplo abaixo, o namespace no qual o código está sendo executado é reportado ao AppSignal. Todas as funções helper disponíveis estão descritas na documentação abaixo.
Funções helper
- Namespace
- Tag
- Parâmetros da requisição
- Definir dados de sessão
- Headers da requisição
- Root Name
- Dados personalizados
- Helpers de span filho:
Namespace
Define o valor de string do namespace do span raiz.Tag
Define uma tag, por exemplo, a partir de um parâmetro da requisição, que pode ser usada como filtro dentro da aplicação AppSignal. No exemplo abaixo, criamos uma tag chamada color com o valor blue. Você pode configurar tags com nomes relevantes para o contexto da sua aplicação.Parâmetros da requisição
Um objeto serializável para JSON. Parâmetros da requisição recebida, corpo da requisição e parâmetros de query.Definir dados de sessão
Um objeto serializável para JSON.Headers da requisição
Uma string contendo o valor do header.Root Name
Permite definir o nome do trace. As amostras são agrupadas em ações pelo nome do trace.Exemplo de uso
Sua aplicação tem um endpoint chamadoGET /coffee.
GET /coffee, mas seu endpoint lida com múltiplas ações: coffee?action=buy e coffee?action=sell.

GET /coffee, eles são conceitualmente muito diferentes, então faz sentido que sejam agrupados separadamente no AppSignal, em vez de na mesma amostra GET /coffee. Para fazer isso, você pode usar o helper setRootName():
setRootName mudará o nome do span raiz, agrupando as amostras das requisições coffee?action=buy e coffee?action=sell em ações separadas:

Dados personalizados
Um objeto serializável para JSON.Helpers de span filho
Os helpers a seguir só se aplicam a spans filhos. Para criar um span filho, você precisa criar um novo Span Ativo. Novos spans são automaticamente filhos do span pai.Category
Uma string contendo a categoria do span filho. O nome deve usar. para expressar a herança hierárquica da categoria. Por exemplo: cafe.coffee.cupsize
Name
Uma string contendo o título do evento do span filho na linha do tempo.Body
O body do span pode incluir informações adicionais sobre o evento, como a requisição HTTP, o host conectado, etc. Certifique-se de sanitizar as informações antes de adicioná-las ao span para que nenhuma Informação Pessoal Identificável seja enviada ao AppSignal. Essas informações ficarão visíveis para o span ao passar o mouse sobre a linha do tempo do evento. Para armazenar consultas SQL no body do span, por favor, use o helpersetSqlBody em vez disso.
SQL body
Define uma consulta SQL como o body do span, como aparece na linha do tempo de eventos de performance na visualização de detalhes da amostra do incidente. Isso é semelhante ao helpersetBody, mas é especializado para consultas SQL. Qualquer consulta SQL definida como body com este atributo será sanitizada para evitar o envio de dados PII (Informação Pessoal Identificável) para nossos servidores.
Veja o helper setBody para mais detalhes sobre como o atributo body funciona.
Quando os helpers setBody e setSqlBody são chamados no mesmo span, o valor do helper setSqlBody prevalece e o valor do helper setBody será ignorado.