Fix metrics collector NPE (#890)
Fixes #734, #585
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/MetricsCollectController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/MetricsCollectController.java
index 68b36f6..aa493f8 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/MetricsCollectController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/MetricsCollectController.java
@@ -103,24 +103,36 @@
protected void addMetricsConfigToMap(Map<String, String> configMap, String ip) {
List<Provider> providers = providerService.findByAddress(ip);
if (providers.size() > 0) {
- Provider provider = providers.get(0);
- String service = provider.getService();
- MetadataIdentifier providerIdentifier = new MetadataIdentifier(Tool.getInterface(service), Tool.getVersion(service), Tool.getGroup(service),
- Constants.PROVIDER_SIDE, provider.getApplication());
- String metaData = providerService.getProviderMetaData(providerIdentifier);
- FullServiceDefinition providerServiceDefinition = new Gson().fromJson(metaData, FullServiceDefinition.class);
- Map<String, String> parameters = providerServiceDefinition.getParameters();
- configMap.put(parameters.get(Constants.METRICS_PORT), parameters.get(Constants.METRICS_PROTOCOL));
+ for (int i = 0; i < providers.size() && configMap.isEmpty(); i++) {
+ Provider provider = providers.get(i);
+ String service = provider.getService();
+ MetadataIdentifier providerIdentifier = new MetadataIdentifier(Tool.getInterface(service), Tool.getVersion(service), Tool.getGroup(service),
+ Constants.PROVIDER_SIDE, provider.getApplication());
+ String metaData = providerService.getProviderMetaData(providerIdentifier);
+ FullServiceDefinition providerServiceDefinition = new Gson().fromJson(metaData, FullServiceDefinition.class);
+ Map<String, String> parameters = providerServiceDefinition.getParameters();
+ String metricsPort = parameters.get(Constants.METRICS_PORT);
+ String metricsProtocol = parameters.get(Constants.METRICS_PROTOCOL);
+ if (metricsPort != null && metricsProtocol != null) {
+ configMap.put(metricsPort, metricsProtocol);
+ }
+ }
} else {
List<Consumer> consumers = consumerService.findByAddress(ip);
if (consumers.size() > 0) {
- Consumer consumer = consumers.get(0);
- String service = consumer.getService();
- MetadataIdentifier consumerIdentifier = new MetadataIdentifier(Tool.getInterface(service), Tool.getVersion(service), Tool.getGroup(service),
- Constants.CONSUMER_SIDE, consumer.getApplication());
- String metaData = consumerService.getConsumerMetadata(consumerIdentifier);
- Map<String, String> consumerParameters = new Gson().fromJson(metaData, Map.class);
- configMap.put(consumerParameters.get(Constants.METRICS_PORT), consumerParameters.get(Constants.METRICS_PROTOCOL));
+ for (int i = 0; i < consumers.size() && configMap.isEmpty(); i++) {
+ Consumer consumer = consumers.get(i);
+ String service = consumer.getService();
+ MetadataIdentifier consumerIdentifier = new MetadataIdentifier(Tool.getInterface(service), Tool.getVersion(service), Tool.getGroup(service),
+ Constants.CONSUMER_SIDE, consumer.getApplication());
+ String metaData = consumerService.getConsumerMetadata(consumerIdentifier);
+ Map<String, String> consumerParameters = new Gson().fromJson(metaData, Map.class);
+ String metricsPort = consumerParameters.get(Constants.METRICS_PORT);
+ String metricsProtocol = consumerParameters.get(Constants.METRICS_PROTOCOL);
+ if (metricsPort != null && metricsProtocol != null) {
+ configMap.put(metricsPort, metricsProtocol);
+ }
+ }
}
}
}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/MetrcisCollectServiceImpl.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/MetrcisCollectServiceImpl.java
index 53840e1..9af22bd 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/MetrcisCollectServiceImpl.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/MetrcisCollectServiceImpl.java
@@ -29,6 +29,8 @@
referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(new ApplicationConfig("dubbo-admin"));
referenceConfig.setInterface(MetricsService.class);
+ //Keep it consistent with the ConfigManager cache
+ referenceConfig.setSticky(false);
}
public void setUrl(String url) {