Aller au contenu principal

Exportateur Mastra Storage

MastraStorageExporter conserve les traces dans le backend de stockage configuré, ce qui les rend accessibles dans Studio. Il ne nécessite aucun service externe.

remarque

MastraStorageExporter s’appelait auparavant DefaultExporter. La classe DefaultExporter d’origine est toujours exportée depuis @mastra/observability pour assurer la rétrocompatibilité, mais elle est obsolète. Le nouveau code doit utiliser MastraStorageExporter.

Observabilité en production

Les données d’observabilité peuvent rapidement saturer les bases de données généralistes en production. Pour les applications à fort trafic, routez le domaine de stockage de l’observabilité vers ClickHouse au moyen du stockage composite. Consultez les recommandations pour la production pour plus de détails.

Configuration
Lien direct vers Configuration

Prérequis
Lien direct vers Prérequis

  1. Backend de stockage : configurez un fournisseur de stockage, par exemple libSQL ou PostgreSQL
  2. Studio : installez-le pour consulter les traces localement

Configuration de base
Lien direct vers Configuration de base

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { Observability, MastraStorageExporter } from '@mastra/observability'
import { LibSQLStore } from '@mastra/libsql'

export const mastra = new Mastra({
storage: new LibSQLStore({
id: 'mastra-storage',
url: 'file:./mastra.db', // Required for trace persistence
}),
observability: new Observability({
configs: {
local: {
serviceName: 'my-service',
exporters: [new MastraStorageExporter()],
},
},
}),
})

Incluez MastraStorageExporter dans votre configuration d’observabilité :

import { Mastra } from '@mastra/core'
import {
Observability,
MastraStorageExporter,
MastraPlatformExporter,
SensitiveDataFilter,
} from '@mastra/observability'
import { LibSQLStore } from '@mastra/libsql'

export const mastra = new Mastra({
storage: new LibSQLStore({
id: 'mastra-storage',
url: 'file:./mastra.db',
}),
observability: new Observability({
configs: {
default: {
serviceName: 'mastra',
exporters: [
new MastraStorageExporter(), // Persists observability events to Mastra Storage
new MastraPlatformExporter(), // Sends observability events to Mastra platform (requires MASTRA_PLATFORM_ACCESS_TOKEN)
],
spanOutputProcessors: [new SensitiveDataFilter()],
},
},
}),
})

Studio
Lien direct vers Studio

Accédez à vos traces dans Studio :

  1. Démarrez Studio
  2. Accédez à Observabilité
  3. Filtrez et recherchez vos traces locales
  4. Inspectez les informations détaillées des spans

Stratégies de traçage
Lien direct vers Stratégies de traçage

MastraStorageExporter sélectionne automatiquement la stratégie de traçage optimale selon votre fournisseur de stockage. Vous pouvez également remplacer cette sélection si nécessaire.

Stratégies disponibles
Lien direct vers Stratégies disponibles

StratégieDescriptionCas d’utilisation
realtimeTraite immédiatement chaque événementDéveloppement, débogage, faible trafic
batch-with-updatesMet les événements en mémoire tampon et les écrit par lots avec une prise en charge complète du cycle de vieProduction à faible volume
insert-onlyTraite uniquement les spans terminés et ignore les mises à jourProduction à fort volume

Configuration de la stratégie
Lien direct vers Configuration de la stratégie

new MastraStorageExporter({
strategy: 'auto', // Default - let storage provider decide
// or explicitly set:
// strategy: 'realtime' | 'batch-with-updates' | 'insert-only'

// Batching configuration (applies to both batch-with-updates and insert-only)
maxBatchSize: 1000, // Max spans per batch
maxBatchWaitMs: 5000, // Max wait before flushing
maxBufferSize: 10000, // Max spans to buffer
})

Prise en charge des fournisseurs de stockage
Lien direct vers Prise en charge des fournisseurs de stockage

Les fournisseurs de stockage prennent en charge différentes stratégies de traçage. Certains prennent en charge l’observabilité pour les charges de production, tandis que d’autres sont principalement destinés au développement local.

Si vous définissez la stratégie sur 'auto', MastraStorageExporter sélectionne automatiquement la stratégie optimale pour le fournisseur de stockage. Si vous définissez explicitement une stratégie que le fournisseur ne prend pas en charge, l’exportateur journalise un avertissement et se rabat sur la stratégie préférée du fournisseur.

Fournisseurs prenant en charge l’observabilité
Lien direct vers Fournisseurs prenant en charge l’observabilité

Fournisseur de stockageStratégie préféréeStratégies prises en chargeUtilisation recommandée
ClickHouseinsert-onlyinsert-onlyProduction à fort volume
PostgreSQLbatch-with-updatesbatch-with-updates, insert-onlyProduction à faible volume
MSSQLbatch-with-updatesbatch-with-updates, insert-onlyProduction à faible volume
MongoDBbatch-with-updatesbatch-with-updates, insert-onlyProduction à faible volume
OracleDBbatch-with-updatesbatch-with-updates, insert-onlyProduction à faible volume
libSQLbatch-with-updatesbatch-with-updates, insert-onlyStockage par défaut, adapté au développement

Fournisseurs ne prenant pas en charge l’observabilité
Lien direct vers Fournisseurs ne prenant pas en charge l’observabilité

Les fournisseurs de stockage suivants ne prennent pas en charge le domaine d’observabilité. Si vous utilisez l’un d’eux et avez besoin de l’observabilité, utilisez le stockage composite pour router les données d’observabilité vers un fournisseur compatible :

Avantages des stratégies
Lien direct vers Avantages des stratégies

  • realtime : visibilité immédiate, idéale pour le débogage
  • batch-with-updates : débit multiplié par 10 à 100, avec cycle de vie complet des spans
  • insert-only : réduction supplémentaire de 70 % des opérations de base de données, idéale pour l’analyse

Recommandations pour la production
Lien direct vers Recommandations pour la production

Les données d’observabilité croissent rapidement dans les environnements de production. Une seule interaction avec un agent peut générer des centaines de spans, et les applications à fort trafic peuvent produire des milliers de traces par jour. La plupart des bases de données généralistes ne sont pas optimisées pour cette charge composée d’écritures intensives et d’ajouts uniquement.

ClickHouse est une base de données en colonnes conçue pour les charges d’analyse à fort volume. Il s’agit du choix recommandé pour l’observabilité en production pour les raisons suivantes :

  • Optimisé pour les écritures : gère des millions d’insertions par seconde
  • Compression efficace : réduit les coûts de stockage des données de trace
  • Requêtes rapides : le stockage en colonnes permet de rechercher et d’agréger rapidement les traces
  • Natif pour les séries temporelles : prise en charge intégrée de la conservation et du partitionnement des données selon le temps

Utiliser le stockage composite
Lien direct vers Utiliser le stockage composite

Si vous utilisez un fournisseur qui ne prend pas en charge l’observabilité, comme Convex ou DynamoDB, ou si vous souhaitez optimiser les performances, utilisez le stockage composite pour router les données d’observabilité vers ClickHouse tout en conservant les autres données dans votre base principale.

Comportement du traitement par lots
Lien direct vers Comportement du traitement par lots

Déclencheurs du vidage
Lien direct vers Déclencheurs du vidage

Pour les deux stratégies par lots (batch-with-updates et insert-only), les traces sont vidées vers le stockage dès que l’une des conditions suivantes est remplie :

  1. Déclencheur de taille : le tampon atteint maxBatchSize spans
  2. Déclencheur temporel : maxBatchWaitMs s’est écoulé depuis le premier événement
  3. Vidage d’urgence : le tampon approche de la limite maxBufferSize
  4. Arrêt : force le vidage de tous les événements en attente

Gestion des erreurs
Lien direct vers Gestion des erreurs

MastraStorageExporter comprend une gestion fiable des erreurs adaptée à la production :

  • Logique de nouvelle tentative : délai exponentiel (500 ms, 1 s, 2 s, 4 s)
  • Échecs temporaires : nouvelle tentative automatique avec délai progressif
  • Échecs persistants : abandon du lot après 4 tentatives infructueuses
  • Dépassement du tampon : évite les problèmes de mémoire pendant les interruptions du stockage

Événements d’observabilité abandonnés
Lien direct vers Événements d’observabilité abandonnés

DefaultExporter émet des événements structurés d’abandon lorsqu’il ne peut pas conserver les données d’observabilité. Enregistrez un exportateur ou un bridge avec onDroppedEvent afin de transmettre ces abandons à un système d’alerte ou de surveillance.

Les événements sont abandonnés pour deux raisons :

  • unsupported-storage : le fournisseur de stockage n’implémente pas le type de signal.
  • retry-exhausted : l’exportateur a réessayé un lot jusqu’à maxRetries fois avant de l’abandonner.

L’exemple suivant montre comment transmettre les détails des abandons à un endpoint de surveillance :

src/mastra/observability.ts
import { BaseExporter } from '@mastra/observability'
import type { ObservabilityDropEvent, TracingEvent } from '@mastra/core/observability'

class DropAlertExporter extends BaseExporter {
name = 'drop-alerts'

async onDroppedEvent(event: ObservabilityDropEvent) {
await fetch('https://monitoring.example.com/observability-drops', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({
count: event.count,
signal: event.signal,
reason: event.reason,
exporterName: event.exporterName,
}),
})
}

protected async _exportTracingEvent(_event: TracingEvent) {}
}

Exemples de configuration
Lien direct vers Exemples de configuration

// Zero config - recommended for most users
new MastraStorageExporter()

// Development override
new MastraStorageExporter({
strategy: 'realtime', // Immediate visibility for debugging
})

// High-throughput production
new MastraStorageExporter({
maxBatchSize: 2000, // Larger batches
maxBatchWaitMs: 10000, // Wait longer to fill batches
maxBufferSize: 50000, // Handle longer outages
})

// Low-latency production
new MastraStorageExporter({
maxBatchSize: 100, // Smaller batches
maxBatchWaitMs: 1000, // Flush quickly
})