メインコンテンツへ移動

トレーシング

トレーシングは、リクエストが Agent、Workflow、Tool、モデル呼び出しをどのように通過するかを記録する Observability シグナルです。Mastra は各操作を Span として表し、関連する Span を Trace にまとめることで、実行経路全体を調査できるようにします。

このページでは、Span の階層、サンプリング、メタデータ、フィルタリング、Trace ID、サードパーティの Trace コンテキストなど、Trace 固有の概念に焦点を当てます。

トレーシングを使用する場面
トレーシングを使用する場面への直接リンク

  • 実行経路全体を調査し、Agent や Workflow の予期しない動作をデバッグする。
  • 1つのリクエスト内でモデル呼び出し、Tool 呼び出し、Workflow のステップを追跡する。
  • フィルタリングや調査のため、Trace 固有のメタデータやタグを付与する。
  • Mastra の Trace をサードパーティのトレーシングシステムに接続する。

はじめに
はじめにへの直接リンク

トレーシングを開始するには、Mastra インスタンスで Observability を設定し、Agent または Workflow を実行します。次の機能を通じて動作を設定できます。

サンプリング戦略
サンプリング戦略への直接リンク

サンプリングを使用すると、収集する Trace を制御でき、Observability の要件とリソースコストのバランスを取れます。

トラフィックの多い本番環境では、すべての Trace を収集するとコストが高くなり、不要な場合もあります。

サンプリング戦略を使用すれば、エラーや重要な操作に関する重大な情報を見逃すことなく、Trace の代表的なサブセットを取得できます。

サンプリングは Observability の設定レベルで構成できます。

src/mastra/index.ts
export const mastra = new Mastra({
observability: new Observability({
configs: {
'10_percent': {
serviceName: 'my-service',
// Sample 10% of traces
sampling: {
type: 'ratio',
probability: 0.1,
},
exporters: [new MastraStorageExporter()],
},
},
}),
})

sampling オプションを使用すると、収集する Trace を制御でき、Observability の要件とリソースコストのバランスを取れます。Mastra は4つのサンプリング戦略に対応しています。

  1. 常にサンプリング:Trace を100%収集します。完全な可視性が必要な開発、デバッグ、またはトラフィックの少ないシナリオに最適です。

    sampling: {
    type: 'always'
    }
  2. サンプリングしない:トレーシングを完全に無効にします。トレーシングに価値がない特定の環境や、設定を削除せずに一時的にトレーシングを無効にする場合に便利です。

    sampling: {
    type: 'never'
    }
  3. 比率ベースのサンプリング:Trace を一定の割合でランダムにサンプリングします。完全なトレーシングにかかるコストを負担せずに統計的な知見を得たい本番環境に最適です。確率値の範囲は0(Trace なし)から1(すべての Trace)です。

    sampling: {
    type: 'ratio',
    probability: 0.1 // Sample 10% of traces
    }
  4. カスタムサンプリング:リクエストコンテキスト、メタデータ、またはビジネスルールに基づく独自のサンプリングロジックを実装します。ユーザー階層、リクエストタイプ、エラー条件に基づくサンプリングなど、複雑なシナリオに最適です。

    sampling: {
    type: 'custom',
    sampler: (options) => {
    // Sample premium users at higher rate
    if (options?.metadata?.userTier === 'premium') {
    return Math.random() < 0.5; // 50% sampling
    }

    // Default 1% sampling for others
    return Math.random() < 0.01;
    }
    }

カスタムメタデータの追加
カスタムメタデータの追加への直接リンク

カスタムメタデータを使用すると、Trace に追加のコンテキストを付与できるため、問題のデバッグや本番環境でのシステム動作の把握が容易になります。

メタデータには、ビジネスロジックやパフォーマンスメトリクスを含められます。また、ユーザーコンテキストや、実行中に起きたことを説明するその他の情報も格納できます。

トレーシングコンテキストを使用して、任意の Span にメタデータを追加できます。

execute: async (inputData, context) => {
const startTime = Date.now()
const response = await fetch(inputData.endpoint)

// Add custom metadata to the current span
context?.tracingContext.currentSpan?.update({
metadata: {
apiStatusCode: response.status,
endpoint: inputData.endpoint,
responseTimeMs: Date.now() - startTime,
userTier: inputData.userTier,
region: process.env.AWS_REGION,
},
})

return await response.json()
}

ここで設定したメタデータは、設定済みのすべての Exporter に表示されます。

デプロイ環境による Trace のタグ付け
デプロイ環境による Trace のタグ付けへの直接リンク

Mastra のトップレベルにある environment フィールドを設定すると、各呼び出しで tracingOptions.metadata.environment を渡さずに、すべての Observability シグナルへデプロイ環境を自動的に付与できます。

src/mastra/index.ts
export const mastra = new Mastra({
environment: 'production',
observability: new Observability({
configs: {
default: {
serviceName: 'my-service',
exporters: [new MastraStorageExporter()],
},
},
}),
})

environment が設定されていない場合、Mastra は process.env.NODE_ENV を使用します。どちらも設定されていない場合、推測せずにこのフィールドを未定義のままにします。

呼び出しごとの tracingOptions.metadata.environment が常に優先されるため、必要に応じて個別の呼び出しで値を上書きできます。

RequestContext からの自動メタデータ
automatic-metadata-from-requestcontextへの直接リンク

各 Span にメタデータを手動で追加する代わりに、RequestContext から値を自動的に抽出し、Trace 内のすべての Span にメタデータとして付与するよう Mastra を設定できます。これは、Trace 全体でユーザー識別子、環境情報、機能フラグ、その他のリクエストスコープのデータを一貫して追跡する場合に便利です。

設定レベルでの抽出
設定レベルでの抽出への直接リンク

トレーシング設定で、抽出する RequestContext のキーを定義します。これらのキーは、この設定で作成されたすべての Span のメタデータに自動的に含まれます。

src/mastra/index.ts
export const mastra = new Mastra({
observability: new Observability({
configs: {
default: {
serviceName: 'my-service',
requestContextKeys: ['userId', 'environment', 'tenantId'],
exporters: [new MastraStorageExporter()],
},
},
}),
})

RequestContext を使用して Agent や Workflow を実行すると、これらの値が自動的に抽出されます。

const requestContext = new RequestContext()
requestContext.set('userId', 'user-123')
requestContext.set('environment', 'production')
requestContext.set('tenantId', 'tenant-456')

// All spans in this trace automatically get userId, environment, and tenantId metadata
const result = await agent.generate('Hello', {
requestContext,
})

リクエストごとの追加
リクエストごとの追加への直接リンク

tracingOptions.requestContextKeys を使用して、Trace 固有のキーを追加できます。これらは設定レベルのキーとマージされます。

const requestContext = new RequestContext()
requestContext.set('userId', 'user-123')
requestContext.set('environment', 'production')
requestContext.set('experimentId', 'exp-789')

const result = await agent.generate('Hello', {
requestContext,
tracingOptions: {
requestContextKeys: ['experimentId'], // Adds to configured keys
},
})

// All spans now have: userId, environment, AND experimentId

ネストされた値の抽出
ネストされた値の抽出への直接リンク

RequestContext からネストされた値を抽出するには、ドット記法を使用します。

export const mastra = new Mastra({
observability: new Observability({
configs: {
default: {
requestContextKeys: ['user.id', 'session.data.experimentId'],
exporters: [new MastraStorageExporter()],
},
},
}),
})

const requestContext = new RequestContext()
requestContext.set('user', { id: 'user-456', name: 'John Doe' })
requestContext.set('session', { data: { experimentId: 'exp-999' } })

// Metadata will include: { user: { id: 'user-456' }, session: { data: { experimentId: 'exp-999' } } }

仕組み
仕組みへの直接リンク

  1. TraceState の計算:Trace の開始時(ルート Span の作成時)に、Mastra は設定レベルのキーとリクエストごとのキーをマージし、抽出するキーを計算します。
  2. 自動抽出:ルート Span(Agent の実行、Workflow の実行)は、RequestContext からメタデータを自動的に抽出します。
  3. 子 Span での抽出:子 Span の作成時に requestContext を渡すと、子 Span でもメタデータを抽出できます。
  4. メタデータの優先順位:Span のオプションへ明示的に渡されたメタデータは、抽出されたメタデータより常に優先されます。

Trace へのタグの追加
Trace へのタグの追加への直接リンク

タグは、Trace の分類やフィルタリングに役立つ文字列ラベルです。構造化されたキーと値のデータを含むメタデータとは異なり、タグはすばやいフィルタリングと整理を目的とした単純な文字列です。

Agent や Workflow の実行時にタグを追加するには、tracingOptions.tags を使用します。

// With agents
const result = await agent.generate('Hello', {
tracingOptions: {
tags: ['production', 'experiment-v2', 'user-request'],
},
})

// With workflows
const run = await mastra.getWorkflow('myWorkflow').createRun()
const result = await run.start({
inputData: { data: 'process this' },
tracingOptions: {
tags: ['batch-processing', 'priority-high'],
},
})

タグの仕組み
タグの仕組みへの直接リンク

  • ルート Span のみ:タグは Trace のルート Span(Agent の実行または Workflow の実行を表す Span)にのみ適用されます。
  • 幅広い対応:ほとんどの Exporter は、Trace のフィルタリングと検索にタグを使用できます。
    • Braintrust:ネイティブの tags フィールド
    • Langfuse:Trace 上のネイティブの tags フィールド
    • ArizeExporter:OpenInference の tag.tags 属性
    • OtelExporter:Span の mastra.tags 属性
    • OtelBridge:Span の mastra.tags 属性
  • メタデータとの併用tagsmetadata の両方を同じ tracingOptions で使用できます。
const result = await agent.generate([{ role: 'user', content: 'Analyze this' }], {
tracingOptions: {
tags: ['production', 'analytics'],
metadata: { userId: 'user-123', experimentId: 'exp-456' },
},
})

一般的なタグのパターン
一般的なタグのパターンへの直接リンク

  • 環境"production""staging""development"
  • 機能フラグ"feature-x-enabled""beta-user"
  • リクエストタイプ"user-request""batch-job""scheduled-task"
  • 優先度"priority-high""priority-low"
  • 実験"experiment-v1""control-group""treatment-a"

機密性の高い入出力を非表示にする
機密性の高い入出力を非表示にするへの直接リンク

機密データを処理する場合、Observability プラットフォームに入力値や出力値が記録されないようにする必要があります。Trace 内のすべての Span からこのデータを除外するには、hideInputhideOutputtracingOptions で使用します。

// Hide input data (e.g., user credentials, PII)
const result = await agent.generate([{ role: 'user', content: 'Process this sensitive data' }], {
tracingOptions: {
hideInput: true, // Input will be hidden from all spans
},
})

// Hide output data (e.g., generated secrets, confidential results)
const result = await agent.generate([{ role: 'user', content: 'Generate API keys' }], {
tracingOptions: {
hideOutput: true, // Output will be hidden from all spans
},
})

// Hide both input and output
const result = await agent.generate([{ role: 'user', content: 'Handle confidential request' }], {
tracingOptions: {
hideInput: true,
hideOutput: true,
},
})

仕組み
仕組みへの直接リンク

  • Trace 全体への適用:ルート Span に設定すると、これらのオプションは Trace 内のすべての子 Span(Tool 呼び出し、モデル生成など)に適用されます。
  • エクスポート時のフィルタリング:データは実行中、内部では引き続き使用できますが、Span を Observability プラットフォームへエクスポートする際に除外されます。
  • 他のオプションとの併用hideInputhideOutput は、tagsmetadata、その他の tracingOptions と併用できます。
const result = await agent.generate([{ role: 'user', content: 'Sensitive operation' }], {
tracingOptions: {
hideInput: true,
hideOutput: true,
tags: ['sensitive-operation', 'pii-handling'],
metadata: { operationType: 'credential-processing' },
},
})

機密データをより細かく制御するには、Sensitive Data Filter Processor の使用を検討してください。この Processor では、入出力のその他の部分を保持しながら、パスワード、Token、キーなどの特定フィールドをマスキングできます。

子 Span とメタデータの抽出
子 Span とメタデータの抽出への直接リンク

Tool や Workflow のステップ内で子 Span を作成するときに、requestContext パラメーターを渡すとメタデータの抽出を有効にできます。

execute: async (inputData, context) => {
// Create child span WITH requestContext - gets metadata extraction
const dbSpan = context?.tracingContext.currentSpan?.createChildSpan({
type: 'generic',
name: 'database-query',
requestContext: context?.requestContext, // Pass to enable metadata extraction
})

const results = await db.query('SELECT * FROM users')
dbSpan?.end({ output: results })

// Or create child span WITHOUT requestContext - no metadata extraction
const cacheSpan = context?.tracingContext.currentSpan?.createChildSpan({
type: 'generic',
name: 'cache-check',
// No requestContext - won't extract metadata
})

return results
}

これにより、どの子 Span に RequestContext のメタデータを含めるかを細かく制御できます。ルート Span(Agent/Workflow の実行)は常にメタデータを自動抽出しますが、子 Span は requestContext を明示的に渡した場合にのみ抽出します。

子 Span の作成
子 Span の作成への直接リンク

子 Span を使用すると、Workflow のステップや Tool 内の細かな操作を追跡できます。データベースクエリ、API 呼び出し、ファイル操作、複雑な計算などのサブ操作を可視化できます。この階層構造により、パフォーマンスのボトルネックを特定し、操作の正確な順序を把握できます。

特定の操作を追跡するには、Tool 呼び出しまたは Workflow のステップ内で子 Span を作成します。

execute: async (inputData, context) => {
// Create another child span for the main database operation
const querySpan = context?.tracingContext.currentSpan?.createChildSpan({
type: 'generic',
name: 'database-query',
input: { query: inputData.query },
metadata: { database: 'production' },
})

try {
const results = await db.query(inputData.query)
querySpan?.end({
output: results.data,
metadata: {
rowsReturned: results.length,
queryTimeMs: results.executionTime,
cacheHit: results.fromCache,
},
})
return results
} catch (error) {
querySpan?.error({
error,
metadata: { retryable: isRetryableError(error) },
})
throw error
}
}

子 Span は親から Trace コンテキストを自動的に継承し、Observability プラットフォーム内で関係の階層を維持します。

Span の整形
Span の整形への直接リンク

Mastra には、Span データが Observability プラットフォームへ到達する前に変換する方法として、Span Processorカスタム Span Formatter の2つがあります。どちらも Trace データの変更、フィルタリング、拡充が可能ですが、動作するレベルと用途が異なります。

機能Span Processorカスタム Span Formatter
設定レベルObservability の設定Exporter ごと
操作対象内部の Span オブジェクトエクスポートされる ExportedSpan データ
適用対象すべての Exporter1つの Exporter
非同期処理への対応なしあり
ユースケースセキュリティ、フィルタリング、拡充プラットフォーム固有の整形、非同期での拡充

機密データのマスキングなど、すべての Exporter に適用する同期変換には Span Processor を使用します。プラットフォームごとに同じデータを異なる形式で表す必要がある場合(あるプラットフォームではプレーンテキスト、別のプラットフォームでは構造化データなど)や、外部 API からのデータ取得のような非同期操作が必要な場合は、カスタム Span Formatter を使用します。

Span Processor
Span Processorへの直接リンク

Span Processor は、Trace データがエクスポートされる前に変換、フィルタリング、拡充します。Span の作成からエクスポートまでの間をつなぐパイプラインとして機能し、セキュリティ、コンプライアンス、デバッグの目的で Span を変更できます。Processor は一度実行され、すべての Exporter に影響します。

組み込み Processor
組み込み Processorへの直接リンク

  • Sensitive Data Filter は機密情報をマスキングします。Observability のデフォルト設定で有効になっています。

カスタム Processor の作成
カスタム Processor の作成への直接リンク

SpanOutputProcessor インターフェースを実装して、カスタム Span Processor を作成できます。次の基本例では、Span 内のすべての入力テキストを小文字に変換します。

src/processors/lowercase-input-processor.ts
import type { SpanOutputProcessor, AnySpan } from '@mastra/observability'

export class LowercaseInputProcessor implements SpanOutputProcessor {
name = 'lowercase-processor'

process(span: AnySpan): AnySpan {
span.input = `${span.input}`.toLowerCase()
return span
}

async shutdown(): Promise<void> {
// Cleanup if needed
}
}

// Use the custom processor
export const mastra = new Mastra({
observability: new Observability({
configs: {
development: {
spanOutputProcessors: [new LowercaseInputProcessor(), new SensitiveDataFilter()],
exporters: [new MastraStorageExporter()],
},
},
}),
})

Processor は定義された順序で実行されるため、複数の変換を連結できます。一般的なユースケースは次のとおりです。

  • 機密データ(パスワード、Token、API キー)のマスキング
  • 環境固有のメタデータの追加
  • 条件に基づく Span の除外
  • データ形式の正規化
  • ビジネスコンテキストによる Span の拡充

Exporter、Bridge、Processor のより広範なモデルについては、インテグレーションの概要を参照してください。

Span のフィルタリング
Span のフィルタリングへの直接リンク

Span のフィルタリングにより、データが Observability プラットフォームへ到達する前にノイズや Span ごとのコストを削減できます。Observability インスタンスごとに設定できるため、Exporter や環境に応じて異なる詳細レベルを保持できます。

  • 最小限の設定で Span のカテゴリ全体を除外するには、excludeSpanTypes を使用します。
  • エクスポートされる Span データに基づくカスタムロジックが必要な場合は、spanFilter を使用します。

次の例は、1つの設定で両方のオプションを組み合わせる方法を示しています。

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { SpanType } from '@mastra/core/observability'
import { Observability, MastraStorageExporter } from '@mastra/observability'
import { LangfuseExporter } from '@mastra/langfuse'

export const mastra = new Mastra({
observability: new Observability({
configs: {
default: {
serviceName: 'my-app',
exporters: [new MastraStorageExporter(), new LangfuseExporter()],
excludeSpanTypes: [SpanType.MODEL_CHUNK, SpanType.MODEL_STEP],
spanFilter: span => {
if (span.type === SpanType.TOOL_CALL && span.attributes?.success) {
return false
}

return true
},
},
},
}),
})

エクスポート時のフィルタリングは、次の順序で行われます。

  1. includeInternalSpanstrue でない限り、内部 Span を除外します。
  2. excludeSpanTypes で一致するタイプの Span を除外します。
  3. spanOutputProcessors で残りの Span を変換します。
  4. spanFilter で最終的にエクスポートされる Span を保持するかどうかを決定します。

spanFilter が例外をスローした場合、データが気付かないうちに失われるのを防ぐため、Mastra はその Span を保持してエラーをログに記録します。Span タイプの完全な一覧とその他の例については、Span フィルタリングのリファレンスを参照してください。

カスタム Span Formatter
カスタム Span Formatterへの直接リンク

カスタム Span Formatter は、特定の Observability プラットフォームで Span がどのように表示されるかを変換します。Span Processor とは異なり、Formatter は Exporter ごとに設定されるため、送信先ごとに異なる形式を指定できます。Formatter は同期操作と非同期操作の両方に対応しています。

ユースケース
ユースケースへの直接リンク

  • AI SDK メッセージからプレーンテキストを抽出:構造化されたメッセージ配列を読みやすいテキストに変換する
  • 入出力形式を変換:特定のプラットフォームでのデータ表示をカスタマイズする
  • プラットフォーム固有のフィールドマッピング:プラットフォームの要件に基づいてフィールドを追加または削除する
  • 非同期でのデータ拡充:外部 API やデータベースから追加のコンテキストを取得する

設定
設定への直接リンク

任意の Exporter 設定に customSpanFormatter を追加します。

src/mastra/index.ts
import { BraintrustExporter } from '@mastra/braintrust'
import { LangfuseExporter } from '@mastra/langfuse'
import { SpanType } from '@mastra/core/observability'
import type { CustomSpanFormatter } from '@mastra/core/observability'

// Formatter that extracts plain text from AI messages
const plainTextFormatter: CustomSpanFormatter = span => {
if (span.type === SpanType.AGENT_RUN && Array.isArray(span.input)) {
const userMessage = span.input.find(m => m.role === 'user')
return {
...span,
input: userMessage?.content ?? span.input,
}
}
return span
}

export const mastra = new Mastra({
observability: new Observability({
configs: {
default: {
serviceName: 'my-service',
exporters: [
// Braintrust gets plain text formatting
new BraintrustExporter({
customSpanFormatter: plainTextFormatter,
}),
// Langfuse keeps the original structured format
new LangfuseExporter(),
],
},
},
}),
})

複数の Formatter の連結
複数の Formatter の連結への直接リンク

複数の Formatter を組み合わせるには、chainFormatters を使用します。連結された Formatter は、同期と非同期の両方に対応しています。

import { chainFormatters } from '@mastra/observability'

const inputFormatter: CustomSpanFormatter = span => ({
...span,
input: extractPlainText(span.input),
})

const outputFormatter: CustomSpanFormatter = span => ({
...span,
output: extractPlainText(span.output),
})

const exporter = new BraintrustExporter({
customSpanFormatter: chainFormatters([inputFormatter, outputFormatter]),
})

非同期 Formatter
非同期 Formatterへの直接リンク

カスタム Span Formatter は非同期操作に対応しているため、外部 API やデータベースからデータを取得して Span を拡充するようなユースケースを実現できます。

import type { CustomSpanFormatter } from '@mastra/core/observability'

// Async formatter that enriches spans with user data
const userEnrichmentFormatter: CustomSpanFormatter = async span => {
const userId = span.metadata?.userId
if (!userId) return span

// Fetch user data from your API or database
const userData = await fetchUserData(userId)

return {
...span,
metadata: {
...span.metadata,
userName: userData.name,
userEmail: userData.email,
department: userData.department,
},
}
}

// Async formatter that looks up additional context
const contextEnrichmentFormatter: CustomSpanFormatter = async span => {
if (span.type !== SpanType.AGENT_RUN) return span

// Fetch experiment configuration
const experimentConfig = await getExperimentConfig(span.metadata?.experimentId)

return {
...span,
metadata: {
...span.metadata,
experimentVariant: experimentConfig?.variant,
experimentGroup: experimentConfig?.group,
},
}
}

// Use async formatters with an exporter
const exporter = new BraintrustExporter({
customSpanFormatter: userEnrichmentFormatter,
})

// Or chain sync and async formatters together
const exporter = new LangfuseExporter({
customSpanFormatter: chainFormatters([
plainTextFormatter, // sync
userEnrichmentFormatter, // async
contextEnrichmentFormatter, // async
]),
})
注記

非同期 Formatter は Span のエクスポートにレイテンシーを加えます。アプリケーションの速度低下を避けるため、非同期操作は短時間(100ミリ秒未満)で完了するようにしてください。頻繁にアクセスするデータには、キャッシュの使用を検討してください。

シリアル化オプション
シリアル化オプションへの直接リンク

シリアル化オプションは、Span データ(入力、出力、属性)がエクスポート前にどのように切り詰められるかを制御します。大きなペイロードや深くネストされたオブジェクトを扱う場合や、Trace ストレージを最適化する必要がある場合に便利です。

設定
設定への直接リンク

Observability の設定に serializationOptions を追加します。

src/mastra/index.ts
export const mastra = new Mastra({
observability: new Observability({
configs: {
default: {
serviceName: 'my-service',
serializationOptions: {
maxStringLength: 2048, // Maximum length for string values (default: 1024)
maxDepth: 10, // Maximum depth for nested objects (default: 6)
maxArrayLength: 100, // Maximum number of items in arrays (default: 50)
maxObjectKeys: 75, // Maximum number of keys in objects (default: 50)
},
exporters: [new MastraStorageExporter()],
},
},
}),
})

使用可能なオプション
使用可能なオプションへの直接リンク

オプションデフォルト説明
maxStringLength1024文字列値の最大長。これを超える文字列は切り詰められます。
maxDepth6ネストされたオブジェクトの最大深度。これより深い階層は省略されます。
maxArrayLength50配列内の項目の最大数。これを超える項目は省略されます。
maxObjectKeys50オブジェクト内のキーの最大数。これを超えるキーは省略されます。

ユースケース
ユースケースへの直接リンク

デバッグのために上限を引き上げる:Agent や Tool が大きなドキュメント、API レスポンス、データ構造を扱う場合は、これらの上限を引き上げることで、Trace により多くのコンテキストを記録できます。

serializationOptions: {
maxStringLength: 8192, // Capture longer text content
maxDepth: 12, // Handle deeply nested JSON responses
maxArrayLength: 200, // Keep more items from large lists
}

本番環境で Trace のサイズを削減する:ペイロード全体を可視化する必要がない場合は、これらの値を引き下げてストレージコストを削減し、パフォーマンスを向上させます。

serializationOptions: {
maxStringLength: 256, // Truncate strings aggressively
maxDepth: 3, // Shallow object representation
maxArrayLength: 10, // Keep only first few items
maxObjectKeys: 20, // Limit object keys
}

すべてのオプションは任意です。指定しない場合は、上記のデフォルト値が使用されます。

Trace ID の取得
Trace ID の取得への直接リンク

トレーシングを有効にして Agent や Workflow を実行すると、レスポンスに traceId が含まれます。この ID を使用して、Observability プラットフォーム上で Trace 全体を検索できます。これはデバッグやカスタマーサポートに役立つほか、Trace をシステム内の他のイベントと関連付ける場合にも便利です。

Agent の Trace ID
Agent の Trace IDへの直接リンク

generate メソッドと stream メソッドは、どちらもレスポンスで Trace ID を返します。

// Using generate
const result = await agent.generate('Hello')

console.log('Trace ID:', result.traceId)

// Using stream
const streamResult = await agent.stream('Tell me a story')

console.log('Trace ID:', streamResult.traceId)

Workflow の Trace ID
Workflow の Trace IDへの直接リンク

Workflow の実行でも Trace ID が返されます。

// Create a workflow run
const run = await mastra.getWorkflow('myWorkflow').createRun()

// Start the workflow
const result = await run.start({
inputData: { data: 'process this' },
})

console.log('Trace ID:', result.traceId)

// Or stream the workflow
const { stream, getWorkflowState } = run.stream({
inputData: { data: 'process this' },
})

// Get the final state which includes the trace ID
const finalState = await getWorkflowState()
console.log('Trace ID:', finalState.traceId)

Trace ID の使用
Trace ID の使用への直接リンク

Trace ID を取得すると、次のことができます。

  1. Studio で Trace を検索:Trace ビューへ移動し、ID で検索します。
  2. 外部プラットフォームで Trace を検索:Langfuse、Braintrust、MLflow、または使用している Observability プラットフォームで ID を使用します。
  3. ログとの関連付け:相互参照できるよう、アプリケーションログに Trace ID を含めます。
  4. デバッグ用に共有:調査のため、サポートチームや開発者に Trace ID を提供します。

Trace ID は、トレーシングが有効な場合にのみ使用できます。トレーシングが無効な場合や、サンプリングによってリクエストが除外された場合、traceIdundefined になります。

外部トレーシングシステムとの統合
外部トレーシングシステムとの統合への直接リンク

既存の分散トレーシング(OpenTelemetry、Datadog など)があるアプリケーション内で Mastra の Agent や Workflow を実行する場合、Mastra の Trace を親の Trace コンテキストに接続できます。これによりリクエストフロー全体を一元的に表示でき、Mastra の操作がシステム全体の中でどのように位置付けられるかを把握しやすくなります。

外部 Trace ID の受け渡し
外部 Trace ID の受け渡しへの直接リンク

親システムからの Trace コンテキストを指定するには、tracingOptions パラメーターを使用します。

// Get trace context from your existing tracing system
const parentTraceId = getCurrentTraceId() // Your tracing system
const parentSpanId = getCurrentSpanId() // Your tracing system

// Execute Mastra operations as part of the parent trace
const result = await agent.generate('Analyze this data', {
tracingOptions: {
traceId: parentTraceId,
parentSpanId: parentSpanId,
},
})

// The Mastra trace will now appear as a child in your distributed trace

OpenTelemetry との統合
OpenTelemetry との統合への直接リンク

OpenTelemetry と統合すると、Mastra の Trace を既存の Observability プラットフォームへ直接表示できます。

import { trace } from '@opentelemetry/api'

// Get the current OpenTelemetry span
const currentSpan = trace.getActiveSpan()
const spanContext = currentSpan?.spanContext()

if (spanContext) {
const result = await agent.generate(userMessage, {
tracingOptions: {
traceId: spanContext.traceId,
parentSpanId: spanContext.spanId,
},
})
}

Workflow との統合
Workflow との統合への直接リンク

Workflow でも、Trace の伝播に同じパターンを使用できます。

const workflow = mastra.getWorkflow('data-pipeline')
const run = await workflow.createRun()

const result = await run.start({
inputData: { data: '...' },
tracingOptions: {
traceId: externalTraceId,
parentSpanId: externalSpanId,
},
})

ID 形式の要件
ID 形式の要件への直接リンク

互換性を確保するため、Mastra は Trace ID と Span ID を検証します。

  • Trace ID:1~32文字の16進数(OpenTelemetry では32文字)
  • Span ID:1~16文字の16進数(OpenTelemetry では16文字)

無効な ID は適切に処理され、Mastra はエラーをログに記録して処理を続行します。

  • 無効な Trace ID → 新しい Trace ID を生成します。
  • 無効な親 Span ID → 親子関係を無視します。

そのため、入力形式が不正な場合でも、トレーシングによってアプリケーションがクラッシュすることはありません。

例:Express ミドルウェア
例:Express ミドルウェアへの直接リンク

Express アプリケーションで Trace を伝播する完全な例を次に示します。

import { trace } from '@opentelemetry/api'
import express from 'express'

const app = express()

app.post('/api/analyze', async (req, res) => {
// Get current OpenTelemetry context
const currentSpan = trace.getActiveSpan()
const spanContext = currentSpan?.spanContext()

const result = await agent.generate(req.body.message, {
tracingOptions: spanContext
? {
traceId: spanContext.traceId,
parentSpanId: spanContext.spanId,
}
: undefined,
})

res.json(result)
})

これにより、HTTP リクエストの処理と Mastra Agent の実行の両方を含む単一の分散 Trace が作成され、選択した Observability プラットフォームで表示できます。

トレースされる対象
トレースされる対象への直接リンク

Mastra は、次の対象に対して Span を自動的に作成します。

Agent の操作
Agent の操作への直接リンク

  • Agent の実行:指示と Tool を含む完全な実行
  • LLM 呼び出し:Token とパラメーターを含むモデルとのやり取り
  • Tool の実行:入力と出力を含む関数呼び出し
  • メモリ操作:Thread とセマンティックリコール

Workflow の操作
Workflow の操作への直接リンク

  • Workflow の実行:開始から終了までの完全な実行
  • 個別のステップ:入出力を含むステップ処理
  • 制御フロー:条件分岐、ループ、並列実行
  • 待機操作:遅延とイベント待機

関連項目
関連項目への直接リンク

リファレンスドキュメント
リファレンスドキュメントへの直接リンク