diff --git a/custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/json/ProxyConfigParser.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/json/ProxyConfigParser.java similarity index 100% rename from custom/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/json/ProxyConfigParser.java rename to libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/json/ProxyConfigParser.java diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParser.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParser.java new file mode 100644 index 00000000..d13101bd --- /dev/null +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParser.java @@ -0,0 +1,46 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigParser; +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.joboe.config.ProxyConfig; +import com.solarwinds.opentelemetry.extensions.config.parser.json.ProxyConfigParser; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; + +@SuppressWarnings("rawtypes") +@AutoService(ConfigParser.class) +public class ProxyParser implements ConfigParser { + + private static final String CONFIG_KEY = "agent.proxy"; + + @Override + public ProxyConfig convert(DeclarativeConfigProperties declarativeConfigProperties) + throws InvalidConfigException { + String proxyString = declarativeConfigProperties.getString(CONFIG_KEY); + if (proxyString == null) { + return null; + } + return ProxyConfigParser.INSTANCE.convert(proxyString); + } + + @Override + public String configKey() { + return CONFIG_KEY; + } +} diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProvider.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProvider.java new file mode 100644 index 00000000..10d49808 --- /dev/null +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProvider.java @@ -0,0 +1,75 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.provider; + +import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.DATA_TYPE_LOGS; + +import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigManager; +import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.ProxyConfig; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; +import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder; +import io.opentelemetry.exporter.otlp.internal.OtlpDeclarativeConfigUtil; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.common.export.ProxyOptions; +import io.opentelemetry.sdk.logs.export.LogRecordExporter; +import java.net.InetSocketAddress; + +@AutoService(ComponentProvider.class) +public class LogExporterComponentProvider implements ComponentProvider { + + public static final String COMPONENT_NAME = "swo/logExporter"; + + @Override + public Class getType() { + return LogRecordExporter.class; + } + + @Override + public String getName() { + return COMPONENT_NAME; + } + + @Override + public LogRecordExporter create(DeclarativeConfigProperties config) { + OtlpHttpLogRecordExporterBuilder builder = OtlpHttpLogRecordExporter.builder(); + + OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder( + DATA_TYPE_LOGS, + config, + builder::setComponentLoader, + builder::setEndpoint, + builder::addHeader, + builder::setCompression, + builder::setTimeout, + builder::setTrustedCertificates, + builder::setClientTls, + builder::setRetryPolicy, + builder::setMemoryMode, + true); + + ProxyConfig proxyConfig = (ProxyConfig) ConfigManager.getConfig(ConfigProperty.AGENT_PROXY); + if (proxyConfig != null) { + builder.setProxyOptions( + ProxyOptions.create(new InetSocketAddress(proxyConfig.getHost(), proxyConfig.getPort()))); + } + + return builder.build(); + } +} diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProvider.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProvider.java index 14723217..5e2825e1 100644 --- a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProvider.java +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProvider.java @@ -19,14 +19,19 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.DATA_TYPE_METRICS; import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigManager; +import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.ProxyConfig; import com.solarwinds.opentelemetry.extensions.DelegatingMetricExporter; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; +import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; import io.opentelemetry.exporter.otlp.internal.OtlpDeclarativeConfigUtil; -import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; -import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.common.export.ProxyOptions; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; +import java.net.InetSocketAddress; @AutoService(ComponentProvider.class) public class MetricExporterComponentProvider implements ComponentProvider { @@ -45,7 +50,7 @@ public String getName() { @Override public MetricExporter create(DeclarativeConfigProperties config) { - OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter.builder(); + OtlpHttpMetricExporterBuilder builder = OtlpHttpMetricExporter.builder(); OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder( DATA_TYPE_METRICS, @@ -59,9 +64,16 @@ public MetricExporter create(DeclarativeConfigProperties config) { builder::setClientTls, builder::setRetryPolicy, builder::setMemoryMode, - false); + true); builder.setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()); + + ProxyConfig proxyConfig = (ProxyConfig) ConfigManager.getConfig(ConfigProperty.AGENT_PROXY); + if (proxyConfig != null) { + builder.setProxyOptions( + ProxyOptions.create(new InetSocketAddress(proxyConfig.getHost(), proxyConfig.getPort()))); + } + return new DelegatingMetricExporter(builder.build()); } } diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java index a0a15d02..fd9be520 100644 --- a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProvider.java @@ -19,8 +19,12 @@ import static com.solarwinds.opentelemetry.extensions.SharedNames.SPAN_STACKTRACE_FILTER_CLASS; import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigManager; import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.joboe.config.ProxyConfig; import com.solarwinds.joboe.config.ServiceKeyUtils; +import com.solarwinds.opentelemetry.extensions.config.parser.yaml.ProxyParser; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration; import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer; @@ -29,12 +33,12 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel; @@ -42,6 +46,7 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; @@ -57,11 +62,15 @@ public class SharedConfigCustomizerProvider implements DeclarativeConfigurationC private final String[] serviceKeyAndEndpoint = new String[2]; + private final ProxyParser parser = new ProxyParser(); + @Override public void customize(DeclarativeConfigurationCustomizer customizer) { customizer.addModelCustomizer( configurationModel -> { setServiceKeyAndEndpoint(configurationModel); + parseProxyConfig(configurationModel); + configurationModel.withAttributeLimits( new AttributeLimitsModel().withAttributeCountLimit(128)); @@ -172,7 +181,21 @@ private void addSpanExporter(OpenTelemetryConfigurationModel model) { .withExportTimeout(60000) .withMaxQueueSize(1024) .withMaxExportBatchSize(512) - .withExporter(new SpanExporterModel().withOtlpGrpc(createModel()))); + .withExporter( + new SpanExporterModel() + .withAdditionalProperty( + SpanExporterComponentProvider.COMPONENT_NAME, + new SpanExporterPropertyModel() + .withAdditionalProperty("timeout", 10000) + .withAdditionalProperty("protocol", "http/protobuf") + .withAdditionalProperty("compression", "gzip") + .withAdditionalProperty( + "endpoint", serviceKeyAndEndpoint[1] + "/v1/traces") + .withAdditionalProperty( + "headers_list", + String.format( + "authorization=Bearer %s", + serviceKeyAndEndpoint[0]))))); ArrayList spanProcessorModels = new ArrayList<>(processors); spanProcessorModels.add(spanProcessorModel); @@ -201,10 +224,11 @@ private void addMetricExporter(OpenTelemetryConfigurationModel model) { MetricExporterComponentProvider.COMPONENT_NAME, new PushMetricExporterPropertyModel() .withAdditionalProperty("timeout", 10000) - .withAdditionalProperty("protocol", "grpc") + .withAdditionalProperty("protocol", "http/protobuf") .withAdditionalProperty("compression", "gzip") .withAdditionalProperty( - "endpoint", serviceKeyAndEndpoint[1]) + "endpoint", + serviceKeyAndEndpoint[1] + "/v1/metrics") .withAdditionalProperty( "temporality_preference", "delta") .withAdditionalProperty( @@ -237,7 +261,21 @@ private void addLogExporter(OpenTelemetryConfigurationModel model) { .withMaxExportBatchSize(512) .withMaxQueueSize(1024) .withExportTimeout(30000) - .withExporter(new LogRecordExporterModel().withOtlpGrpc(createModel()))); + .withExporter( + new LogRecordExporterModel() + .withAdditionalProperty( + LogExporterComponentProvider.COMPONENT_NAME, + new LogRecordExporterPropertyModel() + .withAdditionalProperty("timeout", 10000) + .withAdditionalProperty("protocol", "http/protobuf") + .withAdditionalProperty("compression", "gzip") + .withAdditionalProperty( + "endpoint", serviceKeyAndEndpoint[1] + "/v1/logs") + .withAdditionalProperty( + "headers_list", + String.format( + "authorization=Bearer %s", + serviceKeyAndEndpoint[0]))))); ArrayList logRecordProcessorModels = new ArrayList<>(processors); logRecordProcessorModels.add(logRecordProcessorModel); @@ -245,18 +283,10 @@ private void addLogExporter(OpenTelemetryConfigurationModel model) { } private void setServiceKeyAndEndpoint(OpenTelemetryConfigurationModel model) { - DeclarativeConfigProperties configProperties = - DeclarativeConfiguration.toConfigProperties(model); - - DeclarativeConfigProperties solarwinds = - configProperties - .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) - .getStructured("java", DeclarativeConfigProperties.empty()) - .getStructured("solarwinds"); + DeclarativeConfigProperties solarwinds = getSolarwindsConfig(model); serviceKeyAndEndpoint[0] = - Objects.requireNonNull(solarwinds, "Solarwinds configuration cannot be null.") - .getString(ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), ""); + solarwinds.getString(ConfigProperty.AGENT_SERVICE_KEY.getConfigFileKey(), ""); String endpoint = solarwinds.getString(ConfigProperty.AGENT_COLLECTOR.getConfigFileKey(), ""); endpoint = endpoint.replaceAll("https?://apm|^apm", "https://otel"); @@ -265,11 +295,27 @@ private void setServiceKeyAndEndpoint(OpenTelemetryConfigurationModel model) { serviceKeyAndEndpoint[1] = endpoint; } - private OtlpGrpcExporterModel createModel() { - return new OtlpGrpcExporterModel() - .withCompression("gzip") - .withEndpoint(serviceKeyAndEndpoint[1]) - .withTimeout(10000) - .withHeadersList(String.format("authorization=Bearer %s", serviceKeyAndEndpoint[0])); + private void parseProxyConfig(OpenTelemetryConfigurationModel model) { + DeclarativeConfigProperties solarwinds = getSolarwindsConfig(model); + try { + ProxyConfig proxyConfig = parser.convert(solarwinds); + if (proxyConfig != null) { + ConfigManager.setConfig(ConfigProperty.AGENT_PROXY, proxyConfig); + } + } catch (InvalidConfigException e) { + throw new RuntimeException(e); + } + } + + private DeclarativeConfigProperties getSolarwindsConfig(OpenTelemetryConfigurationModel model) { + DeclarativeConfigProperties configProperties = + DeclarativeConfiguration.toConfigProperties(model); + + return Objects.requireNonNull( + configProperties + .getStructured("instrumentation/development", DeclarativeConfigProperties.empty()) + .getStructured("java", DeclarativeConfigProperties.empty()) + .getStructured("solarwinds"), + "Solarwinds configuration cannot be null."); } } diff --git a/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProvider.java b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProvider.java new file mode 100644 index 00000000..a0c8bec1 --- /dev/null +++ b/libs/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProvider.java @@ -0,0 +1,75 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.provider; + +import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.DATA_TYPE_TRACES; + +import com.google.auto.service.AutoService; +import com.solarwinds.joboe.config.ConfigManager; +import com.solarwinds.joboe.config.ConfigProperty; +import com.solarwinds.joboe.config.ProxyConfig; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; +import io.opentelemetry.exporter.otlp.internal.OtlpDeclarativeConfigUtil; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.common.export.ProxyOptions; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import java.net.InetSocketAddress; + +@AutoService(ComponentProvider.class) +public class SpanExporterComponentProvider implements ComponentProvider { + + public static final String COMPONENT_NAME = "swo/spanExporter"; + + @Override + public Class getType() { + return SpanExporter.class; + } + + @Override + public String getName() { + return COMPONENT_NAME; + } + + @Override + public SpanExporter create(DeclarativeConfigProperties config) { + OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder(); + + OtlpDeclarativeConfigUtil.configureOtlpExporterBuilder( + DATA_TYPE_TRACES, + config, + builder::setComponentLoader, + builder::setEndpoint, + builder::addHeader, + builder::setCompression, + builder::setTimeout, + builder::setTrustedCertificates, + builder::setClientTls, + builder::setRetryPolicy, + builder::setMemoryMode, + true); + + ProxyConfig proxyConfig = (ProxyConfig) ConfigManager.getConfig(ConfigProperty.AGENT_PROXY); + if (proxyConfig != null) { + builder.setProxy( + ProxyOptions.create(new InetSocketAddress(proxyConfig.getHost(), proxyConfig.getPort()))); + } + + return builder.build(); + } +} diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParserTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParserTest.java new file mode 100644 index 00000000..dfff90ad --- /dev/null +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/parser/yaml/ProxyParserTest.java @@ -0,0 +1,74 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.parser.yaml; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.solarwinds.joboe.config.InvalidConfigException; +import com.solarwinds.joboe.config.ProxyConfig; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import org.junit.jupiter.api.Test; + +class ProxyParserTest { + + private final ProxyParser tested = new ProxyParser(); + + @Test + void testConfigKey() { + assertEquals("agent.proxy", tested.configKey()); + } + + @Test + void testConvertReturnsNullWhenProxyStringIsNull() throws InvalidConfigException { + DeclarativeConfigProperties configProperties = mock(DeclarativeConfigProperties.class); + when(configProperties.getString("agent.proxy")).thenReturn(null); + + ProxyConfig result = tested.convert(configProperties); + + assertNull(result); + } + + @Test + void testConvertReturnsProxyConfigWithHostAndPort() throws InvalidConfigException { + DeclarativeConfigProperties configProperties = mock(DeclarativeConfigProperties.class); + when(configProperties.getString("agent.proxy")).thenReturn("http://proxy.example.com:8080"); + + ProxyConfig result = tested.convert(configProperties); + + assertEquals("proxy.example.com", result.getHost()); + assertEquals(8080, result.getPort()); + assertNull(result.getUsername()); + assertNull(result.getPassword()); + } + + @Test + void testConvertReturnsProxyConfigWithCredentials() throws InvalidConfigException { + DeclarativeConfigProperties configProperties = mock(DeclarativeConfigProperties.class); + when(configProperties.getString("agent.proxy")) + .thenReturn("http://user:password@proxy.example.com:3128"); + + ProxyConfig result = tested.convert(configProperties); + + assertEquals("proxy.example.com", result.getHost()); + assertEquals(3128, result.getPort()); + assertEquals("user", result.getUsername()); + assertEquals("password", result.getPassword()); + } +} diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProviderTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProviderTest.java new file mode 100644 index 00000000..8b1f52ee --- /dev/null +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/LogExporterComponentProviderTest.java @@ -0,0 +1,36 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.provider; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import io.opentelemetry.sdk.logs.export.LogRecordExporter; +import org.junit.jupiter.api.Test; + +class LogExporterComponentProviderTest { + private final LogExporterComponentProvider tested = new LogExporterComponentProvider(); + + @Test + void testName() { + assertEquals("swo/logExporter", tested.getName()); + } + + @Test + void testGetType() { + assertEquals(LogRecordExporter.class, tested.getType()); + } +} diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProviderTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProviderTest.java index 3795cb81..f4bf70be 100644 --- a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProviderTest.java +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProviderTest.java @@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import io.opentelemetry.sdk.metrics.export.MetricExporter; import org.junit.jupiter.api.Test; class MetricExporterComponentProviderTest { @@ -27,4 +28,9 @@ class MetricExporterComponentProviderTest { void testName() { assertEquals("swo/metricExporter", tested.getName()); } + + @Test + void testGetType() { + assertEquals(MetricExporter.class, tested.getType()); + } } diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java index 76786844..cabf3c53 100644 --- a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SharedConfigCustomizerProviderTest.java @@ -29,10 +29,10 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterPropertyModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; -import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpGrpcExporterModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; @@ -117,13 +117,14 @@ void testCustomize() { assertNotNull(batch); LogRecordExporterModel exporter = batch.getExporter(); - OtlpGrpcExporterModel otlp = exporter.getOtlpGrpc(); - - assertNotNull(otlp); - assertEquals("https://otel.collector.com", otlp.getEndpoint()); - assertEquals("authorization=Bearer token", otlp.getHeadersList()); - - assertEquals("gzip", otlp.getCompression()); + LogRecordExporterPropertyModel logExporterProperty = + exporter.getAdditionalProperties().get(LogExporterComponentProvider.COMPONENT_NAME); + + assertNotNull(logExporterProperty); + Map logConfigs = logExporterProperty.getAdditionalProperties(); + assertEquals("https://otel.collector.com/v1/logs", logConfigs.get("endpoint")); + assertEquals("authorization=Bearer token", logConfigs.get("headers_list")); + assertEquals("gzip", logConfigs.get("compression")); } @Test @@ -178,10 +179,10 @@ void testCustomize1() { assertNotNull(configs); assertEquals(10000, configs.get("timeout")); - assertEquals("grpc", configs.get("protocol")); + assertEquals("http/protobuf", configs.get("protocol")); assertEquals("gzip", configs.get("compression")); - assertEquals("https://otel.collector.com", configs.get("endpoint")); + assertEquals("https://otel.collector.com/v1/metrics", configs.get("endpoint")); assertEquals("delta", configs.get("temporality_preference")); assertEquals( "base2_exponential_bucket_histogram", configs.get("default_histogram_aggregation")); @@ -296,11 +297,13 @@ void testCustomize2() { assertNotNull(batch); LogRecordExporterModel exporter = batch.getExporter(); - OtlpGrpcExporterModel otlp = exporter.getOtlpGrpc(); + LogRecordExporterPropertyModel logExporterProperty = + exporter.getAdditionalProperties().get(LogExporterComponentProvider.COMPONENT_NAME); - assertNotNull(otlp); - assertEquals("https://otel.collector.com", otlp.getEndpoint()); - assertEquals("authorization=Bearer token", otlp.getHeadersList()); + assertNotNull(logExporterProperty); + Map logConfigs = logExporterProperty.getAdditionalProperties(); + assertEquals("https://otel.collector.com/v1/logs", logConfigs.get("endpoint")); + assertEquals("authorization=Bearer token", logConfigs.get("headers_list")); } @Test @@ -334,11 +337,13 @@ void UrlShouldNotChangeWhenNotApm() { assertNotNull(batch); LogRecordExporterModel exporter = batch.getExporter(); - OtlpGrpcExporterModel otlp = exporter.getOtlpGrpc(); + LogRecordExporterPropertyModel logExporterProperty = + exporter.getAdditionalProperties().get(LogExporterComponentProvider.COMPONENT_NAME); - assertNotNull(otlp); - assertEquals("http://example.com", otlp.getEndpoint()); - assertEquals("authorization=Bearer token", otlp.getHeadersList()); + assertNotNull(logExporterProperty); + Map logConfigs = logExporterProperty.getAdditionalProperties(); + assertEquals("http://example.com/v1/logs", logConfigs.get("endpoint")); + assertEquals("authorization=Bearer token", logConfigs.get("headers_list")); } @Test @@ -372,10 +377,12 @@ void UrlShouldNotChangeWhenNotApm2() { assertNotNull(batch); LogRecordExporterModel exporter = batch.getExporter(); - OtlpGrpcExporterModel otlp = exporter.getOtlpGrpc(); + LogRecordExporterPropertyModel logExporterProperty = + exporter.getAdditionalProperties().get(LogExporterComponentProvider.COMPONENT_NAME); - assertNotNull(otlp); - assertEquals("http://localhost:4317", otlp.getEndpoint()); - assertEquals("authorization=Bearer token", otlp.getHeadersList()); + assertNotNull(logExporterProperty); + Map logConfigs = logExporterProperty.getAdditionalProperties(); + assertEquals("http://localhost:4317/v1/logs", logConfigs.get("endpoint")); + assertEquals("authorization=Bearer token", logConfigs.get("headers_list")); } } diff --git a/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProviderTest.java b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProviderTest.java new file mode 100644 index 00000000..e90f87f6 --- /dev/null +++ b/libs/shared/src/test/java/com/solarwinds/opentelemetry/extensions/config/provider/SpanExporterComponentProviderTest.java @@ -0,0 +1,36 @@ +/* + * © SolarWinds Worldwide, LLC. All rights reserved. + * + * Licensed 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 com.solarwinds.opentelemetry.extensions.config.provider; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import io.opentelemetry.sdk.trace.export.SpanExporter; +import org.junit.jupiter.api.Test; + +class SpanExporterComponentProviderTest { + private final SpanExporterComponentProvider tested = new SpanExporterComponentProvider(); + + @Test + void testName() { + assertEquals("swo/spanExporter", tested.getName()); + } + + @Test + void testGetType() { + assertEquals(SpanExporter.class, tested.getType()); + } +}