Overview
このガイドでは、 .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");
Dependencies
ドライバーは OpenTelemetry SDK に依存しません。は ActivitySource を通じて範囲を出力するため、System.Diagnostics.ActivityListenerオブジェクトを含む任意のリスナーがそれらを収集できます。
OpenTelemetry SDK を使用してドライバーのスパンを収集するには、 SDK と エクスポート機能をアプリに追加 します。このページの例では、インメモリ エクスポート機能を使用しているため、ドライバーが生成する範囲を検査できます。プロジェクトディレクトリから次のコマンドを実行します。
dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Exporter.InMemory
OpenTelemetry トレースの有効化
ドライバーは、リスナーがドライバーの 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パッケージを使用して範囲を収集します。アプリで、それをトレースバックエンドのエクスポート機能に置き換えます。
trackerProvider でのサブスクライブ
アプリにホストがない場合は、次の例に示すように 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クラスには次のプロパティがあります。
プロパティ | タイプ | 説明 |
|---|---|---|
|
|
デフォルト: |
|
| span 属性に含めるクエリ テキストの最大長を指定します。 デフォルト: |
次の例では、QueryTextMaxLength を 1024 に設定します。これにより、コマンドテキストが最大 1024 文字でキャプチャされます。
var settings = MongoClientSettings.FromConnectionString(connectionString); settings.TracingOptions = new TracingOptions { Disabled = false, QueryTextMaxLength = 1024 }; var client = new MongoClient(settings);
操作トレース
.NET/ C#ドライバーは次のタイプの範囲を作成します。
スパン タイプ | 説明 |
|---|---|
操作レベルの範囲 | 高レベルのドライバー操作を表す範囲( |
コマンドレベルの範囲 | ドライバーがサーバーに送信する個々の コマンドを表す の範囲。コマンドレベルの範囲には |
トランザクションの範囲 | 明示的なトランザクション内で実行されるすべての操作を含む範囲。 |
例、find操作では、次の階層に示すように、ネストされたコマンドレベルの範囲を含む操作レベルの範囲が作成されます。
find sample_mflix.movies └── find
範囲属性
.NET/ C#ドライバーは OpenTelemetry のセマンティック規則に従い、各操作に関するコンテキストを提供する属性を含めています。
一般的な属性
範囲には、次の一般的な属性が含まれます。
db.system.name: 常に に設定しますmongodbdb.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: サーバーが割り当てた接続IDdb.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は トレース用バックバックエンドに範囲を送信します。ドライバーは セッションとクラスターのメタデータのみを削除します。トレースバックエンドは、フィルター値、クエリ演算子、挿入またはアップデートされたドキュメントの内容は引き続き記録します。
Error Handling
操作が失敗すると、ドライバーは例外の詳細を 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 ドキュメント
ドライバー内の操作を追跡するために使用されるクラスの詳細については、次のAPIドキュメントを参照してください。