Genkit テレメトリー プラグインの作成

Firebase Genkit ライブラリは OpenTelemetry で計測可能 トレース、指標、ログの収集をサポートできますGenkit のユーザーは テレメトリー データをモニタリング ツールや可視化ツールに提供するために、 OpenTelemetry Go SDK を構成します。 特定の OpenTelemetry 対応システムにエクスポートできます。

Genkit には、データをエクスポートするように OpenTelemetry を構成するプラグインが含まれています。 Google Cloud Monitoring と Cloud Logging。サポート 使用する場合は、テレメトリー プラグインを記述することで Genkit を拡張できます。 このページで説明するとおりです。

始める前に

作成について詳しくは、Genkit プラグインの作成をご覧ください。 テレメトリープラグインを含むあらゆる Genkit プラグインに 対応しています特に すべてのプラグインは、ユーザーが呼び出すことが想定される Init 関数をエクスポートする必要があります。 確認しましょう。

エクスポータとロガー

前述のように、テレメトリー プラグインの主な役割は、 データをエクスポートするための OpenTelemetry(Genkit がすでに計測可能になっている) アクセスを制限することです。これを行うには、次のものが必要です。

  • OpenTelemetry の SpanExporter の実装 任意のサービスにデータをエクスポートできます。
  • OpenTelemetry の metric.Exporter の実装 任意のサービスにデータをエクスポートできます。
  • slog.Logger または slog.Handler の実装 任意のサービスにログをエクスポートできます。

エクスポート先のサービスによっては、 比較的軽微な作業か大規模な作業かです。

OpenTelemetry は業界標準であるため、多くのモニタリング サービスはすでに これらのインターフェースを実装するライブラリがあります。たとえば、googlecloud プラグインでは、Genkit の opentelemetry-operations-go このライブラリは Google Cloud チームによって管理されています。 同様に、多くのモニタリング サービスには、 標準の slog インターフェース。

一方、サービスに利用できるライブラリがない場合は、 必要なインターフェースの実装は大規模なプロジェクトになる場合があります。

OpenTelemetry レジストリを確認する またはモニタリング サービスのドキュメントを参照して、統合がすでに利用可能かどうかを確認してください。

これらの統合をご自身で構築する必要がある場合は、 OpenTelemetry の公式エクスポータ および slog ハンドラの作成ガイドのページをご覧ください。

プラグインのビルド

依存関係

すべてのテレメトリー プラグインは、Genkit コアライブラリといくつかの OpenTelemetry ライブラリ:

import {
	// Import the Genkit core library.
	"github.com/firebase/genkit/go/core"

	// Import the OpenTelemetry libraries.
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/metric"
	"go.opentelemetry.io/otel/sdk/trace"
}

既存の OpenTelemetry または slog を中心にプラグインを構築する場合 インポートすることも必要です

Config

テレメトリー プラグインは、少なくとも次の構成をサポートする必要があります。 オプション:

type Config struct {
	// Export even in the dev environment.
	ForceExport bool

	// The interval for exporting metric data.
	// The default is 60 seconds.
	MetricInterval time.Duration

	// The minimum level at which logs will be written.
	// Defaults to [slog.LevelInfo].
	LogLevel slog.Leveler
}

以下の例では、これらのオプションが利用可能であることを前提としています。 対応方法に関するガイダンスを提供します。

ほとんどのプラグインには、対象サービスの設定も含まれます。 (API キー、プロジェクト名など)のエクスポート先を指定します。

Init()

テレメトリー プラグインの Init() 関数は、次のすべてを行う必要があります。

  • Genkit が開発環境で実行されている(例: genkit start で実行され、Config.ForceExport オプションが set:

    shouldExport := cfg.ForceExport || os.Getenv("GENKIT_ENV") != "dev"
    if !shouldExport {
    	return nil
    }
    
  • トレーススパン エクスポータを初期化し、Genkit に登録します。

    spanProcessor := trace.NewBatchSpanProcessor(YourCustomSpanExporter{})
    core.RegisterSpanProcessor(spanProcessor)
    
  • 指標エクスポータを初期化して OpenTelemetry に登録する ライブラリ:

    r := metric.NewPeriodicReader(
    	YourCustomMetricExporter{},
    	metric.WithInterval(cfg.MetricInterval),
    )
    mp := metric.NewMeterProvider(metric.WithReader(r))
    otel.SetMeterProvider(mp)
    

    次の場合はユーザー構成の収集間隔(Config.MetricInterval)を使用する PeriodicReader を初期化する。

  • slog ハンドラをデフォルトのロガーとして登録します。

    logger := slog.New(YourCustomHandler{
    	Options: &slog.HandlerOptions{Level: cfg.LogLevel},
    })
    slog.SetDefault(logger)
    

    ユーザーが指定した最小ログ数に従うようにハンドラを構成する必要があります。 レベル(Config.LogLevel)。

PII の秘匿化

ほとんどの生成 AI フローはなんらかのユーザー入力から始まるため、 一部のフロートレースに、個人を特定できる情報(PII)を含む 保護します。ユーザーのプライバシーを保護するにはPII は秘匿化する必要があります。 エクスポートする前にトレースから抽出できます

独自のスパン エクスポータを構築する場合は、 その内容に入ります

既存の OpenTelemetry インテグレーションを中心にプラグインを作成する場合は、 指定のスパン エクスポータを、これを実行するカスタム エクスポータでラップできます。 タスクを実行します。たとえば、googlecloud プラグインは genkit:input と ラッパーを使用してエクスポートする前に、すべてのスパンの genkit:output 属性 次のようになります。

type redactingSpanExporter struct {
	trace.SpanExporter
}

func (e *redactingSpanExporter) ExportSpans(ctx context.Context, spanData []trace.ReadOnlySpan) error {
	var redacted []trace.ReadOnlySpan
	for _, s := range spanData {
		redacted = append(redacted, redactedSpan{s})
	}
	return e.SpanExporter.ExportSpans(ctx, redacted)
}

func (e *redactingSpanExporter) Shutdown(ctx context.Context) error {
	return e.SpanExporter.Shutdown(ctx)
}

type redactedSpan struct {
	trace.ReadOnlySpan
}

func (s redactedSpan) Attributes() []attribute.KeyValue {
	// Omit input and output, which may contain PII.
	var ts []attribute.KeyValue
	for _, a := range s.ReadOnlySpan.Attributes() {
		if a.Key == "genkit:input" || a.Key == "genkit:output" {
			continue
		}
		ts = append(ts, a)
	}
	return ts
}

トラブルシューティング

目的の場所にデータが表示されない場合は、OpenTelemetry を 便利な診断ツールを提供 問題の原因を特定するのに役立つことがあります。