Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polish "Add metrics support for Netty 4.x" #3768

Merged
merged 1 commit into from
Apr 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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