From 3c61790a00f86e79373fb2bcf3803d21b06f4384 Mon Sep 17 00:00:00 2001 From: Matt Peterson Date: Tue, 3 Sep 2024 09:36:20 -0600 Subject: [PATCH] fix: metric service light refactoring Signed-off-by: Matt Peterson --- .../block/server/BlockStreamService.java | 4 +- .../ConsumerStreamResponseObserver.java | 2 +- .../mediator/LiveStreamMediatorImpl.java | 6 +-- ...icNames.java => BlockNodeMetricTypes.java} | 43 +++++++++++++++++-- .../block/server/metrics/MetricsService.java | 16 ++++++- .../server/metrics/MetricsServiceImpl.java | 28 ++++++++---- .../storage/write/BlockAsDirWriter.java | 2 +- .../producer/ProducerBlockItemObserver.java | 8 ++-- .../BlockStreamServiceIntegrationTest.java | 2 +- .../mediator/LiveStreamMediatorImplTest.java | 2 +- .../server/metrics/MetricsServiceTest.java | 10 ++--- .../ProducerBlockItemObserverTest.java | 2 +- 12 files changed, 94 insertions(+), 31 deletions(-) rename server/src/main/java/com/hedera/block/server/metrics/{BlockNodeMetricNames.java => BlockNodeMetricTypes.java} (62%) diff --git a/server/src/main/java/com/hedera/block/server/BlockStreamService.java b/server/src/main/java/com/hedera/block/server/BlockStreamService.java index 807630b6..009bfc60 100644 --- a/server/src/main/java/com/hedera/block/server/BlockStreamService.java +++ b/server/src/main/java/com/hedera/block/server/BlockStreamService.java @@ -22,8 +22,8 @@ import static com.hedera.block.server.Constants.SINGLE_BLOCK_METHOD_NAME; import static com.hedera.block.server.Translator.fromPbj; import static com.hedera.block.server.Translator.toPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.SingleBlocksNotFound; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.SingleBlocksRetrieved; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.SingleBlocksNotFound; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.SingleBlocksRetrieved; import static java.lang.System.Logger; import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.ERROR; diff --git a/server/src/main/java/com/hedera/block/server/consumer/ConsumerStreamResponseObserver.java b/server/src/main/java/com/hedera/block/server/consumer/ConsumerStreamResponseObserver.java index da5887d8..25a028c8 100644 --- a/server/src/main/java/com/hedera/block/server/consumer/ConsumerStreamResponseObserver.java +++ b/server/src/main/java/com/hedera/block/server/consumer/ConsumerStreamResponseObserver.java @@ -17,7 +17,7 @@ package com.hedera.block.server.consumer; import static com.hedera.block.server.Translator.fromPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItemsConsumed; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItemsConsumed; import static java.lang.System.Logger; import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.ERROR; diff --git a/server/src/main/java/com/hedera/block/server/mediator/LiveStreamMediatorImpl.java b/server/src/main/java/com/hedera/block/server/mediator/LiveStreamMediatorImpl.java index e967740e..7691b62b 100644 --- a/server/src/main/java/com/hedera/block/server/mediator/LiveStreamMediatorImpl.java +++ b/server/src/main/java/com/hedera/block/server/mediator/LiveStreamMediatorImpl.java @@ -16,9 +16,9 @@ package com.hedera.block.server.mediator; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItems; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockStreamMediatorError; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Gauge.Subscribers; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItems; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockStreamMediatorError; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Gauge.Subscribers; import static java.lang.System.Logger; import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.ERROR; diff --git a/server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricNames.java b/server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricTypes.java similarity index 62% rename from server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricNames.java rename to server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricTypes.java index 094e2de3..c5d968e4 100644 --- a/server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricNames.java +++ b/server/src/main/java/com/hedera/block/server/metrics/BlockNodeMetricTypes.java @@ -18,19 +18,48 @@ import edu.umd.cs.findbugs.annotations.NonNull; -public final class BlockNodeMetricNames { - private BlockNodeMetricNames() {} - +/** + * The BlockNodeMetricNames class contains the names of the metrics used by the BlockNode. + * + *

These names are used to register the metrics with the metrics service. + */ +public final class BlockNodeMetricTypes { + private BlockNodeMetricTypes() {} + + /** + * Add new counting metrics to this enum to automatically register them with the metrics + * service. + * + *

Each enum value should have a unique grafana label and meaningful description. These + * counters can capture data on standard operations or errors. + */ public enum Counter implements MetricMetadata { // Standard counters + /** The number of live block items received from a producer. */ LiveBlockItemsReceived("live_block_items_received", "Live Block Items Received"), + + /** The number of live block items received before publishing to the RingBuffer. */ LiveBlockItems("live_block_items", "Live BlockItems"), + + /** + * The number of blocks persisted to storage. + * + *

Block items are not counted here, only the blocks. + */ BlocksPersisted("blocks_persisted", "Blocks Persisted"), + + /** The number of live block items consumed from the by each consumer observer. */ LiveBlockItemsConsumed("live_block_items_consumed", "Live Block Items Consumed"), + + /** The number of single blocks retrieved from the singleBlock rpc service. */ SingleBlocksRetrieved("single_blocks_retrieved", "Single Blocks Retrieved"), + + /** The number of single blocks not found via the singleBlock rpc service. */ SingleBlocksNotFound("single_blocks_not_found", "Single Blocks Not Found"), // Error counters + + /** The number of errors encountered by the live block stream mediator. */ LiveBlockStreamMediatorError( "live_block_stream_mediator_error", "Live Block Stream Mediator Error"); @@ -55,7 +84,15 @@ public String description() { } } + /** + * Add new gauge metrics to this enum to automatically register them with the metrics service. + * + *

Each enum value should have a unique grafana label and meaningful description. These + * gauges can capture data on standard operations or errors. + */ public enum Gauge implements MetricMetadata { + + /** The number of subscribers receiving the live block stream. */ Subscribers("subscribers", "Subscribers"); private final String grafanaLabel; diff --git a/server/src/main/java/com/hedera/block/server/metrics/MetricsService.java b/server/src/main/java/com/hedera/block/server/metrics/MetricsService.java index 8cce37f8..205c17e1 100644 --- a/server/src/main/java/com/hedera/block/server/metrics/MetricsService.java +++ b/server/src/main/java/com/hedera/block/server/metrics/MetricsService.java @@ -22,7 +22,19 @@ /** Use member variables of this class to update metric data for the Hedera Block Node. */ public interface MetricsService { - Counter get(@NonNull BlockNodeMetricNames.Counter key); + /** + * Use this method to get a specific counter for the given metric type. + * + * @param key to get a specific counter + * @return the counter + */ + Counter get(@NonNull BlockNodeMetricTypes.Counter key); - LongGauge get(@NonNull BlockNodeMetricNames.Gauge key); + /** + * Use this method to get a specific gauge for the given metric type. + * + * @param key to get a specific gauge + * @return the gauge + */ + LongGauge get(@NonNull BlockNodeMetricTypes.Gauge key); } diff --git a/server/src/main/java/com/hedera/block/server/metrics/MetricsServiceImpl.java b/server/src/main/java/com/hedera/block/server/metrics/MetricsServiceImpl.java index 9207acc0..77631833 100644 --- a/server/src/main/java/com/hedera/block/server/metrics/MetricsServiceImpl.java +++ b/server/src/main/java/com/hedera/block/server/metrics/MetricsServiceImpl.java @@ -33,10 +33,10 @@ public class MetricsServiceImpl implements MetricsService { private static final String CATEGORY = "hedera_block_node"; - private final EnumMap counters = - new EnumMap<>(BlockNodeMetricNames.Counter.class); - private final EnumMap gauges = - new EnumMap<>(BlockNodeMetricNames.Gauge.class); + private final EnumMap counters = + new EnumMap<>(BlockNodeMetricTypes.Counter.class); + private final EnumMap gauges = + new EnumMap<>(BlockNodeMetricTypes.Gauge.class); /** * Create singleton instance of metrics service to be used throughout the application. @@ -46,7 +46,7 @@ public class MetricsServiceImpl implements MetricsService { @Inject public MetricsServiceImpl(@NonNull final Metrics metrics) { // Initialize the counters - for (BlockNodeMetricNames.Counter counter : BlockNodeMetricNames.Counter.values()) { + for (BlockNodeMetricTypes.Counter counter : BlockNodeMetricTypes.Counter.values()) { counters.put( counter, metrics.getOrCreate( @@ -55,7 +55,7 @@ public MetricsServiceImpl(@NonNull final Metrics metrics) { } // Initialize the gauges - for (BlockNodeMetricNames.Gauge gauge : BlockNodeMetricNames.Gauge.values()) { + for (BlockNodeMetricTypes.Gauge gauge : BlockNodeMetricTypes.Gauge.values()) { gauges.put( gauge, metrics.getOrCreate( @@ -64,15 +64,27 @@ public MetricsServiceImpl(@NonNull final Metrics metrics) { } } + /** + * Use this method to get a specific counter for the given metric type. + * + * @param key to get a specific counter + * @return the counter + */ @NonNull @Override - public Counter get(@NonNull BlockNodeMetricNames.Counter key) { + public Counter get(@NonNull BlockNodeMetricTypes.Counter key) { return counters.get(key); } + /** + * Use this method to get a specific gauge for the given metric type. + * + * @param key to get a specific gauge + * @return the gauge + */ @NonNull @Override - public LongGauge get(@NonNull BlockNodeMetricNames.Gauge key) { + public LongGauge get(@NonNull BlockNodeMetricTypes.Gauge key) { return gauges.get(key); } } diff --git a/server/src/main/java/com/hedera/block/server/persistence/storage/write/BlockAsDirWriter.java b/server/src/main/java/com/hedera/block/server/persistence/storage/write/BlockAsDirWriter.java index d097a4d7..e5c96e75 100644 --- a/server/src/main/java/com/hedera/block/server/persistence/storage/write/BlockAsDirWriter.java +++ b/server/src/main/java/com/hedera/block/server/persistence/storage/write/BlockAsDirWriter.java @@ -17,7 +17,7 @@ package com.hedera.block.server.persistence.storage.write; import static com.hedera.block.server.Constants.BLOCK_FILE_EXTENSION; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.BlocksPersisted; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.BlocksPersisted; import static java.lang.System.Logger; import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.ERROR; diff --git a/server/src/main/java/com/hedera/block/server/producer/ProducerBlockItemObserver.java b/server/src/main/java/com/hedera/block/server/producer/ProducerBlockItemObserver.java index 36dd6f6c..18151583 100644 --- a/server/src/main/java/com/hedera/block/server/producer/ProducerBlockItemObserver.java +++ b/server/src/main/java/com/hedera/block/server/producer/ProducerBlockItemObserver.java @@ -18,7 +18,7 @@ import static com.hedera.block.server.Translator.fromPbj; import static com.hedera.block.server.Translator.toPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItemsReceived; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItemsReceived; import static com.hedera.block.server.producer.Util.getFakeHash; import static java.lang.System.Logger; import static java.lang.System.Logger.Level.DEBUG; @@ -64,9 +64,11 @@ public class ProducerBlockItemObserver * to the upstream producer via the responseStreamObserver. * * @param publisher the block item publisher to used to pass block items to consumers as they - * arrive from the upstream producer + * arrive from the upstream producer. * @param publishStreamResponseObserver the response stream observer to send responses back to - * the upstream producer for each block item processed + * the upstream producer for each block item processed. + * @param blockNodeContext the block node context used to access context objects for the Block + * Node (e.g. - the metrics service). * @param serviceStatus the service status used to determine if the downstream service is * accepting block items. In the event of an unrecoverable exception, it will be used to * stop the web server. diff --git a/server/src/test/java/com/hedera/block/server/BlockStreamServiceIntegrationTest.java b/server/src/test/java/com/hedera/block/server/BlockStreamServiceIntegrationTest.java index 52a0415e..ef4f985a 100644 --- a/server/src/test/java/com/hedera/block/server/BlockStreamServiceIntegrationTest.java +++ b/server/src/test/java/com/hedera/block/server/BlockStreamServiceIntegrationTest.java @@ -17,7 +17,7 @@ package com.hedera.block.server; import static com.hedera.block.server.Translator.fromPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItems; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItems; import static com.hedera.block.server.producer.Util.getFakeHash; import static com.hedera.block.server.util.PersistTestUtils.generateBlockItems; import static java.lang.System.Logger; diff --git a/server/src/test/java/com/hedera/block/server/mediator/LiveStreamMediatorImplTest.java b/server/src/test/java/com/hedera/block/server/mediator/LiveStreamMediatorImplTest.java index 356687bf..63e1813f 100644 --- a/server/src/test/java/com/hedera/block/server/mediator/LiveStreamMediatorImplTest.java +++ b/server/src/test/java/com/hedera/block/server/mediator/LiveStreamMediatorImplTest.java @@ -17,7 +17,7 @@ package com.hedera.block.server.mediator; import static com.hedera.block.server.Translator.fromPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItems; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItems; import static com.hedera.block.server.util.PersistTestUtils.generateBlockItems; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/server/src/test/java/com/hedera/block/server/metrics/MetricsServiceTest.java b/server/src/test/java/com/hedera/block/server/metrics/MetricsServiceTest.java index ebdd0381..83e1dab4 100644 --- a/server/src/test/java/com/hedera/block/server/metrics/MetricsServiceTest.java +++ b/server/src/test/java/com/hedera/block/server/metrics/MetricsServiceTest.java @@ -16,11 +16,11 @@ package com.hedera.block.server.metrics; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.BlocksPersisted; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItems; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItemsConsumed; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.SingleBlocksRetrieved; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Gauge.Subscribers; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.BlocksPersisted; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItems; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItemsConsumed; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.SingleBlocksRetrieved; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Gauge.Subscribers; import static org.junit.jupiter.api.Assertions.assertEquals; import com.hedera.block.server.config.BlockNodeContext; diff --git a/server/src/test/java/com/hedera/block/server/producer/ProducerBlockItemObserverTest.java b/server/src/test/java/com/hedera/block/server/producer/ProducerBlockItemObserverTest.java index 848cd870..242ef05e 100644 --- a/server/src/test/java/com/hedera/block/server/producer/ProducerBlockItemObserverTest.java +++ b/server/src/test/java/com/hedera/block/server/producer/ProducerBlockItemObserverTest.java @@ -17,7 +17,7 @@ package com.hedera.block.server.producer; import static com.hedera.block.server.Translator.fromPbj; -import static com.hedera.block.server.metrics.BlockNodeMetricNames.Counter.LiveBlockItems; +import static com.hedera.block.server.metrics.BlockNodeMetricTypes.Counter.LiveBlockItems; import static com.hedera.block.server.producer.Util.getFakeHash; import static com.hedera.block.server.util.PersistTestUtils.generateBlockItems; import static com.hedera.block.server.util.PersistTestUtils.reverseByteArray;