> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Instrumentação customizada em Go

O AppSignal é compatível com pacotes de instrumentação do OpenTelemetry.
Alguns desses [pacotes de instrumentação](/go/instrumentations) podem exigir configuração adicional.

Isso nem sempre inclui as informações que você precisa para depurar problemas.
Para um relatório mais granular, você pode adicionar instrumentação customizada.

Damos suporte ao [tracing do OpenTelemetry][manual] conforme descrito na documentação do OpenTelemetry.
É possível adicionar mais dados a um span usando atributos de span do OpenTelemetry.

Também existem atributos de span do AppSignal que podem mudar como os traces são agrupados e alguns atributos que permitem filtrar dados sensíveis.

## Configuração

Ao adicionar instrumentação customizada, primeiro importe o pacote de trace do OpenTelemetry no arquivo onde você deseja adicionar a instrumentação.

<CodeGroup>
  ```go Go theme={null}
  import (
  	"go.opentelemetry.io/otel"
  	"go.opentelemetry.io/otel/attribute"
  	"go.opentelemetry.io/otel/trace"
  )
  ```
</CodeGroup>

## Criando um novo span

Usando o tracer inicializado durante a [instalação](/go/installation), crie um novo span.

<CodeGroup>
  ```go Go theme={null}
  var tracer = otel.Tracer("my-tracer-name")

  func httpHandler(w http.ResponseWriter, r *http.Request) {
  	// Create a new span from the parent context
  	ctx, span := tracer.Start(r.Context(), "hello-span")
  	// Defer closing the span to the end of this function
  	defer span.End()

  	// Set attributes
  }
  ```
</CodeGroup>

*Nota: Nestes exemplos, dependemos do contexto da requisição HTTP, fornecido por `r.Context()`.*
*A forma de receber o contexto pode ser diferente na sua aplicação.*

## Obter o span atual

Você também pode obter o span atual usando o tracer inicializado durante a [instalação](/go/installation):

<CodeGroup>
  ```go Go theme={null}
  func httpHandler(w http.ResponseWriter, r *http.Request) {
  	ctx := r.Context()
      span := trace.SpanFromContext(ctx)

  	// Set attributes
  }
  ```
</CodeGroup>

*Nota: Isso só retornará um span se já houver um ativo.*

Mais formas de criar e obter spans estão documentadas na [página de instrumentação Go do OpenTelemetry][manual].

## Atributos do AppSignal

Depois de criar ou obter um span, você pode definir certos atributos específicos do AppSignal para personalizar como os dados chegam ao AppSignal.

<CodeGroup>
  ```go Go theme={null}
  span = // Create a new span or fetch the current span
  span.SetAttributes(attribute.String("attribute_name", "attribute value"))
  ```
</CodeGroup>

Veja nossos guias para mais informações sobre quais atributos customizados do AppSignal são suportados:

* [Guia de tagging](/guides/tagging)
* [Guia de personalização de dados](/guides/custom-data)

[manual]: https://opentelemetry.io/docs/languages/go/instrumentation/
