# Debugging

Debug é um processo que possibilita aos desenvolvedores depurar mensagens de log ou valores de variáveis, por exemplo. A depuração permite ao usuário de **Functions** gerar logs como se estivesse utilizando o JavaScript do browser.

---

## O que é

O processo de debugging em **Functions** tem por finalidade promover maior controle da aplicação para identificação de erros. Pode ser usado, também, para auxiliar no desenvolvimento e depuração de uma function, resultando em maior observabilidade.

---

## Como funciona

Para depurar códigos, você deve criar uma nova [function](/pt-br/documentacao/produtos/build/applications/functions/) que utilizará o método **log**. Esse métodoo imprime no console uma mensagem que foi previamente enviada como parâmetro para a função.

### Crie uma function

Siga estas etapas para criar uma function que registra mensagens:

1. Acesse o [Azion Console](https://console.azion.com/) com suas credenciais de login.
2. No **Products Menu**, navegue até **Libraries** > **Functions**.
3. Clique em **+ Function** para criar uma nova function.
4. Escolha um nome para sua função.
5. Na aba **Code**, cole o seguinte código:

:::note
O seguinte trecho mostra uma implementação simples como exemplo para os fins deste guia. Ao criar sua função, certifique-se de que ela colete e registre os dados de que você precisa.
:::

```js
       async function handleRequest(request) {
           console.log("Hello World");
    
           return new Response("Checking console output.", {
               status: 200,
           });
       }
       addEventListener("fetch", (event) => {
           event.respondWith(handleRequest(event.request));
       });
```

6. Clique no botão **Save** para finalizar o processo.

Agora que você criou a function, deve configurar sua **application** para executar a função para que os logs sejam acessíveis.

---

### Instancie a function

Para instanciar a função recém criada em sua aplicação, siga estas etapas:

1. No **Products Menu**, navegue até **Build** > **Applications**.
2. Clique na aplicação à qual você deseja adicionar a função ou [crie uma nova](/pt-br/documentacao/produtos/build/applications/primeiros-passos/).
3. Vá para a aba **Function Instances** e clique em **+ Function Instance**.
4. Nomeie sua instância de função.
5. Selecione a function recém-criada no menu suspenso.
6. Clique no botão **Save**.

Agora sua function está instanciada e pronta para ser usada em sua aplicação. Você pode configurar as condições de execução e comportamentos usando o [Rules Engine](/pt-br/documentacao/produtos/build/applications/rules-engine/):

1. Ainda na página de configuração da application, navegue até a aba **Rules Engine** e clique no botão **+ Rule**.
2. Dê um nome descritivo à sua regra.
3. Selecione **Request Phase**.
4. Na seção **Criteria**, configure os critérios da seguinte forma:
   - If `${uri}` *starts with* `/`
5. Na seção **Behaviors**, selecione **Run Function** no menu suspenso.
6. Escolha a instância da sua function.
7. Clique no botão **Save**.

Agora a função será executada de acordo com a regra e seus logs estarão prontos para serem capturados pelo **Data Stream**.

---

### Configure um data stream

1. No **Products Menu**, vá para **Observe** > **Data Stream**.
2. Selecione um stream existente ou crie um novo clicando no botão **+ Stream**.
3. No campo **Name**, dê ao seu stream um nome único e fácil de lembrar.
4. Na seção **Data Settings**, selecione **Functions** como a fonte.
5. Selecione o modelo **Functions Event Collector**. Na caixa **Data Set**, você verá o conjunto pré-definido de variáveis:

```json
{
	"time": "$time",
	"client": "$client",
	"configuration": "$global_id",
	"edgeFunctionID": "$edge_function_id",
	"requestID": "$request_id",
	"messageSource": "$message_source",
	"logLevel": "$log_level",
	"logMessage": "$log_message"
}
```

| Variável | Descrição |
| --- | --- |
| $time | Data e hora da requisição. |
| $client | Identificador único do cliente Azion. |
| $global_id | Identificador da configuração. |
| $edge_function_id | Identificador da Function. |
| $request_id | Identificador da requisição. |
| $message_source | A origem da mensagem. |
| $log_level | Nível do log gerado (ERROR, WARN, INFO, DEBUG, TRACE). |
| $log_message | Mensagem usada para o log na chamada da função. |

6. Na seção **Destination**, deixe o **Connector** como `Standard HTTP/HTTPS POST` e insira a **URL** que receberá os dados coletados.

7. Clique no botão **Save** para finalizar o processo.

Agora seu data stream coletará logs das functions e os enviará para a URL especificada.

Consulte a [documentação](/pt-br/documentacao/produtos/observe/data-stream/) para saber mais sobre **Data Stream** e suas configurações. Você também pode usar **Real-Time Events** para observar e analisar os logs gerados.

1. No **Products Menu**, navegue até **Observe** > **Real-Time Events**.
2. Selecione a aba **Functions Console** para ver os logs originados das functions. Use os filtros para especificar uma consulta detalhada.
3. Na aba **Data Stream**, você pode ver os logs de dados enviados para vários endpoints via **Data Stream**.
4. Clique em qualquer item para ver os detalhes dos dados enviados.

Leia a [documentação do Real-Time Events](/pt-br/documentacao/produtos/observe/real-time-events/) para saber mais.