From b9223702de0a943548d3a1299ea86a63961d7583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tingel=C3=B6f?= Date: Mon, 19 Apr 2021 13:27:20 +0200 Subject: [PATCH] Prevent faulty localBroadcastAddress to be set When Cassandra has not yet started up and /metrics is called, then FBUtilities.getlocalBroadcastAddress is called and sets variables which causes faulty address to be set for the local broadcast address. Using the same logic as FBUtilities, but not assigning any variable that Cassandra server itself is using elsewhere. --- .../zegelin/cassandra/exporter/Harvester.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java b/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java index ae433c9..fb7423d 100644 --- a/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java +++ b/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java @@ -10,12 +10,14 @@ import com.zegelin.prometheus.domain.Labels; import com.zegelin.prometheus.domain.MetricFamily; import com.zegelin.prometheus.domain.NumericMetric; +import org.apache.cassandra.config.DatabaseDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -280,17 +282,30 @@ private Stream collectTimings() { } public Labels globalLabels() { - final InetAddress localBroadcastAddress = metadataFactory.localBroadcastAddress(); - final MetadataFactory.EndpointMetadata localMetadata = metadataFactory.endpointMetadata(localBroadcastAddress) - .orElseThrow(() -> new IllegalStateException("Unable to get metadata about the local node.")); + try + { + final InetAddress localBroadcastAddress = DatabaseDescriptor.getBroadcastAddress() == null ? + getInetAddress() : DatabaseDescriptor.getBroadcastAddress(); + final MetadataFactory.EndpointMetadata localMetadata = metadataFactory.endpointMetadata(localBroadcastAddress) + .orElseThrow(() -> new IllegalStateException("Unable to get metadata about the local node.")); - final ImmutableMap.Builder mapBuilder = ImmutableMap.builder(); + final ImmutableMap.Builder mapBuilder = ImmutableMap.builder(); - LabelEnum.addIfEnabled(GlobalLabel.CLUSTER, enabledGlobalLabels, mapBuilder, metadataFactory::clusterName); - LabelEnum.addIfEnabled(GlobalLabel.NODE, enabledGlobalLabels, mapBuilder, () -> InetAddresses.toAddrString(localBroadcastAddress)); - LabelEnum.addIfEnabled(GlobalLabel.DATACENTER, enabledGlobalLabels, mapBuilder, localMetadata::dataCenter); - LabelEnum.addIfEnabled(GlobalLabel.RACK, enabledGlobalLabels, mapBuilder, localMetadata::rack); + LabelEnum.addIfEnabled(GlobalLabel.CLUSTER, enabledGlobalLabels, mapBuilder, metadataFactory::clusterName); + LabelEnum.addIfEnabled(GlobalLabel.NODE, enabledGlobalLabels, mapBuilder, () -> InetAddresses.toAddrString(localBroadcastAddress)); + LabelEnum.addIfEnabled(GlobalLabel.DATACENTER, enabledGlobalLabels, mapBuilder, localMetadata::dataCenter); + LabelEnum.addIfEnabled(GlobalLabel.RACK, enabledGlobalLabels, mapBuilder, localMetadata::rack); - return new Labels(mapBuilder.build()); + return new Labels(mapBuilder.build()); + } + catch (UnknownHostException e) + { + throw new RuntimeException(e); + } + } + + private InetAddress getInetAddress() throws UnknownHostException + { + return DatabaseDescriptor.getListenAddress() == null ? InetAddress.getLocalHost() : DatabaseDescriptor.getListenAddress(); } }