Merge branch 'apache-3.2' into apache-3.3

# Conflicts:
#	dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
This commit is contained in:
Albumen Kevin 2023-11-15 11:40:53 +08:00
commit 976516cbc1
17 changed files with 173 additions and 226 deletions

View File

@ -95,7 +95,7 @@
<javassist_version>3.29.2-GA</javassist_version>
<bytebuddy.version>1.14.9</bytebuddy.version>
<netty_version>3.2.10.Final</netty_version>
<netty4_version>4.1.100.Final</netty4_version>
<netty4_version>4.1.101.Final</netty4_version>
<mina_version>2.2.1</mina_version>
<grizzly_version>2.4.4</grizzly_version>
<httpclient_version>4.5.14</httpclient_version>

View File

@ -48,7 +48,7 @@
<profile>
<id>dubbo-all</id>
<activation>
<jdk>[8,)</jdk>
<jdk>[1.7,)</jdk>
</activation>
<modules>
<module>dubbo-all</module>

View File

@ -27,10 +27,13 @@ import org.apache.dubbo.spring.boot.actuate.endpoint.condition.CompatibleConditi
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* Dubbo {@link Endpoint @Endpoint} Auto-{@link Configuration} for Spring Boot Actuator 2.0
*
@ -38,6 +41,7 @@ import org.springframework.context.annotation.PropertySource;
* @see Configuration
* @since 2.7.0
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@Configuration
@PropertySource(
name = "Dubbo Endpoints Default Properties",

View File

@ -23,10 +23,14 @@ import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegi
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication
@AutoConfigureAfter(CompositeMeterRegistryAutoConfiguration.class)

View File

@ -25,15 +25,19 @@ import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* Dubbo {@link Endpoint} Auto Configuration is compatible with Spring Boot Actuator 1.x
*
* @since 2.7.0
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@Configuration
@ConditionalOnClass(
name = {"org.springframework.boot.actuate.endpoint.Endpoint" // Spring Boot 1.x

View File

@ -20,12 +20,16 @@ import org.apache.dubbo.spring.boot.actuate.endpoint.metadata.AbstractDubboMetad
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* Dubbo Endpoints Metadata Auto-{@link Configuration}
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@ConditionalOnClass(
name = {"org.springframework.boot.actuate.health.Health" // If spring-boot-actuator is present
})

View File

@ -35,7 +35,10 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
@ConditionalOnClass(name = {"org.springframework.boot.actuate.health.Health"})
@ConditionalOnProperty(name = "management.health.dubbo.enabled", matchIfMissing = true, havingValue = "true")
@ConditionalOnProperty(
name = {"management.health.dubbo.enabled", "dubbo.enabled"},
matchIfMissing = true,
havingValue = "true")
@EnableConfigurationProperties(DubboHealthIndicatorProperties.class)
public class DubboHealthIndicatorAutoConfiguration {

View File

@ -25,41 +25,33 @@ import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import static org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors;
/**
* {@link DubboAutoConfiguration} Test On multiple Dubbo Configuration
*
* @since 2.7.0
*/
@Ignore
@RunWith(SpringRunner.class)
@TestPropertySource(
properties = {
"dubbo.applications.application1.NAME = dubbo-demo-application",
"dubbo.modules.module1.name = dubbo-demo-module",
"dubbo.registries.registry1.address = zookeeper://192.168.99.100:32770",
"dubbo.applications.application1.name=dubbo-demo-multi-application",
"dubbo.modules.module1.name=dubbo-demo-module",
"dubbo.registries.registry1.address=test://192.168.99.100:32770",
"dubbo.protocols.protocol1.name=dubbo",
"dubbo.protocols.protocol1.pORt=20880",
"dubbo.monitors.monitor1.Address=zookeeper://127.0.0.1:32770",
"dubbo.protocols.protocol1.port=20880",
"dubbo.monitors.monitor1.address=test://127.0.0.1:32770",
"dubbo.providers.provider1.host=127.0.0.1",
"dubbo.consumers.consumer1.client=netty",
"dubbo.config.multiple=true",
@ -67,62 +59,39 @@ import static org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncl
})
@SpringBootTest(classes = {DubboAutoConfigurationOnMultipleConfigTest.class})
@EnableAutoConfiguration
@ComponentScan
public class DubboAutoConfigurationOnMultipleConfigTest {
@Autowired
private Environment environment;
@Autowired
private ApplicationContext applicationContext;
/**
* {@link ApplicationConfig}
* @see TestBeansConfiguration
*/
@Autowired
@Qualifier("application1")
private ApplicationConfig application;
ApplicationConfig application;
/**
* {@link ModuleConfig}
*/
@Autowired
@Qualifier("module1")
private ModuleConfig module;
ModuleConfig module;
/**
* {@link RegistryConfig}
*/
@Autowired
@Qualifier("registry1")
private RegistryConfig registry;
RegistryConfig registry;
/**
* {@link ProtocolConfig}
*/
@Autowired
@Qualifier("protocol1")
private ProtocolConfig protocol;
/**
* {@link MonitorConfig}
*/
@Autowired
@Qualifier("monitor1")
private MonitorConfig monitor;
MonitorConfig monitor;
/**
* {@link ProviderConfig}
*/
@Autowired
@Qualifier("provider1")
private ProviderConfig provider;
@Qualifier("protocol1")
ProtocolConfig protocol;
/**
* {@link ConsumerConfig}
*/
@Autowired
@Qualifier("consumer1")
private ConsumerConfig consumer;
ConsumerConfig consumer;
@Autowired
@Qualifier("provider1")
ProviderConfig provider;
@Before
public void init() {
@ -134,134 +103,24 @@ public class DubboAutoConfigurationOnMultipleConfigTest {
DubboBootstrap.reset();
}
@Autowired
private Map<String, ApplicationConfig> applications = new LinkedHashMap<>();
@Autowired
private Map<String, ModuleConfig> modules = new LinkedHashMap<>();
@Autowired
private Map<String, RegistryConfig> registries = new LinkedHashMap<>();
@Autowired
private Map<String, ProtocolConfig> protocols = new LinkedHashMap<>();
@Autowired
private Map<String, MonitorConfig> monitors = new LinkedHashMap<>();
@Autowired
private Map<String, ProviderConfig> providers = new LinkedHashMap<>();
@Autowired
private Map<String, ConsumerConfig> consumers = new LinkedHashMap<>();
@Test
public void testMultipleDubboConfigBindingProperties() {
Assert.assertEquals(1, applications.size());
Assert.assertEquals(1, modules.size());
Assert.assertEquals(1, registries.size());
Assert.assertEquals(1, protocols.size());
Assert.assertEquals(1, monitors.size());
Assert.assertEquals(1, providers.size());
Assert.assertEquals(1, consumers.size());
}
@Test
public void testApplicationContext() {
/**
* Multiple {@link ApplicationConfig}
*/
Map<String, ApplicationConfig> applications =
beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class);
Assert.assertEquals(1, applications.size());
/**
* Multiple {@link ModuleConfig}
*/
Map<String, ModuleConfig> modules = beansOfTypeIncludingAncestors(applicationContext, ModuleConfig.class);
Assert.assertEquals(1, modules.size());
/**
* Multiple {@link RegistryConfig}
*/
Map<String, RegistryConfig> registries =
beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class);
Assert.assertEquals(1, registries.size());
/**
* Multiple {@link ProtocolConfig}
*/
Map<String, ProtocolConfig> protocols = beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class);
Assert.assertEquals(1, protocols.size());
/**
* Multiple {@link MonitorConfig}
*/
Map<String, MonitorConfig> monitors = beansOfTypeIncludingAncestors(applicationContext, MonitorConfig.class);
Assert.assertEquals(1, monitors.size());
/**
* Multiple {@link ProviderConfig}
*/
Map<String, ProviderConfig> providers = beansOfTypeIncludingAncestors(applicationContext, ProviderConfig.class);
Assert.assertEquals(1, providers.size());
/**
* Multiple {@link ConsumerConfig}
*/
Map<String, ConsumerConfig> consumers = beansOfTypeIncludingAncestors(applicationContext, ConsumerConfig.class);
Assert.assertEquals(1, consumers.size());
}
@Test
public void testApplicationConfig() {
Assert.assertEquals("dubbo-demo-application", application.getName());
}
@Test
public void testModuleConfig() {
public void testMultiConfig() {
// application
Assert.assertEquals("dubbo-demo-multi-application", application.getName());
// module
Assert.assertEquals("dubbo-demo-module", module.getName());
}
@Test
public void testRegistryConfig() {
Assert.assertEquals("zookeeper://192.168.99.100:32770", registry.getAddress());
}
@Test
public void testMonitorConfig() {
Assert.assertEquals("zookeeper://127.0.0.1:32770", monitor.getAddress());
}
@Test
public void testProtocolConfig() {
// registry
Assert.assertEquals("test://192.168.99.100:32770", registry.getAddress());
Assert.assertEquals("test", registry.getProtocol());
Assert.assertEquals(Integer.valueOf(32770), registry.getPort());
// monitor
Assert.assertEquals("test://127.0.0.1:32770", monitor.getAddress());
// protocol
Assert.assertEquals("dubbo", protocol.getName());
Assert.assertEquals(Integer.valueOf(20880), protocol.getPort());
}
@Test
public void testConsumerConfig() {
// consumer
Assert.assertEquals("netty", consumer.getClient());
// provider
Assert.assertEquals("127.0.0.1", provider.getHost());
}
}

View File

@ -28,14 +28,12 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
@ -44,21 +42,21 @@ import org.springframework.test.context.junit4.SpringRunner;
*
* @since 2.7.0
*/
@Ignore
@RunWith(SpringRunner.class)
@TestPropertySource(
properties = {
"dubbo.application.name = dubbo-demo-application",
"dubbo.application.name = dubbo-demo-single-application",
"dubbo.module.name = dubbo-demo-module",
"dubbo.registry.address = zookeeper://192.168.99.100:32770",
"dubbo.registry.address = test://192.168.99.100:32770",
"dubbo.protocol.name=dubbo",
"dubbo.protocol.port=20880",
"dubbo.monitor.address=zookeeper://127.0.0.1:32770",
"dubbo.monitor.address=test://127.0.0.1:32770",
"dubbo.provider.host=127.0.0.1",
"dubbo.consumer.client=netty"
})
@SpringBootTest(classes = {DubboAutoConfigurationOnSingleConfigTest.class})
@EnableAutoConfiguration
@ComponentScan
public class DubboAutoConfigurationOnSingleConfigTest {
@Autowired
@ -82,12 +80,6 @@ public class DubboAutoConfigurationOnSingleConfigTest {
@Autowired
private ProtocolConfig protocolConfig;
@Autowired
private Environment environment;
@Autowired
private ApplicationContext applicationContext;
@Before
public void init() {
DubboBootstrap.reset();
@ -99,45 +91,21 @@ public class DubboAutoConfigurationOnSingleConfigTest {
}
@Test
public void testApplicationConfig() {
Assert.assertEquals("dubbo-demo-application", applicationConfig.getName());
}
@Test
public void testModuleConfig() {
public void testSingleConfig() {
// application
Assert.assertEquals("dubbo-demo-single-application", applicationConfig.getName());
// module
Assert.assertEquals("dubbo-demo-module", moduleConfig.getName());
}
@Test
public void testRegistryConfig() {
Assert.assertEquals("zookeeper://192.168.99.100:32770", registryConfig.getAddress());
}
@Test
public void testMonitorConfig() {
Assert.assertEquals("zookeeper://127.0.0.1:32770", monitorConfig.getAddress());
}
@Test
public void testProtocolConfig() {
// registry
Assert.assertEquals("test://192.168.99.100:32770", registryConfig.getAddress());
// monitor
Assert.assertEquals("test://127.0.0.1:32770", monitorConfig.getAddress());
// protocol
Assert.assertEquals("dubbo", protocolConfig.getName());
Assert.assertEquals(Integer.valueOf(20880), protocolConfig.getPort());
}
@Test
public void testProviderConfig() {
// consumer
Assert.assertEquals("netty", consumerConfig.getClient());
// provider
Assert.assertEquals("127.0.0.1", providerConfig.getHost());
}
@Test
public void testConsumerConfig() {
Assert.assertEquals("netty", consumerConfig.getClient());
}
}

View File

@ -0,0 +1,81 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.spring.boot.autoconfigure;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConsumerConfig;
import org.apache.dubbo.config.ModuleConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TestBeansConfiguration {
@Bean
ApplicationConfig application1() {
ApplicationConfig config = new ApplicationConfig();
config.setId("application1");
return config;
}
@Bean
ModuleConfig module1() {
ModuleConfig config = new ModuleConfig();
config.setId("module1");
return config;
}
@Bean
RegistryConfig registry1() {
RegistryConfig config = new RegistryConfig();
config.setId("registry1");
return config;
}
@Bean
MonitorConfig monitor1() {
MonitorConfig config = new MonitorConfig();
config.setId("monitor1");
return config;
}
@Bean
ProtocolConfig protocol1() {
ProtocolConfig config = new ProtocolConfig();
config.setId("protocol1");
return config;
}
@Bean
ConsumerConfig consumer1() {
ConsumerConfig config = new ConsumerConfig();
config.setId("consumer1");
return config;
}
@Bean
ProviderConfig provider1() {
ProviderConfig config = new ProviderConfig();
config.setId("provider1");
return config;
}
}

View File

@ -20,10 +20,12 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
/**
* {@link AwaitingNonWebApplicationListener} Test
*/
@Ignore
public class AwaitingNonWebApplicationListenerTest {
@Before

View File

@ -22,13 +22,17 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* copy from {@link org.springframework.boot.actuate.autoconfigure.tracing.MicrometerTracingAutoConfiguration}
* this class is available starting from Boot 3.0. It's not available if you're using Boot < 3.0
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@ConditionalOnDubboTracingEnable
@ConditionalOnClass(
name = {

View File

@ -36,15 +36,19 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* Register observationRegistry to ApplicationModel.
* Create observationRegistry when you are using Boot <3.0 or you are not using spring-boot-starter-actuator
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@AutoConfiguration(
after = DubboMicrometerTracingAutoConfiguration.class,
afterName = "org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration")

View File

@ -37,9 +37,12 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* provider Brave when you are using Boot <3.0 or you are not using spring-boot-starter-actuator
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@AutoConfiguration(
before = DubboMicrometerTracingAutoConfiguration.class,
afterName = "org.springframework.boot.actuate.autoconfigure.tracing.BraveAutoConfiguration")

View File

@ -35,10 +35,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean;
import static org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils.DUBBO_TRACING_OTLP_CONFIG_PREFIX;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* @since 3.2.2
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@AutoConfiguration
@ConditionalOnClass({OtelTracer.class, SdkTracerProvider.class, OpenTelemetry.class, OtlpGrpcSpanExporter.class})
@ConditionalOnDubboTracingEnable

View File

@ -36,6 +36,7 @@ import zipkin2.codec.SpanBytesEncoder;
import zipkin2.reporter.Sender;
import static org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils.DUBBO_TRACING_ZIPKIN_CONFIG_PREFIX;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* {@link EnableAutoConfiguration Auto-configuration} for Zipkin.
@ -46,6 +47,7 @@ import static org.apache.dubbo.spring.boot.observability.autoconfigure.Observabi
*
* @since 3.2.1
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@AutoConfiguration(
after = RestTemplateAutoConfiguration.class,
afterName = "org.springframework.boot.actuate.autoconfigure.tracing.zipkin")

View File

@ -36,9 +36,12 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX;
/**
* provider OpenTelemetry when you are using Boot <3.0 or you are not using spring-boot-starter-actuator
*/
@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true)
@AutoConfiguration(
before = DubboMicrometerTracingAutoConfiguration.class,
afterName = "org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryAutoConfiguration")