diff --git a/core/src/main/java/io/grpc/internal/InternalSubchannel.java b/core/src/main/java/io/grpc/internal/InternalSubchannel.java index 5ae082cbb6..3e8c6ff424 100644 --- a/core/src/main/java/io/grpc/internal/InternalSubchannel.java +++ b/core/src/main/java/io/grpc/internal/InternalSubchannel.java @@ -589,8 +589,10 @@ final class InternalSubchannel implements InternalInstrumented, Tr public void transportReady() { channelLogger.log(ChannelLogLevel.INFO, "READY"); subchannelMetrics.recordConnectionAttemptSucceeded(buildLabelSet( - addressIndex.getCurrentEagAttributes().get(NameResolver.ATTR_BACKEND_SERVICE), - addressIndex.getCurrentEagAttributes().get(LoadBalancer.ATTR_LOCALITY_NAME), + getAttributeOrDefault( + addressIndex.getCurrentEagAttributes(), NameResolver.ATTR_BACKEND_SERVICE), + getAttributeOrDefault( + addressIndex.getCurrentEagAttributes(), LoadBalancer.ATTR_LOCALITY_NAME), null, extractSecurityLevel( addressIndex.getCurrentEagAttributes().get(GrpcAttributes.ATTR_SECURITY_LEVEL)) @@ -625,10 +627,10 @@ final class InternalSubchannel implements InternalInstrumented, Tr ChannelLogLevel.INFO, "{0} SHUTDOWN with {1}", transport.getLogId(), printShortStatus(s)); shutdownInitiated = true; subchannelMetrics.recordConnectionAttemptFailed(buildLabelSet( - addressIndex.getCurrentEagAttributes().get(NameResolver.ATTR_BACKEND_SERVICE), - addressIndex.getCurrentEagAttributes().get(LoadBalancer.ATTR_LOCALITY_NAME), + getAttributeOrDefault(addressIndex.getCurrentEagAttributes(), NameResolver.ATTR_BACKEND_SERVICE), + getAttributeOrDefault(addressIndex.getCurrentEagAttributes(), LoadBalancer.ATTR_LOCALITY_NAME), null, null - )); + )); syncContext.execute(new Runnable() { @Override public void run() { @@ -670,8 +672,10 @@ final class InternalSubchannel implements InternalInstrumented, Tr filter.transportTerminated(transport.getAttributes()); } subchannelMetrics.recordDisconnection(buildLabelSet( - addressIndex.getCurrentEagAttributes().get(NameResolver.ATTR_BACKEND_SERVICE), - addressIndex.getCurrentEagAttributes().get(LoadBalancer.ATTR_LOCALITY_NAME), + getAttributeOrDefault( + addressIndex.getCurrentEagAttributes(), NameResolver.ATTR_BACKEND_SERVICE), + getAttributeOrDefault( + addressIndex.getCurrentEagAttributes(), LoadBalancer.ATTR_LOCALITY_NAME), "Peer Pressure", extractSecurityLevel( addressIndex.getCurrentEagAttributes().get(GrpcAttributes.ATTR_SECURITY_LEVEL)) @@ -702,6 +706,11 @@ final class InternalSubchannel implements InternalInstrumented, Tr throw new IllegalArgumentException("Unknown SecurityLevel: " + securityLevel); } } + + private String getAttributeOrDefault(Attributes attributes, Attributes.Key key) { + String value = attributes.get(key); + return value == null ? "" : value; + } } // All methods are called in syncContext