Skip to content

Commit

Permalink
Polish "Add metrics support for Netty 4.x"
Browse files Browse the repository at this point in the history
  • Loading branch information
izeye committed Apr 13, 2023
1 parent a165805 commit 0db41b7
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 46 deletions.
2 changes: 1 addition & 1 deletion micrometer-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ dependencies {
optionalApi 'org.apache.tomcat.embed:tomcat-embed-core'
optionalApi 'org.glassfish.jersey.core:jersey-server'
optionalApi 'io.grpc:grpc-api'
optionalApi 'io.netty:netty-transport'
optionalApi 'io.netty:netty-transport'

// apache httpcomponents monitoring
optionalApi 'org.apache.httpcomponents:httpclient'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,19 @@ public void bindTo(MeterRegistry registry) {
int allocatorId = this.allocator.hashCode();

ByteBufAllocatorMetric allocatorMetric = this.allocator.metric();
Tags tags = Tags.of(NettyMeters.AllocatorMeterTags.ID.asString(), String.valueOf(allocatorId),
NettyMeters.AllocatorMeterTags.ALLOCATOR_TYPE.asString(), this.allocator.getClass().getSimpleName());
Tags tags = Tags.of(NettyMeters.AllocatorKeyNames.ID.asString(), String.valueOf(allocatorId),
NettyMeters.AllocatorKeyNames.ALLOCATOR_TYPE.asString(), this.allocator.getClass().getSimpleName());

Gauge
.builder(NettyMeters.ALLOCATOR_MEMORY_USED.getName(), allocatorMetric,
ByteBufAllocatorMetric::usedHeapMemory)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "heap"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "heap"))
.register(registry);

Gauge
.builder(NettyMeters.ALLOCATOR_MEMORY_USED.getName(), allocatorMetric,
ByteBufAllocatorMetric::usedDirectMemory)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "direct"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "direct"))
.register(registry);

if (this.allocator instanceof PooledByteBufAllocator) {
Expand All @@ -70,35 +70,35 @@ public void bindTo(MeterRegistry registry) {
Gauge
.builder(NettyMeters.ALLOCATOR_MEMORY_PINNED.getName(), pooledByteBufAllocator,
PooledByteBufAllocator::pinnedHeapMemory)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "heap"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "heap"))
.register(registry);

Gauge
.builder(NettyMeters.ALLOCATOR_MEMORY_PINNED.getName(), pooledByteBufAllocator,
PooledByteBufAllocator::pinnedDirectMemory)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "direct"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "direct"))
.register(registry);

Gauge
.builder(NettyMeters.ALLOCATOR_POOLED_ARENAS.getName(), pooledAllocatorMetric,
PooledByteBufAllocatorMetric::numHeapArenas)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "heap"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "heap"))
.register(registry);
Gauge
.builder(NettyMeters.ALLOCATOR_POOLED_ARENAS.getName(), pooledAllocatorMetric,
PooledByteBufAllocatorMetric::numDirectArenas)
.tags(tags.and(NettyMeters.AllocatorMemoryMeterTags.MEMORY_TYPE.asString(), "direct"))
.tags(tags.and(NettyMeters.AllocatorMemoryKeyNames.MEMORY_TYPE.asString(), "direct"))
.register(registry);

Gauge
.builder(NettyMeters.ALLOCATOR_POOLED_CACHE_SIZE.getName(), pooledAllocatorMetric,
PooledByteBufAllocatorMetric::normalCacheSize)
.tags(tags.and(NettyMeters.AllocatorPooledCacheMeterTags.CACHE_TYPE.asString(), "normal"))
.tags(tags.and(NettyMeters.AllocatorPooledCacheKeyNames.CACHE_TYPE.asString(), "normal"))
.register(registry);
Gauge
.builder(NettyMeters.ALLOCATOR_POOLED_CACHE_SIZE.getName(), pooledAllocatorMetric,
PooledByteBufAllocatorMetric::smallCacheSize)
.tags(tags.and(NettyMeters.AllocatorPooledCacheMeterTags.CACHE_TYPE.asString(), "small"))
.tags(tags.and(NettyMeters.AllocatorPooledCacheKeyNames.CACHE_TYPE.asString(), "small"))
.register(registry);

Gauge
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public void bindTo(MeterRegistry registry) {
Gauge
.builder(NettyMeters.EVENT_EXECUTOR_TASKS_PENDING.getName(),
singleThreadEventExecutor::pendingTasks)
.tag(NettyMeters.EventLoopTasksPendingMeterTags.NAME.asString(),
.tag(NettyMeters.EventExecutorTasksPendingKeyNames.NAME.asString(),
singleThreadEventExecutor.threadProperties().name())
.register(registry);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import io.micrometer.common.docs.KeyName;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.binder.BaseUnits;
import io.micrometer.core.instrument.docs.MeterDocumentation;

/**
Expand Down Expand Up @@ -45,12 +46,12 @@ public Meter.Type getType() {

@Override
public String getBaseUnit() {
return "bytes";
return BaseUnits.BYTES;
}

@Override
public KeyName[] getKeyNames() {
return KeyName.merge(AllocatorMeterTags.values(), AllocatorMemoryMeterTags.values());
return KeyName.merge(AllocatorKeyNames.values(), AllocatorMemoryKeyNames.values());
}
},

Expand All @@ -70,17 +71,17 @@ public Meter.Type getType() {

@Override
public String getBaseUnit() {
return "bytes";
return BaseUnits.BYTES;
}

@Override
public KeyName[] getKeyNames() {
return KeyName.merge(AllocatorMeterTags.values(), AllocatorMemoryMeterTags.values());
return KeyName.merge(AllocatorKeyNames.values(), AllocatorMemoryKeyNames.values());
}
},

/**
* Number of Arenas for a pooled allocator.
* Number of arenas for a pooled allocator.
*/
ALLOCATOR_POOLED_ARENAS {
@Override
Expand All @@ -95,7 +96,7 @@ public Meter.Type getType() {

@Override
public KeyName[] getKeyNames() {
return KeyName.merge(AllocatorMeterTags.values(), AllocatorMemoryMeterTags.values());
return KeyName.merge(AllocatorKeyNames.values(), AllocatorMemoryKeyNames.values());
}
},

Expand All @@ -115,12 +116,12 @@ public Meter.Type getType() {

@Override
public String getBaseUnit() {
return "bytes";
return BaseUnits.BYTES;
}

@Override
public KeyName[] getKeyNames() {
return KeyName.merge(AllocatorMeterTags.values(), AllocatorPooledCacheMeterTags.values());
return KeyName.merge(AllocatorKeyNames.values(), AllocatorPooledCacheKeyNames.values());
}
},

Expand All @@ -140,7 +141,7 @@ public Meter.Type getType() {

@Override
public KeyName[] getKeyNames() {
return AllocatorMeterTags.values();
return AllocatorKeyNames.values();
}
},

Expand All @@ -160,12 +161,12 @@ public Meter.Type getType() {

@Override
public String getBaseUnit() {
return "bytes";
return BaseUnits.BYTES;
}

@Override
public KeyName[] getKeyNames() {
return AllocatorMeterTags.values();
return AllocatorKeyNames.values();
}
},

Expand All @@ -185,11 +186,11 @@ public Meter.Type getType() {

@Override
public KeyName[] getKeyNames() {
return EventLoopTasksPendingMeterTags.values();
return EventExecutorTasksPendingKeyNames.values();
}
};

public enum AllocatorMeterTags implements KeyName {
enum AllocatorKeyNames implements KeyName {

/**
* Unique runtime identifier for the allocator.
Expand All @@ -201,7 +202,7 @@ public String asString() {
}
},
/**
* Type of memory allocation strategy (pooled, unpooled).
* Allocator's class simple name.
*/
ALLOCATOR_TYPE {
@Override
Expand All @@ -212,7 +213,7 @@ public String asString() {

}

public enum AllocatorMemoryMeterTags implements KeyName {
enum AllocatorMemoryKeyNames implements KeyName {

/**
* Type of memory allocated: {@code "heap"} memory or {@code "direct"} memory.
Expand All @@ -226,7 +227,7 @@ public String asString() {

}

public enum AllocatorPooledCacheMeterTags implements KeyName {
enum AllocatorPooledCacheKeyNames implements KeyName {

/**
* Type of cache pages for this cache.
Expand All @@ -240,10 +241,10 @@ public String asString() {

}

public enum EventLoopTasksPendingMeterTags implements KeyName {
enum EventExecutorTasksPendingKeyNames implements KeyName {

/**
* Event Loop name.
* Event loop name.
*/
NAME {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
*/
package io.micrometer.core.instrument.binder.netty4;

import io.micrometer.core.instrument.MockClock;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.simple.SimpleConfig;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
Expand All @@ -33,7 +31,7 @@
*/
class NettyAllocatorMetricsTests {

private SimpleMeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
private final SimpleMeterRegistry registry = new SimpleMeterRegistry();

@Test
void shouldHaveHeapMemoryUsedMetricsForUnpooledAllocator() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
*/
package io.micrometer.core.instrument.binder.netty4;

import io.micrometer.core.instrument.MockClock;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.simple.SimpleConfig;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.netty.channel.DefaultEventLoopGroup;
import io.netty.channel.EventLoop;
Expand All @@ -37,10 +35,10 @@
*/
class NettyEventExecutorMetricsTests {

private SimpleMeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock());
private final SimpleMeterRegistry registry = new SimpleMeterRegistry();

@Test
void shouldHaveTaskPendingMetricForEachEventLoop() throws Exception {
void shouldHaveTasksPendingMetricForEachEventLoop() throws Exception {
Set<String> names = new LinkedHashSet<>();
DefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();
new NettyEventExecutorMetrics(eventExecutors).bindTo(this.registry);
Expand All @@ -50,6 +48,7 @@ void shouldHaveTaskPendingMetricForEachEventLoop() throws Exception {
names.add(singleThreadEventExecutor.threadProperties().name());
}
});
assertThat(names).isNotEmpty();
names.forEach(name -> {
assertThat(this.registry.get(NettyMeters.EVENT_EXECUTOR_TASKS_PENDING.getName())
.tags(Tags.of("name", name))
Expand All @@ -60,18 +59,17 @@ void shouldHaveTaskPendingMetricForEachEventLoop() throws Exception {
}

@Test
void shouldHaveTaskPendingMetricForSingleEventLoop() throws Exception {
void shouldHaveTasksPendingMetricForSingleEventLoop() throws Exception {
DefaultEventLoopGroup eventExecutors = new DefaultEventLoopGroup();
EventLoop eventLoop = eventExecutors.next();
new NettyEventExecutorMetrics(eventLoop).bindTo(this.registry);
if (eventLoop instanceof SingleThreadEventExecutor) {
SingleThreadEventExecutor singleThreadEventExecutor = (SingleThreadEventExecutor) eventLoop;
String eventLoopName = singleThreadEventExecutor.threadProperties().name();
assertThat(this.registry.get(NettyMeters.EVENT_EXECUTOR_TASKS_PENDING.getName())
.tags(Tags.of("name", eventLoopName))
.gauge()
.value()).isZero();
}
assertThat(eventLoop).isInstanceOf(SingleThreadEventExecutor.class);
SingleThreadEventExecutor singleThreadEventExecutor = (SingleThreadEventExecutor) eventLoop;
String eventLoopName = singleThreadEventExecutor.threadProperties().name();
assertThat(this.registry.get(NettyMeters.EVENT_EXECUTOR_TASKS_PENDING.getName())
.tags(Tags.of("name", eventLoopName))
.gauge()
.value()).isZero();
eventExecutors.shutdownGracefully().get(5, TimeUnit.SECONDS);
}

Expand Down

0 comments on commit 0db41b7

Please sign in to comment.