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

# Zabbix

> Conecte o Zabbix ao aciona.me com uma media type webhook customizada.

## Visão geral

O Zabbix não tem formato de webhook padronizado. A integração usa uma **media type do tipo webhook** que monta o payload canônico do aciona.me a partir das macros do evento.

|                    |                                      |
| ------------------ | ------------------------------------ |
| **Tipo de fonte**  | `Zabbix`                             |
| **Mecanismo**      | Media type webhook + action          |
| **Correlação**     | `triggerId` (`{EVENT.TRIGGERID}`)    |
| **Auto-resolução** | ✅ (action em PROBLEM **e** RECOVERY) |

## Pré-requisitos

* Zabbix com permissão de administração para criar media types e actions.
* Um serviço criado no aciona.me e vinculado a um time com escala ativa.

## 1. Crie a fonte de alerta no aciona.me

Em **Fontes de alerta**, crie uma fonte do tipo **Zabbix**. Copie a URL e o token.

## 2. Crie a media type

Em **Administration → Media types → Create media type**:

* **Type:** `Webhook`
* **Parameters:**

| Nome           | Valor                                            |
| -------------- | ------------------------------------------------ |
| `aciona_url`   | `https://ingress.aciona.me/webhooks/<idDaFonte>` |
| `aciona_token` | `<tokenDaFonte>`                                 |
| `event_id`     | `{EVENT.ID}`                                     |
| `trigger_id`   | `{EVENT.TRIGGERID}`                              |
| `event_name`   | `{EVENT.NAME}`                                   |
| `severity`     | `{EVENT.SEVERITY}`                               |
| `event_value`  | `{EVENT.VALUE}`                                  |
| `event_status` | `{EVENT.STATUS}`                                 |
| `opdata`       | `{EVENT.OPDATA}`                                 |
| `event_age`    | `{EVENT.AGE}`                                    |
| `host_name`    | `{HOST.NAME}`                                    |
| `host_ip`      | `{HOST.IP}`                                      |
| `host_tech`    | `{HOST.HOST}`                                    |

<Accordion title="Script da media type" icon="code">
  ```javascript theme={null}
  function str(v) {
    return v === null || v === undefined ? '' : String(v);
  }
  function num(v) {
    var n = Number(v);
    return isFinite(n) ? n : 0;
  }

  var params = JSON.parse(value);

  var deeplink = '';
  if (str(params.event_id)) {
    deeplink =
      'https://zabbix.exemplo.com/zabbix.php?action=problem.view&eventid=' +
      str(params.event_id);
  }

  var payload = {
    eventId: str(params.event_id),
    triggerId: str(params.trigger_id),
    name: str(params.event_name),
    severity: num(params.severity),
    value: num(params.event_value),
    status: str(params.event_status),
    opdata: str(params.opdata),
    age: str(params.event_age),
    host: str(params.host_name),
    hostIp: str(params.host_ip),
    hostTechnical: str(params.host_tech),
    url: deeplink,
  };

  var req = new HttpRequest();
  req.addHeader('Content-Type: application/json');
  req.addHeader('X-Aciona-Token: ' + params.aciona_token);

  Zabbix.log(4, '[aciona.me] enviando triggerId=' + payload.triggerId);
  var response = req.post(params.aciona_url, JSON.stringify(payload));
  var status = req.getStatus();

  if (status < 200 || status >= 300) {
    Zabbix.log(3, '[aciona.me] falhou: ' + status + ' ' + response);
    throw 'aciona.me HTTP ' + status;
  }

  return 'OK';
  ```

  Ajuste o domínio do `deeplink` para o seu Zabbix. Valide o script em um ambiente de teste antes de aplicar em produção.
</Accordion>

## 3. Crie a action

Em **Configuration → Actions → Trigger actions**, crie uma action cuja operação envie a notificação pela media type do aciona.me.

<Warning>
  A action precisa disparar em **PROBLEM e RECOVERY**. O Zabbix já faz isso por padrão — só confirme que não há condição filtrando apenas `PROBLEM`. Sem o evento de recovery, os acionamentos nunca fecham sozinhos.
</Warning>

## 4. Teste

Force um trigger a disparar (ou use um trigger de teste) e confirme o acionamento no painel. Depois faça o trigger voltar ao normal e confirme a resolução automática.

## Como os campos são traduzidos

### Estado

| Condição                                 | Efeito                           |
| ---------------------------------------- | -------------------------------- |
| `value = 1`                              | Cria ou agrega acionamento       |
| `value = 0`                              | Resolve automaticamente          |
| Sem `value`, `status = PROBLEM`          | Cria ou agrega acionamento       |
| Sem `value`, `status = RESOLVED` ou `OK` | Resolve automaticamente          |
| Sem `value` nem `status`                 | Cria acionamento (padrão seguro) |

`value` tem precedência sobre `status`.

### Severidade

| Prioridade Zabbix  | Severidade |
| ------------------ | ---------- |
| 5 — Disaster       | `critical` |
| 4 — High           | `high`     |
| 3 — Average        | `warning`  |
| 2 — Warning        | `warning`  |
| 1 — Information    | `info`     |
| 0 — Not classified | `info`     |

### Serviço

A pista de serviço vem do `{HOST.NAME}`. Crie no aciona.me serviços com os mesmos nomes visíveis dos hosts, ou configure um serviço padrão na fonte.

## Campos obrigatórios

`triggerId` e `name` são obrigatórios. Sem eles, a requisição é recusada com `400`.

## Solução de problemas

<AccordionGroup>
  <Accordion title="O acionamento abre, mas nunca fecha sozinho" icon="triangle-alert">
    A action está filtrada apenas para `PROBLEM`. Remova a condição para que ela também dispare em `RECOVERY`.
  </Accordion>

  <Accordion title="Resposta 400" icon="circle-x">
    Faltam `trigger_id` ou `event_name` nos parâmetros da media type. Confira as macros configuradas.
  </Accordion>

  <Accordion title="Nada chega" icon="unplug">
    Veja os logs do Zabbix server (`Zabbix.log` grava com nível 3 e 4). Confirme que o servidor tem saída HTTPS para `ingress.aciona.me`.
  </Accordion>
</AccordionGroup>
