commit
b8e4ec3dc4
|
@ -57,7 +57,7 @@ public final class OpenTelemetryResourceAttributes {
|
|||
/**
|
||||
* Creates a new instance of {@link OpenTelemetryResourceAttributes}.
|
||||
* @param environment the environment
|
||||
* @param resourceAttributes user provided resource attributes to be used
|
||||
* @param resourceAttributes user-provided resource attributes to be used
|
||||
*/
|
||||
public OpenTelemetryResourceAttributes(Environment environment, Map<String, String> resourceAttributes) {
|
||||
this(environment, resourceAttributes, null);
|
||||
|
@ -66,7 +66,7 @@ public final class OpenTelemetryResourceAttributes {
|
|||
/**
|
||||
* Creates a new {@link OpenTelemetryResourceAttributes} instance.
|
||||
* @param environment the environment
|
||||
* @param resourceAttributes user provided resource attributes to be used
|
||||
* @param resourceAttributes user-provided resource attributes to be used
|
||||
* @param getEnv a function to retrieve environment variables by name
|
||||
*/
|
||||
OpenTelemetryResourceAttributes(Environment environment, Map<String, String> resourceAttributes,
|
||||
|
|
|
@ -27,6 +27,7 @@ import javax.net.ssl.SSLException;
|
|||
|
||||
import okhttp3.mockwebserver.MockResponse;
|
||||
import okhttp3.mockwebserver.MockWebServer;
|
||||
import org.assertj.core.api.InstanceOfAssertFactories;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.netty.http.HttpResources;
|
||||
|
@ -43,7 +44,6 @@ import org.springframework.boot.actuate.endpoint.ApiVersion;
|
|||
import org.springframework.boot.actuate.endpoint.EndpointId;
|
||||
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
|
||||
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
|
||||
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
||||
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.web.WebOperation;
|
||||
import org.springframework.boot.actuate.endpoint.web.WebOperationRequestPredicate;
|
||||
|
@ -74,7 +74,6 @@ import org.springframework.security.core.userdetails.MapReactiveUserDetailsServi
|
|||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.security.web.server.SecurityWebFilterChain;
|
||||
import org.springframework.security.web.server.WebFilterChainProxy;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
|
@ -121,16 +120,16 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
"vcap.application.cf_api:https://my-cloud-controller.com")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = getHandlerMapping(context);
|
||||
EndpointMapping endpointMapping = (EndpointMapping) ReflectionTestUtils.getField(handlerMapping,
|
||||
"endpointMapping");
|
||||
assertThat(endpointMapping.getPath()).isEqualTo("/cloudfoundryapplication");
|
||||
CorsConfiguration corsConfiguration = (CorsConfiguration) ReflectionTestUtils.getField(handlerMapping,
|
||||
"corsConfiguration");
|
||||
assertThat(corsConfiguration.getAllowedOrigins()).contains("*");
|
||||
assertThat(corsConfiguration.getAllowedMethods())
|
||||
.containsAll(Arrays.asList(HttpMethod.GET.name(), HttpMethod.POST.name()));
|
||||
assertThat(corsConfiguration.getAllowedHeaders())
|
||||
.containsAll(Arrays.asList("Authorization", "X-Cf-App-Instance", "Content-Type"));
|
||||
assertThat(handlerMapping).extracting("endpointMapping.path").isEqualTo("/cloudfoundryapplication");
|
||||
assertThat(handlerMapping)
|
||||
.extracting("corsConfiguration", InstanceOfAssertFactories.type(CorsConfiguration.class))
|
||||
.satisfies((corsConfiguration) -> {
|
||||
assertThat(corsConfiguration.getAllowedOrigins()).contains("*");
|
||||
assertThat(corsConfiguration.getAllowedMethods())
|
||||
.containsAll(Arrays.asList(HttpMethod.GET.name(), HttpMethod.POST.name()));
|
||||
assertThat(corsConfiguration.getAllowedHeaders())
|
||||
.containsAll(Arrays.asList("Authorization", "X-Cf-App-Instance", "Content-Type"));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -150,12 +149,8 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
this.contextRunner
|
||||
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id",
|
||||
"vcap.application.cf_api:https://my-cloud-controller.com")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = getHandlerMapping(context);
|
||||
Object interceptor = ReflectionTestUtils.getField(handlerMapping, "securityInterceptor");
|
||||
String applicationId = (String) ReflectionTestUtils.getField(interceptor, "applicationId");
|
||||
assertThat(applicationId).isEqualTo("my-app-id");
|
||||
});
|
||||
.run((context) -> assertThat(getHandlerMapping(context)).extracting("securityInterceptor.applicationId")
|
||||
.isEqualTo("my-app-id"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -163,28 +158,18 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
this.contextRunner
|
||||
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id",
|
||||
"vcap.application.cf_api:https://my-cloud-controller.com")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = getHandlerMapping(context);
|
||||
Object interceptor = ReflectionTestUtils.getField(handlerMapping, "securityInterceptor");
|
||||
Object interceptorSecurityService = ReflectionTestUtils.getField(interceptor,
|
||||
"cloudFoundrySecurityService");
|
||||
String cloudControllerUrl = (String) ReflectionTestUtils.getField(interceptorSecurityService,
|
||||
"cloudControllerUrl");
|
||||
assertThat(cloudControllerUrl).isEqualTo("https://my-cloud-controller.com");
|
||||
});
|
||||
.run((context) -> assertThat(getHandlerMapping(context))
|
||||
.extracting("securityInterceptor.cloudFoundrySecurityService.cloudControllerUrl")
|
||||
.isEqualTo("https://my-cloud-controller.com"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void cloudFoundryPlatformActiveAndCloudControllerUrlNotPresent() {
|
||||
this.contextRunner.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = context.getBean(
|
||||
"cloudFoundryWebFluxEndpointHandlerMapping", CloudFoundryWebFluxEndpointHandlerMapping.class);
|
||||
Object securityInterceptor = ReflectionTestUtils.getField(handlerMapping, "securityInterceptor");
|
||||
Object interceptorSecurityService = ReflectionTestUtils.getField(securityInterceptor,
|
||||
"cloudFoundrySecurityService");
|
||||
assertThat(interceptorSecurityService).isNull();
|
||||
});
|
||||
.run((context) -> assertThat(context.getBean("cloudFoundryWebFluxEndpointHandlerMapping",
|
||||
CloudFoundryWebFluxEndpointHandlerMapping.class))
|
||||
.extracting("securityInterceptor.cloudFoundrySecurityService")
|
||||
.isNull());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -194,30 +179,30 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id",
|
||||
"vcap.application.cf_api:https://my-cloud-controller.com")
|
||||
.run((context) -> {
|
||||
WebFilterChainProxy chainProxy = context.getBean(WebFilterChainProxy.class);
|
||||
List<SecurityWebFilterChain> filters = (List<SecurityWebFilterChain>) ReflectionTestUtils
|
||||
.getField(chainProxy, "filters");
|
||||
Boolean cfBaseRequestMatches = getMatches(filters, BASE_PATH);
|
||||
Boolean cfBaseWithTrailingSlashRequestMatches = getMatches(filters, BASE_PATH + "/");
|
||||
Boolean cfRequestMatches = getMatches(filters, BASE_PATH + "/test");
|
||||
Boolean cfRequestWithAdditionalPathMatches = getMatches(filters, BASE_PATH + "/test/a");
|
||||
Boolean otherCfRequestMatches = getMatches(filters, BASE_PATH + "/other-path");
|
||||
Boolean otherRequestMatches = getMatches(filters, "/some-other-path");
|
||||
assertThat(cfBaseRequestMatches).isTrue();
|
||||
assertThat(cfBaseWithTrailingSlashRequestMatches).isTrue();
|
||||
assertThat(cfRequestMatches).isTrue();
|
||||
assertThat(cfRequestWithAdditionalPathMatches).isTrue();
|
||||
assertThat(otherCfRequestMatches).isFalse();
|
||||
assertThat(otherRequestMatches).isFalse();
|
||||
otherRequestMatches = filters.get(1)
|
||||
.matches(MockServerWebExchange.from(MockServerHttpRequest.get("/some-other-path").build()))
|
||||
.block(Duration.ofSeconds(30));
|
||||
assertThat(otherRequestMatches).isTrue();
|
||||
assertThat(context.getBean(WebFilterChainProxy.class))
|
||||
.extracting("filters", InstanceOfAssertFactories.list(SecurityWebFilterChain.class))
|
||||
.satisfies((filters) -> {
|
||||
Boolean cfBaseRequestMatches = getMatches(filters, BASE_PATH);
|
||||
Boolean cfBaseWithTrailingSlashRequestMatches = getMatches(filters, BASE_PATH + "/");
|
||||
Boolean cfRequestMatches = getMatches(filters, BASE_PATH + "/test");
|
||||
Boolean cfRequestWithAdditionalPathMatches = getMatches(filters, BASE_PATH + "/test/a");
|
||||
Boolean otherCfRequestMatches = getMatches(filters, BASE_PATH + "/other-path");
|
||||
Boolean otherRequestMatches = getMatches(filters, "/some-other-path");
|
||||
assertThat(cfBaseRequestMatches).isTrue();
|
||||
assertThat(cfBaseWithTrailingSlashRequestMatches).isTrue();
|
||||
assertThat(cfRequestMatches).isTrue();
|
||||
assertThat(cfRequestWithAdditionalPathMatches).isTrue();
|
||||
assertThat(otherCfRequestMatches).isFalse();
|
||||
assertThat(otherRequestMatches).isFalse();
|
||||
otherRequestMatches = filters.get(1)
|
||||
.matches(MockServerWebExchange.from(MockServerHttpRequest.get("/some-other-path").build()))
|
||||
.block(Duration.ofSeconds(30));
|
||||
assertThat(otherRequestMatches).isTrue();
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private static Boolean getMatches(List<SecurityWebFilterChain> filters, String urlTemplate) {
|
||||
private static Boolean getMatches(List<? extends SecurityWebFilterChain> filters, String urlTemplate) {
|
||||
return filters.get(0)
|
||||
.matches(MockServerWebExchange.from(MockServerHttpRequest.get(urlTemplate).build()))
|
||||
.block(Duration.ofSeconds(30));
|
||||
|
@ -322,20 +307,17 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id",
|
||||
"vcap.application.cf_api:https://my-cloud-controller.com",
|
||||
"management.cloudfoundry.skip-ssl-validation:true")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = getHandlerMapping(context);
|
||||
Object interceptor = ReflectionTestUtils.getField(handlerMapping, "securityInterceptor");
|
||||
Object interceptorSecurityService = ReflectionTestUtils.getField(interceptor,
|
||||
"cloudFoundrySecurityService");
|
||||
WebClient webClient = (WebClient) ReflectionTestUtils.getField(interceptorSecurityService,
|
||||
"webClient");
|
||||
ResponseEntity<Void> response = webClient.get()
|
||||
.uri(server.url("/").uri())
|
||||
.retrieve()
|
||||
.toBodilessEntity()
|
||||
.block(Duration.ofSeconds(30));
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204));
|
||||
});
|
||||
.run((context) -> assertThat(getHandlerMapping(context))
|
||||
.extracting("securityInterceptor.cloudFoundrySecurityService.webClient",
|
||||
InstanceOfAssertFactories.type(WebClient.class))
|
||||
.satisfies((webClient) -> {
|
||||
ResponseEntity<Void> response = webClient.get()
|
||||
.uri(server.url("/").uri())
|
||||
.retrieve()
|
||||
.toBodilessEntity()
|
||||
.block(Duration.ofSeconds(30));
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204));
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -351,21 +333,16 @@ class ReactiveCloudFoundryActuatorAutoConfigurationTests {
|
|||
this.contextRunner.withConfiguration(AutoConfigurations.of(HealthEndpointAutoConfiguration.class))
|
||||
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id",
|
||||
"vcap.application.cf_api:https://my-cloud-controller.com")
|
||||
.run((context) -> {
|
||||
CloudFoundryWebFluxEndpointHandlerMapping handlerMapping = getHandlerMapping(context);
|
||||
Object interceptor = ReflectionTestUtils.getField(handlerMapping, "securityInterceptor");
|
||||
Object interceptorSecurityService = ReflectionTestUtils.getField(interceptor,
|
||||
"cloudFoundrySecurityService");
|
||||
WebClient webClient = (WebClient) ReflectionTestUtils.getField(interceptorSecurityService,
|
||||
"webClient");
|
||||
assertThatExceptionOfType(RuntimeException.class)
|
||||
.run((context) -> assertThat(getHandlerMapping(context))
|
||||
.extracting("securityInterceptor.cloudFoundrySecurityService.webClient",
|
||||
InstanceOfAssertFactories.type(WebClient.class))
|
||||
.satisfies((webClient) -> assertThatExceptionOfType(RuntimeException.class)
|
||||
.isThrownBy(() -> webClient.get()
|
||||
.uri(server.url("/").uri())
|
||||
.retrieve()
|
||||
.toBodilessEntity()
|
||||
.block(Duration.ofSeconds(30)))
|
||||
.withCauseInstanceOf(SSLException.class);
|
||||
});
|
||||
.withCauseInstanceOf(SSLException.class)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -53,9 +53,7 @@ import org.springframework.boot.actuate.health.Status;
|
|||
import org.springframework.boot.actuate.health.StatusAggregator;
|
||||
import org.springframework.boot.actuate.health.SystemHealth;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener;
|
||||
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
|
||||
import org.springframework.boot.logging.LogLevel;
|
||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
|
||||
|
@ -365,7 +363,6 @@ class HealthEndpointAutoConfigurationTests {
|
|||
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
|
||||
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
|
||||
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
|
||||
.withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO))
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class);
|
||||
assertThat(context).hasNotFailed();
|
||||
|
|
|
@ -63,7 +63,7 @@ class OtlpMetricsPropertiesConfigAdapterTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
void whenPropertiesUrlIsNotSetThanUseOtlpConfigUrlAsFallback() {
|
||||
void whenPropertiesUrlIsNotSetThenUseOtlpConfigUrlAsFallback() {
|
||||
assertThat(this.properties.getUrl()).isNull();
|
||||
OtlpMetricsPropertiesConfigAdapter adapter = spy(createAdapter());
|
||||
given(adapter.get("management.otlp.metrics.export.url")).willReturn("https://my-endpoint/v1/metrics");
|
||||
|
|
|
@ -45,7 +45,7 @@ public class JdbcProperties {
|
|||
|
||||
/**
|
||||
* Whether to ignore JDBC statement warnings (SQLWarning). When set to false,
|
||||
* throw a SQLWarningException instead.
|
||||
* throw an SQLWarningException instead.
|
||||
*/
|
||||
private boolean ignoreWarnings = true;
|
||||
|
||||
|
|
|
@ -1156,7 +1156,7 @@ public class ServerProperties {
|
|||
WHEN_AVAILABLE,
|
||||
|
||||
/**
|
||||
* Never user APR.
|
||||
* Never use APR.
|
||||
*/
|
||||
NEVER
|
||||
|
||||
|
|
|
@ -35,9 +35,7 @@ import org.springframework.aot.hint.RuntimeHints;
|
|||
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration.GraphQlResourcesRuntimeHints;
|
||||
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener;
|
||||
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
|
||||
import org.springframework.boot.logging.LogLevel;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.boot.test.system.CapturedOutput;
|
||||
import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||
|
@ -89,12 +87,11 @@ class GraphQlAutoConfigurationTests {
|
|||
|
||||
@Test
|
||||
void shouldContributeDefaultBeans() {
|
||||
this.contextRunner.withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO))
|
||||
.run((context) -> assertThat(context).hasSingleBean(GraphQlSource.class)
|
||||
.hasSingleBean(BatchLoaderRegistry.class)
|
||||
.hasSingleBean(ExecutionGraphQlService.class)
|
||||
.hasSingleBean(AnnotatedControllerConfigurer.class)
|
||||
.hasSingleBean(EncodingCursorStrategy.class));
|
||||
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(GraphQlSource.class)
|
||||
.hasSingleBean(BatchLoaderRegistry.class)
|
||||
.hasSingleBean(ExecutionGraphQlService.class)
|
||||
.hasSingleBean(AnnotatedControllerConfigurer.class)
|
||||
.hasSingleBean(EncodingCursorStrategy.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -25,8 +25,6 @@ import com.zaxxer.hikari.HikariDataSource;
|
|||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener;
|
||||
import org.springframework.boot.logging.LogLevel;
|
||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.boot.testsupport.classpath.ClassPathExclusions;
|
||||
|
@ -46,25 +44,22 @@ class DataSourceAutoConfigurationWithoutSpringJdbcTests {
|
|||
|
||||
@Test
|
||||
void pooledDataSourceCanBeAutoConfigured() {
|
||||
this.contextRunner.withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO))
|
||||
.run((context) -> {
|
||||
HikariDataSource dataSource = context.getBean(HikariDataSource.class);
|
||||
assertThat(dataSource.getJdbcUrl()).isNotNull();
|
||||
assertThat(dataSource.getDriverClassName()).isNotNull();
|
||||
});
|
||||
this.contextRunner.run((context) -> {
|
||||
HikariDataSource dataSource = context.getBean(HikariDataSource.class);
|
||||
assertThat(dataSource.getJdbcUrl()).isNotNull();
|
||||
assertThat(dataSource.getDriverClassName()).isNotNull();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void withoutConnectionPoolsAutoConfigurationBacksOff() {
|
||||
this.contextRunner.withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO))
|
||||
.with(hideConnectionPools())
|
||||
this.contextRunner.with(hideConnectionPools())
|
||||
.run((context) -> assertThat(context).doesNotHaveBean(DataSource.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void withUrlAndWithoutConnectionPoolsAutoConfigurationBacksOff() {
|
||||
this.contextRunner.withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO))
|
||||
.with(hideConnectionPools())
|
||||
this.contextRunner.with(hideConnectionPools())
|
||||
.withPropertyValues("spring.datasource.url:jdbc:hsqldb:mem:testdb-" + new Random().nextInt())
|
||||
.run((context) -> assertThat(context).doesNotHaveBean(DataSource.class));
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ import org.springframework.boot.docker.compose.service.connection.DockerComposeC
|
|||
*/
|
||||
class LLdapDockerComposeConnectionDetailsFactory extends DockerComposeConnectionDetailsFactory<LdapConnectionDetails> {
|
||||
|
||||
protected LLdapDockerComposeConnectionDetailsFactory() {
|
||||
LLdapDockerComposeConnectionDetailsFactory() {
|
||||
super("lldap/lldap");
|
||||
}
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ If you have defined your own javadoc:io.opentelemetry.sdk.resources.Resource[] b
|
|||
NOTE: Spring Boot does not provide auto-configuration for OpenTelemetry metrics or logging.
|
||||
OpenTelemetry tracing is only auto-configured when used together with xref:actuator/tracing.adoc[Micrometer Tracing].
|
||||
|
||||
NOTE: The `OTEL_RESOURCE_ATTRIBUTES` environment variable consist of a list of key-value pairs.
|
||||
NOTE: The `OTEL_RESOURCE_ATTRIBUTES` environment variable consists of a list of key-value pairs.
|
||||
For example: `key1=value1,key2=value2,key3=spring%20boot`.
|
||||
All attribute values are treated as strings, and any characters outside the baggage-octet range must be **percent-encoded**.
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ import java.util.regex.Matcher;
|
|||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* User provided hint for an otherwise missing file extension.
|
||||
* User-provided hint for an otherwise missing file extension.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
|
|
|
@ -163,10 +163,8 @@ public enum EmbeddedDatabaseConnection {
|
|||
* @return true if the data source is one of the embedded types
|
||||
*/
|
||||
public static boolean isEmbedded(DataSource dataSource) {
|
||||
try {
|
||||
try (Connection connection = dataSource.getConnection()) {
|
||||
return new IsEmbedded().apply(connection);
|
||||
}
|
||||
try (Connection connection = dataSource.getConnection()) {
|
||||
return new IsEmbedded().apply(connection);
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
// Could not connect, which means it's not embedded
|
||||
|
|
Loading…
Reference in New Issue