From e40e0d0cdec05fedcd822aafffcb5f075826e1ba Mon Sep 17 00:00:00 2001 From: chenyijiang Date: Thu, 2 Dec 2021 13:11:16 +0800 Subject: [PATCH] Add comments and ut. Add CapaMeterSpi. --- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- .../component/telemetry/SamplerConfig.java | 105 ++++++++++++------ .../CapaContextPropagatorSettings.java | 3 +- .../metrics/CapaMeterProviderSettings.java | 3 +- .../trace/CapaTracerProviderSettings.java | 3 +- .../telemetry/SamplerConfigTest.java | 38 +++++++ .../telemetry/TestMixerProvider.java | 87 +++++++++++++++ .../trace/CapaTracerProviderBuilderTest.java | 1 + ...capa-component-telemetry-common.properties | 1 + ... => capa-component-telemetry-context.json} | 0 ...on => capa-component-telemetry-meter.json} | 0 ...n => capa-component-telemetry-tracer.json} | 0 .../capa-infrastructure-mixer.properties | 1 + sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- .../telemetry/CapaTelemetryClientGlobal.java | 19 ---- .../CapaTelemetryClientGlobalTest.java | 3 +- 22 files changed, 208 insertions(+), 72 deletions(-) create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/SamplerConfigTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/TestMixerProvider.java create mode 100644 sdk-component/src/test/resources/capa-component-telemetry-common.properties rename sdk-component/src/test/resources/{capa-context.json => capa-component-telemetry-context.json} (100%) rename sdk-component/src/test/resources/{capa-meter.json => capa-component-telemetry-meter.json} (100%) rename sdk-component/src/test/resources/{capa-tracer.json => capa-component-telemetry-tracer.json} (100%) create mode 100644 sdk-component/src/test/resources/capa-infrastructure-mixer.properties diff --git a/examples/pom.xml b/examples/pom.xml index 40f3206..6eed8d9 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-examples diff --git a/pom.xml b/pom.xml index 9b98361..9f817f4 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 370c378..608b900 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk-component diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java index f53b99b..94d4bfb 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java @@ -16,19 +16,20 @@ */ package group.rxcloud.capa.component.telemetry; +import com.google.common.collect.Lists; import group.rxcloud.capa.component.telemetry.metrics.CapaMeterProviderBuilder; import group.rxcloud.capa.infrastructure.CapaProperties; import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; import group.rxcloud.capa.infrastructure.hook.Mixer; -import group.rxcloud.cloudruntimes.domain.core.configuration.ConfigurationItem; +import group.rxcloud.cloudruntimes.domain.core.configuration.SubConfigurationResp; import group.rxcloud.cloudruntimes.utils.TypeRef; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; import java.io.Serializable; -import java.util.Collections; -import java.util.List; -import java.util.Optional; import java.util.function.Supplier; /** @@ -36,58 +37,88 @@ */ public class SamplerConfig implements Serializable { - public static final transient String FILE_PATH = "capa-sample.properties"; + private static final long serialVersionUID = -2113523925814197551L; + + public static final transient String FILE_PATH = "capa-component-telemetry-sample.properties"; + + public static final transient String COMMON_FILE_SUFFIX = "telemetry-common"; /** * Sample all data as default. */ - public static final transient SamplerConfig DEFAULT_CONFIG = new SamplerConfig(); + public static final transient SamplerConfig DEFAULT_CONFIG = new SamplerConfig() {{ + setTraceEnable(true); + setMetricsEnable(true); + }}; - private static final transient Logger log = LoggerFactory.getLogger(CapaMeterProviderBuilder.class); + public static final transient SamplerConfig CONFIG = new SamplerConfig(); public static final transient Supplier DEFAULT_SUPPLIER = () -> { - try { - String storeName = Optional.ofNullable(CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply("configuration") - .getProperty( - "CONFIGURATION_COMPONENT_STORE_NAME")) - .orElse("UN_CONFIGURED_STORE_CONFIG_NAME"); - Optional hooksOptional = Mixer.configurationHooksNullable(); - if (hooksOptional.isPresent()) { - List> config = hooksOptional.get().getConfiguration(storeName, - null, - Collections.singletonList(FILE_PATH), - null, - "", - "", - TypeRef.get(SamplerConfig.class)).block(); - if (!config.isEmpty()) { - SamplerConfig item = config.get(0).getContent(); - return item == null ? DEFAULT_CONFIG : item; - } + return CONFIG; + }; + + private static final transient Logger log = LoggerFactory.getLogger(CapaMeterProviderBuilder.class); + + + static { + Mixer.configurationHooksNullable().ifPresent(hooks -> { + try { + subscribeConfiguration(hooks, hooks.defaultConfigurationAppId(), true); + } catch (Throwable throwable) { + log.warn("Fail to load global telemetry config. Dynamic global config is disabled for capa telemetry.", + throwable); + } + try { + subscribeConfiguration(hooks, + CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(COMMON_FILE_SUFFIX).getProperty("appId"), + false); + } catch (Throwable throwable) { + log.warn("Fail to load global telemetry config. Dynamic global config is disabled for capa telemetry.", + throwable); } - } catch (Throwable throwable) { - log.warn("Fail to load config item. Dynamic config is disabled for capa telemetry.", throwable); - } + }); - return DEFAULT_CONFIG; - }; + } - private static final long serialVersionUID = -2113523925814197551L; + private Boolean metricsEnable; - private boolean metricsEnable = true; + private Boolean traceEnable; - private boolean traceEnable = true; + private static void subscribeConfiguration(ConfigurationHooks configurationHooks, String appId, boolean prior) { + String storeName = configurationHooks.registryStoreNames().get(0); + Flux> configFlux = configurationHooks.subscribeConfiguration( + storeName, + appId, + Lists.newArrayList(FILE_PATH), + null, + StringUtils.EMPTY, + StringUtils.EMPTY, + TypeRef.get(SamplerConfig.class)); + configFlux.subscribe(resp -> { + if (CollectionUtils.isNotEmpty(resp.getItems())) { + SamplerConfig config = resp.getItems().get(0).getContent(); + if (config != null) { + if (config.metricsEnable != null && (prior || CONFIG.metricsEnable == null)) { + CONFIG.metricsEnable = config.metricsEnable; + } + if (config.traceEnable != null && (prior || CONFIG.traceEnable == null)) { + CONFIG.traceEnable = config.traceEnable; + } + } + } + }); + } - public boolean isMetricsEnable() { - return metricsEnable; + public Boolean isMetricsEnable() { + return metricsEnable == null ? DEFAULT_CONFIG.metricsEnable : metricsEnable; } public void setMetricsEnable(boolean metricsEnable) { this.metricsEnable = metricsEnable; } - public boolean isTraceEnable() { - return traceEnable; + public Boolean isTraceEnable() { + return traceEnable == null ? DEFAULT_CONFIG.traceEnable : traceEnable; } public void setTraceEnable(boolean traceEnable) { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java index bba38ab..93b2c68 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java @@ -23,8 +23,7 @@ */ public interface CapaContextPropagatorSettings { - // FIXME: 2021/11/28 change to capa-component-telemetry-context.json - String FILE_PATH = "/capa-context.json"; + String FILE_PATH = "/capa-component-telemetry-context.json"; /** * Replace the whole context config. diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java index e190690..3b36b63 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java @@ -25,8 +25,7 @@ */ public interface CapaMeterProviderSettings { - // FIXME: 2021/11/28 change to capa-component-telemetry-meter.json - String FILE_PATH ="/capa-meter.json"; + String FILE_PATH ="/capa-component-telemetry-meter.json"; /** * Replace the whole config for the meter. diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java index f77b840..a98cf06 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java @@ -27,8 +27,7 @@ */ public interface CapaTracerProviderSettings { - // FIXME: 2021/11/28 change to capa-component-telemetry-tracer.json - String FILE_PATH = "/capa-tracer.json"; + String FILE_PATH = "/capa-component-telemetry-tracer.json"; /** * Replace the whole config for the meter. diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/SamplerConfigTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/SamplerConfigTest.java new file mode 100644 index 0000000..c8c4a59 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/SamplerConfigTest.java @@ -0,0 +1,38 @@ +/* + * 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 group.rxcloud.capa.component.telemetry; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +/** + * @author: chenyijiang + * @date: 2021/12/2 12:33 + */ +public class SamplerConfigTest { + + @Test + public void isMetricsEnable() { + assertFalse(SamplerConfig.DEFAULT_SUPPLIER.get().isMetricsEnable()); + } + + @Test + public void isTraceEnable() { + assertFalse(SamplerConfig.DEFAULT_SUPPLIER.get().isTraceEnable()); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/TestMixerProvider.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/TestMixerProvider.java new file mode 100644 index 0000000..2f1ffe5 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/TestMixerProvider.java @@ -0,0 +1,87 @@ +/* + * 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 group.rxcloud.capa.component.telemetry; + +import com.google.common.collect.Lists; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.Mixer; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; +import group.rxcloud.cloudruntimes.domain.core.configuration.ConfigurationItem; +import group.rxcloud.cloudruntimes.domain.core.configuration.SubConfigurationResp; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import reactor.core.publisher.Flux; + +import java.util.List; +import java.util.Map; + +/** + * @author: chenyijiang + * @date: 2021/12/2 12:39 + */ +public class TestMixerProvider implements Mixer.MixerProvider { + + SamplerConfig app = new SamplerConfig() {{setMetricsEnable(false);}}; + SamplerConfig global = new SamplerConfig() {{setTraceEnable(false); setMetricsEnable(true);}}; + + + private ConfigurationHooks configurationHooks = new ConfigurationHooks() { + @Override + public List registryStoreNames() { + return Lists.newArrayList("QConfig"); + } + + @Override + public String defaultConfigurationAppId() { + return "1234567"; + } + + @Override + public Flux> subscribeConfiguration(String storeName, String appId, List keys, Map metadata, String group, String label, TypeRef type) { + + if (type.getType() == SamplerConfig.class) { + if ("123".equals(appId)) { + return Flux.just(getSubscribeResponse(global)); + } + if (defaultConfigurationAppId().equals(appId)) { + return Flux.just(getSubscribeResponse(app)); + } + return Flux.just(null); + } + return ConfigurationHooks.super.subscribeConfiguration(storeName, appId, keys, metadata, type); + } + }; + + private SubConfigurationResp getSubscribeResponse(SamplerConfig samplerConfig) { + SubConfigurationResp subConfigurationResp = new SubConfigurationResp<>(); + ConfigurationItem item = new ConfigurationItem(); + item.setContent(samplerConfig); + subConfigurationResp.setItems(Lists.newArrayList(item)); + return subConfigurationResp; + } + + @Override + public ConfigurationHooks provideConfigurationHooks() { + return configurationHooks; + } + + @Override + public TelemetryHooks provideTelemetryHooks() { + return null; + } + + +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java index 1a19cc6..f4f2232 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java @@ -116,6 +116,7 @@ public boolean matches(ReadableSpan span) { @Test public void buildFromTraceConfig() { CapaTracerProvider provider = new CapaTracerProviderBuilder() + .setSamplerConfig(() -> SamplerConfig.DEFAULT_CONFIG) .buildTracerProvider(); Span span = provider.tracerBuilder("test") diff --git a/sdk-component/src/test/resources/capa-component-telemetry-common.properties b/sdk-component/src/test/resources/capa-component-telemetry-common.properties new file mode 100644 index 0000000..a277f74 --- /dev/null +++ b/sdk-component/src/test/resources/capa-component-telemetry-common.properties @@ -0,0 +1 @@ +appId=123 \ No newline at end of file diff --git a/sdk-component/src/test/resources/capa-context.json b/sdk-component/src/test/resources/capa-component-telemetry-context.json similarity index 100% rename from sdk-component/src/test/resources/capa-context.json rename to sdk-component/src/test/resources/capa-component-telemetry-context.json diff --git a/sdk-component/src/test/resources/capa-meter.json b/sdk-component/src/test/resources/capa-component-telemetry-meter.json similarity index 100% rename from sdk-component/src/test/resources/capa-meter.json rename to sdk-component/src/test/resources/capa-component-telemetry-meter.json diff --git a/sdk-component/src/test/resources/capa-tracer.json b/sdk-component/src/test/resources/capa-component-telemetry-tracer.json similarity index 100% rename from sdk-component/src/test/resources/capa-tracer.json rename to sdk-component/src/test/resources/capa-component-telemetry-tracer.json diff --git a/sdk-component/src/test/resources/capa-infrastructure-mixer.properties b/sdk-component/src/test/resources/capa-infrastructure-mixer.properties new file mode 100644 index 0000000..216b8de --- /dev/null +++ b/sdk-component/src/test/resources/capa-infrastructure-mixer.properties @@ -0,0 +1 @@ +group.rxcloud.capa.infrastructure.hook.Mixer$MixerProvider=group.rxcloud.capa.component.telemetry.TestMixerProvider \ No newline at end of file diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 4d892ae..30f4bb9 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 0f22976..cdfaf90 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index f2811cc..d77b534 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index 5cd1112..b39ac27 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8-alpha-1 + 1.0.8-alpha-2 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index dfa787f..b03d649 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.8-alpha-1 + 1.0.8-alpha-2 capa-sdk diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java index 5755b13..cc71ca9 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java @@ -16,7 +16,6 @@ */ package group.rxcloud.capa.telemetry; -import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterProvider; @@ -31,30 +30,12 @@ public class CapaTelemetryClientGlobal implements CapaTelemetryClient, OpenTelemetry { // noop as default. - private static volatile CapaTelemetryClientGlobal instance; - private TracerProvider tracerProvider = TracerProvider.noop(); private MeterProvider meterProvider = MeterProvider.noop(); private ContextPropagators contextPropagators = ContextPropagators.noop(); - public static CapaTelemetryClientGlobal getOrCreate() { - if (instance == null) { - synchronized (CapaTelemetryClientGlobal.class) { - if (instance == null) { - instance = (CapaTelemetryClientGlobal) new CapaTelemetryClientBuilder().build(); - GlobalOpenTelemetry.set(instance); - } - } - } - return instance; - } - - static void set(CapaTelemetryClientGlobal capaTelemetryClient) { - instance = capaTelemetryClient; - } - protected List registryNames; @Override diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java index 579d125..4c2d13e 100644 --- a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java @@ -31,13 +31,12 @@ public class CapaTelemetryClientGlobalTest { @Test public void getOrCreate() { - CapaTelemetryClient client = CapaTelemetryClientGlobal.getOrCreate(); + CapaTelemetryClient client = new CapaTelemetryClientBuilder().build(); assertTrue(client instanceof CapaTelemetryClientGlobal); assertNotNull(client.getContextPropagators()); assertNotNull(((CapaTelemetryClientGlobal) client).getPropagators()); assertNotNull(((CapaTelemetryClientGlobal) client).getMeterProvider()); assertNotNull(((CapaTelemetryClientGlobal) client).getTracerProvider()); assertNotNull(GlobalOpenTelemetry.get()); - assertEquals(client, CapaTelemetryClientGlobal.getOrCreate()); } } \ No newline at end of file