
# Webhook

Queuety dapat mengirim notifikasi POST HTTP ke URL eksternal saat event tertentu terjadi. Gunakan webhook untuk integrasi dengan sistem pemantauan, Slack, atau dasbor khusus.

## Event yang didukung

| Event | Dipicu saat |
|---|---|
| `job.completed` | Job handler biasa atau kelas `Contracts\Job` selesai dengan sukses (tidak dipicu untuk langkah alur kerja atau aksi mesin status) |
| `job.failed` | Sebuah percobaan gagal dan retry dijadwalkan |
| `job.buried` | Job menghabiskan semua percobaan retry |
| `workflow.failed` | Langkah alur kerja gagal secara permanen |

## Mendaftarkan webhook

Melalui PHP:

```php
$id = Queuety::webhook_notifier()->register( 'job.buried', 'https://hooks.slack.com/services/...' );
```

Melalui CLI:

```bash
wp queuety webhook add job.buried https://hooks.slack.com/services/...
wp queuety webhook add workflow.failed https://monitoring.example.com/queuety
```

## Melihat daftar webhook

```php
$webhooks = Queuety::webhook_notifier()->list();
```

```bash
wp queuety webhook list
```

## Menghapus webhook

```php
Queuety::webhook_notifier()->remove( $webhook_id );
```

```bash
wp queuety webhook remove 3
```

## Format payload

Saat sebuah event terjadi, Queuety mengirim permintaan POST HTTP dengan isi JSON. Bentuk payload selalu seperti berikut:

```json
{
    "event": "job.buried",
    "data": {
        "job_id": 42,
        "handler": "send_email",
        "queue": "emails",
        "error_message": "Connection timed out"
    },
    "timestamp": "2025-03-15T14:30:00Z"
}
```

Untuk kegagalan alur kerja:

```json
{
    "event": "workflow.failed",
    "data": {
        "workflow_id": 7,
        "job_id": 42,
        "handler": "CallLlmStep",
        "error_message": "API rate limit exceeded"
    },
    "timestamp": "2025-03-15T14:30:00Z"
}
```

Pengiriman webhook menggunakan upaya terbaik. Worker mengirim POST ke setiap URL yang terdaftar secara bergiliran dengan batas waktu stream satu detik dan mengabaikan kegagalan pengiriman. Karena itu, endpoint yang lambat dapat menahan worker hingga sekitar satu detik per URL, tetapi tidak pernah menyebabkan job gagal.

## Kasus penggunaan

- **Peringatan Slack.** Dapatkan notifikasi saat job dikubur atau alur kerja gagal.
- **Integrasi PagerDuty.** Picu insiden untuk kegagalan job kritis.
- **Dasbor khusus.** Alirkan event ke infrastruktur pemantauan Anda sendiri.
- **Jejak audit.** Teruskan event ke layanan pencatatan eksternal.
