PHPackages                             mltstephane/data-hub - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. mltstephane/data-hub

ActiveLibrary

mltstephane/data-hub
====================

Client Laravel privé pour Mulot Data Hub.

04↑2900%PHPCI failing

Since Jul 26Pushed todayCompare

[ Source](https://github.com/MltStephane/data-hub)[ Packagist](https://packagist.org/packages/mltstephane/data-hub)[ RSS](/packages/mltstephane-data-hub/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (1)Used By (0)

Mulot Data Hub pour Laravel
===========================

[](#mulot-data-hub-pour-laravel)

Package privé d’observabilité applicative pour Laravel 11, 12 et 13. Il collecte sans interrompre l’application hôte les requêtes HTTP, logs, jobs de queue et métriques métier, puis les envoie par lots à Data Hub.

Installation
------------

[](#installation)

Configurez le dépôt Composer privé de votre organisation, puis installez le package :

```
composer require mltstephane/data-hub
php artisan vendor:publish --tag=data-hub-config
```

Le provider, le middleware HTTP, les listeners et la façade `Metrics` sont auto-découverts. **Aucune modification de `bootstrap/app.php` ou `config/logging.php` n’est nécessaire.**

Configuration minimale
----------------------

[](#configuration-minimale)

Créez une clé depuis la page dédiée de votre projet Data Hub et conservez-la dans le gestionnaire de secrets de l’application :

```
DATA_HUB_ENABLED=true
DATA_HUB_URL=https://data-hub.example.com
DATA_HUB_API_KEY=hub_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DATA_HUB_PROJECT=boutique
DATA_HUB_ENVIRONMENT=production
DATA_HUB_HOST=web-01
```

En production, `DATA_HUB_URL` doit utiliser HTTPS. L’URL peut être la racine Data Hub ou l’endpoint complet `/api/v1/batch`.

Métriques métier
----------------

[](#métriques-métier)

```
use Metrics;

Metrics::count('orders.created', tags: ['channel' => 'web']);
Metrics::gauge('queue.depth', 42, ['queue' => 'emails']);
Metrics::timing('checkout.duration', 185.4, ['payment' => 'card']);
```

Les événements de jobs incluent leur numéro de tentative. Les retries d’un même job restent donc des exécutions distinctes côté Data Hub. Les jobs internes de flush du package sont exclus de la capture.

Buffer durable et envoi
-----------------------

[](#buffer-durable-et-envoi)

Avec un cache Redis, le package sélectionne automatiquement un backend de liste Redis avec ajout, lecture et acquittement atomiques O(1). Avec les autres stores Laravel, il conserve un mode de compatibilité borné fondé sur un tableau cache et un verrou ; ce mode réécrit le tableau et convient surtout aux volumes modérés. Le backend actif apparaît dans la sortie de `data-hub:flush`.

Cette durabilité est bornée, pas sans perte : lorsque la capacité est atteinte, la politique d’overflow configurée supprime explicitement l’entrée la plus ancienne ou refuse la plus récente. Les compteurs diagnostiques rendent ces pertes observables. Les entrées JSON irréparablement invalides sont mises en quarantaine individuellement afin de ne jamais bloquer la tête FIFO.

Un seul flush est mis en queue lors du franchissement du seuil grâce à un marqueur cache atomique. Si la connexion choisie est `sync`, aucun flush de seuil et aucun appel HTTP synchrone ne sont déclenchés ; la commande planifiée ou manuelle envoie le reliquat.

```
DATA_HUB_BUFFER_SIZE=1000
DATA_HUB_CHUNK_SIZE=100
DATA_HUB_FLUSH_THRESHOLD=50
DATA_HUB_OVERFLOW_POLICY=drop_oldest
DATA_HUB_CACHE_STORE=redis
# Facultatif : une valeur vide dérive un namespace isolé de l’endpoint, de la clé et du projet.
DATA_HUB_CACHE_KEY=
DATA_HUB_BUFFER_LOCK_SECONDS=5
DATA_HUB_BUFFER_LOCK_WAIT_SECONDS=1
DATA_HUB_FLUSH_LOCK_SECONDS=0
DATA_HUB_QUEUE_CONNECTION=redis
DATA_HUB_QUEUE=default
DATA_HUB_CONNECT_TIMEOUT=3
DATA_HUB_REQUEST_TIMEOUT=10
DATA_HUB_RETRIES=2
```

Politiques disponibles : `drop_oldest` (défaut) et `drop_newest`. `php artisan data-hub:flush` affiche la taille du buffer ainsi que les compteurs `overflow`, `quarantined`, `invalid_metric`, `write_lock_failures`, `backend_failures` et `dispatch_failures`.

Les métriques sont arrondies à six décimales avant mise en buffer afin de respecter `DECIMAL(20,6)`. Les valeurs non finies ou hors de la plage ±99 999 999 999 999,999999 sont ignorées sans interrompre l’application et incrémentent `invalid_metric`.

Les acquittements retirent uniquement les enregistrements de stockage effectivement envoyés, chacun possédant un ID interne distinct de l’ID d’idempotence API. Un flusher expiré peut donc renvoyer un événement — l’API est idempotente — mais ne peut jamais supprimer une entrée ajoutée ou non envoyée après son snapshot. Les clés Lua partagent un hash-tag Redis Cluster. La durée du verrou de flush est dérivée du budget HTTP et de la capacité du buffer lorsque `DATA_HUB_FLUSH_LOCK_SECONDS=0`.

Sans `DATA_HUB_CACHE_KEY`, le namespace effectif est dérivé par hash de l’endpoint normalisé, de l’identifiant hashé de la clé, du nom de l’application, de l’environnement et du projet. La clé API brute n’apparaît jamais dans les clés cache.

Envoi manuel :

```
php artisan data-hub:flush
```

Capture et confidentialité
--------------------------

[](#capture-et-confidentialité)

```
DATA_HUB_MIN_LEVEL=warning
DATA_HUB_CAPTURE_REQUESTS=true
DATA_HUB_CAPTURE_LOGS=true
DATA_HUB_CAPTURE_JOBS=true
DATA_HUB_CAPTURE_EXCEPTION_TRACE=false
DATA_HUB_CAPTURE_IP=false
DATA_HUB_CAPTURE_USER_AGENT=false
DATA_HUB_EXCEPT_PATHS=up,telescope/*,horizon/*
DATA_HUB_REDACTION_KEYS=password,token,authorization,cookie,secret,api_key
DATA_HUB_MAX_STRING_LENGTH=10000
```

Les clés sensibles sont canonicalisées et masquées récursivement dans les contextes, en-têtes et cookies. Les secrets intégrés aux messages et URL sont également retirés. Les traces d’exception sont désactivées par défaut ; si elles sont explicitement activées, elles sont nettoyées et tronquées. L’endpoint Data Hub effectif et les chemins exclus ne sont jamais capturés, ce qui évite les boucles. Les captures restent fail-open, mais les flushs queue/manuels utilisent des lectures strictes : une panne conserve le marqueur pending et provoque un retry ou un code de sortie non nul.

Tests
-----

[](#tests)

```
composer install
vendor/bin/phpunit
```

Ce package est privé et distribué sous licence propriétaire.

###  Health Score

22

—

LowBetter than 21% of packages

Maintenance65

Regular maintenance activity

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/c6f52ac54f6f214ccd8f2b65a36da872006633dacf6ba86709272b7acfd73755?d=identicon)[MltStephane](/maintainers/MltStephane)

---

Top Contributors

[![MltStephane](https://avatars.githubusercontent.com/u/64021677?v=4)](https://github.com/MltStephane "MltStephane (2 commits)")

### Embed Badge

![Health badge](/badges/mltstephane-data-hub/health.svg)

```
[![Health](https://phpackages.com/badges/mltstephane-data-hub/health.svg)](https://phpackages.com/packages/mltstephane-data-hub)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
