diff --git a/spring-boot-admin-client/src/main/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactory.java b/spring-boot-admin-client/src/main/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactory.java index 365f74be452..b938de05b1e 100644 --- a/spring-boot-admin-client/src/main/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactory.java +++ b/spring-boot-admin-client/src/main/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactory.java @@ -24,9 +24,11 @@ import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties; import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints; import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.util.StringUtils; public class CloudFoundryApplicationFactory extends DefaultApplicationFactory { private final CloudFoundryApplicationProperties cfApplicationProperties; + private final InstanceProperties instance; public CloudFoundryApplicationFactory(InstanceProperties instance, ManagementServerProperties management, @@ -37,16 +39,21 @@ public CloudFoundryApplicationFactory(InstanceProperties instance, CloudFoundryApplicationProperties cfApplicationProperties) { super(instance, management, server, pathMappedEndpoints, webEndpoint, metadataContributor); this.cfApplicationProperties = cfApplicationProperties; + this.instance = instance; } - @Override - protected String getServiceBaseUrl() { - if (cfApplicationProperties.getUris().isEmpty()) { - return super.getServiceBaseUrl(); - } + @Override + protected String getServiceBaseUrl() { + String baseUrl = this.instance.getServiceBaseUrl(); + if (!StringUtils.isEmpty(baseUrl)) { + return baseUrl; + } - String uri = cfApplicationProperties.getUris().get(0); - String schema = this.getMetadata().getOrDefault("serviceSchema", "http"); - return schema + "://" + uri; - } + if (this.cfApplicationProperties.getUris().isEmpty()) { + return super.getServiceBaseUrl(); + } + + return "http://" + this.cfApplicationProperties.getUris().get(0); + } } + diff --git a/spring-boot-admin-client/src/test/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactoryTest.java b/spring-boot-admin-client/src/test/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactoryTest.java index ad140531914..12d14ea4073 100644 --- a/spring-boot-admin-client/src/test/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactoryTest.java +++ b/spring-boot-admin-client/src/test/java/de/codecentric/boot/admin/client/registration/CloudFoundryApplicationFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2018 the original author or authors. + * Copyright 2014-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,13 +28,11 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import java.util.HashMap; -import java.util.Map; - public class CloudFoundryApplicationFactoryTest { private InstanceProperties instanceProperties = new InstanceProperties(); private ServerProperties server = new ServerProperties(); @@ -42,43 +40,42 @@ public class CloudFoundryApplicationFactoryTest { private PathMappedEndpoints pathMappedEndpoints = mock(PathMappedEndpoints.class); private WebEndpointProperties webEndpoint = new WebEndpointProperties(); private CloudFoundryApplicationProperties cfApplicationProperties = new CloudFoundryApplicationProperties(); - private Map metadata = new HashMap<>(); - - private CloudFoundryApplicationFactory factory = new CloudFoundryApplicationFactory(instanceProperties, management, - server, pathMappedEndpoints, webEndpoint, () -> metadata, cfApplicationProperties); - - @Before - public void setup() { - instanceProperties.setName("test"); - metadata.put("contributor", "test"); - } - - @Test - public void should_use_application_uri() { - - when(pathMappedEndpoints.getPath(EndpointId.of("health"))).thenReturn("/actuator/health"); - cfApplicationProperties.setUris(singletonList("application/Uppercase")); - - Application app = factory.createApplication(); - - assertThat(app.getManagementUrl()).isEqualTo("http://application/Uppercase/actuator"); - assertThat(app.getHealthUrl()).isEqualTo("http://application/Uppercase/actuator/health"); - assertThat(app.getServiceUrl()).isEqualTo("http://application/Uppercase/"); - } - - @Test - public void should_use_application_uri_with_defined_service_schema() { - - metadata.put("serviceSchema", "https"); - - when(pathMappedEndpoints.getPath(EndpointId.of("health"))).thenReturn("/actuator/health"); - cfApplicationProperties.setUris(singletonList("application/Uppercase")); - - Application app = factory.createApplication(); - - assertThat(app.getManagementUrl()).isEqualTo("https://application/Uppercase/actuator"); - assertThat(app.getHealthUrl()).isEqualTo("https://application/Uppercase/actuator/health"); - assertThat(app.getServiceUrl()).isEqualTo("https://application/Uppercase/"); - } - + private CloudFoundryApplicationFactory factory = new CloudFoundryApplicationFactory(this.instanceProperties, + this.management, + this.server, + this.pathMappedEndpoints, + this.webEndpoint, + () -> singletonMap("contributor", "test"), + this.cfApplicationProperties + ); + + @Before + public void setup() { + this.instanceProperties.setName("test"); + } + + @Test + public void should_use_application_uri() { + when(this.pathMappedEndpoints.getPath(EndpointId.of("health"))).thenReturn("/actuator/health"); + this.cfApplicationProperties.setUris(singletonList("application/Uppercase")); + + Application app = this.factory.createApplication(); + + assertThat(app.getManagementUrl()).isEqualTo("http://application/Uppercase/actuator"); + assertThat(app.getHealthUrl()).isEqualTo("http://application/Uppercase/actuator/health"); + assertThat(app.getServiceUrl()).isEqualTo("http://application/Uppercase/"); + } + + @Test + public void should_use_service_base_uri() { + when(this.pathMappedEndpoints.getPath(EndpointId.of("health"))).thenReturn("/actuator/health"); + this.cfApplicationProperties.setUris(singletonList("application/Uppercase")); + this.instanceProperties.setServiceBaseUrl("https://serviceBaseUrl"); + + Application app = this.factory.createApplication(); + + assertThat(app.getManagementUrl()).isEqualTo("https://serviceBaseUrl/actuator"); + assertThat(app.getHealthUrl()).isEqualTo("https://serviceBaseUrl/actuator/health"); + assertThat(app.getServiceUrl()).isEqualTo("https://serviceBaseUrl/"); + } } diff --git a/spring-boot-admin-docs/src/main/asciidoc/client.adoc b/spring-boot-admin-docs/src/main/asciidoc/client.adoc index e655533765e..0da8f842542 100644 --- a/spring-boot-admin-docs/src/main/asciidoc/client.adoc +++ b/spring-boot-admin-docs/src/main/asciidoc/client.adoc @@ -4,7 +4,8 @@ [[show-version-in-application-list]] === Show Version in Application List === -For *Spring Boot* applications the easiest way to show the version, is to use the `build-info` goal from the `spring-boot-maven-plugin`, which generates the `META-INF/build-info.properties`. See also the http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-build-info[Spring Boot Reference Guide]. +For *Spring Boot* applications the easiest way to show the version, is to use the `build-info` goal from the `spring-boot-maven-plugin`, which generates the `META-INF/build-info.properties`. +See also the http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-build-info[Spring Boot Reference Guide]. For *non-Spring Boot* applications you can either add a `version` or `build.version` to the registration metadata and the version will show up in the application list. @@ -31,8 +32,10 @@ For *non-Spring Boot* applications you can either add a `version` or `build.vers [[jmx-bean-management]] === JMX-Bean Management === -To interact with JMX-beans in the admin UI you have to include https://jolokia.org/[Jolokia] in your application. As Jolokia is servlet based there is no support for reactive applications. -In case you are using the `spring-boot-admin-starter-client` it will be pulled in for you, if not add Jolokia to your dependencies. With Spring Boot 2.2.0 you might want to set `spring.jmx.enabled=true` if you want to expose Spring beans via JMX. +To interact with JMX-beans in the admin UI you have to include https://jolokia.org/[Jolokia] in your application. +As Jolokia is servlet based there is no support for reactive applications. +In case you are using the `spring-boot-admin-starter-client` it will be pulled in for you, if not add Jolokia to your dependencies. +With Spring Boot 2.2.0 you might want to set `spring.jmx.enabled=true` if you want to expose Spring beans via JMX. [source,xml] .pom.xml @@ -52,14 +55,16 @@ In order to enable the logfile actuator endpoint you need to configure Spring Bo Spring Boot Admin will detect everything that looks like an URL and render it as hyperlink. -ANSI color-escapes are also supported. You need to set a custom file log pattern as Spring Boot's default one doesn't use colors. +ANSI color-escapes are also supported. +You need to set a custom file log pattern as Spring Boot's default one doesn't use colors. .application.properties ---- logging.file=/var/log/sample-boot-application.log <1> logging.pattern.file=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx <2> ---- -<1> Destination the logfile is written to. Enables the logfile actuator endpoint. +<1> Destination the logfile is written to. +Enables the logfile actuator endpoint. <2> File log pattern using ANSI colors. [[show-instance-tags]] @@ -80,9 +85,12 @@ info.tags.environment=test [[spring-boot-admin-client]] === Spring Boot Admin Client === -The Spring Boot Admin Client registers the application at the admin server. This is done by periodically doing a HTTP post request to the SBA Server providing information about the application. It also adds Jolokia to your application, so that JMX-beans are accessible via HTTP. +The Spring Boot Admin Client registers the application at the admin server. +This is done by periodically doing a HTTP post request to the SBA Server providing information about the application. +It also adds Jolokia to your application, so that JMX-beans are accessible via HTTP. -TIP: There are plenty of properties to influence the way how the SBA Client registers your application. In case that doesn't fit your needs, you can provide your own `ApplicationFactory` implementation. +TIP: There are plenty of properties to influence the way how the SBA Client registers your application. +In case that doesn't fit your needs, you can provide your own `ApplicationFactory` implementation. .Spring Boot Admin Client configuration options |=== @@ -142,7 +150,7 @@ spring.boot.admin.client.password | Guessed based on management-base-url and `management.context-path`. | spring.boot.admin.client.instance.service-base-url -| Base url for computing the service-url to register with. The path is inferred at runtime, and appended to the base url. +| Base url for computing the service-url to register with. The path is inferred at runtime, and appended to the base url. In Cloudfoundry environments you can switching to https like this: `spring.boot.admin.client.instance.service-base-url=https://${vcap.application.uris[0]}` | Guessed based on hostname, `server.port`. | spring.boot.admin.client.instance.service-url @@ -178,8 +186,4 @@ spring.boot.admin.client.password user.password | Credentials being used to access the endpoints. | -| serviceSchema -| schema used by SBA server to access the client/instance on CloudFoundry -| http |=== - diff --git a/spring-boot-admin-docs/src/main/asciidoc/server-discovery.adoc b/spring-boot-admin-docs/src/main/asciidoc/server-discovery.adoc index d082956cec1..b3210c77645 100644 --- a/spring-boot-admin-docs/src/main/asciidoc/server-discovery.adoc +++ b/spring-boot-admin-docs/src/main/asciidoc/server-discovery.adoc @@ -120,5 +120,4 @@ eureka: metadata-map: applicationId: ${vcap.application.application_id} instanceId: ${vcap.application.instance_index} - serviceSchema: https ----