Skip to content

Commit a7b4a16

Browse files
committed
address review comments
- Switch to joint 8-arg AsyncMetricEntityStateBase.create() API - Add TehutiMetricName inner enum, use getMetricName() instead of string literal - Fix Javadoc: joint registration IS possible and is now used
1 parent b979f09 commit a7b4a16

1 file changed

Lines changed: 16 additions & 11 deletions

File tree

services/venice-server/src/main/java/com/linkedin/venice/stats/DiskHealthStats.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import com.linkedin.davinci.storage.DiskHealthCheckService;
66
import com.linkedin.venice.stats.dimensions.VeniceMetricsDimensions;
77
import com.linkedin.venice.stats.metrics.AsyncMetricEntityStateBase;
8+
import com.linkedin.venice.stats.metrics.TehutiMetricNameEnum;
89
import io.opentelemetry.api.common.Attributes;
910
import io.tehuti.metrics.MetricsRepository;
1011
import io.tehuti.metrics.stats.AsyncGauge;
12+
import java.util.Collections;
1113
import java.util.Map;
1214
import java.util.function.LongSupplier;
1315

@@ -16,33 +18,36 @@
1618
* {@code DiskHealthStats} measures the disk health conditions based on the periodic tests ran by
1719
* the {@link DiskHealthCheckService}. Reports 1 if healthy, 0 if unhealthy.
1820
*
19-
* <p>Tehuti and OTel both poll the same {@link DiskHealthCheckService#isDiskHealthy()} method.
20-
* They cannot share a single registration because Tehuti uses {@link AsyncGauge} (polled by
21-
* Tehuti's async executor) while OTel uses {@link AsyncMetricEntityStateBase} (polled by the
22-
* OTel SDK's PeriodicMetricReader).
21+
* <p>Uses the joint Tehuti+OTel API: a single {@link AsyncMetricEntityStateBase} registration
22+
* binds both the Tehuti {@link AsyncGauge} and the OTel ASYNC_GAUGE to the same
23+
* {@link DiskHealthCheckService#isDiskHealthy()} callback.
2324
*/
2425
public class DiskHealthStats extends AbstractVeniceStats {
26+
/** Tehuti metric name for the disk health sensor. */
27+
enum TehutiMetricName implements TehutiMetricNameEnum {
28+
DISK_HEALTHY
29+
}
30+
2531
public DiskHealthStats(
2632
MetricsRepository metricsRepository,
2733
DiskHealthCheckService diskHealthCheckService,
2834
String name,
2935
String clusterName) {
3036
super(metricsRepository, name);
3137

32-
// Shared callback: 1 = healthy, 0 = unhealthy
33-
LongSupplier healthCallback = () -> diskHealthCheckService.isDiskHealthy() ? 1 : 0;
34-
35-
// Tehuti: AsyncGauge
36-
registerSensor(new AsyncGauge((ignored, ignored2) -> healthCallback.getAsLong(), "disk_healthy"));
37-
38-
// OTel: ASYNC_GAUGE with CLUSTER_NAME
3938
OpenTelemetryMetricsSetup.OpenTelemetryMetricsSetupInfo otelData =
4039
OpenTelemetryMetricsSetup.builder(metricsRepository).setClusterName(clusterName).build();
4140
Map<VeniceMetricsDimensions, String> baseDimensionsMap = otelData.getBaseDimensionsMap();
4241
Attributes baseAttributes = otelData.getBaseAttributes();
42+
43+
LongSupplier healthCallback = () -> diskHealthCheckService.isDiskHealthy() ? 1 : 0;
4344
AsyncMetricEntityStateBase.create(
4445
DISK_HEALTH_STATUS.getMetricEntity(),
4546
otelData.getOtelRepository(),
47+
this::registerSensorIfAbsent,
48+
TehutiMetricName.DISK_HEALTHY,
49+
Collections.singletonList(
50+
new AsyncGauge((ig, ig2) -> healthCallback.getAsLong(), TehutiMetricName.DISK_HEALTHY.getMetricName())),
4651
baseDimensionsMap,
4752
baseAttributes,
4853
healthCallback);

0 commit comments

Comments
 (0)