Skip to content

Commit 03baefb

Browse files
committed
[controller] Cleanup log compaction metrics and add some tests
1 parent 86057b9 commit 03baefb

13 files changed

Lines changed: 139 additions & 69 deletions

File tree

internal/venice-client-common/src/main/java/com/linkedin/venice/stats/dimensions/RepushStoreTriggerSource.java renamed to internal/venice-client-common/src/main/java/com/linkedin/venice/stats/dimensions/StoreRepushTriggerSource.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.linkedin.venice.stats.dimensions;
22

3-
public enum RepushStoreTriggerSource implements VeniceDimensionInterface {
4-
MANUAL, SCHEDULED;
3+
public enum StoreRepushTriggerSource implements VeniceDimensionInterface {
4+
MANUAL, SCHEDULED_FOR_LOG_COMPACTION;
55

66
private final String triggerSource;
77

8-
RepushStoreTriggerSource() {
8+
StoreRepushTriggerSource() {
99
this.triggerSource = name().toLowerCase();
1010
}
1111

@@ -15,7 +15,7 @@ public enum RepushStoreTriggerSource implements VeniceDimensionInterface {
1515
*/
1616
@Override
1717
public VeniceMetricsDimensions getDimensionName() {
18-
return VeniceMetricsDimensions.REPUSH_TRIGGER_SOURCE;
18+
return VeniceMetricsDimensions.STORE_REPUSH_TRIGGER_SOURCE;
1919
}
2020

2121
@Override

internal/venice-client-common/src/main/java/com/linkedin/venice/stats/dimensions/VeniceMetricsDimensions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public enum VeniceMetricsDimensions {
3636
/** {@link RequestRetryAbortReason} */
3737
VENICE_REQUEST_RETRY_ABORT_REASON("venice.request.retry_abort_reason"),
3838

39-
/** {@link RepushStoreTriggerSource} */
40-
REPUSH_TRIGGER_SOURCE("repush.trigger.source");
39+
/** {@link StoreRepushTriggerSource} */
40+
STORE_REPUSH_TRIGGER_SOURCE("store.repush.trigger.source");
4141

4242
private final String[] dimensionName = new String[VeniceOpenTelemetryMetricNamingFormat.SIZE];
4343

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.linkedin.venice.stats.dimensions;
2+
3+
import com.linkedin.venice.utils.CollectionUtils;
4+
import java.util.Map;
5+
6+
7+
public class StoreRepushTriggerSourceTest extends VeniceDimensionInterfaceTest<StoreRepushTriggerSource> {
8+
protected StoreRepushTriggerSourceTest() {
9+
super(StoreRepushTriggerSource.class);
10+
}
11+
12+
@Override
13+
protected VeniceMetricsDimensions expectedDimensionName() {
14+
return VeniceMetricsDimensions.STORE_REPUSH_TRIGGER_SOURCE;
15+
}
16+
17+
@Override
18+
protected Map<StoreRepushTriggerSource, String> expectedDimensionValueMapping() {
19+
return CollectionUtils.<StoreRepushTriggerSource, String>mapBuilder()
20+
.put(StoreRepushTriggerSource.MANUAL, "manual")
21+
.put(StoreRepushTriggerSource.SCHEDULED_FOR_LOG_COMPACTION, "scheduled_for_log_compaction")
22+
.build();
23+
}
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.linkedin.venice.stats.dimensions;
2+
3+
import com.linkedin.venice.utils.CollectionUtils;
4+
import java.util.Map;
5+
6+
7+
public class StreamProgressTest extends VeniceDimensionInterfaceTest<StreamProgress> {
8+
protected StreamProgressTest() {
9+
super(StreamProgress.class);
10+
}
11+
12+
@Override
13+
protected VeniceMetricsDimensions expectedDimensionName() {
14+
return VeniceMetricsDimensions.VENICE_STREAM_PROGRESS;
15+
}
16+
17+
@Override
18+
protected Map<StreamProgress, String> expectedDimensionValueMapping() {
19+
return CollectionUtils.<StreamProgress, String>mapBuilder()
20+
.put(StreamProgress.FIRST, "FirstRecord")
21+
.put(StreamProgress.PCT_50, "50thPercentileRecord")
22+
.put(StreamProgress.PCT_90, "90thPercentileRecord")
23+
.build();
24+
}
25+
}

internal/venice-client-common/src/test/java/com/linkedin/venice/stats/dimensions/VeniceMetricsDimensionsTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public void testGetDimensionNameInSnakeCase() {
4343
case VENICE_STREAM_PROGRESS:
4444
assertEquals(dimension.getDimensionName(format), "venice.stream.progress");
4545
break;
46-
case REPUSH_TRIGGER_SOURCE:
47-
assertEquals(dimension.getDimensionName(format), "repush.trigger.source");
46+
case STORE_REPUSH_TRIGGER_SOURCE:
47+
assertEquals(dimension.getDimensionName(format), "store.repush.trigger.source");
4848
break;
4949
default:
5050
throw new IllegalArgumentException("Unknown dimension: " + dimension);
@@ -87,8 +87,8 @@ public void testGetDimensionNameInCamelCase() {
8787
case VENICE_STREAM_PROGRESS:
8888
assertEquals(dimension.getDimensionName(format), "venice.stream.progress");
8989
break;
90-
case REPUSH_TRIGGER_SOURCE:
91-
assertEquals(dimension.getDimensionName(format), "repush.trigger.source");
90+
case STORE_REPUSH_TRIGGER_SOURCE:
91+
assertEquals(dimension.getDimensionName(format), "store.repush.trigger.source");
9292
break;
9393
default:
9494
throw new IllegalArgumentException("Unknown dimension: " + dimension);
@@ -131,8 +131,8 @@ public void testGetDimensionNameInPascalCase() {
131131
case VENICE_STREAM_PROGRESS:
132132
assertEquals(dimension.getDimensionName(format), "Venice.Stream.Progress");
133133
break;
134-
case REPUSH_TRIGGER_SOURCE:
135-
assertEquals(dimension.getDimensionName(format), "Repush.Trigger.Source");
134+
case STORE_REPUSH_TRIGGER_SOURCE:
135+
assertEquals(dimension.getDimensionName(format), "Store.Repush.Trigger.Source");
136136
break;
137137
default:
138138
throw new IllegalArgumentException("Unknown dimension: " + dimension);

services/venice-controller/src/main/java/com/linkedin/venice/controller/logcompaction/LogCompactionService.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.linkedin.venice.controllerapi.RepushJobResponse;
88
import com.linkedin.venice.meta.StoreInfo;
99
import com.linkedin.venice.service.AbstractVeniceService;
10-
import com.linkedin.venice.stats.dimensions.RepushStoreTriggerSource;
10+
import com.linkedin.venice.stats.dimensions.StoreRepushTriggerSource;
1111
import com.linkedin.venice.utils.LogContext;
1212
import java.time.Instant;
1313
import java.time.ZoneId;
@@ -109,8 +109,11 @@ public void run() {
109109
private void compactStoresInClusters() {
110110
for (StoreInfo storeInfo: admin.getStoresForCompaction(clusterName)) {
111111
try {
112-
RepushJobResponse response = admin
113-
.repushStore(new RepushJobRequest(clusterName, storeInfo.getName(), RepushStoreTriggerSource.SCHEDULED));
112+
RepushJobResponse response = admin.repushStore(
113+
new RepushJobRequest(
114+
clusterName,
115+
storeInfo.getName(),
116+
StoreRepushTriggerSource.SCHEDULED_FOR_LOG_COMPACTION));
114117
LOGGER.info(
115118
"Succeeded to trigger log compaction for store: {} in cluster: {} | execution ID: {}",
116119
response.getName(),

services/venice-controller/src/main/java/com/linkedin/venice/controller/repush/RepushJobRequest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import static com.linkedin.venice.controllerapi.ControllerApiConstants.SOURCE_REGION;
55
import static com.linkedin.venice.controllerapi.ControllerApiConstants.STORE_NAME;
66

7-
import com.linkedin.venice.stats.dimensions.RepushStoreTriggerSource;
7+
import com.linkedin.venice.stats.dimensions.StoreRepushTriggerSource;
88
import java.util.HashMap;
99
import java.util.Map;
1010

@@ -13,9 +13,9 @@ public class RepushJobRequest {
1313
private final String clusterName;
1414
private final String storeName;
1515
private final String sourceRegion;
16-
private final RepushStoreTriggerSource triggerSource;
16+
private final StoreRepushTriggerSource triggerSource;
1717

18-
public RepushJobRequest(String clusterName, String storeName, RepushStoreTriggerSource triggerSource) {
18+
public RepushJobRequest(String clusterName, String storeName, StoreRepushTriggerSource triggerSource) {
1919
this.clusterName = clusterName;
2020
this.storeName = storeName;
2121
this.sourceRegion = null; // default to null if not specified
@@ -26,7 +26,7 @@ public RepushJobRequest(
2626
String clusterName,
2727
String storeName,
2828
String sourceRegion,
29-
RepushStoreTriggerSource triggerSource) {
29+
StoreRepushTriggerSource triggerSource) {
3030
this.clusterName = clusterName;
3131
this.storeName = storeName;
3232
this.sourceRegion = sourceRegion;
@@ -45,7 +45,7 @@ public String getSourceRegion() {
4545
return sourceRegion;
4646
}
4747

48-
public RepushStoreTriggerSource getTriggerSource() {
48+
public StoreRepushTriggerSource getTriggerSource() {
4949
return triggerSource;
5050
}
5151

services/venice-controller/src/main/java/com/linkedin/venice/controller/server/StoresRoutes.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
import com.linkedin.venice.pubsub.api.PubSubTopic;
117117
import com.linkedin.venice.pubsub.api.exceptions.PubSubTopicDoesNotExistException;
118118
import com.linkedin.venice.pubsub.manager.TopicManager;
119-
import com.linkedin.venice.stats.dimensions.RepushStoreTriggerSource;
119+
import com.linkedin.venice.stats.dimensions.StoreRepushTriggerSource;
120120
import com.linkedin.venice.systemstore.schemas.StoreProperties;
121121
import com.linkedin.venice.utils.Utils;
122122
import java.util.ArrayList;
@@ -1112,7 +1112,7 @@ public void internalHandle(Request request, RepushJobResponse veniceResponse) {
11121112
try {
11131113
veniceResponse.copyValueOf(
11141114
admin.repushStore(
1115-
new RepushJobRequest(clusterName, storeName, sourceRegion, RepushStoreTriggerSource.MANUAL)));
1115+
new RepushJobRequest(clusterName, storeName, sourceRegion, StoreRepushTriggerSource.MANUAL)));
11161116
} catch (Exception e) {
11171117
veniceResponse.setError("Failed to compact store: " + storeName, e);
11181118
}

services/venice-controller/src/main/java/com/linkedin/venice/controller/stats/ControllerMetricEntity.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.linkedin.venice.controller.stats;
22

3-
import static com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions.REPUSH_TRIGGER_SOURCE;
3+
import static com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions.STORE_REPUSH_TRIGGER_SOURCE;
44
import static com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions.VENICE_CLUSTER_NAME;
55
import static com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions.VENICE_RESPONSE_STATUS_CODE_CATEGORY;
66
import static com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions.VENICE_STORE_NAME;
77
import static com.linkedin.venice.utils.Utils.setOf;
88

9+
import com.linkedin.venice.annotation.VisibleForTesting;
910
import com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions;
1011
import com.linkedin.venice.stats.metrics.MetricEntity;
1112
import com.linkedin.venice.stats.metrics.MetricType;
@@ -15,34 +16,41 @@
1516

1617

1718
public enum ControllerMetricEntity implements ModuleMetricEntityInterface {
18-
REPUSH_CALL_COUNT(
19-
MetricType.COUNTER, MetricUnit.NUMBER, "Count of all calls to a controller endpoint",
20-
setOf(VENICE_STORE_NAME, VENICE_RESPONSE_STATUS_CODE_CATEGORY, VENICE_CLUSTER_NAME, REPUSH_TRIGGER_SOURCE)
19+
STORE_REPUSH_CALL_COUNT(
20+
"store.repush.call_count", MetricType.COUNTER, MetricUnit.NUMBER, "Count of all requests to repush a store",
21+
setOf(VENICE_STORE_NAME, VENICE_RESPONSE_STATUS_CODE_CATEGORY, VENICE_CLUSTER_NAME, STORE_REPUSH_TRIGGER_SOURCE)
2122
),
22-
COMPACTION_ELIGIBLE_STATE(
23-
MetricType.GAUGE, MetricUnit.NUMBER,
24-
"This metric indicates the duration from when a store is first nominated for compaction until the store is compacted successfully."
25-
+ " When a store is nominated for scheduled compaction and remains uncompacted, this metric will be at 1."
26-
+ " When the store is compacted, this metric will return to 0.",
23+
24+
/** log compaction related metrics */
25+
STORE_COMPACTION_NOMINATED_COUNT(
26+
"store.compaction.nominated_count", MetricType.COUNTER, MetricUnit.NUMBER,
27+
"Count of stores nominated for scheduled compaction", setOf(VENICE_STORE_NAME, VENICE_CLUSTER_NAME)
28+
),
29+
STORE_COMPACTION_ELIGIBLE_STATE(
30+
"store.compaction.eligible_state", MetricType.GAUGE, MetricUnit.NUMBER,
31+
"State of the compaction eligibility: shows the duration from compaction nomination to triggered to completion. stays 1 after nomination and becomes 0 when the compaction is compacted",
2732
setOf(VENICE_STORE_NAME, VENICE_CLUSTER_NAME)
2833
),
29-
STORE_NOMINATED_FOR_COMPACTION_COUNT(
30-
MetricType.COUNTER, MetricUnit.NUMBER, "Count of stores nominated for scheduled compaction",
34+
STORE_COMPACTION_TRIGGERED_COUNT(
35+
"store.compaction.triggered_count", MetricType.COUNTER, MetricUnit.NUMBER,
36+
"Count of log compaction repush triggered for a store after it becomes eligible",
3137
setOf(VENICE_STORE_NAME, VENICE_CLUSTER_NAME)
3238
);
3339

3440
private final MetricEntity metricEntity;
3541
private final String metricName;
3642

3743
ControllerMetricEntity(
44+
String metricName,
3845
MetricType metricType,
3946
MetricUnit unit,
4047
String description,
4148
Set<VeniceMetricsDimensions> dimensionsList) {
42-
this.metricName = this.name().toLowerCase();
49+
this.metricName = metricName;
4350
this.metricEntity = new MetricEntity(metricName, metricType, unit, description, dimensionsList);
4451
}
4552

53+
@VisibleForTesting
4654
public String getMetricName() {
4755
return metricName;
4856
}

services/venice-controller/src/main/java/com/linkedin/venice/controller/stats/LogCompactionStats.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.linkedin.venice.stats.VeniceMetricsConfig;
88
import com.linkedin.venice.stats.VeniceMetricsRepository;
99
import com.linkedin.venice.stats.VeniceOpenTelemetryMetricsRepository;
10-
import com.linkedin.venice.stats.dimensions.RepushStoreTriggerSource;
10+
import com.linkedin.venice.stats.dimensions.StoreRepushTriggerSource;
1111
import com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions;
1212
import com.linkedin.venice.stats.dimensions.VeniceResponseStatusCategory;
1313
import com.linkedin.venice.stats.metrics.MetricEntityStateGeneric;
@@ -51,23 +51,23 @@ public LogCompactionStats(MetricsRepository metricsRepository, String clusterNam
5151
}
5252

5353
repushCallCountMetric = MetricEntityStateGeneric.create(
54-
ControllerMetricEntity.REPUSH_CALL_COUNT.getMetricEntity(),
54+
ControllerMetricEntity.STORE_REPUSH_CALL_COUNT.getMetricEntity(),
5555
otelRepository,
5656
this::registerSensor,
5757
ControllerTehutiMetricNameEnum.REPUSH_CALL_COUNT,
5858
Collections.singletonList(new OccurrenceRate()),
5959
baseDimensionsMap);
6060

6161
compactionEligibleMetric = MetricEntityStateGeneric.create(
62-
ControllerMetricEntity.COMPACTION_ELIGIBLE_STATE.getMetricEntity(),
62+
ControllerMetricEntity.STORE_COMPACTION_ELIGIBLE_STATE.getMetricEntity(),
6363
otelRepository,
6464
this::registerSensor,
6565
ControllerTehutiMetricNameEnum.COMPACTION_ELIGIBLE_STATE,
6666
Collections.singletonList(new Gauge()),
6767
baseDimensionsMap);
6868

6969
storeNominatedForCompactionCountMetric = MetricEntityStateGeneric.create(
70-
ControllerMetricEntity.STORE_NOMINATED_FOR_COMPACTION_COUNT.getMetricEntity(),
70+
ControllerMetricEntity.STORE_COMPACTION_NOMINATED_COUNT.getMetricEntity(),
7171
otelRepository,
7272
this::registerSensor,
7373
ControllerTehutiMetricNameEnum.STORE_NOMINATED_FOR_COMPACTION_COUNT,
@@ -77,12 +77,12 @@ public LogCompactionStats(MetricsRepository metricsRepository, String clusterNam
7777

7878
public void recordRepushStoreCall(
7979
String storeName,
80-
RepushStoreTriggerSource triggerSource,
80+
StoreRepushTriggerSource triggerSource,
8181
VeniceResponseStatusCategory executionStatus) {
8282
repushCallCountMetric.record(
8383
1,
8484
getDimensionsBuilder().put(VeniceMetricsDimensions.VENICE_STORE_NAME, storeName)
85-
.put(VeniceMetricsDimensions.REPUSH_TRIGGER_SOURCE, triggerSource.getDimensionValue())
85+
.put(VeniceMetricsDimensions.STORE_REPUSH_TRIGGER_SOURCE, triggerSource.getDimensionValue())
8686
.put(VeniceMetricsDimensions.VENICE_RESPONSE_STATUS_CODE_CATEGORY, executionStatus.getDimensionValue())
8787
.build());
8888
}
@@ -113,11 +113,11 @@ private ImmutableMap.Builder<VeniceMetricsDimensions, String> getDimensionsBuild
113113
}
114114

115115
enum ControllerTehutiMetricNameEnum implements TehutiMetricNameEnum {
116-
/** for {@link ControllerMetricEntity#REPUSH_CALL_COUNT} */
116+
/** for {@link ControllerMetricEntity#STORE_REPUSH_CALL_COUNT} */
117117
REPUSH_CALL_COUNT,
118-
/** for {@link ControllerMetricEntity#COMPACTION_ELIGIBLE_STATE} */
118+
/** for {@link ControllerMetricEntity#STORE_COMPACTION_ELIGIBLE_STATE} */
119119
COMPACTION_ELIGIBLE_STATE,
120-
/** for {@link ControllerMetricEntity#STORE_NOMINATED_FOR_COMPACTION_COUNT} */
120+
/** for {@link ControllerMetricEntity#STORE_COMPACTION_NOMINATED_COUNT} */
121121
STORE_NOMINATED_FOR_COMPACTION_COUNT;
122122

123123
private final String metricName;

0 commit comments

Comments
 (0)