npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@aldofrota/dd-trace-decorator

v1.0.12

Published

Decorator to facilitate tracing with Datadog

Readme

DD-Trace Decorator

Decorator para facilitar o tracing com Datadog em aplicações TypeScript.

Pré-requisitos

Certifique-se de que o Datadog está configurado no seu ambiente para validar a funcionalidade de tracing.

Instalação

Instale a biblioteca

npm install @aldofrota/dd-trace-decorator

Uso

Decorator de Método

O decorator @TraceMethod pode ser aplicado a métodos individuais para adicionar tracing específico.

Configuração Básica

import { TraceMethod } from "@aldofrota/dd-trace-decorator";

export class UserService {
  @TraceMethod({
    includeParamsAsTags: true,
    includeResultAsTag: true,
  })
  async createUser(user: any): Promise<any> {
    return { id: 123, name: user.name };
  }
}

Configuração Avançada

@TraceMethod({
  name: "custom.span.name",
  includeParamsAsTags: true,
  includeSpecificArgs: [0], // Apenas o primeiro argumento
  objectFieldsToInclude: {
    0: ["id", "status"], // Apenas campos específicos do primeiro argumento
  },
  excludeObjectFields: {
    0: ["password", "secret"], // Excluir campos sensíveis
  },
  argsMap: ["user", "role", "config"], // Nomes customizados para argumentos
  tags: {
    "custom.tag": "value",
  },
})
async createUser(user: any, role: string, config: any): Promise<any> {
  // ...
}

Opções do Decorator

Opções Disponíveis

Configurações Independentes:

  • name: Nome customizado do span
  • tags: Tags estáticas adicionais
  • includeParamsAsTags: Incluir parâmetros como tags
  • includeResultAsTag: Incluir resultado como tag

Configurações que dependem de includeParamsAsTags: true:

  • includeParamsAsTags: Habilita a inclusão de parâmetros como tags
  • argsMap: Mapeamento de nomes para argumentos
  • includeSpecificArgs: Índices dos argumentos a serem incluídos
  • objectFieldsToInclude: Campos específicos de objetos por índice
  • excludeObjectFields: Campos a serem excluídos por índice

Comportamento do Decorator

O decorator @TraceMethod:

  • Aplica tracing apenas ao método decorado
  • Permite configurações específicas por método
  • Suporta todas as opções de configuração
  • Funciona com métodos síncronos e assíncronos

Configurações Detalhadas

Configurações Básicas

name: Define um nome customizado para o span

@TraceMethod({ name: "custom.operation.name" })
method() { /* ... */ }

tags: Adiciona tags estáticas ao span

@TraceMethod({ 
  tags: { 
    service: "user-service", 
    version: "1.0.0" 
  } 
})
method() { /* ... */ }

includeParamsAsTags: Habilita a inclusão de parâmetros como tags

@TraceMethod({ includeParamsAsTags: true })
method(user: any) { /* ... */ }
// Resultado: user = { id: 123, name: "John" }

includeResultAsTag: Inclui o resultado do método como tag

@TraceMethod({ includeResultAsTag: true })
method() { return { success: true }; }
// Resultado: result = {"success":true}

Configurações de Parâmetros

argsMap: Define nomes customizados para argumentos (requer includeParamsAsTags: true)

⚠️ Importante: O argsMap deve ter exatamente o mesmo número de nomes que o número de parâmetros, na ordem correta.

@TraceMethod({
  includeParamsAsTags: true, // ← Obrigatório
  argsMap: ["user", "role", "config"] // ← Deve corresponder aos parâmetros na ordem
})
method(user: any, role: string, config: any) { /* ... */ }
// Resultado: user = {...}, role = "admin", config = {...}

❌ Exemplo incorreto:

@TraceMethod({
  includeParamsAsTags: true,
  argsMap: ["user", "role"] // ← Faltando nome para o terceiro parâmetro
})
method(user: any, role: string, config: any) { /* ... */ }
// Resultado: user = {...}, role = "admin", config = "arg2" (nome padrão)

includeSpecificArgs: Inclui apenas argumentos específicos (requer includeParamsAsTags: true)

@TraceMethod({
  includeParamsAsTags: true, // ← Obrigatório
  includeSpecificArgs: [0, 2] // Apenas primeiro e terceiro argumentos
})
method(user: any, role: string, config: any) { /* ... */ }
// Resultado: user = {...}, config = {...} (role é ignorado)

Configurações de Filtragem de Objetos

Importante: Estas configurações só funcionam quando includeParamsAsTags: true

objectFieldsToInclude: Inclui apenas campos específicos de objetos (requer includeParamsAsTags: true)

@TraceMethod({
  includeParamsAsTags: true, // ← Obrigatório
  objectFieldsToInclude: {
    0: ["id", "name"], // Apenas id e name do primeiro argumento
    2: ["enabled"]     // Apenas enabled do terceiro argumento
  }
})
method(user: any, role: string, config: any) { /* ... */ }
// Resultado: user.id = 123, user.name = "John", config.enabled = true

excludeObjectFields: Exclui campos específicos de objetos (requer includeParamsAsTags: true)

@TraceMethod({
  includeParamsAsTags: true, // ← Obrigatório
  excludeObjectFields: {
    0: ["password", "secret"], // Exclui campos sensíveis
    2: ["internal"]            // Exclui campo interno
  }
})
method(user: any, role: string, config: any) { /* ... */ }
// Resultado: todos os campos exceto password, secret e internal

Combinações Avançadas

Filtragem completa com nomes customizados:

@TraceMethod({
  includeParamsAsTags: true,
  argsMap: ["user", "role", "config"],
  includeSpecificArgs: [0, 2],
  objectFieldsToInclude: {
    0: ["id", "name"],
    2: ["enabled"]
  },
  excludeObjectFields: {
    0: ["password"],
    2: ["internal"]
  }
})
method(user: any, role: string, config: any) { /* ... */ }

Configuração para objeto único:

@TraceMethod({
  includeParamsAsTags: true,
  objectFieldsToInclude: {
    0: ["id", "name", "email"]
  },
  excludeObjectFields: {
    0: ["password", "secret"]
  }
})
createUser(user: any) { /* ... */ }
// Resultado: apenas id, name e email são incluídos como tags

Comportamentos Especiais

Objeto único sem filtros:

@TraceMethod({ includeParamsAsTags: true })
createUser(user: any) { /* ... */ }
// Resultado: todos os campos do objeto são incluídos

Argumento único (não objeto):

@TraceMethod({ 
  includeParamsAsTags: true,
  defaultParamName: "content" // Nome padrão para argumento único
})
processId(id: number) { /* ... */ }
// Resultado: content = 123

Múltiplos argumentos sem filtros:

@TraceMethod({ includeParamsAsTags: true })
updateUser(id: number, user: any, config: any) { /* ... */ }
// Resultado: arg0 = 123, arg1 = {...}, arg2 = {...}

Comportamento padrão sem argsMap:

@TraceMethod({ includeParamsAsTags: true })
method(param1: any, param2: any, param3: any) { /* ... */ }
// Resultado: arg0 = {...}, arg1 = {...}, arg2 = {...}
// Nomes padrão: arg0, arg1, arg2, etc.

Manipulação de Dados

Serialização Segura

  • Objetos são serializados de forma segura
  • Campos sensíveis podem ser excluídos
  • Arrays e objetos aninhados são suportados
  • Valores undefined e null são tratados adequadamente

Tratamento de Erros

  • Erros são capturados e adicionados como tags
  • O span é finalizado adequadamente mesmo em caso de erro
  • Stack traces são incluídos quando disponíveis

Performance

  • Decorators são aplicados em tempo de compilação
  • Overhead mínimo em runtime
  • Spans são finalizados automaticamente

1. Overhead por Chamada de Método

  • Criação do span: ~1-5μs (microssegundos)
  • Serialização de parâmetros: Depende do tamanho dos dados
  • Finalização do span: ~1-2μs

2. Impactos Específicos

Baixo impacto:

  • Métodos simples com poucos parâmetros
  • Objetos pequenos
  • Chamadas síncronas

Impacto moderado:

  • Objetos grandes (serialização JSON)
  • Muitos parâmetros
  • Arrays complexos

Alto impacto:

  • Objetos circulares (requer tratamento especial)
  • Dados muito grandes
  • Chamadas muito frequentes

3. Recomendações

Use em:

  • Métodos críticos para observabilidade
  • APIs importantes
  • Métodos com lógica complexa

Evite em:

  • Métodos chamados milhares de vezes por segundo
  • Loops internos muito frequentes
  • Métodos com objetos muito grandes

4. Benchmark Simples

// Método sem decorator: ~0.001ms
// Método com decorator: ~0.005ms
// Overhead: ~0.004ms por chamada