Remonter les exceptions
QuietGuard\Monitor\Reporter est le client neutre vis-à-vis du framework. Les adaptateurs le branchent sur les hooks d'exceptions et de logs d'un hôte ; vous pouvez aussi le piloter à la main.
Câbler un Reporter
Le constructeur du Reporter prend un Config, un Http\HttpClient, un Support\Scrubber, un Payload\ExceptionPayloadBuilder et un LoggerInterface PSR optionnel :
Envoyer des données
Le Reporter expose trois méthodes d'envoi, chacune renvoyant un bool et ne levant jamais d'exception, la surveillance ne doit pas casser l'application hôte :
| Méthode | Endpoint | Notes |
|---|---|---|
reportException(Throwable $e, array $context = []) | POST /api/v1/ingest | Construit le payload, masque le context, l'envoie. |
sendLogs(array $logs) | POST /api/v1/logs | Enveloppe les logs en {"logs": [...]} et les masque. Renvoie true immédiatement si $logs est vide. |
sendDependencies(array $packages) | POST /api/v1/dependencies | Enveloppe en {"packages": [...]}. Renvoie false immédiatement si $packages est vide ; les dépendances ne sont pas masquées. |
Un envoi ne renvoie true que sur un HTTP 2xx. Si le client n'est pas configuré (Config::isConfigured() est faux), les méthodes renvoient false sans toucher au réseau. Toute exception de transport est capturée, journalisée via le logger optionnel en avertissement, et transformée en false.
Le payload d'exception
Payload\ExceptionPayloadBuilder::build() transforme un Throwable en la forme attendue sur le fil :
La trace est tronquée à traceLimit frames, chacune réduite à class, type, function, file, line. Quand release est non nul, il est fusionné dans context (vos clés de contexte explicites l'emportent en cas de collision). Le contrat exact sur le fil est décrit par l'API d'ingestion (/docs/tool/1.0/ingestion-api).
L'abstraction de transport
Http\HttpClient est un contrat volontairement minimal :
Le Http\CurlHttpClient fourni l'implémente avec ext-curl et sans aucune autre dépendance : il encode le corps en JSON et envoie Content-Type: application/json, Accept: application/json et Authorization: Bearer <token>. Il renvoie 0 (au lieu de lever une exception) quand l'encodage JSON ou curl_init() échoue.
Apporter votre propre client
Comme HttpClient est une simple interface, et non PSR-18 lui-même, vous pouvez encapsuler n'importe quel client (un client PSR-18, Guzzle, le client HTTP du framework) derrière elle. Les implémentations ne doivent pas lever d'exception et doivent renvoyer le code de statut (ou 0) :
Passez votre implémentation comme argument http au Reporter. Pour capturer automatiquement les erreurs dans une appli PHP simple, voir le handler d'erreurs global ; pour garder les secrets hors des payloads, voir le masquage.
Vous lisez la documentation PHP Core v1.0.