# Templates e payload

Um template é o objeto do [Data Stream](/pt-br/documentacao/plataforma/data-stream/) que decide quais variáveis cada linha de log carrega e sob quais chaves. Seu **Data Set** é um objeto JSON: cada chave é um nome na linha de log, e cada valor é uma variável da fonte de dados do stream. O template predefinido *Functions Event Collector* tem este data set:

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

Um stream indica um template em `transform[render_template].attributes.template`, como descrito em [Configurações do stream](/pt-br/documentacao/plataforma/data-stream/configuracoes-do-stream/#render-template). O caminho da API é `/v4/workspace/stream/templates`, e um template é `/v4/workspace/stream/templates/<template-id>`. Toda requisição carrega o header `Authorization: Token [TOKEN VALUE]`. As configurações em [Payload](#payload) pertencem ao endpoint Standard HTTP/HTTPS POST, não ao template.

---

## Templates predefinidos

A Azion oferece cinco templates predefinidos. A API os lista com `custom: false`, `last_editor` `support@azion.com` e `created_at` `null`. Cada template predefinido tem o nome da fonte de dados cujas variáveis ele carrega, e o objeto de template não tem campo de fonte de dados.

| Template predefinido                 | ID    | Fonte de dados     | Chaves | Uso                                                                                  |
| ------------------------------------ | ----- | ------------------ | ------ | ------------------------------------------------------------------------------------ |
| *Activity History Collector*         | `251` | *Activity History* | 20     | Eventos da conta: o que mudou, quem mudou e de qual endereço.                        |
| *Applications Event Collector*       | `2`   | *Applications*     | 36     | Dados de requisição, resposta, cache e upstream de cada requisição.                  |
| *Applications + WAF Event Collector* | `184` | *Applications*     | 51     | Os dados da requisição mais as variáveis de WAF, sessão, TLS e endereço do servidor. |
| *Functions Event Collector*          | `86`  | *Functions*        | 8      | As mensagens que as functions registram no log, com seu nível e o ID da requisição.  |
| *WAF Event Collector*                | `4`   | *WAF Events*       | 21     | As requisições que o WAF avaliou, com a família de ataque, a ação e a pontuação.     |

As variáveis de um template predefinido são fixas. No Console, o campo **Data Set** da seção **Render Template** é somente leitura, e para um template predefinido, **Duplicate Template** abre o drawer **Create Custom Template** preenchido com o data set do template predefinido. Para enviar outras variáveis, crie um template personalizado. Cada variável é descrita em [Fontes de dados e variáveis](/pt-br/documentacao/plataforma/data-stream/fontes-de-dados-e-variaveis/).

### Activity History Collector

O template predefinido *Activity History Collector*, ID `251`, usa o nome de cada variável como chave: `$comment`, `$user_ip`, `$request_data`, `$resource_name`, `$user_id`, `$account_id`, `$referer_header`, `$title`, `$author_email`, `$parent_resource_id`, `$author_name`, `$resource_id`, `$parent_resource_name`, `$client`, `$user_agent`, `$parent_resource_type`, `$time`, `$type`, `$remote_port` e `$resource_type`.

Um endpoint S3 com **Content Type** *plain/text* recebe as linhas de log deste template predefinido como um objeto JSON por linha. Uma linha, reduzida:

```json
{"comment": "-", "user_ip": "203.0.113.10", "request_data": "…", "resource_name": "activity-to-bucket", …, "title": "Stream activity-to-bucket was edited", "author_email": "user@example.com", …, "time": "2026-01-01T12:01:39Z", "type": "edited", …, "resource_type": "Stream"}
```

### Applications Event Collector

O template predefinido *Applications Event Collector*, ID `2`, usa o nome de cada variável como chave: `$http_user_agent`, `$ssl_protocol`, `$server_protocol`, `$waf_attack_action`, `$upstream_cache_status`, `$request_time`, `$upstream_status`, `$state`, `$version`, `$request_method`, `$ssl_cipher`, `$scheme`, `$tcpinfo_rtt`, `$status`, `$sent_http_x_original_image_size`, `$request_length`, `$sent_http_content_type`, `$time`, `$requestQuery`, `$host`, `$http_referrer`, `$upstream_local_addr`, `$configuration`, `$request_uri`, `$proxy_status`, `$requestPath`, `$country`, `$remote_addr`, `$bytes_sent`, `$upstream_header_time`, `$upstream_bytes_received`, `$client`, `$upstream_response_time`, `$remote_port`, `$upstream_connect_time` e `$waf_attack_family`.

### Applications + WAF Event Collector

O template predefinido *Applications + WAF Event Collector*, ID `184`, carrega todas as variáveis do *Applications Event Collector*, exceto `$upstream_local_addr` e `$version`. Ele adiciona 17 variáveis: `$session_id`, `$stream`, `$upstream_addr`, `$upstream_bytes_sent`, `$server_port`, `$server_addr`, `$waf_learning`, `$waf_block`, `$waf_total_processed`, `$waf_total_blocked`, `$waf_score`, `$waf_match`, `$waf_headers`, `$asn`, `$ssl_session_reused`, `$ssl_server_name` e `$request_id`. Suas chaves correspondem aos nomes das variáveis, exceto `$http_referrer`, que ele envia sob a chave `http_referer`.

### Functions Event Collector

O template predefinido *Functions Event Collector*, ID `86`, tem oito chaves. Seis delas diferem do nome da variável: `configuration` carrega `$global_id`, `edgeFunctionID` carrega `$edge_function_id`, `requestID` carrega `$request_id`, `messageSource` carrega `$message_source`, `logLevel` carrega `$log_level` e `logMessage` carrega `$log_message`. As chaves `time` e `client` carregam `$time` e `$client`.

### WAF Event Collector

O template predefinido *WAF Event Collector*, ID `4`, usa o nome de cada variável como chave: `$version`, `$time`, `$client`, `$configuration`, `$host`, `$remote_addr`, `$server_protocol`, `$country`, `$waf_server`, `$waf_uri`, `$waf_learning`, `$blocked`, `$waf_score`, `$waf_match`, `$waf_attack_family`, `$waf_attack_action`, `$truncated_body`, `$waf_args`, `$requestPath` e `$requestQuery`. Sua 21ª chave, `headers`, guarda o literal `-` em vez da variável `$headers`. Para enviar `$headers`, use um template personalizado.

---

## Templates personalizados

Um template personalizado é um template que a conta cria, e a API o lista com `custom: true` na mesma lista dos templates predefinidos. Um stream que usa um template personalizado envia somente as variáveis do seu data set. No Console, o dropdown **Template** agrupa os templates personalizados em *Custom Templates* e os templates predefinidos em *Azion's Templates*.

| Console      | Campo da API | Tipo    | Obrigatório | Padrão | Valores                                                                                                                        |
| ------------ | ------------ | ------- | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ |
| **Name**     | `name`       | string  | Sim         | nenhum | 1 a 100 caracteres.                                                                                                            |
| **Data Set** | `data_set`   | string  | Sim         | nenhum | 1 a 65.535 caracteres. Um objeto JSON cujas entradas são `"<key>": "$<variable>"`, enviado como string com as aspas escapadas. |
| nenhum       | `active`     | boolean | Não         | `true` | `true` ou `false`.                                                                                                             |

A API adiciona os campos somente leitura `id`, `custom`, `last_editor`, `created_at` e `last_modified`. Um template personalizado na lista de templates aparece como este, que copia o data set do *Functions Event Collector*:

```json
{
  "id": 2948,
  "name": "functions-logs",
  "last_editor": "user@example.com",
  "created_at": "2026-01-01T12:00:00.000000Z",
  "last_modified": "2026-01-01T12:00:00.000000Z",
  "custom": true,
  "active": true,
  "data_set": "{\n\t\"time\": \"$time\",\n\t\"client\": \"$client\",\n\t…\n\t\"logMessage\": \"$log_message\"\n}"
}
```

Um `POST` em `/v4/workspace/stream/templates` cria um template personalizado a partir de `name` e `data_set`. Em `/v4/workspace/stream/templates/<template-id>`, um `GET` lê o template, um `PATCH` altera somente as chaves que você envia, um `PUT` exige as mesmas chaves obrigatórias de uma criação, e um `DELETE` o remove.

A chave de cada entrada é sua escolha, e o valor é a variável. Este data set mantém dez variáveis de *Applications* com seus próprios nomes, e duas delas, `$session_id` e `$server_port`, só o template predefinido *Applications + WAF Event Collector* carrega:

```json
{
  "time": "$time",
  "session_id": "$session_id",
  "host": "$host",
  "status": "$status",
  "bytes_sent": "$bytes_sent",
  "upstream_bytes_received": "$upstream_bytes_received",
  "server_port": "$server_port",
  "remote_port": "$remote_port",
  "country": "$country",
  "state": "$state"
}
```

Um template personalizado também pode carregar uma variável que nenhum template predefinido carrega. O data set `{"time": "$time", "traceback": "$traceback"}` envia as regras que foram executadas em cada requisição de uma aplicação. Um data set de *Functions* pode manter os nomes das variáveis como chaves, como `{"time": "$time", "global_id": "$global_id", "edge_function_id": "$edge_function_id", "request_id": "$request_id", "log_level": "$log_level", "log_message": "$log_message"}`.

Os templates não têm página própria no Console. Na seção **Render Template** de um stream, **Create Custom Template** abre um drawer com as seções **General**, que contém **Name**, e **Data Set**, um editor de JSON. Para um template personalizado, **Edit Template** abre o drawer **Edit Custom Template**, em que **Danger area** contém **Delete template**. Para os passos, consulte [Crie um template personalizado](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/data-stream-template-personalizado/).

---

## Payload

As configurações de payload decidem como um endpoint Standard HTTP/HTTPS POST recebe as linhas de log de cada requisição. Elas são campos do endpoint em `outputs[0].attributes`, não do template, e nenhum outro tipo de endpoint as tem. O Console chama o campo do endpoint de **Connector** e mostra essas configurações na seção **Output** quando **Connector** é *Standard HTTP/HTTPS POST*.

| Console                        | Campo da API                               | Tipo           | Obrigatório                | Padrão                              | Valores                                                                                                                                                       |
| ------------------------------ | ------------------------------------------ | -------------- | -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Payload Format**             | `outputs[0].attributes.payload_format`     | string         | Não na API, Sim no Console | `$dataset`                          | 1 a 250 caracteres. `$dataset` é substituído pelas linhas de log da requisição, unidas pelo separador. O texto em volta de `$dataset` é enviado como escrito. |
| **Payload Log Line Separator** | `outputs[0].attributes.log_line_separator` | string         | Não na API, Sim no Console | `\n`                                | 1 a 100 caracteres. A string entre duas linhas de log. `\n` coloca cada linha de log em sua própria linha.                                                    |
| **Payload Max Size**           | `outputs[0].attributes.max_size`           | inteiro, bytes | Não                        | `null` na API, `1000000` no Console | 1.000.000 a 2.147.483.647. O tamanho máximo de um pacote de dados. Um valor abaixo de `1000000` é recusado com `10050` `Min Value`.                           |

Um endpoint Standard HTTP/HTTPS POST recebe um lote quando ele atinge 2.000 linhas de log, 60 segundos ou o **Payload Max Size**, o que ocorrer primeiro. Para saber como os lotes se formam, consulte [Como o Data Stream funciona](/pt-br/documentacao/plataforma/data-stream/como-funciona/).

Com os valores padrão, o endpoint recebe NDJSON: uma linha de log por linha, sem colchetes em volta e sem vírgula entre as linhas. NDJSON serve a um receptor que processa um registro por vez. Um array JSON, com colchetes e vírgulas, é lido como um único registro. Os dois exemplos abaixo usam este data set:

```json
{"request_method": "$request_method", "host": "$host", "status": "$status"}
```

Com **Payload Log Line Separator** `\n` e **Payload Format** `$dataset`, o corpo da requisição é NDJSON:

```json
{"request_method": "GET", "host": "www.onedomain.com", "status": "200"}
{"request_method": "POST", "host": "www.anotherdomain.com.br", "status": "200"}
```

Com **Payload Log Line Separator** `,` e **Payload Format** `[$dataset]`, o corpo da requisição é um único array JSON:

```json
[{"request_method": "GET", "host": "www.onedomain.com", "status": "200"},{"request_method": "POST", "host": "www.anotherdomain.com.br", "status": "200"}]
```

Para personalizar o payload de um stream de *Activity History* que envia para um endpoint Standard HTTP/HTTPS POST, a Azion especifica **Payload Log Line Separator** `\n` e este **Payload Format**:

```text
'v1\t$time_iso8601\t$clientid\t$title\t$comment\t$type\t$author_name\t$author_email'
```

Este formato usa `$time_iso8601` e `$clientid`, que não estão entre as variáveis de *Activity History*. Essa fonte de dados chama o horário de `$time` e o cliente de `$client`.

As configurações de payload não têm opção de compressão. Entre os tipos de endpoint, só o Simple Storage Service (S3) oferece um **Content Type** comprimido, *application/gzip*. Para cada campo do endpoint, incluindo **Custom Headers**, consulte [Endpoints](/pt-br/documentacao/plataforma/data-stream/endpoints/#standard-httphttps-post).

---

## Recursos relacionados

- [Fontes de dados e variáveis](/pt-br/documentacao/plataforma/data-stream/fontes-de-dados-e-variaveis.md): O que carrega cada variável que um data set pode usar, com um valor de exemplo.
- [Configurações do stream](/pt-br/documentacao/plataforma/data-stream/configuracoes-do-stream.md#render-template): Como um stream escolhe seu template, e os erros que um template ausente ou desconhecido retorna.
- [Crie um template personalizado](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/data-stream-template-personalizado.md): Os passos para criar um template personalizado no Console e vinculá-lo a um stream.
- [Personalize o payload do HTTP POST](/pt-br/documentacao/guias/plataforma/observabilidade/data-stream-adicionar-payload.md): Os passos para definir os campos de payload de um endpoint Standard HTTP/HTTPS POST.
