AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

애플리케이션 이벤트 모니터링

이 가이드에서는 Scala 드라이버를 사용하여 드라이버 작업 중 발생하는 이벤트를 모니터링하는 방법을 학습할 수 있습니다. 모니터링에는 애플리케이션 또는 애플리케이션 성능 관리 라이브러리와 함께 사용할 수 있는 실행 프로그램의 활동에 대한 정보 수집이 포함됩니다.

애플리케이션 이벤트를 모니터링하면 드라이버의 리소스 사용량과 성능을 이해할 수 있으며, 애플리케이션을 설계하고 디버그할 때 정보에 입각한 결정을 내리는 데 도움이 됩니다.

Scala 드라이버는 모니터링할 수 있는 이벤트를 다음 카테고리로 구성합니다.

  • 명령 이벤트: MongoDB 데이터베이스 명령과 관련된 이벤트

  • 서버 검색 및 모니터링(SDAM) 이벤트: 연결된 MongoDB 인스턴스 또는 클러스터 상태 변경과 관련된 이벤트

  • 연결 풀 이벤트: 드라이버가 MongoDB 인스턴스와 유지하는 연결 풀에 관련된 이벤트

다음 섹션에서는 각 이벤트 카테고리를 설명하고 이벤트 모니터 방법을 설명합니다. 로그에 드라이버 이벤트를 기록하는 방법은 로그 가이드를 참조하세요.

명령 이벤트는 MongoDB 데이터베이스 명령과 관련된 이벤트입니다. 명령 이벤트를 생성하는 데이터베이스 명령의 예에는 find, insert, delete, count 등이 있습니다.

Scala 드라이버는 내부적으로 호출하는 명령에 대한 이벤트를 게시하지 않습니다. 여기에는 드라이버가 클러스터를 모니터링하는 데 사용하는 명령과 초기 hello 명령과 같이 연결 설정과 관련된 명령이 포함됩니다.

명령 이벤트를 모니터 하려면 CommandListener 인터페이스를 구현하는 클래스를 만들고 해당 클래스의 인스턴스 를 MongoClient 인스턴스 에 등록합니다.

중요

수정된 출력

보안 조치로 드라이버는 일부 명령 이벤트의 내용을 수정하여 보호합니다. 수정된 명령 이벤트의 전체 목록은 MongoDB 명령 로그 및 모니터링 사양의 보안 섹션을 참조하십시오.

MongoDB 데이터베이스 명령에 대해 자세히 학습하려면 데이터베이스 명령을 참조하세요.

다음 예시는 CommandListener 인터페이스를 구현하는 CommandCounter 클래스를 정의합니다. 이 클래스는 드라이버가 각 데이터베이스 명령을 성공적으로 실행한 횟수를 추적하고 명령이 완료될 때마다 이 정보를 인쇄합니다.

case class CommandCounter() extends CommandListener {
private val commands =
scala.collection.mutable.Map[String, Int]()
override def commandStarted(event: CommandStartedEvent): Unit = {}
override def commandSucceeded(
event: CommandSucceededEvent
): Unit = {
val commandName = event.getCommandName
commands(commandName) =
commands.getOrElse(commandName, 0) + 1
println(commands.toMap)
}
override def commandFailed(event: CommandFailedEvent): Unit = {}
}

다음 코드는 CommandCounter 클래스의 인스턴스를 MongoClientSettings 객체에 추가하고 다음 설정을 사용하여 MongoClient 인스턴스를 구성합니다.

val settings: MongoClientSettings = MongoClientSettings
.builder()
.addCommandListener(CommandCounter())
.applyConnectionString(ConnectionString("<connection string>"))
.build()
val mongoClient: MongoClient = MongoClient(settings)

애플리케이션을 실행하면 출력은 다음과 유사합니다.

Map(find -> 1)
Map(find -> 2)
Map(find -> 2, endSessions -> 1)

다음 표에는 Scala 드라이버가 결시하는 명령 이벤트와 이를 처리하는 리스너 인터페이스가 설명되어 있습니다.

eventType
리스너 인터페이스
설명

데이터베이스 명령이 시작되면 개시됩니다.

데이터베이스 명령이 성공하면 개시됩니다.

데이터베이스 명령이 실패할 경우 게시됩니다.

서버 검색 및 모니터링(SDAM) 이벤트는 연결된 MongoDB 인스턴스 또는 클러스터의 상태 변경과 관련된 이벤트입니다.

Scala 드라이버는 9개의 SDAM 이벤트를 정의하고 각각 3개의 SDAM 이벤트를 수신하는 다음과 같은 리스너 인터페이스를 제공합니다.

  • ClusterListener: 토폴로지 변경 또는 클러스터 의 상태 및 구조 변경과 관련된 이벤트를 수신 대기합니다.

  • ServerListener: 개별 서버 변경과 관련된 이벤트를 수신 대기합니다.

  • ServerMonitorListener: 복제본 세트 노드 간의 통신 상태를 보고하는 하트비트 이벤트를 수신합니다.

SDAM 이벤트에 대한 정보를 사용하여 클러스터 변경 사항을 이해하거나, 클러스터 상태를 평가하거나, 용량 계획을 수행할 수 있습니다.

다음 예시는 ClusterListener 인터페이스를 구현하는 TestClusterListener 클래스를 정의합니다. 클래스에는 다음 토폴로지 관련 이벤트에 대한 응답으로 메시지를 출력하는 메서드가 포함되어 있습니다.

  • clusterOpening(): 운전자 클러스터 에 처음 연결할 때 메시지를 인쇄합니다.

  • clusterClosed(): 운전자 클러스터 에서 연결이 끊길 때 메시지를 인쇄합니다.

  • clusterDescriptionChanged(): 클러스터 의 읽기 및 쓰기 (write) 가용성 변경에 대한 메시지를 출력합니다.

case class TestClusterListener(readPreference: ReadPreference) extends ClusterListener {
var isWritable: Boolean = false
var isReadable: Boolean = false
override def clusterOpening(event: ClusterOpeningEvent): Unit =
println(s"Cluster with ID ${event.getClusterId} opening")
override def clusterClosed(event: ClusterClosedEvent): Unit =
println(s"Cluster with ID ${event.getClusterId} closed")
override def clusterDescriptionChanged(event: ClusterDescriptionChangedEvent): Unit = {
if (!isWritable) {
if (event.getNewDescription.hasWritableServer) {
isWritable = true
println("Writable server available")
}
} else {
if (!event.getNewDescription.hasWritableServer) {
isWritable = false
println("No writable server available")
}
}
if (!isReadable) {
if (event.getNewDescription.hasReadableServer(readPreference)) {
isReadable = true
println("Readable server available")
}
} else {
if (!event.getNewDescription.hasReadableServer(readPreference)) {
isReadable = false
println("No readable server available")
}
}
}
}

다음 코드는 TestClusterListener 클래스의 인스턴스를 MongoClientSettings 객체에 추가하고 다음 설정을 사용하여 MongoClient 인스턴스를 구성합니다.

val uri: ConnectionString = ConnectionString("<connection string>")
val settings: MongoClientSettings = MongoClientSettings
.builder()
.applyToClusterSettings((builder: ClusterSettings.Builder) =>
builder.addClusterListener(TestClusterListener(ReadPreference.secondary())))
.applyConnectionString(uri)
.build()
val client: MongoClient = MongoClient(settings)

애플리케이션을 실행하면 출력은 다음과 유사합니다.

Cluster with ID ClusterId{value='...', description='...'} opening
Writable server available
Readable server available
Cluster with ID ClusterId{value='...', description='...'} closed

다음 표에서는 각 SDAM 이벤트, 이를 처리하는 수신기 인터페이스 및 드라이버가 이를 결정하는 시기를 설명합니다.

eventType
리스너 인터페이스
설명

새 프라이머리 투표가 있는 경우와 같이 토폴로지 설명이 변경될 때 게시됩니다.

드라이버가 클러스터에 처음 연결할 때 게시됩니다.

드라이버가 클러스터에서 연결을 해제할 때 게시됩니다.

서버 설명이 변경될 때 게시됩니다.

토폴로지에 새 서버가 추가될 때 게시됩니다.

기존 서버가 토폴로지에서 제거될 때 게시됩니다.

서버 모니터가 서버에 hello 명령을 보낼 때 게시됩니다. 이 조치를 하트비트라고 합니다.

하트비트가 성공할 때 게시됩니다.

하트비트가 실패할 때 게시됩니다.

연결 풀 이벤트는 드라이버가 MongoDB 인스턴스를 사용하여 유지 관리하는 연결 풀과 관련된 이벤트입니다. 연결 풀은 드라이버가 MongoDB 인스턴스를 사용하여 유지 관리하는 개방형 TCP 연결 집합입니다. 연결 풀은 애플리케이션이 수행해야 하는 네트워크 핸드쉐이크 수를 줄여줍니다. 그리고 애플리케이션을 더 빠르게 실행하는 데 도움이 될 수 있습니다.

연결 풀 이벤트를 모니터 하려면 ConnectionPoolListener 인터페이스를 구현하는 클래스를 만들고 해당 클래스의 인스턴스 MongoClient 인스턴스 에 등록합니다.

팁

연결 풀

연결 풀에 대해 자세히 학습 연결 풀 가이드 참조하세요.

다음 예시는 ConnectionPoolListener 인터페이스를 구현하는 ConnectionPoolLibrarian 클래스를 정의합니다. 이 클래스는 드라이버가 연결 풀에서 연결을 체크아웃할 때마다 메시지를 인쇄합니다.

case class ConnectionPoolLibrarian()
extends ConnectionPoolListener {
override def connectionCheckedOut(
event: ConnectionCheckedOutEvent
): Unit =
println(
s"Let me get you the connection with id " +
s"${event.getConnectionId.getLocalValue}..."
)
override def connectionCheckOutFailed(
event: ConnectionCheckOutFailedEvent
): Unit = {}
}

다음 코드는 ConnectionPoolLibrarian 클래스의 인스턴스를 MongoClientSettings 객체에 추가하고 다음 설정을 사용하여 MongoClient 인스턴스를 구성합니다.

val settings: MongoClientSettings = MongoClientSettings
.builder()
.applyToConnectionPoolSettings(
(builder: ConnectionPoolSettings.Builder) =>
builder.addConnectionPoolListener(
ConnectionPoolLibrarian()
)
)
.applyConnectionString(ConnectionString("<connection string>"))
.build()
val mongoClient: MongoClient = MongoClient(settings)

애플리케이션을 실행하면 출력은 다음과 유사합니다.

Let me get you the connection with id 1...

다음 표에서는 Scala 드라이버가 발행하는 연결 풀 이벤트와 이를 처리하는 수신기 인터페이스에 대해 설명합니다.

eventType
리스너 인터페이스
설명

연결 풀이 생성될 때 게시됩니다.

연결 풀이 사용 준비되면 게시됩니다.

연결 풀이 닫히면 게시됩니다.

풀에서 연결이 생성될 때 게시됩니다.

연결이 핸드쉴이크를 완료하고 사용할 준비가 되면 게시됩니다.

연결이 닫힐 때 게시됩니다.

드라이버가 연결을 체크아웃하기 시작할 때 개시됩니다.

드라이버가 연결을 성공적으로 체크아웃할 때 게시됩니다.

드라이버가 연결을 체크아웃하지 못할 때 개시됩니다.

드라이버가 푸린에 연결을 다시 확인할 때 개시됩니다.

연결 풀이 지워지면 게시됩니다.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.