> ## 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.

# Hooks

No ciclo de vida de um `Span`, oferecemos várias oportunidades para atualizar ou modificar seu estado interno. Hooks são o mecanismo para isso. Usando funções com formato específico, podemos enriquecer qualquer `Span` de saída com informações adicionais antes de ele ser enviado para a Push API.

Ambos os tipos de hooks são um array de funções compostas que são aplicadas da direita para a esquerda. Em outras palavras, os hooks adicionados por último são sempre os primeiros a serem aplicados.

Quando um `Span` é passado para `appsignal.send()`, ou um `Error` é passado para `appsignal.sendError()`, os hooks são aplicados ao `Span` na seguinte ordem:

* Decorators
* Argumentos opcionais `tags` ou `namespace` para `appsignal.send()`
* Overrides

Hooks geralmente são aplicados em um plugin.

<Tip>
  Quando um `Error` é passado para `appsignal.sendError()`, um objeto `Span` interno
  é criado, o que significa que Hooks ainda podem ser aplicados a ele normalmente.
</Tip>

## Decorators

Pode ser necessário adicionar contexto adicional a um `Span` no nível global, para que todas as requisições incluam essas informações por padrão. Decorators podem ser usados para isso.

## Overrides

Overrides são a última oportunidade possível para atualizar dados em um `Span` antes de ele ser enviado para a Push API. Por exemplo, você pode optar por remover quaisquer dados do usuário dos `Span`s em um override.

## Escrevendo seu próprio Hook

Hooks são, essencialmente, funções que recebem um `Span` como único argumento e retornam o mesmo `Span`. Durante a execução da função, modificações podem ser feitas no `Span`, mas sugerimos que nenhum outro efeito colateral seja introduzido.

Veja um exemplo de como você pode adicionar um Hook ao objeto `Appsignal`:

<CodeGroup>
  ```js JavaScript theme={null}
  appsignal.addDecorator((span) => {
    return span.setTags({ customTag: "value" });
  });

  appsignal.addOverride((span) => {
    // scrub e-mail addresses
    const { tags } = span.serialize();

    return span.setTags({
      text: tags.text.replace(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, "[SCRUBBED]"),
    });
  });
  ```
</CodeGroup>

Plugins também podem adicionar decorators e overrides. Se você quiser criar um hook reutilizável que possa ser empacotado em um módulo `npm`, por exemplo, recomendamos utilizar [a interface de plugin](/front-end/plugins/) para registrá-lo.
