/** * Creates a new {@link DuplexConnection}. * * @param connectionType the type of connection being monitored * @param delegate the {@link DuplexConnection} to delegate to * @param meterRegistry the {@link MeterRegistry} to use * @param tags additional tags to attach to {@link Meter}s * @throws NullPointerException if {@code connectionType}, {@code delegate}, or {@code * meterRegistry} is {@code null} */ MicrometerDuplexConnection( Type connectionType, DuplexConnection delegate, MeterRegistry meterRegistry, Tag... tags) { Objects.requireNonNull(connectionType, "connectionType must not be null"); this.delegate = Objects.requireNonNull(delegate, "delegate must not be null"); Objects.requireNonNull(meterRegistry, "meterRegistry must not be null"); this.close = meterRegistry.counter( "rsocket.duplex.connection.close", Tags.of(tags).and("connection.type", connectionType.name())); this.dispose = meterRegistry.counter( "rsocket.duplex.connection.dispose", Tags.of(tags).and("connection.type", connectionType.name())); this.frameCounters = new FrameCounters(connectionType, meterRegistry, tags); }
@Override public DuplexConnection apply(Type type, DuplexConnection connection) { return new DuplexConnection() { Counter cancelCounter = registry.counter(FrameType.CANCEL.name(), type.name()); Counter requestChannelCounter = registry.counter(FrameType.REQUEST_CHANNEL.name(), type.name()); Counter completeCounter = registry.counter(FrameType.COMPLETE.name(), type.name()); Counter errorCounter = registry.counter(FrameType.ERROR.name(), type.name()); Counter extCounter = registry.counter(FrameType.EXT.name(), type.name()); Counter fireAndForgetCounter = registry.counter(FrameType.FIRE_AND_FORGET.name(), type.name()); Counter keepAliveCounter = registry.counter(FrameType.KEEPALIVE.name(), type.name()); Counter leaseCounter = registry.counter(FrameType.LEASE.name(), type.name()); Counter metadataPushCounter = registry.counter(FrameType.METADATA_PUSH.name(), type.name()); Counter nextCounter = registry.counter(FrameType.NEXT.name(), type.name()); Counter nextCompleteCounter = registry.counter(FrameType.NEXT_COMPLETE.name(), type.name()); Counter payloadCounter = registry.counter(FrameType.PAYLOAD.name(), type.name()); Counter requestNCounter = registry.counter(FrameType.REQUEST_N.name(), type.name()); Counter requestResponseCounter = registry.counter(FrameType.REQUEST_RESPONSE.name(), type.name()); Counter requestStreamCounter = registry.counter(FrameType.REQUEST_STREAM.name(), type.name()); Counter resumeCounter = registry.counter(FrameType.RESUME.name(), type.name()); Counter resumeOkCounter = registry.counter(FrameType.RESUME_OK.name(), type.name()); Counter setupCounter = registry.counter(FrameType.SETUP.name(), type.name()); Counter undefinedCounter = registry.counter(FrameType.UNDEFINED.name(), type.name());
@DisplayName("onClose gathers metrics") @Test void onClose() { when(delegate.onClose()).thenReturn(Mono.empty()); new MicrometerDuplexConnection( CLIENT, delegate, meterRegistry, Tag.of("test-key", "test-value")) .onClose() .subscribe(Operators.drainSubscriber()); assertThat( meterRegistry .get("rsocket.duplex.connection.close") .tag("connection.type", CLIENT.name()) .tag("test-key", "test-value") .counter() .count()) .isEqualTo(1); }
@DisplayName("dispose gathers metrics") @Test void dispose() { new MicrometerDuplexConnection( CLIENT, delegate, meterRegistry, Tag.of("test-key", "test-value")) .dispose(); assertThat( meterRegistry .get("rsocket.duplex.connection.dispose") .tag("connection.type", CLIENT.name()) .tag("test-key", "test-value") .counter() .count()) .isEqualTo(1); }
private static Counter counter( Type connectionType, MeterRegistry meterRegistry, String frameType, Tag... tags) { return meterRegistry.counter( "rsocket.frame", Tags.of(tags).and("connection.type", connectionType.name()).and("frame.type", frameType)); } }
private Counter findCounter(Type connectionType, FrameType frameType) { return meterRegistry .get("rsocket.frame") .tag("connection.type", connectionType.name()) .tag("frame.type", frameType.name()) .tag("test-key", "test-value") .counter(); } }