Docs Menu
Docs Home
/ / /
Java Reactive Streams 드라이버
/

JMX 모니터링

이 페이지의 내용

  • 명령 모니터링
  • 클러스터 모니터링
  • 연결 풀 모니터링

드라이버는 JMX 를 사용합니다.MXBean 생성 드라이버의 다양한 측면을 모니터링할 수 있습니다.

드라이버는 단일 유형인 ConnectionPoolStatisticsMBeanMXBean 인스턴스를 생성합니다. 드라이버는 연결하는 각 서버에 대해 하나의 ConnectionPoolStatisticsMBean 인스턴스를 등록합니다. 예를 들어, 복제본 세트에 연결되면 드라이버는 복제본 세트의 숨겨지지 않은 각 멤버에 대한 인스턴스를 생성합니다.

MXBean 인스턴스는 도메인과 명명된 속성 집합으로 구성된 고유한 객체 이름을 사용하여 등록해야 합니다. 드라이버에 의해 생성된 모든 MXBean 인스턴스는 도메인 org.mongodb.driver 에 있습니다. ConnectionPoolStatisticsMBean 인스턴스에는 다음과 같은 속성이 있습니다.

  • clusterId: 클라이언트가 생성한 고유 식별자로, 애플리케이션에 동일한 MongoDB Server 배포에 연결된 여러 MongoClient 인스턴스가 있는 상황에서 객체 이름의 고유성을 보장하는 데 필요합니다.

  • host: 서버의 호스트 이름

  • port: 서버가 수신 대기 중인 포트

  • minSize: 유휴 멤버 및 사용 중인 멤버를 포함하여 풀의 최소 허용 크기입니다.

  • maxSize: 유휴 멤버와 사용 중인 멤버를 포함하여 풀의 최대 허용 크기입니다.

  • size: 유휴 멤버와 사용 중인 멤버를 포함한 풀의 현재 크기

  • checkedOutCount: 현재 사용 중인 연결의 현재 수

JMX 연결 풀 모니터링은 기본적으로 비활성화되어 있습니다. 활성화하려면 MongoClientSettings 인스턴스를 생성할 때 com.mongodb.management.JMXConnectionPoolListener 인스턴스를 추가합니다.

MongoClientSettings settings =
MongoClientSettings.builder()
.applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(new JMXConnectionPoolListener()))
.build();

드라이버는 명령 모니터링 사양을 구현하여 명령이 시작될 때와 성공 또는 실패할 때 애플리케이션에 알림을 보낼 수 있습니다.

애플리케이션은 CommandListener 인터페이스를 구현하는 클래스의 인스턴스로 MongoClientSettings 인스턴스를 구성하여 명령 리스너를 MongoClient 에 등록합니다. 다음 예제는 CommandListener 인터페이스의 간단한 구현입니다.

public class TestCommandListener implements CommandListener {
@Override
public void commandStarted(final CommandStartedEvent event) {
System.out.println(String.format("Sent command '%s:%s' with id %s to database '%s' "
+ "on connection '%s' to server '%s'",
event.getCommandName(),
event.getCommand().get(event.getCommandName()),
event.getRequestId(),
event.getDatabaseName(),
event.getConnectionDescription()
.getConnectionId(),
event.getConnectionDescription().getServerAddress()));
}
@Override
public void commandSucceeded(final CommandSucceededEvent event) {
System.out.println(String.format("Successfully executed command '%s' with id %s "
+ "on connection '%s' to server '%s'",
event.getCommandName(),
event.getRequestId(),
event.getConnectionDescription()
.getConnectionId(),
event.getConnectionDescription().getServerAddress()));
}
@Override
public void commandFailed(final CommandFailedEvent event) {
System.out.println(String.format("Failed execution of command '%s' with id %s "
+ "on connection '%s' to server '%s' with exception '%s'",
event.getCommandName(),
event.getRequestId(),
event.getConnectionDescription()
.getConnectionId(),
event.getConnectionDescription().getServerAddress(),
event.getThrowable()));
}
}

다음 예에서는 TestCommandListener 인스턴스로 구성된 MongoClientSettings 인스턴스를 만듭니다.

MongoClientSettings settings = MongoClientSettings.builder()
.addCommandListener(new TestCommandListener())
.build();
MongoClient client = MongoClients.create(settings);

이러한 옵션으로 구성된 MongoClient 는 각 명령을 MongoDB Server로 보내기 전에 System.out 에 메시지를 인쇄하고, 각 명령이 성공적으로 완료되거나 실패하면 다른 메시지를 인쇄합니다.

드라이버는 SDAM 모니터링 사양을 구현하여 드라이버가 연결된 MongoDB cluster의 토폴로지 변경을 감지하면 애플리케이션에 알림을 보낼 수 있습니다.

애플리케이션은 ClusterListener, ServerListener 또는 ServerMonitorListener 인터페이스를 구현하는 클래스의 인스턴스로 MongoClientSettings 를 구성하여 MongoClient 에 리스너를 등록합니다.

다음 코드는 cluster 리스너를 생성하는 방법을 보여줍니다.

public class TestClusterListener implements ClusterListener {
private final ReadPreference readPreference;
private boolean isWritable;
private boolean isReadable;
public TestClusterListener(final ReadPreference readPreference) {
this.readPreference = readPreference;
}
@Override
public void clusterOpening(final ClusterOpeningEvent clusterOpeningEvent) {
System.out.println(String.format("Cluster with unique client identifier %s opening",
clusterOpeningEvent.getClusterId()));
}
@Override
public void clusterClosed(final ClusterClosedEvent clusterClosedEvent) {
System.out.println(String.format("Cluster with unique client identifier %s closed",
clusterClosedEvent.getClusterId()));
}
@Override
public void clusterDescriptionChanged(final ClusterDescriptionChangedEvent event) {
if (!isWritable) {
if (event.getNewDescription().hasWritableServer()) {
isWritable = true;
System.out.println("Writable server available!");
}
} else {
if (!event.getNewDescription().hasWritableServer()) {
isWritable = false;
System.out.println("No writable server available!");
}
}
if (!isReadable) {
if (event.getNewDescription().hasReadableServer(readPreference)) {
isReadable = true;
System.out.println("Readable server available!");
}
} else {
if (!event.getNewDescription().hasReadableServer(readPreference)) {
isReadable = false;
System.out.println("No readable server available!");
}
}
}
}

다음 예에서는 TestClusterListener 인스턴스로 구성된 MongoClientSettings 인스턴스를 만듭니다.

List<ServerAddress> seedList = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.addClusterListener(new TestClusterListener(ReadPreference.secondary())))
.build();
MongoClient client = MongoClients.create(settings);

이러한 옵션으로 구성된 MongoClient 는 이러한 옵션으로 MongoClient 가 생성되고 해당 MongoClient 가 닫힐 때 System.out 에 메시지를 인쇄합니다. 또한 클라이언트가 다음 상태 중 하나에 들어가면 메시지를 인쇄합니다.

  • 쓰기를 허용하는 사용 가능한 서버가 있습니다.

  • 쓰기를 허용할 가용 서버가 없는 경우

  • 구성된 ReadPreference

  • 구성된 ReadPreference

이 드라이버는 연결 풀 관련 이벤트의 모니터링을 지원합니다.

애플리케이션은 ConnectionPoolListener 인터페이스를 구현하는 클래스의 인스턴스로 MongoClientSettings 를 구성하여 MongoClient 에 리스너를 등록합니다.

다음 코드는 연결 풀 리스너를 생성하는 방법을 보여줍니다.

public class TestConnectionPoolListener implements ConnectionPoolListener {
@Override
public void connectionPoolOpened(final ConnectionPoolOpenedEvent event) {
System.out.println(event);
}
@Override
public void connectionPoolClosed(final ConnectionPoolClosedEvent event) {
System.out.println(event);
}
@Override
public void connectionCheckedOut(final ConnectionCheckedOutEvent event) {
System.out.println(event);
}
@Override
public void connectionCheckedIn(final ConnectionCheckedInEvent event) {
System.out.println(event);
}
@Override
public void connectionAdded(final ConnectionAddedEvent event) {
System.out.println(event);
}
@Override
public void connectionRemoved(final ConnectionRemovedEvent event) {
System.out.println(event);
}
}

다음 예에서는 TestConnectionPoolListener 인스턴스로 구성된 MongoClientSettings 인스턴스를 만듭니다.

List<ServerAddress> seedList = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToConnectionPoolSettings(builder ->
builder.addConnectionPoolListener(new TestConnectionPoolListener()))
.build();
MongoClient client = MongoClients.create(settings);

이러한 옵션으로 구성된 MongoClient 는 MongoClient가 연결된 각 MongoDB Server의 각 연결 풀 관련 이벤트에 대해 System.out 에 메시지를 인쇄합니다.

돌아가기

로깅