AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

OpenTelemetry による操作の追跡

このガイドでは、 .NET/ C#ドライバーで OpenTelemetry トレースを使用する方法を学習できます。 OpenTelemetry は、テレメトリ データの測定、生成、収集、エクスポートを行う標準化された方法を提供するオープンソースの可視性フレームワークです。

.NET/ C#ドライバーは、 System.Diagnostics.ActivitySource APIを通じてトレース データを出力します。ドライバーのActivitySource にリスナーをサブスクライブすると、ドライバーはクエリやトランザクションなどのMongoDB操作を表す範囲を作成します。これらの範囲には、OpenTelemetry のセマンティック 規則 に従う属性が含まれます。

注意

OpenTelemetry トレースは、 .NET/ C#ドライバー 3.7 以降で利用できます。

sample_mflix.moviesこのガイドの例では、Atlasサンプルデータセットの コレクションを使用します。無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、「.NET/ C#ドライバーを使い始める 」を参照してください。

次のコードでは、MongoClient を作成し、サンプルコレクションにアクセスします。

var connectionString = "<connection string>";
var client = new MongoClient(connectionString);
var collection = client.GetDatabase("sample_mflix").GetCollection<BsonDocument>("movies");

ドライバーは OpenTelemetry SDK に依存しません。は ActivitySource を通じて範囲を出力するため、System.Diagnostics.ActivityListenerオブジェクトを含む任意のリスナーがそれらを収集できます。

OpenTelemetry SDK を使用してドライバーのスパンを収集するには、 SDK と エクスポート機能をアプリに追加 します。このページの例では、インメモリ エクスポート機能を使用しているため、ドライバーが生成する範囲を検査できます。プロジェクトディレクトリから次のコマンドを実行します。

dotnet add package OpenTelemetry
dotnet add package OpenTelemetry.Exporter.InMemory

ドライバーは、リスナーがドライバーの ActivitySource にサブスクライブし、クライアントでトレースが有効になっている場合に範囲を作成します。クライアントのトレースを無効にするには、TracingOptions.Disabledプロパティを true に設定します。

リスナーがサブスクライブされていない場合、ドライバーはすべてのトレース作業をスキップするため、パフォーマンスへの影響は無視できます。

ドライバーは、MongoDB.Driver という名前の ActivitySource に範囲を登録します。ドライバーのスパンを収集するには、OpenTelemetry を構成するときに MongoTelemetry.ActivitySourceName 定数を AddSource() メソッドに渡します。

ASP .NET Core やワーカー サービスなど、 .NETホスティング モデルを使用するアプリで OpenTelemetry を構成するには、次のパッケージを追加します。

dotnet add package OpenTelemetry.Extensions.Hosting

アプリにすでにホストがある場合は、次の例に示すように、ドライバーの ActivitySource を OpenTelemetry 設定に追加します。

// Register the driver's ActivitySource with an OpenTelemetry
// TracerProvider in a generic host.
var exportedSpans = new List<Activity>();
var builder = Host.CreateApplicationBuilder();
builder.Services.AddOpenTelemetry()
.WithTracing(tracing => tracing
.AddSource(MongoTelemetry.ActivitySourceName)
.AddInMemoryExporter(exportedSpans));
var host = builder.Build();

上記の例では、OpenTelemetry.Exporter.InMemoryパッケージを使用して範囲を収集します。アプリで、それをトレースバックエンドのエクスポート機能に置き換えます。

アプリにホストがない場合は、次の例に示すように TracerProvider をビルドします。

// Register the driver's ActivitySource with an OpenTelemetry
// TracerProvider.
var exportedSpans = new List<Activity>();
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource(MongoTelemetry.ActivitySourceName)
.AddInMemoryExporter(exportedSpans)
.Build();

上記の例では、OpenTelemetry.Exporter.InMemoryパッケージを使用して範囲を収集します。アプリで、それを トレースバックエンド用のエクスポート機能( OTLP(OpenTelemetry Protocol)エクスポート機能など)に置き換えます。

ActivitySource をサブスクライブすると、ドライバーは次の例に示すように、アプリケーションが実行する操作の範囲を出力します。

var filter = Builders<BsonDocument>.Filter.Eq("title", "Back to the Future");
var movie = collection.Find(filter).First();

OpenTelemetry SDKActivitySource に依存したくない場合は、 System.Diagnostics.ActivityListerオブジェクトを使用して、ドライバーの をサブスクライブできます。次の例では、ドライバーが出力するすべての範囲を受信するリスナーを登録します。

// Subscribe to the driver's ActivitySource by using an ActivityListener.
// This approach avoids a dependency on the OpenTelemetry SDK.
var exportedSpans = new List<Activity>();
using var listener = new ActivityListener
{
ShouldListenTo = source => source.Name == MongoTelemetry.ActivitySourceName,
Sample = (ref ActivityCreationOptions<ActivityContext> _) =>
ActivitySamplingResult.AllDataAndRecorded,
ActivityStopped = exportedSpans.Add
};
ActivitySource.AddActivityListener(listener);

個々のクライアントのトレース機能を設定するには、MongoClientSettings.TracingOptionsプロパティを TracingOptionsインスタンスに設定します。 TracingOptionsクラスには次のプロパティがあります。

プロパティ
タイプ
説明

Disabled

bool

true に設定されている場合、このクライアントは範囲を作成しません。他のクライアントがサブスクライブしているリスナーは影響を受けません。

デフォルト: false

QueryTextMaxLength

int

span 属性に含めるクエリ テキストの最大長を指定します。 0 に設定されている場合、ドライバーはクエリテキストを省略します。クエリ テキストは db.query.text 属性に表示されます。

デフォルト: 0

次の例では、QueryTextMaxLength を 1024 に設定します。これにより、コマンドテキストが最大 1024 文字でキャプチャされます。

var settings = MongoClientSettings.FromConnectionString(connectionString);
settings.TracingOptions = new TracingOptions
{
Disabled = false,
QueryTextMaxLength = 1024
};
var client = new MongoClient(settings);

.NET/ C#ドライバーは次のタイプの範囲を作成します。

スパン タイプ
説明

操作レベルの範囲

高レベルのドライバー操作を表す範囲(find、insert、aggregate など)。操作レベルの範囲には db.operation.name 属性が含まれます。

コマンドレベルの範囲

ドライバーがサーバーに送信する個々の コマンドを表す の範囲。コマンドレベルの範囲には db.command.name 属性が含まれ、対応する操作レベルの範囲の下にネストされます。

トランザクションの範囲

明示的なトランザクション内で実行されるすべての操作を含む範囲。

例、find操作では、次の階層に示すように、ネストされたコマンドレベルの範囲を含む操作レベルの範囲が作成されます。

find sample_mflix.movies
└── find

.NET/ C#ドライバーは OpenTelemetry のセマンティック規則に従い、各操作に関するコンテキストを提供する属性を含めています。

範囲には、次の一般的な属性が含まれます。

  • db.system.name: 常に に設定します mongodb

  • db.operation.name: 高レベル操作の名前(操作範囲のみ)

  • db.operation.summary:高レベルの操作の概要(操作範囲のみ)

  • db.command.name: MongoDBコマンドの名前(コマンドは のみ)

  • db.namespace: データベース名

  • db.collection.name: コレクション名(該当する場合)

  • db.query.summary: クエリの概要(コマンドは 範囲のみ)

コマンド範囲には、次のネットワーク属性が含まれます。

  • server.address: MongoDBサーバーホストする

  • server.port: MongoDBサーバーポート

  • network.transport: トランスポートプロトコル(tcp や unix など)

コマンド範囲には、次の接続属性が含まれます。

  • db.mongodb.server_connection_id: サーバーが割り当てた接続ID

  • db.mongodb.driver_connection_id: ドライバーに割り当てられた接続ID

セッションまたはトランザクションを使用する場合、コマンド範囲には次の属性が含まれます。

  • db.mongodb.lsid: 論理セッションID ( セッションを使用する場合)

  • db.mongodb.txn_number: トランザクション番号(トランザクション内)

  • db.mongodb.cursor_id: カーソルID (カーソルを返す操作)

QueryTextMaxLength を 0 より大きい値で構成すると、コマンド範囲には次の属性が含まれます。

  • db.query.text: 指定された最大長まで切り捨てられたコマンドテキスト

操作が失敗すると、ドライバーは例外の詳細を記録し、次の属性を含めます。

  • exception.type: 例外のタイプ

  • exception.message: 例外メッセージ

  • exception.stacktrace: 例外スタックトレース

  • db.response.status_code: MongoDBエラー コード(コマンドは 範囲のみにまたがる)

ドライバーは機密情報を保護するために、次のセキュリティ対策を適用します。

  • ドライバーは、認証コマンドなどの機密性の高いコマンドの範囲を作成しません。これらのコマンドには、authenticate、saslStart、saslContinue、getNonce、createUser、updateUser、copyDbSaslStart、copyDb が含まれます。ドライバーは、speculativeAuthenticateフィールドが含まれている場合は hello コマンドもスキップします。

  • ドライバーはデフォルトで db.query.text 属性を無効にします。この属性は必要な場合にのみ有効にしてください。

  • ドライバーがクエリテキストをキャプチャすると、コマンドから lsid、$db、$clusterTime、signature フィールドが削除されます。

警告

db.query.text 属性を有効にすると、ドライバーは コマンド テキストを span 属性に含め、エクスポートerは トレース用バックバックエンドに範囲を送信します。ドライバーは セッションとクラスターのメタデータのみを削除します。トレースバックエンドは、フィルター値、クエリ演算子、挿入またはアップデートされたドキュメントの内容は引き続き記録します。

操作が失敗すると、ドライバーは例外の詳細を OpenTelemetry セマンティック規則に準拠する span 属性として記録し、 span ステータスを Error に設定します。

MongoDBコマンドが失敗した場合、ドライバーは操作範囲とそのコマンド範囲の両方のステータスを Error に設定します。ドライバーは、コマンド span の db.response.status_code 属性にエラー コードを記録します。

重複キー エラーなど、サーバーが正常なコマンド応答で返す書き込みエラーは、db.response.status_code を設定しないでください。ドライバーはこれらのエラーを操作範囲の例外属性として記録します。

エラーは発生しても、ドライバーはアプリケーションに対して例外を発生させることはありません。

OpenTelemetry トレースを使用する場合は、次のパフォーマンスへの影響を考慮してください。

  • db.query.text 属性をキャプチャするとオーバーヘッドが増加します。必要な場合にのみコマンド テキストをキャプチャするか、QueryTextMaxLength を 0 に設定して無効にします。

  • ドライバーの ActivitySource にサブスクライブされていないリスナーが ない 場合、ドライバーはすべてのトレース作業をスキップするため、トレースによるパフォーマンスへの影響は無視されます。

OpenTelemetry トレースの詳細については、 OpenTelemetry .NETドキュメント を参照してください。

ドライバー内の操作を追跡するために使用されるクラスの詳細については、次のAPIドキュメントを参照してください。