Skip to content

Commit

Permalink
feat: revise metric names and add testing for the added metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
jonesho committed Feb 13, 2025
1 parent f0de440 commit e67bbf9
Show file tree
Hide file tree
Showing 3 changed files with 209 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ class GlobalBlobAwareConflationCalculator(

private val gasUsedInBlobHistogram = metricsFacade.createHistogram(
category = LineaMetricsCategory.BLOB,
name = "gas.used",
description = "Total gas used in each blob"
name = "gas",
description = "Total gas in each blob"
)
private val compressedDataSizeInBlobHistogram = metricsFacade.createHistogram(
category = LineaMetricsCategory.BLOB,
Expand All @@ -52,8 +52,8 @@ class GlobalBlobAwareConflationCalculator(
)
private val gasUsedInBatchHistogram = metricsFacade.createHistogram(
category = LineaMetricsCategory.BATCH,
name = "gas.used",
description = "Total gas used in each batch"
name = "gas",
description = "Total gas in each batch"
)
private val compressedDataSizeInBatchHistogram = metricsFacade.createHistogram(
category = LineaMetricsCategory.BATCH,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import build.linea.domain.BlockIntervals
import io.vertx.core.Vertx
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import net.consensys.linea.metrics.Histogram
import net.consensys.linea.metrics.LineaMetricsCategory
import net.consensys.linea.metrics.MetricsFacade
import net.consensys.trimToSecondPrecision
import net.consensys.zkevm.coordinator.clients.ProofAggregationProverClientV2
Expand All @@ -17,11 +19,13 @@ import net.consensys.zkevm.domain.ProofsToAggregate
import net.consensys.zkevm.persistence.AggregationsRepository
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.mockito.Mockito
import org.mockito.Mockito.anyLong
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
import org.mockito.kotlin.argThat
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import tech.pegasys.teku.infrastructure.async.SafeFuture
Expand Down Expand Up @@ -74,7 +78,20 @@ class ProofAggregationCoordinatorServiceTest {
val mockAggregationCalculator = mock<AggregationCalculator>()
val mockAggregationsRepository = mock<AggregationsRepository>()
val mockProofAggregationClient = mock<ProofAggregationProverClientV2>()
val aggregationL2StateProvider = mock<AggregationL2StateProvider>()
val mockAggregationL2StateProvider = mock<AggregationL2StateProvider>()

// histogram metrics mocks
lateinit var mockAggregationSizeInBlocksHistogram: Histogram
lateinit var mockAggregationSizeInBatchesHistogram: Histogram
lateinit var mockAggregationSizeInBlobsHistogram: Histogram
val mockMetricsFacade: MetricsFacade = mock() {
on { createHistogram(eq(LineaMetricsCategory.AGGREGATION), eq("blocks.size"), any(), any(), any(), anyOrNull()) }
.thenAnswer { mock<Histogram>().also { mockAggregationSizeInBlocksHistogram = it } }
on { createHistogram(eq(LineaMetricsCategory.AGGREGATION), eq("batches.size"), any(), any(), any(), anyOrNull()) }
.thenAnswer { mock<Histogram>().also { mockAggregationSizeInBatchesHistogram = it } }
on { createHistogram(eq(LineaMetricsCategory.AGGREGATION), eq("blobs.size"), any(), any(), any(), anyOrNull()) }
.thenAnswer { mock<Histogram>().also { mockAggregationSizeInBlobsHistogram = it } }
}

val config = ProofAggregationCoordinatorService.Config(
pollingInterval = 10.milliseconds,
Expand All @@ -92,8 +109,8 @@ class ProofAggregationCoordinatorServiceTest {
aggregationsRepository = mockAggregationsRepository,
consecutiveProvenBlobsProvider = mockAggregationsRepository::findConsecutiveProvenBlobs,
proofAggregationClient = mockProofAggregationClient,
aggregationL2StateProvider = aggregationL2StateProvider,
metricsFacade = mock<MetricsFacade>(defaultAnswer = Mockito.RETURNS_DEEP_STUBS),
aggregationL2StateProvider = mockAggregationL2StateProvider,
metricsFacade = mockMetricsFacade,
provenAggregationEndBlockNumberConsumer = provenAggregationEndBlockNumberConsumer
)
verify(mockAggregationCalculator).onAggregation(proofAggregationCoordinatorService)
Expand Down Expand Up @@ -148,7 +165,7 @@ class ProofAggregationCoordinatorServiceTest {
parentAggregationLastL1RollingHash = ByteArray(32)
)

whenever(aggregationL2StateProvider.getAggregationL2State(anyLong()))
whenever(mockAggregationL2StateProvider.getAggregationL2State(anyLong()))
.thenAnswer { SafeFuture.completedFuture(rollingInfo1) }
.thenAnswer { SafeFuture.completedFuture(rollingInfo2) }

Expand Down Expand Up @@ -220,13 +237,19 @@ class ProofAggregationCoordinatorServiceTest {
// First aggregation should Trigger
proofAggregationCoordinatorService.action().get()

verify(mockAggregationSizeInBlocksHistogram, times(1)).record(23.0)
verify(mockAggregationSizeInBatchesHistogram, times(1)).record(6.0)
verify(mockAggregationSizeInBlobsHistogram, times(1)).record(2.0)
verify(mockProofAggregationClient).requestProof(proofsToAggregate1)
verify(mockAggregationsRepository).saveNewAggregation(aggregation1)
assertThat(provenAggregation).isEqualTo(aggregation1.endBlockNumber)

// Second aggregation should Trigger
proofAggregationCoordinatorService.action().get()

verify(mockAggregationSizeInBlocksHistogram, times(1)).record(27.0)
verify(mockAggregationSizeInBatchesHistogram, times(2)).record(6.0)
verify(mockAggregationSizeInBlobsHistogram, times(2)).record(2.0)
verify(mockProofAggregationClient).requestProof(proofsToAggregate2)
verify(mockAggregationsRepository).saveNewAggregation(aggregation2)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import kotlinx.datetime.Instant
import linea.domain.BlockHeaderSummary
import net.consensys.ByteArrayExt
import net.consensys.FakeFixedClock
import net.consensys.linea.metrics.Histogram
import net.consensys.linea.metrics.LineaMetricsCategory
import net.consensys.linea.metrics.MetricsFacade
import net.consensys.linea.traces.TracesCountersV1
import net.consensys.linea.traces.fakeTracesCountersV1
Expand All @@ -18,8 +20,14 @@ import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mockito
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
import org.mockito.kotlin.eq
import org.mockito.kotlin.inOrder
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import tech.pegasys.teku.infrastructure.async.SafeFuture
import kotlin.time.Duration.Companion.days
Expand All @@ -44,6 +52,17 @@ class GlobalBlobAwareConflationCalculatorTest {
private lateinit var blobs: MutableList<Blob>
private val defaultBatchesLimit = 2U
private val conflationTargetEndBlockNumbers: MutableSet<ULong> = mutableSetOf()
private lateinit var mockMetricsFacade: MetricsFacade

// histogram metrics mocks
private lateinit var mockGasUsedInBlobHistogram: Histogram
private lateinit var mockCompressedDataSizeInBlobHistogram: Histogram
private lateinit var mockUncompressedDataSizeInBlobHistogram: Histogram
private lateinit var mockGasUsedInBatchHistogram: Histogram
private lateinit var mockCompressedDataSizeInBatchHistogram: Histogram
private lateinit var mockUncompressedDataSizeInBatchHistogram: Histogram
private lateinit var mockAvgCompressedTxDataSizeInBatchHistogram: Histogram
private lateinit var mockAvgUncompressedTxDataSizeInBatchHistogram: Histogram

@BeforeEach
fun beforeEach() {
Expand All @@ -56,6 +75,104 @@ class GlobalBlobAwareConflationCalculatorTest {
SafeFuture.failedFuture(RuntimeException("getLatestSafeBlockHeader not mocked yet"))
)
}
mockMetricsFacade = mock() {
on {
createHistogram(
eq(LineaMetricsCategory.BLOB),
eq("gas"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockGasUsedInBlobHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BLOB),
eq("compressed.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockCompressedDataSizeInBlobHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BLOB),
eq("uncompressed.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockUncompressedDataSizeInBlobHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BATCH),
eq("gas"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockGasUsedInBatchHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BATCH),
eq("compressed.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockCompressedDataSizeInBatchHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BATCH),
eq("uncompressed.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockUncompressedDataSizeInBatchHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BATCH),
eq("avg.compressed.tx.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockAvgCompressedTxDataSizeInBatchHistogram = it }
}
on {
createHistogram(
eq(LineaMetricsCategory.BATCH),
eq("avg.uncompressed.tx.data.size"),
any(),
any(),
any(),
anyOrNull()
)
}.thenAnswer {
mock<Histogram>().also { mockAvgUncompressedTxDataSizeInBatchHistogram = it }
}
}
calculatorByDealine = spy(
ConflationCalculatorByTimeDeadline(
config = ConflationCalculatorByTimeDeadline.Config(
Expand Down Expand Up @@ -88,7 +205,7 @@ class GlobalBlobAwareConflationCalculatorTest {
conflationCalculator = globalCalculator,
blobCalculator = calculatorByDataCompressed,
batchesLimit = defaultBatchesLimit,
metricsFacade = mock<MetricsFacade>(defaultAnswer = Mockito.RETURNS_DEEP_STUBS)
metricsFacade = mockMetricsFacade
)
conflations = mutableListOf()
blobs = mutableListOf()
Expand All @@ -112,7 +229,9 @@ class GlobalBlobAwareConflationCalculatorTest {
blockNumber = it,
blockTimestamp = fakeClockTime,
tracesCounters = fakeTracesCountersV1(1u),
blockRLPEncoded = ByteArray(11)
blockRLPEncoded = ByteArray(11),
numOfTransactions = 1u,
gasUsed = 10uL
)
}
blockCounters.forEach {
Expand Down Expand Up @@ -141,6 +260,16 @@ class GlobalBlobAwareConflationCalculatorTest {
assertThat(blobs[1].conflations).isEqualTo(conflations.subList(1, 2))
assertThat(blobs[1].startBlockTime).isEqualTo(blockCounters[5].blockTimestamp)
assertThat(blobs[1].endBlockTime).isEqualTo(blockCounters[9].blockTimestamp)

// verify histogram metrics
verify(mockGasUsedInBlobHistogram, times(2)).record(50.0)
verify(mockCompressedDataSizeInBlobHistogram, times(2)).record(55.0)
verify(mockUncompressedDataSizeInBlobHistogram, times(2)).record(55.0)
verify(mockGasUsedInBatchHistogram, times(2)).record(50.0)
verify(mockCompressedDataSizeInBatchHistogram, times(2)).record(55.0)
verify(mockUncompressedDataSizeInBatchHistogram, times(2)).record(55.0)
verify(mockAvgCompressedTxDataSizeInBatchHistogram, times(2)).record(11.0)
verify(mockAvgUncompressedTxDataSizeInBatchHistogram, times(2)).record(11.0)
}

@Test
Expand All @@ -149,25 +278,33 @@ class GlobalBlobAwareConflationCalculatorTest {
blockNumber = 1uL,
blockTimestamp = fakeClockTime,
tracesCounters = fakeTracesCountersV1(10u),
blockRLPEncoded = ByteArray(11)
blockRLPEncoded = ByteArray(11),
numOfTransactions = 1u,
gasUsed = 10uL
)
val block2Counters = BlockCounters(
blockNumber = 2uL,
blockTimestamp = block1Counters.blockTimestamp.plus(blockTime),
tracesCounters = fakeTracesCountersV1(10u),
blockRLPEncoded = ByteArray(12)
blockRLPEncoded = ByteArray(12),
numOfTransactions = 1u,
gasUsed = 10uL
)
val block3Counters = BlockCounters(
blockNumber = 3uL,
blockTimestamp = block2Counters.blockTimestamp.plus(blockTime),
tracesCounters = fakeTracesCountersV1(10u),
blockRLPEncoded = ByteArray(83)
blockRLPEncoded = ByteArray(83),
numOfTransactions = 1u,
gasUsed = 10uL
)
val block4Counters = BlockCounters(
blockNumber = 4uL,
blockTimestamp = block3Counters.blockTimestamp.plus(blockTime),
tracesCounters = fakeTracesCountersV1(10u),
blockRLPEncoded = ByteArray(44)
blockRLPEncoded = ByteArray(44),
numOfTransactions = 1u,
gasUsed = 10uL
)

calculator.newBlock(block1Counters)
Expand Down Expand Up @@ -202,6 +339,40 @@ class GlobalBlobAwareConflationCalculatorTest {
assertThat(blobs[1].conflations).isEqualTo(conflations.subList(1, 2))
assertThat(blobs[1].startBlockTime).isEqualTo(block3Counters.blockTimestamp)
assertThat(blobs[1].endBlockTime).isEqualTo(block3Counters.blockTimestamp)

// verify histogram metrics
inOrder(mockGasUsedInBlobHistogram).also {
it.verify(mockGasUsedInBlobHistogram).record(20.0)
it.verify(mockGasUsedInBlobHistogram).record(10.0)
}
inOrder(mockCompressedDataSizeInBlobHistogram).also {
it.verify(mockCompressedDataSizeInBlobHistogram).record(23.0)
it.verify(mockCompressedDataSizeInBlobHistogram).record(83.0)
}
inOrder(mockUncompressedDataSizeInBlobHistogram).also {
it.verify(mockUncompressedDataSizeInBlobHistogram).record(23.0)
it.verify(mockUncompressedDataSizeInBlobHistogram).record(83.0)
}
inOrder(mockGasUsedInBatchHistogram).also {
it.verify(mockGasUsedInBatchHistogram).record(20.0)
it.verify(mockGasUsedInBatchHistogram).record(10.0)
}
inOrder(mockCompressedDataSizeInBatchHistogram).also {
it.verify(mockCompressedDataSizeInBatchHistogram).record(23.0)
it.verify(mockCompressedDataSizeInBatchHistogram).record(83.0)
}
inOrder(mockUncompressedDataSizeInBatchHistogram).also {
it.verify(mockUncompressedDataSizeInBatchHistogram).record(23.0)
it.verify(mockUncompressedDataSizeInBatchHistogram).record(83.0)
}
inOrder(mockAvgCompressedTxDataSizeInBatchHistogram).also {
it.verify(mockAvgCompressedTxDataSizeInBatchHistogram).record(11.0)
it.verify(mockAvgCompressedTxDataSizeInBatchHistogram).record(83.0)
}
inOrder(mockAvgUncompressedTxDataSizeInBatchHistogram).also {
it.verify(mockAvgUncompressedTxDataSizeInBatchHistogram).record(11.0)
it.verify(mockAvgUncompressedTxDataSizeInBatchHistogram).record(83.0)
}
}

@Test
Expand Down

0 comments on commit e67bbf9

Please sign in to comment.