# API Monitor Client

Modulo per il monitoraggio pro attivo della stabilità e delle performance delle API in un ecosistema Drupal.

---

## 📌 Panoramica
Il sistema permette di monitorare endpoint remoti (Sito A) da un'istanza di controllo (Sito B).
Non si limita a un semplice controllo dello status HTTP, ma permette di validare la logica della risposta e tracciare la latenza temporale.


### Caratteristiche Principali
* **Guzzle Async:** Esecuzione parallela dei check per massime prestazioni.
* **Plugin System:** Ogni API da monitorare è un Plugin dedicato.
* **Dashboard Visuale:** Grafici storici (Chart.js) per l'analisi dei tempi di risposta.
* **Hook System:** Estensibile tramite API per logiche di business custom.

---

## 🛠️ Installazione e Configurazione

### 1. Requisiti
* PHP >= 8.3
* Drupal >= 11.1
* Estensione cURL abilitata

### 2. Configurazione Sito B (Monitor)
1.  Abilita il modulo: `drush en api_monitor_client`.
2.  Naviga in `/admin/config/development/api-monitoring/settings`.
3.  Inserisci l'**Endpoint Base** del Sito A.
---
## 🔔 Sistema di Notifiche (Alerting)

Il modulo include un sistema di monitoraggio attivo che non si limita a registrare i dati, ma invia avvisi immediati in caso di anomalie.

### Configurazione Alert
All'interno della pagina di impostazioni (`/admin/config/development/api-monitoring/settings`), è possibile definire:
* **Destinatari Email:** Lista di indirizzi (separati da virgola) che riceveranno i report di errore.
* **Intervallo di notifica** in minuti per evitare lo spam in caso di API giù da ore.

### Integrazione con Drupal Mail
Il modulo utilizza il sistema `MailManager` di Drupal. È consigliato l'uso di moduli come **SMTP** o **Swift Mailer / Symfony Mailer** per garantire la consegna delle notifiche.

L'ID del template per il theming delle email è `api_status_alert`.
## 🚀 Guida per lo Sviluppatore

### Creazione di un nuovo Monitoraggio (Probe)
Crea una classe nella directory `src/Plugin/ApiMonitorProbe/` del tuo modulo custom:

```php
#[AttributeMonitorProbe(
  id: 'check_ordine_invio',
  label: new TranslatableMarkup('Verifica Invio Ordine'),
  description: new TranslatableMarkup('Invia un ordine di test al Sito A'),
  endpoint_id: 'api_ordini_clienti',
  method: 'POST'
)]
class CustomServiceProbe extends ApiMonitorProbeBase implements ApiMonitorProbeInterface{

  public function validateResponse($response): bool {
    // Esempio: successo solo se lo status è 200 e il body contiene 'active'
    $data = json_decode($response->getBody()->getContents(), TRUE);
    return $response->getStatusCode() === 200 && ($data['status'] === 'active');
  }
}
```
### 🔗 Utilizzo degli Hook (Extensibility)
Il modulo espone degli hook per permettere ad altri moduli di intervenire nel processo.

1. **hook_api_monitor_report_alter(array &$results, string $api_id)**
   Questo hook viene invocato dal Runner dopo l'esecuzione dei check ma prima del salvataggio.
   Permette di modificare i dati o gli stati in base a logiche esterne.
2. **hook_api_monitor_probe_info_alter(array &$definitions)**
   Permette di modificare le definizioni dei plugin (es. cambiare la label o le soglie di uptime) senza toccare il codice originale.
