AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

OpenTelemetry를 사용한 추적 작업

이 가이드 에서는 .NET/ C# 드라이버 로 OpenTelemetry 추적을 사용하는 방법을 학습 수 있습니다. OpenTelemetry는 원격 분석 데이터를 계측, 생성, 수집 및 내보내기 위한 표준화된 방법을 제공하는 오픈 소스 관찰 가능성 프레임워크 입니다.

.NET/ C# 드라이버 System.Diagnostics.ActivitySource API 통해 추적 데이터를 내보냅니다. 드라이버의 ActivitySource에 대한 리스너를 구독 운전자 쿼리 및 트랜잭션과 같은 MongoDB 작업을 나타내는 스팬을 생성합니다. 이러한 범위에는 OpenTelemetry 시맨틱 규칙을 따르는 속성이 포함됩니다.

참고

OpenTelemetry 추적은 .NET/ C# 드라이버 3.7 이상에서 사용할 수 있습니다.

이 가이드 의 예시에서는 Atlas 샘플 데이터 세트의 sample_mflix.movies 컬렉션 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 .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() 메서드에 전달합니다.

.NET 호스팅 모델을 사용하는 앱 (예: ASP .NET Core 또는 작업자 서비스)에서 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 SDK에 의존하지 않으려면 System.Diagnostics.ActivityListener 객체 사용하여 드라이버의 ActivitySource를 구독 할 수 있습니다. 다음 예시 운전자 방출하는 모든 스팬을 수신하는 리스너를 등록합니다.

// 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

스팬 속성에 포함할 쿼리 텍스트의 최대 길이를 지정합니다. 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 속성을 활성화 하면 운전자 스팬 속성에 명령 텍스트를 포함하고 내보내기는 스팬을 추적 백엔드 로 전송합니다. 운전자 세션 및 클러스터 메타데이터 만 제거합니다. 추적 백엔드 여전히 필터하다 값, 쿼리 연산자, 삽입되거나 업데이트된 문서의 내용을 기록합니다.

작업이 실패하면 운전자 OpenTelemetry 시맨틱 규칙을 따르는 범위 속성으로 예외 세부 정보를 기록하고 범위 상태를 Error로 설정합니다.

MongoDB 명령 실패의 경우, 운전자 작업 범위와 해당 명령 범위의 상태를 모두 Error로 설정합니다. 운전자 명령 범위의 db.response.status_code 속성에 오류 코드를 기록합니다.

중복 키 오류와 같이 서버 성공적인 명령 응답에서 반환하는 쓰기 오류는 db.response.status_code을 설정하다 하지 않습니다. 운전자 이러한 오류를 작업 범위의 예외 속성으로 기록합니다.

오류로 인해 드라이버 애플리케이션 에 예외를 발생시키는 것은 아닙니다.

OpenTelemetry 추적을 사용할 때 다음과 같은 성능 영향을 고려하세요.

  • db.query.text 속성을 캡처하면 오버헤드 추가됩니다. 필요한 경우에만 명령 텍스트를 캡처하거나 QueryTextMaxLength을 0로 설정하다 비활성화합니다.

  • 드라이버의 ActivitySource을(를) 구독하는 리스너가 없는 경우, 운전자 모든 추적 작업을 건너뛰기 때문에 추적이 성능에 미치는 영향 미미합니다.

OpenTelemetry 추적에 대해 자세히 학습 OpenTelemetry .NET 설명서를 참조하세요.

운전자 에서 작업을 추적하는 데 사용되는 클래스에 대해 자세히 학습 다음 API 설명서를 참조하세요.