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();
}