From 1964c222be6773dac5d08f9746c20dd4a8450775 Mon Sep 17 00:00:00 2001 From: chenyijiang Date: Tue, 30 Nov 2021 19:35:44 +0800 Subject: [PATCH] Fix Histogram Metrics. Add sample config. --- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- .../component/telemetry/SamplerConfig.java | 87 +++++++++++-------- .../metrics/CapaDoubleHistogram.java | 47 ++++++++++ .../metrics/CapaDoubleHistogramBuilder.java | 76 ++++++++++++++++ .../telemetry/metrics/CapaLongHistogram.java | 45 ++++++++++ .../metrics/CapaLongHistogramBuilder.java | 75 ++++++++++++++++ .../telemetry/metrics/CapaMeter.java | 72 +++++++++++++++ .../telemetry/metrics/CapaMeterBuilder.java | 56 ++++++++++++ .../telemetry/metrics/CapaMeterProvider.java | 46 ++++++++++ .../metrics/CapaMeterProviderBuilder.java | 26 +++--- .../metrics/CapaMeterProviderSettings.java | 4 +- .../telemetry/metrics/CapaMeterWrapper.java | 65 ++++++++++++++ .../metrics/CapaMetricsExporter.java | 66 ++++++++++++++ .../telemetry/metrics/CapaMetricsSampler.java | 59 ++++--------- .../telemetry/trace/CapaSpanBuilder.java | 2 +- .../telemetry/trace/CapaTraceSampler.java | 34 +++----- .../component/telemetry/trace/CapaTracer.java | 2 +- .../telemetry/trace/CapaTracerBuilder.java | 2 +- .../telemetry/trace/CapaTracerProvider.java | 2 +- .../trace/CapaTracerProviderBuilder.java | 14 +-- .../trace/CapaTracerProviderSettings.java | 4 +- ...apaWrapper.java => CapaTracerWrapper.java} | 4 +- .../metrics/CapaMeterProviderBuilderTest.java | 12 +-- .../metrics/CapaMetricsSamplerTest.java | 39 +++------ .../metrics/TestMetricsExporter.java | 14 ++- .../telemetry/trace/CapaTraceSamplerTest.java | 35 ++++---- .../trace/CapaTracerProviderBuilderTest.java | 2 +- .../src/test/resources/capa-sample.properties | 2 - sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- .../spi/telemetry/CapaDoubleHistogramSpi.java | 28 ++++++ .../spi/telemetry/CapaLongHistogramSpi.java | 29 +++++++ .../spi/telemetry/CapaMetricsExporterSpi.java | 33 +++++++ sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- .../telemetry/CapaTelemetryClientBuilder.java | 4 +- .../CapaTelemetryClientBuilderTest.java | 2 +- .../capa/telemetry/MetricTestExporter.java | 15 +++- 41 files changed, 810 insertions(+), 209 deletions(-) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogram.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogramBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogram.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogramBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeter.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProvider.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterWrapper.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsExporter.java rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/{CapaWrapper.java => CapaTracerWrapper.java} (98%) delete mode 100644 sdk-component/src/test/resources/capa-sample.properties create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaDoubleHistogramSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaLongHistogramSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMetricsExporterSpi.java diff --git a/examples/pom.xml b/examples/pom.xml index 739a0b7..40f3206 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-examples diff --git a/pom.xml b/pom.xml index b8f7b9d..5fb5bf2 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 22941a3..a669e53 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7.RELEASE + 1.0.8-alpha-1 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 702962e..f53b99b 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,66 +16,81 @@ */ package group.rxcloud.capa.component.telemetry; -import group.rxcloud.capa.infrastructure.utils.SpiUtils; +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.utils.TypeRef; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.Serializable; -import java.util.Properties; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; /** * Sampler config. */ public class SamplerConfig implements Serializable { - public static final String FILE_PATH = "/capa-sample.properties"; + public static final transient String FILE_PATH = "capa-sample.properties"; /** * Sample all data as default. */ public static final transient SamplerConfig DEFAULT_CONFIG = new SamplerConfig(); - private static final long serialVersionUID = -2113523925814197551L; - - private boolean metricsSample = true; + private static final transient Logger log = LoggerFactory.getLogger(CapaMeterProviderBuilder.class); + + 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; + } + } + } catch (Throwable throwable) { + log.warn("Fail to load config item. Dynamic config is disabled for capa telemetry.", throwable); + } - private boolean traceSample = true; + return DEFAULT_CONFIG; + }; - private boolean logSample = true; + private static final long serialVersionUID = -2113523925814197551L; - public boolean isMetricsSample() { - return metricsSample; - } + private boolean metricsEnable = true; - public void setMetricsSample(boolean metricsSample) { - this.metricsSample = metricsSample; - } + private boolean traceEnable = true; - public boolean isTraceSample() { - return traceSample; + public boolean isMetricsEnable() { + return metricsEnable; } - public void setTraceSample(boolean traceSample) { - this.traceSample = traceSample; + public void setMetricsEnable(boolean metricsEnable) { + this.metricsEnable = metricsEnable; } - public boolean isLogSample() { - return logSample; + public boolean isTraceEnable() { + return traceEnable; } - public void setLogSample(boolean logSample) { - this.logSample = logSample; - } - - public static SamplerConfig loadOrDefault() { - Properties properties = SpiUtils.loadPropertiesNullable(FILE_PATH); - if (properties == null) { - return DEFAULT_CONFIG; - } - - SamplerConfig result = new SamplerConfig(); - result.setMetricsSample(Boolean.valueOf(properties.getProperty("metricsSample", Boolean.TRUE.toString()))); - result.setTraceSample(Boolean.valueOf(properties.getProperty("traceSample", Boolean.TRUE.toString()))); - result.setLogSample(Boolean.valueOf(properties.getProperty("logSample", Boolean.TRUE.toString()))); - - return result; + public void setTraceEnable(boolean traceEnable) { + this.traceEnable = traceEnable; } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogram.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogram.java new file mode 100644 index 0000000..4828001 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogram.java @@ -0,0 +1,47 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.DoubleHistogram; + +/** + */ +public abstract class CapaDoubleHistogram implements DoubleHistogram { + + protected final String meterName; + + protected final String schemaUrl; + + protected final String version; + + protected final String name; + + protected String description; + + protected String unit; + + public CapaDoubleHistogram(String meterName, String schemaUrl, String version, String name, + String description, + String unit) { + this.meterName = meterName; + this.schemaUrl = schemaUrl; + this.version = version; + this.name = name; + this.description = description; + this.unit = unit; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogramBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogramBuilder.java new file mode 100644 index 0000000..6fafd87 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaDoubleHistogramBuilder.java @@ -0,0 +1,76 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.api.metrics.LongHistogramBuilder; +import io.opentelemetry.api.metrics.internal.NoopMeter; + +/** + * + */ +public class CapaDoubleHistogramBuilder implements DoubleHistogramBuilder { + + protected final String meterName; + + protected final String schemaUrl; + + protected final String version; + + private final String name; + + private String description; + + private String unit; + + public CapaDoubleHistogramBuilder(String meterName, String schemaUrl, String version, String name) { + this.meterName = meterName; + this.schemaUrl = schemaUrl; + this.version = version; + this.name = name; + } + + @Override + public DoubleHistogramBuilder setDescription(String description) { + this.description = description; + return this; + } + + @Override + public DoubleHistogramBuilder setUnit(String unit) { + this.unit = unit; + return this; + } + + @Override + public LongHistogramBuilder ofLongs() { + return new CapaLongHistogramBuilder(meterName, schemaUrl, version, name).setDescription(description) + .setUnit(unit); + } + + @Override + public DoubleHistogram build() { + DoubleHistogram histogram = CapaMeterWrapper + .loadHistogramNullable(meterName, schemaUrl, version, name, description, unit, + CapaDoubleHistogram.class); + if (histogram == null) { + return NoopMeter.getInstance().histogramBuilder(name).build(); + } + return histogram; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogram.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogram.java new file mode 100644 index 0000000..a3d750d --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogram.java @@ -0,0 +1,45 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.LongHistogram; + +/** + */ +public abstract class CapaLongHistogram implements LongHistogram { + + protected final String meterName; + + protected final String schemaUrl; + + protected final String version; + + protected final String name; + + protected String description; + + protected String unit; + + public CapaLongHistogram(String meterName, String schemaUrl, String version, String name, String description, String unit) { + this.meterName = meterName; + this.schemaUrl = schemaUrl; + this.version = version; + this.name = name; + this.description = description; + this.unit = unit; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogramBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogramBuilder.java new file mode 100644 index 0000000..508c943 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaLongHistogramBuilder.java @@ -0,0 +1,75 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.api.metrics.LongHistogram; +import io.opentelemetry.api.metrics.LongHistogramBuilder; +import io.opentelemetry.api.metrics.internal.NoopMeter; + +/** + * + */ +public class CapaLongHistogramBuilder implements LongHistogramBuilder { + + private final String meterName; + + private final String schemaUrl; + + private final String version; + + private final String name; + + private String description; + + private String unit; + + public CapaLongHistogramBuilder(String meterName, String schemaUrl, String version, String name) { + this.meterName = meterName; + this.schemaUrl = schemaUrl; + this.version = version; + this.name = name; + } + + @Override + public LongHistogramBuilder setDescription(String description) { + this.description = description; + return this; + } + + @Override + public LongHistogramBuilder setUnit(String unit) { + this.unit = unit; + return this; + } + + @Override + public DoubleHistogramBuilder ofDoubles() { + return new CapaDoubleHistogramBuilder(meterName, schemaUrl, version, name).setDescription(description) + .setUnit(unit); + } + + @Override + public LongHistogram build() { + LongHistogram histogram = CapaMeterWrapper + .loadHistogramNullable(meterName, schemaUrl, version, name, description, unit, CapaLongHistogram.class); + if (histogram == null) { + return NoopMeter.getInstance().histogramBuilder(name).ofLongs().build(); + } + return histogram; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeter.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeter.java new file mode 100644 index 0000000..050ba10 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeter.java @@ -0,0 +1,72 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.DoubleGaugeBuilder; +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.api.metrics.LongCounterBuilder; +import io.opentelemetry.api.metrics.LongUpDownCounterBuilder; +import io.opentelemetry.api.metrics.Meter; + +import javax.annotation.concurrent.NotThreadSafe; + +/** + */ +@NotThreadSafe +public class CapaMeter implements Meter { + + private final String meterName; + + private final String schemaUrl; + + private final String version; + + private final Meter meter; + + public CapaMeter(String meterName, String schemaUrl, String version, Meter meter) { + this.meterName = meterName; + this.schemaUrl = schemaUrl; + this.version = version; + this.meter = meter; + } + + @Override + public LongCounterBuilder counterBuilder(String name) { + return meter.counterBuilder(name); + } + + @Override + public LongUpDownCounterBuilder upDownCounterBuilder(String name) { + return meter.upDownCounterBuilder(name); + } + + /** + * Only histogram need self inplementation now. + * + * @param name metric name. + * @return CapaDoubleHistogramBuilder + */ + @Override + public DoubleHistogramBuilder histogramBuilder(String name) { + return new CapaDoubleHistogramBuilder(meterName, schemaUrl, version, name); + } + + @Override + public DoubleGaugeBuilder gaugeBuilder(String name) { + return meter.gaugeBuilder(name); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterBuilder.java new file mode 100644 index 0000000..330a827 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterBuilder.java @@ -0,0 +1,56 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.MeterBuilder; + +/** + * Builder for capa meter. + */ +public class CapaMeterBuilder implements MeterBuilder { + + private final MeterBuilder meterBuilder; + + private final String name; + + private String schemaUrl; + + private String version; + + public CapaMeterBuilder(String name, MeterBuilder builder) { + this.name = name; + meterBuilder = builder; + } + + @Override + public MeterBuilder setSchemaUrl(String schemaUrl) { + this.schemaUrl = schemaUrl; + return meterBuilder.setSchemaUrl(schemaUrl); + } + + @Override + public MeterBuilder setInstrumentationVersion(String instrumentationVersion) { + version = instrumentationVersion; + return meterBuilder.setInstrumentationVersion(instrumentationVersion); + } + + @Override + public Meter build() { + return CapaMeterWrapper.wrap(name, schemaUrl, version, meterBuilder.build()); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProvider.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProvider.java new file mode 100644 index 0000000..38957b5 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProvider.java @@ -0,0 +1,46 @@ +/* + * 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.metrics; + +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.MeterBuilder; +import io.opentelemetry.api.metrics.MeterProvider; + +import javax.annotation.concurrent.NotThreadSafe; + +/** + * Builder for capa meter provider. + */ +@NotThreadSafe +public class CapaMeterProvider implements MeterProvider { + + private final MeterProvider meterProvider; + + public CapaMeterProvider(MeterProvider meterProvider) { + this.meterProvider = meterProvider; + } + + @Override + public Meter get(String instrumentationName) { + return CapaMeterWrapper.wrap(instrumentationName, null, null, meterProvider.get(instrumentationName)); + } + + @Override + public MeterBuilder meterBuilder(String instrumentationName) { + return CapaMeterWrapper.wrap(instrumentationName, meterProvider.meterBuilder(instrumentationName)); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java index 044eb92..160bd28 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java @@ -32,6 +32,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; /** * Builder for capa metric provider. @@ -47,7 +48,7 @@ public class CapaMeterProviderBuilder implements CapaMeterProviderSettings { /** * Sampler config. */ - private SamplerConfig samplerConfig; + private Supplier samplerConfig = SamplerConfig.DEFAULT_SUPPLIER; /** * Readers manually set. @@ -61,11 +62,13 @@ public class CapaMeterProviderBuilder implements CapaMeterProviderSettings { * @param readerConfigs metrics reader configs. * @return metrics reader factories. */ - private static List bulidReaderFactories(List readerConfigs) { + private static List bulidReaderFactories(List readerConfigs, + Supplier samplerConfig) { List factories = new ArrayList<>(); for (MetricsReaderConfig config : readerConfigs) { MetricExporter exporter = SpiUtils - .newInstanceWithConstructorCache(config.getExporterType(), MetricExporter.class); + .newInstance(config.getExporterType(), CapaMetricsExporter.class, new Class[]{Supplier.class}, + new Object[]{samplerConfig}, false); if (exporter == null) { throw new IllegalArgumentException( "Metric Exporter is not configured. readerName = " + config.getName() + '.'); @@ -91,7 +94,7 @@ public Thread newThread(@NotNull Runnable r) { } @Override - public CapaMeterProviderBuilder setSamplerConfig(SamplerConfig samplerConfig) { + public CapaMeterProviderBuilder setSamplerConfig(Supplier samplerConfig) { this.samplerConfig = samplerConfig; return this; } @@ -133,15 +136,14 @@ public MeterProvider buildMeterProvider() { return MeterProvider.noop(); } - List factories = bulidReaderFactories(metricsReaderConfigs); + List factories = bulidReaderFactories(metricsReaderConfigs, samplerConfig); - initSampleConfig(); SdkMeterProviderBuilder builder = SdkMeterProvider.builder() - .setExemplarFilter(CapaMetricsSampler.getInstance() - .update(samplerConfig)); + .setExemplarFilter(new CapaMetricsSampler(samplerConfig)); factories.forEach(f -> builder.registerMetricReader(f)); - return builder.build(); + SdkMeterProvider provider = builder.build(); + return new CapaMeterProvider(provider); } private void initMeterConfig() { @@ -149,10 +151,4 @@ private void initMeterConfig() { meterConfigs = SpiUtils.loadConfigNullable(FILE_PATH, MeterConfig.class); } } - - private void initSampleConfig() { - if (samplerConfig == null) { - samplerConfig = SamplerConfig.loadOrDefault(); - } - } } 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 01967a6..e190690 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 @@ -18,6 +18,8 @@ import group.rxcloud.capa.component.telemetry.SamplerConfig; +import java.util.function.Supplier; + /** * Settings for capa meter provider. */ @@ -48,5 +50,5 @@ public interface CapaMeterProviderSettings { * @param samplerConfig sample config. * @return current settings. */ - CapaMeterProviderSettings setSamplerConfig(SamplerConfig samplerConfig); + CapaMeterProviderSettings setSamplerConfig(Supplier samplerConfig); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterWrapper.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterWrapper.java new file mode 100644 index 0000000..07b6e75 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterWrapper.java @@ -0,0 +1,65 @@ +/* + * 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.metrics; + +import group.rxcloud.capa.infrastructure.utils.SpiUtils; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.MeterBuilder; + +import javax.annotation.Nullable; + +/** + * Load capa implementation. + */ +final class CapaMeterWrapper { + + static final String FILE_SUFFIX = "telemetry"; + + static final boolean CACHE = true; + + private CapaMeterWrapper() { + } + + @Nullable + static CapaMeter wrap(String meterName, String schemaUrl, String version, Meter meter) { + if (meter instanceof CapaMeter) { + return (CapaMeter) meter; + } + CapaMeter result = SpiUtils.loadFromSpiComponentFileNullable(CapaMeter.class, + new Class[]{String.class, String.class, String.class, Meter.class}, + new Object[]{meterName, schemaUrl, version, meter}, FILE_SUFFIX, CACHE); + if (result == null) { + result = new CapaMeter(meterName, schemaUrl, version, meter); + } + return result; + } + + @Nullable + static CapaMeterBuilder wrap(String meterName, MeterBuilder meterBuilder) { + if (meterBuilder instanceof CapaMeterBuilder) { + return (CapaMeterBuilder) meterBuilder; + } + return new CapaMeterBuilder(meterName, meterBuilder); + } + + static T loadHistogramNullable(String meterName, String schemaUrl, String version, String name, String description, String unit, Class type) { + return SpiUtils.loadFromSpiComponentFileNullable( + type, new Class[]{String.class, String.class, String.class, String.class, String.class, String.class}, new Object[]{meterName, schemaUrl, version, name, description, unit}, + "telemetry", true); + } +} + diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsExporter.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsExporter.java new file mode 100644 index 0000000..d3e6025 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsExporter.java @@ -0,0 +1,66 @@ +/* + * 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.metrics; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; + +import java.util.Collection; +import java.util.function.Supplier; + +/** + * + */ +public abstract class CapaMetricsExporter implements MetricExporter { + + private Supplier samplerConfig; + + public CapaMetricsExporter(Supplier samplerConfig) { + this.samplerConfig = samplerConfig; + } + + @Override + public CompletableResultCode export(Collection metrics) { + SamplerConfig config = samplerConfig.get(); + if (config != null && !config.isMetricsEnable()) { + return CompletableResultCode.ofSuccess(); + } + + return doExport(metrics); + } + + @Override + public CompletableResultCode flush() { + SamplerConfig config = samplerConfig.get(); + if (config != null && !config.isMetricsEnable()) { + return CompletableResultCode.ofSuccess(); + } + + return doFlush(); + } + + protected abstract CompletableResultCode doExport(Collection metrics); + + protected abstract CompletableResultCode doFlush(); + + @Override + public CompletableResultCode shutdown() { + return null; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java index 049a7a0..eda0109 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java @@ -21,61 +21,40 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.metrics.exemplar.ExemplarFilter; +import java.util.function.Supplier; + /** * Sampler for metrics data. * Choose to sample all or none data according to the config file. */ public class CapaMetricsSampler implements ExemplarFilter { - /** - * Sampler instance, which samples all the data if no config was explicitly set. - */ - private static final CapaMetricsSampler INSTANCE = new CapaMetricsSampler(SamplerConfig.DEFAULT_CONFIG); - - /** - * Inner instance. - */ - private ExemplarFilter inner; - - /** - * Get the sampler instance. - * - * @return the sampler instance. - */ - public static CapaMetricsSampler getInstance() { - return INSTANCE; - } + private final Supplier samplerConfigSupplier; - private CapaMetricsSampler(SamplerConfig config) { - update(config); - } - - /** - * Update the sample policy. - * - * @param config new sample config. - * @return the updated sampler instance. - */ - public CapaMetricsSampler update(SamplerConfig config) { - if (config == null) { - return this; + public CapaMetricsSampler(Supplier samplerConfigSupplier) { + if (samplerConfigSupplier == null) { + samplerConfigSupplier = () -> SamplerConfig.DEFAULT_CONFIG; } - - if (config.isMetricsSample()) { - inner = ExemplarFilter.alwaysSample(); - } else { - inner = ExemplarFilter.neverSample(); - } - return this; + this.samplerConfigSupplier = samplerConfigSupplier; } @Override public boolean shouldSampleMeasurement(long value, Attributes attributes, Context context) { - return inner.shouldSampleMeasurement(value, attributes, context); + return get().shouldSampleMeasurement(value, attributes, context); } @Override public boolean shouldSampleMeasurement(double value, Attributes attributes, Context context) { - return inner.shouldSampleMeasurement(value, attributes, context); + return get().shouldSampleMeasurement(value, attributes, context); + } + + private ExemplarFilter get() { + SamplerConfig config = samplerConfigSupplier.get(); + if (config != null && !config.isMetricsEnable()) { + return ExemplarFilter.neverSample(); + } + + return ExemplarFilter.alwaysSample(); } + } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java index 2979570..9053817 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java @@ -129,7 +129,7 @@ public SpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { public Span startSpan() { Span span = spanBuilder.startSpan(); if (span instanceof ReadWriteSpan) { - return CapaWrapper.wrap(tracerName, version, schemaUrl, (ReadWriteSpan) span); + return CapaTracerWrapper.wrap(tracerName, version, schemaUrl, (ReadWriteSpan) span); } return span; } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java index 4c1873b..2fc563b 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java @@ -25,6 +25,7 @@ import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.util.List; +import java.util.function.Supplier; /** * Sampler for trace data. @@ -32,35 +33,24 @@ */ public class CapaTraceSampler implements Sampler { - private static final CapaTraceSampler INSTANCE = new CapaTraceSampler(SamplerConfig.DEFAULT_CONFIG); + private final Supplier samplerConfigSupplier; - private Sampler inner; - - public static CapaTraceSampler getInstance() { - return INSTANCE; - } - - private CapaTraceSampler(SamplerConfig config) { - update(config); - } - - public CapaTraceSampler update(SamplerConfig config) { - if (config == null) { - return this; - } - - if (config.isTraceSample()) { - inner = Sampler.alwaysOn(); - } else { - inner = Sampler.alwaysOff(); + public CapaTraceSampler(Supplier samplerConfigSupplier) { + if (samplerConfigSupplier == null) { + samplerConfigSupplier = () -> SamplerConfig.DEFAULT_CONFIG; } - return this; + this.samplerConfigSupplier = samplerConfigSupplier; } @Override public SamplingResult shouldSample(Context context, String traceId, String name, SpanKind kind, Attributes attributes, List list) { - return inner.shouldSample(context, traceId, name, kind, attributes, list); + Sampler sampler = Sampler.alwaysOn(); + SamplerConfig config = samplerConfigSupplier.get(); + if (config != null && !config.isTraceEnable()) { + sampler = Sampler.alwaysOff(); + } + return sampler.shouldSample(context, traceId, name, kind, attributes, list); } @Override diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java index 15d0a6b..a048ee7 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java @@ -39,7 +39,7 @@ public CapaTracer(String tracerName, String version, String schemaUrl, Tracer tr @Override public SpanBuilder spanBuilder(String spanName) { SpanBuilder builder = tracer.spanBuilder(spanName); - return CapaWrapper.wrap(tracerName, version, schemaUrl, spanName, builder); + return CapaTracerWrapper.wrap(tracerName, version, schemaUrl, spanName, builder); } public String getVersion() { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java index 06708c6..6e46ea6 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java @@ -53,6 +53,6 @@ public TracerBuilder setInstrumentationVersion(String instrumentationVersion) { @Override public Tracer build() { - return CapaWrapper.wrap(tracerName, version, schemaUrl, tracerBuilder.build()); + return CapaTracerWrapper.wrap(tracerName, version, schemaUrl, tracerBuilder.build()); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java index 3b102ae..ad72469 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java @@ -44,6 +44,6 @@ public Tracer get(String instrumentationName, String instrumentationVersion) { @Override public TracerBuilder tracerBuilder(String instrumentationName) { TracerBuilder tracerBuilder = provider.tracerBuilder(instrumentationName); - return CapaWrapper.wrap(instrumentationName, tracerBuilder); + return CapaTracerWrapper.wrap(instrumentationName, tracerBuilder); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java index 60f1bba..00a9530 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java @@ -33,6 +33,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; /** * Builder for capa tracer provider. @@ -63,7 +64,7 @@ public class CapaTracerProviderBuilder implements CapaTracerProviderSettings { /** * Sampler config. */ - private SamplerConfig samplerConfig; + private Supplier samplerConfig = SamplerConfig.DEFAULT_SUPPLIER; private static boolean addSpanLimits(SpanLimitsConfig spanLimits, SpanLimitsBuilder limits) { if (spanLimits == null) { @@ -112,7 +113,7 @@ private static void skipIdValidate(SdkTracerProvider provider) { } @Override - public CapaTracerProviderBuilder setSamplerConfig(SamplerConfig samplerConfig) { + public CapaTracerProviderBuilder setSamplerConfig(Supplier samplerConfig) { this.samplerConfig = samplerConfig; return this; } @@ -210,14 +211,7 @@ private void addSpanLimits(SdkTracerProviderBuilder builder) { } private void addSampler(SdkTracerProviderBuilder builder) { - initSampleConfig(); - builder.setSampler(Sampler.parentBased(CapaTraceSampler.getInstance().update(samplerConfig))); - } - - private void initSampleConfig() { - if (samplerConfig == null) { - samplerConfig = SamplerConfig.loadOrDefault(); - } + builder.setSampler(Sampler.parentBased(new CapaTraceSampler(samplerConfig))); } private void addProcessors(SdkTracerProviderBuilder builder) { 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 f1ac0da..f77b840 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 @@ -20,6 +20,8 @@ import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SpanProcessor; +import java.util.function.Supplier; + /** * Settings for capa trace provider. */ @@ -66,6 +68,6 @@ public interface CapaTracerProviderSettings { * @param samplerConfig sample config. * @return current settings. */ - CapaTracerProviderSettings setSamplerConfig(SamplerConfig samplerConfig); + CapaTracerProviderSettings setSamplerConfig(Supplier samplerConfig); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaWrapper.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerWrapper.java similarity index 98% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaWrapper.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerWrapper.java index fec1d7c..2de9c21 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaWrapper.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerWrapper.java @@ -27,13 +27,13 @@ /** * Load capa implementation. */ -final class CapaWrapper { +final class CapaTracerWrapper { static final String FILE_SUFFIX = "telemetry"; static final boolean CACHE = true; - private CapaWrapper() { + private CapaTracerWrapper() { } @Nullable diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java index f12879e..56169e9 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java @@ -25,7 +25,6 @@ import java.util.Arrays; import java.util.concurrent.TimeUnit; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -48,8 +47,6 @@ public void buildWithConfigFile() { currentGroup.enumerate(lstThreads); assertTrue(Arrays.stream(lstThreads).anyMatch(t -> t.getName().contains("my-reader"))); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); } @@ -103,9 +100,6 @@ public void addReaderConfig() { assertTrue(Arrays.stream(lstThreads).anyMatch(t -> t.getName().contains(readerConfigByInstance.getName()))); assertTrue(Arrays.stream(lstThreads).anyMatch(t -> t.getName().contains(readerConfigByPath.getName()))); - - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); } @@ -124,12 +118,12 @@ public void setMeterConfig() { readerConfigByPath.setExporterType("group.rxcloud.capa.component.telemetry.metrics.TestMetricsExporter"); SamplerConfig samplerConfig = new SamplerConfig(); - samplerConfig.setMetricsSample(false); + samplerConfig.setMetricsEnable(false); MeterProvider meterProvider = new CapaMeterProviderBuilder() .addMetricReaderConfig(readerConfigByPath) .setMeterConfig(meterConfig) - .setSamplerConfig(samplerConfig) + .setSamplerConfig(() -> samplerConfig) .buildMeterProvider(); ThreadGroup currentGroup = @@ -141,7 +135,5 @@ public void setMeterConfig() { assertTrue(Arrays.stream(lstThreads).noneMatch(t -> t.getName().contains(readerConfigByInstance.getName()))); assertTrue(Arrays.stream(lstThreads).anyMatch(t -> t.getName().contains(readerConfigByPath.getName()))); - assertFalse(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertFalse(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); } } \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java index d05d7e1..2673f31 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java @@ -17,11 +17,9 @@ package group.rxcloud.capa.component.telemetry.metrics; import group.rxcloud.capa.component.telemetry.SamplerConfig; -import group.rxcloud.capa.component.telemetry.trace.CapaTraceSampler; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -31,30 +29,17 @@ public class CapaMetricsSamplerTest { @Test - public void getInstance() { - assertNotNull(CapaMetricsSampler.getInstance()); - CapaMetricsSampler.getInstance().update(SamplerConfig.DEFAULT_CONFIG); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); - - CapaMetricsSampler.getInstance().update(null); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); - - SamplerConfig samplerConfig = new SamplerConfig(); - samplerConfig.setMetricsSample(false); - CapaMetricsSampler.getInstance().update(samplerConfig); - assertFalse(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertFalse(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); - - - samplerConfig.setMetricsSample(true); - CapaMetricsSampler.getInstance().update(samplerConfig); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1L, null, null)); - assertTrue(CapaMetricsSampler.getInstance().shouldSampleMeasurement(1.0, null, null)); - - CapaMetricsSampler.getInstance().update(SamplerConfig.DEFAULT_CONFIG); - - assertNotNull(CapaTraceSampler.getInstance().getDescription()); + public void testConfig() { + CapaMetricsSampler sampler = new CapaMetricsSampler(() -> SamplerConfig.DEFAULT_CONFIG); + assertTrue(sampler.shouldSampleMeasurement(1, null, null)); + sampler = new CapaMetricsSampler(() -> null); + assertTrue(sampler.shouldSampleMeasurement(1.0, null, null)); + SamplerConfig config = new SamplerConfig(); + config.setMetricsEnable(false); + sampler = new CapaMetricsSampler(() -> config); + assertFalse(sampler.shouldSampleMeasurement(1, null, null)); + config.setMetricsEnable(true); + assertTrue(sampler.shouldSampleMeasurement(1.0, null, null)); } + } \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.java index ede215b..cc15444 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.java @@ -16,26 +16,32 @@ */ package group.rxcloud.capa.component.telemetry.metrics; +import group.rxcloud.capa.component.telemetry.SamplerConfig; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.data.MetricData; -import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.function.Supplier; /** * @author: chenyijiang * @date: 2021/11/25 17:04 */ -public class TestMetricsExporter implements MetricExporter { +public class TestMetricsExporter extends CapaMetricsExporter { + + public TestMetricsExporter( + Supplier samplerConfig) { + super(samplerConfig); + } @Override - public CompletableResultCode export(Collection metrics) { + public CompletableResultCode doExport(Collection metrics) { metrics.forEach(System.out::println); return CompletableResultCode.ofSuccess(); } @Override - public CompletableResultCode flush() { + public CompletableResultCode doFlush() { return CompletableResultCode.ofSuccess(); } diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java index 9bff803..cac8c0b 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java @@ -30,26 +30,21 @@ public class CapaTraceSamplerTest { @Test - public void getInstance() { - assertNotNull(CapaTraceSampler.getInstance()); - CapaTraceSampler.getInstance().update(SamplerConfig.DEFAULT_CONFIG); - assertEquals(SamplingResult.recordAndSample(), CapaTraceSampler.getInstance().shouldSample(null, null, null, null, null, null)); - - CapaTraceSampler.getInstance().update(null); - assertEquals(SamplingResult.recordAndSample(), CapaTraceSampler.getInstance().shouldSample(null, null, null, null, null, null)); - - SamplerConfig samplerConfig = new SamplerConfig(); - samplerConfig.setTraceSample(false); - CapaTraceSampler.getInstance().update(samplerConfig); - assertEquals(SamplingResult.drop(), CapaTraceSampler.getInstance().shouldSample(null, null, null, null, null, null)); - - - samplerConfig.setTraceSample(true); - CapaTraceSampler.getInstance().update(samplerConfig); - assertEquals(SamplingResult.recordAndSample(), CapaTraceSampler.getInstance().shouldSample(null, null, null, null, null, null)); - - CapaTraceSampler.getInstance().update(SamplerConfig.DEFAULT_CONFIG); + public void testConfig() { + CapaTraceSampler sampler = new CapaTraceSampler(() -> SamplerConfig.DEFAULT_CONFIG); + assertEquals(SamplingResult.recordAndSample(), sampler.shouldSample(null, null, null, null, null, null)); + sampler = new CapaTraceSampler(() -> null); + assertEquals(SamplingResult.recordAndSample(), sampler.shouldSample(null, null, null, null, null, null)); + SamplerConfig config = new SamplerConfig(); + config.setTraceEnable(false); + sampler = new CapaTraceSampler(() -> config); + assertEquals(SamplingResult.drop(), sampler.shouldSample(null, null, null, null, null, null)); + config.setTraceEnable(true); + assertEquals(SamplingResult.recordAndSample(), sampler.shouldSample(null, null, null, null, null, null)); + } - assertNotNull(CapaTraceSampler.getInstance().getDescription()); + @Test + public void getDescription() { + assertNotNull(new CapaTraceSampler(() -> SamplerConfig.DEFAULT_CONFIG).getDescription()); } } \ No newline at end of file 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 c3a49a6..1a19cc6 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 @@ -65,7 +65,7 @@ public void buildFromTraceConfg() { .addProcessor(processor) .setSpanLimits(outter) .setIdGenerator(IdGenerator.random()) - .setSamplerConfig(SamplerConfig.DEFAULT_CONFIG) + .setSamplerConfig(() -> SamplerConfig.DEFAULT_CONFIG) .buildTracerProvider(); Span spanAnother = provider.tracerBuilder("otherTracer").build().spanBuilder("otherSpan").startSpan(); spanAnother.end(System.currentTimeMillis(), TimeUnit.MILLISECONDS); diff --git a/sdk-component/src/test/resources/capa-sample.properties b/sdk-component/src/test/resources/capa-sample.properties deleted file mode 100644 index d22c308..0000000 --- a/sdk-component/src/test/resources/capa-sample.properties +++ /dev/null @@ -1,2 +0,0 @@ -metricsSample=true -traceSample=true \ No newline at end of file diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 17a1891..7992479 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 4256367..0f22976 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index dc3077f..f2811cc 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-sdk-spi diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaDoubleHistogramSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaDoubleHistogramSpi.java new file mode 100644 index 0000000..f0754d3 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaDoubleHistogramSpi.java @@ -0,0 +1,28 @@ +/* + * 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.spi.telemetry; + +import group.rxcloud.capa.component.telemetry.metrics.CapaDoubleHistogram; + +/** + */ +public abstract class CapaDoubleHistogramSpi extends CapaDoubleHistogram { + + public CapaDoubleHistogramSpi(String meterName, String schemaUrl, String version, String name, String description, String unit) { + super(meterName, schemaUrl, version, name, description, unit); + } +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaLongHistogramSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaLongHistogramSpi.java new file mode 100644 index 0000000..a07f545 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaLongHistogramSpi.java @@ -0,0 +1,29 @@ +/* + * 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.spi.telemetry; + +import group.rxcloud.capa.component.telemetry.metrics.CapaLongHistogram; + +/** + */ +public abstract class CapaLongHistogramSpi extends CapaLongHistogram { + + public CapaLongHistogramSpi(String meterName, String schemaUrl, String version, String name, String description, + String unit) { + super(meterName, schemaUrl, version, name, description, unit); + } +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMetricsExporterSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMetricsExporterSpi.java new file mode 100644 index 0000000..5f7bdf2 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMetricsExporterSpi.java @@ -0,0 +1,33 @@ +/* + * 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.spi.telemetry; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.component.telemetry.metrics.CapaMetricsExporter; + +import java.util.function.Supplier; + +/** + * + */ +public abstract class CapaMetricsExporterSpi extends CapaMetricsExporter { + + public CapaMetricsExporterSpi( + Supplier samplerConfig) { + super(samplerConfig); + } +} diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index 8febac5..5cd1112 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.8-alpha-1 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index b1e9a06..dfa787f 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7.RELEASE + 1.0.8-alpha-1 capa-sdk diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java index 9b5023a..574f827 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java @@ -32,6 +32,8 @@ import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SpanProcessor; +import java.util.function.Supplier; + /** * A builder for the {@link CapaTelemetryClient} */ @@ -93,7 +95,7 @@ public CapaTelemetryClientBuilder addMetricReaderConfig(MetricsReaderConfig conf } @Override - public CapaTelemetryClientBuilder setSamplerConfig(SamplerConfig samplerConfig) { + public CapaTelemetryClientBuilder setSamplerConfig(Supplier samplerConfig) { meterProviderBuilder.setSamplerConfig(samplerConfig); tracerProviderBuilder.setSamplerConfig(samplerConfig); return this; diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java index d79bf17..b1632f8 100644 --- a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java @@ -59,7 +59,7 @@ public void buildManual() throws InterruptedException { readerConfig.setExportInterval(1, TimeUnit.SECONDS); CapaTelemetryClient capaTelemetryClient = new CapaTelemetryClientBuilder() .addProcessor(new TraceProcessor()) - .setSamplerConfig(SamplerConfig.DEFAULT_CONFIG) + .setSamplerConfig(() -> SamplerConfig.DEFAULT_CONFIG) .setSpanLimits(new SpanLimitsConfig()) .setIdGenerator(IdGenerator.random()) .setTracerConfig(new TracerConfig()) diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java index 6149cf5..3d184b6 100644 --- a/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java @@ -16,22 +16,29 @@ */ package group.rxcloud.capa.telemetry; +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.component.telemetry.metrics.CapaMetricsExporter; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.metrics.data.MetricData; -import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.Collection; +import java.util.function.Supplier; -public class MetricTestExporter implements MetricExporter { +public class MetricTestExporter extends CapaMetricsExporter { + + public MetricTestExporter( + Supplier samplerConfig) { + super(samplerConfig); + } @Override - public CompletableResultCode export(Collection metrics) { + protected CompletableResultCode doExport(Collection metrics) { metrics.forEach(System.out::println); return CompletableResultCode.ofSuccess(); } @Override - public CompletableResultCode flush() { + protected CompletableResultCode doFlush() { return CompletableResultCode.ofSuccess(); }