From bbfb589916a1543a47d50f64fbfe3a5c877366f3 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 17 Nov 2021 10:54:30 +0800 Subject: [PATCH 01/36] feat(Add a new feature): Add the abstract log api in compoent Add abstract apis of log4j and logback in compoent, so the users only need to refer to the corresponding abstract apis when configuring, and don't care about the specific implementation. BREAKING CHANGE: #38 --- examples/pom.xml | 30 +++--- .../rxcloud/capa/examples/log/DemoLog.java | 38 ++++++++ examples/src/main/resources/log4j2.xml | 4 +- examples/src/main/resources/xml/log4j2.xml | 31 ++++++ examples/src/main/resources/xml/logback.xml | 36 +++++++ pom.xml | 36 +++++++ sdk-component/pom.xml | 17 ++++ .../capa/component/log/CapaLog4jAppender.java | 94 +++++++++++++++++++ .../component/log/CapaLogbackAppender.java | 34 +++++++ .../log/CapaLogbackAppenderAgent.java | 75 +++++++++++++++ sdk-spi-demo/pom.xml | 24 +++++ .../capa/spi/demo/log/DemoLog4jAppender.java | 40 ++++++++ .../spi/demo/log/DemoLogbackAppender.java | 35 +++++++ .../main/resources/capa-component.properties | 4 +- 14 files changed, 478 insertions(+), 20 deletions(-) create mode 100644 examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java create mode 100644 examples/src/main/resources/xml/log4j2.xml create mode 100644 examples/src/main/resources/xml/logback.xml create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java create mode 100644 sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java create mode 100644 sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java diff --git a/examples/pom.xml b/examples/pom.xml index 8fe886e..ba27052 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -30,10 +30,6 @@ jar capa-sdk-examples - - 2.14.1 - - @@ -45,12 +41,10 @@ org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} log4j-api @@ -58,21 +52,21 @@ - + org.apache.logging.log4j log4j-slf4j-impl - ${log4j.version} - - - log4j-core - org.apache.logging.log4j - - - log4j-api - org.apache.logging.log4j - - + + + + + + org.projectlombok + lombok + 1.18.2 diff --git a/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java b/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java new file mode 100644 index 0000000..71e1390 --- /dev/null +++ b/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.examples.log; + +import lombok.extern.slf4j.Slf4j; + +/** + * An application cannot use log4j and logback configuration to print logs at the same time. + * So if you want to test the log4j2 configuration to print logs, then you need to copy the resources/xml/log4j2.xml file to the resources directory, and then add log4j-slf4j-impl dependency to the pom file. + * Else if you want to use logback configuration to print logs, then the resources/xml/logback.xml file needs to be copied to the resources path, and the logback-classic dependency needs to be added to the pom file. + * Notice: + * 1. Resources cannot contain log4j2.xml and logback.xml files at the same time, + * 2. log4j-slf4j-impl and logback-classic cannot exist at the same time. + * + * @Author gpeng + * @Date 2021/11/11 17:16 + */ +@Slf4j +public class DemoLog { + + public static void main(String[] args) { + log.info("test"); + } +} diff --git a/examples/src/main/resources/log4j2.xml b/examples/src/main/resources/log4j2.xml index f923cdb..3587353 100644 --- a/examples/src/main/resources/log4j2.xml +++ b/examples/src/main/resources/log4j2.xml @@ -20,10 +20,12 @@ + - + + \ No newline at end of file diff --git a/examples/src/main/resources/xml/log4j2.xml b/examples/src/main/resources/xml/log4j2.xml new file mode 100644 index 0000000..3587353 --- /dev/null +++ b/examples/src/main/resources/xml/log4j2.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/src/main/resources/xml/logback.xml b/examples/src/main/resources/xml/logback.xml new file mode 100644 index 0000000..0e82bd0 --- /dev/null +++ b/examples/src/main/resources/xml/logback.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3fdfbad..3561aa6 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,9 @@ true true true + 2.8.2 + 1.1.7 + 1.7.21 @@ -143,6 +146,39 @@ ${mockito-core.version} test + + + ch.qos.logback + logback-classic + ${logback.version} + + + ch.qos.logback + logback-core + ${logback.version} + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index d78462b..4b985c9 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -80,6 +80,23 @@ mockito-core test + + + org.apache.logging.log4j + log4j-core + true + + + + ch.qos.logback + logback-core + true + + + ch.qos.logback + logback-classic + true + diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java new file mode 100644 index 0000000..28cb0dd --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java @@ -0,0 +1,94 @@ +/* + * 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.log; + +import group.rxcloud.capa.infrastructure.config.CapaProperties; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Properties; + +/** + * The abstract log4j appender. Extend this and provide your specific impl. + * + * @Author gpeng + * @Date 2021/11/11 18:56 + */ +@Plugin(name = "CapaLog4jAppender", elementType = Appender.ELEMENT_TYPE, category = "Core") +public abstract class CapaLog4jAppender extends AbstractAppender { + + /** + * Instantiates a new Capa log4j appender. + * + * @param name The name of the appender. + * @param filter The filter of the appender. + * @param layout The layout of the appender. + * @param ignoreExceptions Whether to ignore exceptions. + */ + public CapaLog4jAppender(String name, Filter filter, Layout layout, + boolean ignoreExceptions) { + super(name, filter, layout, ignoreExceptions); + } + + /** + * Create a appender instance. + * + * @param name The name of the appender. + * @param filter The filter of the appender. + * @param layout The layout of the appender. + * @param ignoreExceptions Whether to ignore exceptions. + * @return CapaLog4jAppender instance. + */ + @PluginFactory + public static CapaLog4jAppender createAppender(@PluginAttribute("name") String name, + @PluginElement("Filter") final Filter filter, @PluginElement("Layout") Layout layout, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + return buildCapaLog4jAppender(name, filter, layout, ignoreExceptions); + } + + /** + * Build a appender instance. + * + * @param name The name of the appender. + * @param filter The filter of the appender. + * @param layout The layout of the appender. + * @param ignoreExceptions Whether to ignore exceptions. + * @return CapaLog4jAppender instance. + */ + public static CapaLog4jAppender buildCapaLog4jAppender(String name, final Filter filter, Layout layout, boolean ignoreExceptions) { + // load spi capa Log4j appender impl + try { + Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.get(); + String capaLogAppenderClassPath = properties.getProperty(CapaLog4jAppender.class.getName()); + Class aClass = (Class) Class.forName(capaLogAppenderClassPath); + Constructor constructor = aClass.getConstructor(String.class, Filter.class, Layout.class, boolean.class); + Object newInstance = constructor.newInstance(name, filter, layout, ignoreExceptions); + return (CapaLog4jAppender) newInstance; + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("No Capa log4j appender supported."); + } + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java new file mode 100644 index 0000000..290073e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java @@ -0,0 +1,34 @@ +/* + * 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.log; + +import ch.qos.logback.classic.spi.ILoggingEvent; + +/** + * The interface of the logback appender impl.Implement this and provide your specific impl. + * + * @Author gpeng + * @Date 2021/11/12 14:06 + */ +public interface CapaLogbackAppender { + + /** + * Deal with the log. + * @param event The log event. + */ + void appendLog(ILoggingEvent event); +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java new file mode 100644 index 0000000..1e7f08e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.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.log; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.UnsynchronizedAppenderBase; +import group.rxcloud.capa.infrastructure.config.CapaProperties; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Properties; + +/** + * The agent of the logback impl. + * + * @Author gpeng + * @Date 2021/11/11 18:53 + */ +public class CapaLogbackAppenderAgent extends UnsynchronizedAppenderBase { + + /** + * Capa logback appender instance. + */ + private static final CapaLogbackAppender logbackAppender; + + /** + * Init the logbackAppender impl. + */ + static { + logbackAppender = buildCapaLogbackAppender(); + } + + /** + * Build the logback appender impl. + * + * @return CapaLogbackAppender instance. + */ + public static CapaLogbackAppender buildCapaLogbackAppender() { + // load spi capa Log4j appender impl + try { + Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.get(); + String capaLogbackAppenderClassPath = properties.getProperty(CapaLogbackAppender.class.getName()); + Class aClass = (Class) Class.forName(capaLogbackAppenderClassPath); + Constructor constructor = aClass.getConstructor(); + Object newInstance = constructor.newInstance(); + return (CapaLogbackAppender) newInstance; + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("No Capa Logback Appender supported."); + } + } + + /** + * Deal with the log. + * + * @param event The log event. + */ + @Override + protected void append(ILoggingEvent event) { + logbackAppender.appendLog(event); + } +} diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index c772e6f..5549426 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -48,6 +48,30 @@ mockito-core test + + + ch.qos.logback + logback-classic + true + + + ch.qos.logback + logback-core + + + + org.slf4j + slf4j-api + + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-api + diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java new file mode 100644 index 0000000..6ebe27c --- /dev/null +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -0,0 +1,40 @@ +/* + * 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.demo.log; + +import group.rxcloud.capa.component.log.CapaLog4jAppender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; + +import java.io.Serializable; + +/** + * @Author gpeng + * @Date 2021/11/11 17:10 + */ +public class DemoLog4jAppender extends CapaLog4jAppender { + + public DemoLog4jAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions) { + super(name, filter, layout, ignoreExceptions); + } + + @Override + public void append(LogEvent event) { + System.out.println("test log log4j and content is " + event.getMessage().getFormattedMessage()); + } +} diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java new file mode 100644 index 0000000..8784877 --- /dev/null +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -0,0 +1,35 @@ +/* + * 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.demo.log; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import group.rxcloud.capa.component.log.CapaLogbackAppender; + +/** + * @Author gpeng + * @Date 2021/11/12 11:50 + */ +public class DemoLogbackAppender implements CapaLogbackAppender { + + public DemoLogbackAppender() { + } + + @Override + public void appendLog(ILoggingEvent event) { + System.out.println("test logback log and content is " + event.getFormattedMessage()); + } +} diff --git a/sdk-spi-demo/src/main/resources/capa-component.properties b/sdk-spi-demo/src/main/resources/capa-component.properties index d1215aa..7c95113 100644 --- a/sdk-spi-demo/src/main/resources/capa-component.properties +++ b/sdk-spi-demo/src/main/resources/capa-component.properties @@ -1,4 +1,6 @@ group.rxcloud.capa.component.http.CapaHttp=group.rxcloud.capa.spi.demo.http.DemoCapaHttp group.rxcloud.capa.spi.config.CapaSpiOptionsLoader=group.rxcloud.capa.spi.demo.config.DemoSpiOptionsLoader -group.rxcloud.capa.component.configstore.CapaConfigStore=group.rxcloud.capa.spi.demo.configstore.DemoCapaConfigStore \ No newline at end of file +group.rxcloud.capa.component.configstore.CapaConfigStore=group.rxcloud.capa.spi.demo.configstore.DemoCapaConfigStore +group.rxcloud.capa.component.log.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender +group.rxcloud.capa.component.log.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file From 8a4a8c21994eaded87c6621271ba03f2a1c8900c Mon Sep 17 00:00:00 2001 From: = Date: Wed, 17 Nov 2021 11:18:57 +0800 Subject: [PATCH 02/36] delete useless tag --- .../main/java/group/rxcloud/capa/examples/log/DemoLog.java | 3 --- .../group/rxcloud/capa/component/log/CapaLog4jAppender.java | 3 --- .../rxcloud/capa/component/log/CapaLogbackAppender.java | 4 +--- .../rxcloud/capa/component/log/CapaLogbackAppenderAgent.java | 3 --- .../group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java | 5 +---- .../group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java | 4 ---- 6 files changed, 2 insertions(+), 20 deletions(-) diff --git a/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java b/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java index 71e1390..20ac7e2 100644 --- a/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java +++ b/examples/src/main/java/group/rxcloud/capa/examples/log/DemoLog.java @@ -25,9 +25,6 @@ * Notice: * 1. Resources cannot contain log4j2.xml and logback.xml files at the same time, * 2. log4j-slf4j-impl and logback-classic cannot exist at the same time. - * - * @Author gpeng - * @Date 2021/11/11 17:16 */ @Slf4j public class DemoLog { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java index 1155fb7..6012ab2 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java @@ -33,9 +33,6 @@ /** * The abstract log4j appender. Extend this and provide your specific impl. - * - * @Author gpeng - * @Date 2021/11/11 18:56 */ @Plugin(name = "CapaLog4jAppender", elementType = Appender.ELEMENT_TYPE, category = "Core") public abstract class CapaLog4jAppender extends AbstractAppender { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java index 290073e..4f25303 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java @@ -20,14 +20,12 @@ /** * The interface of the logback appender impl.Implement this and provide your specific impl. - * - * @Author gpeng - * @Date 2021/11/12 14:06 */ public interface CapaLogbackAppender { /** * Deal with the log. + * * @param event The log event. */ void appendLog(ILoggingEvent event); diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java index e601bac..e9925bb 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java @@ -26,9 +26,6 @@ /** * The agent of the logback impl. - * - * @Author gpeng - * @Date 2021/11/11 18:53 */ public class CapaLogbackAppenderAgent extends UnsynchronizedAppenderBase { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java index 6ebe27c..985cc6e 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -23,10 +23,7 @@ import java.io.Serializable; -/** - * @Author gpeng - * @Date 2021/11/11 17:10 - */ + public class DemoLog4jAppender extends CapaLog4jAppender { public DemoLog4jAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions) { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java index 8784877..6a2bf37 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -19,10 +19,6 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import group.rxcloud.capa.component.log.CapaLogbackAppender; -/** - * @Author gpeng - * @Date 2021/11/12 11:50 - */ public class DemoLogbackAppender implements CapaLogbackAppender { public DemoLogbackAppender() { From af1fe7e4aa0ae396caa263d035974eb45d2d38f8 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 17 Nov 2021 14:47:11 +0800 Subject: [PATCH 03/36] update some conversations --- examples/pom.xml | 11 +- examples/src/main/resources/xml/logback.xml | 10 +- pom.xml | 36 ------ sdk-component/pom.xml | 28 ++-- .../capa/component/log/CapaLog4jAppender.java | 75 +---------- .../component/log/CapaLogbackAppender.java | 5 +- .../log/agent/CapaLog4jAppenderAgent.java | 120 ++++++++++++++++++ .../{ => agent}/CapaLogbackAppenderAgent.java | 8 +- sdk-spi-demo/pom.xml | 11 ++ .../capa/spi/demo/log/DemoLog4jAppender.java | 12 +- .../spi/demo/log/DemoLogbackAppender.java | 2 +- 11 files changed, 173 insertions(+), 145 deletions(-) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java rename sdk-component/src/main/java/group/rxcloud/capa/component/log/{ => agent}/CapaLogbackAppenderAgent.java (91%) diff --git a/examples/pom.xml b/examples/pom.xml index 1f5acde..6d14731 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -30,6 +30,11 @@ jar capa-sdk-examples + + 2.8.2 + 1.1.7 + 1.7.32 + @@ -41,10 +46,12 @@ org.apache.logging.log4j log4j-api + ${log4j.version} org.apache.logging.log4j log4j-core + ${log4j.version} log4j-api @@ -56,11 +63,13 @@ org.apache.logging.log4j log4j-slf4j-impl + ${log4j.version} - diff --git a/examples/src/main/resources/xml/logback.xml b/examples/src/main/resources/xml/logback.xml index 0e82bd0..268d16c 100644 --- a/examples/src/main/resources/xml/logback.xml +++ b/examples/src/main/resources/xml/logback.xml @@ -16,21 +16,21 @@ limitations under the License. --> - - + + - + - + - + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 35bfc34..a59afbb 100644 --- a/pom.xml +++ b/pom.xml @@ -85,9 +85,6 @@ true true true - 2.8.2 - 1.1.7 - 1.7.21 @@ -147,39 +144,6 @@ ${mockito-core.version} test - - - ch.qos.logback - logback-classic - ${logback.version} - - - ch.qos.logback - logback-core - ${logback.version} - - - - org.slf4j - slf4j-api - ${slf4j.version} - - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - org.apache.logging.log4j - log4j-api - ${log4j.version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j.version} - diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 4031ddf..2dfa33a 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -33,6 +33,8 @@ 4.9.1 1.4.10 + 2.8.2 + 1.1.7 @@ -70,33 +72,27 @@ kotlin-stdlib-common ${kotlin-stdlib.version} - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.mockito - mockito-core - test - org.apache.logging.log4j log4j-core - true + ${log4j.version} ch.qos.logback logback-core - true + ${logback.version} - ch.qos.logback - logback-classic - true + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-core + test diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java index 6012ab2..bb24f58 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java @@ -16,81 +16,18 @@ */ package group.rxcloud.capa.component.log; -import group.rxcloud.capa.infrastructure.config.CapaProperties; -import org.apache.logging.log4j.core.Appender; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import java.io.Serializable; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Properties; +import org.apache.logging.log4j.core.LogEvent; /** - * The abstract log4j appender. Extend this and provide your specific impl. + * The interface of the log4j appender impl.Implement this and provide your specific impl. */ -@Plugin(name = "CapaLog4jAppender", elementType = Appender.ELEMENT_TYPE, category = "Core") -public abstract class CapaLog4jAppender extends AbstractAppender { +public interface CapaLog4jAppender { /** - * The log component type. - */ - private static final String LOG_COMPONENT_TYPE = "log"; - - /** - * Instantiates a new Capa log4j appender. - * - * @param name The name of the appender. - * @param filter The filter of the appender. - * @param layout The layout of the appender. - * @param ignoreExceptions Whether to ignore exceptions. - */ - public CapaLog4jAppender(String name, Filter filter, Layout layout, - boolean ignoreExceptions) { - super(name, filter, layout, ignoreExceptions); - } - - /** - * Create a appender instance. - * - * @param name The name of the appender. - * @param filter The filter of the appender. - * @param layout The layout of the appender. - * @param ignoreExceptions Whether to ignore exceptions. - * @return CapaLog4jAppender instance. - */ - @PluginFactory - public static CapaLog4jAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Filter") final Filter filter, @PluginElement("Layout") Layout layout, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { - return buildCapaLog4jAppender(name, filter, layout, ignoreExceptions); - } - - /** - * Build a appender instance. + * Deal with the log. * - * @param name The name of the appender. - * @param filter The filter of the appender. - * @param layout The layout of the appender. - * @param ignoreExceptions Whether to ignore exceptions. - * @return CapaLog4jAppender instance. + * @param event The log event. */ - public static CapaLog4jAppender buildCapaLog4jAppender(String name, final Filter filter, Layout layout, boolean ignoreExceptions) { - // load spi capa Log4j appender impl - try { - Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(LOG_COMPONENT_TYPE); - String capaLogAppenderClassPath = properties.getProperty(CapaLog4jAppender.class.getName()); - Class aClass = (Class) Class.forName(capaLogAppenderClassPath); - Constructor constructor = aClass.getConstructor(String.class, Filter.class, Layout.class, boolean.class); - Object newInstance = constructor.newInstance(name, filter, layout, ignoreExceptions); - return (CapaLog4jAppender) newInstance; - } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - throw new IllegalArgumentException("No Capa log4j appender supported."); - } - } + void appendLog(LogEvent event); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java index 4f25303..1259d12 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java @@ -16,17 +16,16 @@ */ package group.rxcloud.capa.component.log; -import ch.qos.logback.classic.spi.ILoggingEvent; /** * The interface of the logback appender impl.Implement this and provide your specific impl. */ -public interface CapaLogbackAppender { +public interface CapaLogbackAppender { /** * Deal with the log. * * @param event The log event. */ - void appendLog(ILoggingEvent event); + void appendLog(EVENT event); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java new file mode 100644 index 0000000..f91c489 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java @@ -0,0 +1,120 @@ +/* + * 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.log.agent; + +/** + * @Author gpeng + * @Date 2021/11/17 14:16 + */ + +import group.rxcloud.capa.component.log.CapaLog4jAppender; +import group.rxcloud.capa.infrastructure.config.CapaProperties; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Properties; + +/** + * The abstract log4j appender. Extend this and provide your specific impl. + */ +@Plugin(name = "CapaLog4jAppender", elementType = Appender.ELEMENT_TYPE, category = "Core") +public class CapaLog4jAppenderAgent extends AbstractAppender { + + /** + * The log component type. + */ + private static final String LOG_COMPONENT_TYPE = "log"; + /** + * Capa log4j appender instance. + */ + private static final CapaLog4jAppender logAppender; + + /** + * Init the logbackAppender impl. + */ + static { + logAppender = buildCapaLog4jAppender(); + } + + /** + * Instantiates a new Capa log4j appender. + * + * @param name The name of the appender. + * @param filter The filter of the appender. + * @param layout The layout of the appender. + * @param ignoreExceptions Whether to ignore exceptions. + */ + public CapaLog4jAppenderAgent(String name, + Filter filter, + Layout layout, + boolean ignoreExceptions) { + super(name, filter, layout, ignoreExceptions); + } + + /** + * Create a appender instance. + * + * @param name The name of the appender. + * @param filter The filter of the appender. + * @param layout The layout of the appender. + * @param ignoreExceptions Whether to ignore exceptions. + * @return CapaLog4jAppender instance. + */ + @PluginFactory + public static CapaLog4jAppenderAgent createAppender(@PluginAttribute("name") String name, + @PluginElement("Filter") final Filter filter, + @PluginElement("Layout") Layout layout, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + return new CapaLog4jAppenderAgent(name, filter, layout, ignoreExceptions); + } + + /** + * Build a appender instance. + * + * @return CapaLog4jAppender instance. + */ + public static CapaLog4jAppender buildCapaLog4jAppender() { + // load spi capa Log4j appender impl + try { + Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(LOG_COMPONENT_TYPE); + String capaLogAppenderClassPath = properties.getProperty(CapaLog4jAppender.class.getName()); + Class aClass = (Class) Class.forName(capaLogAppenderClassPath); + Constructor constructor = aClass.getConstructor(); + Object newInstance = constructor.newInstance(); + return (CapaLog4jAppender) newInstance; + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException("No Capa log4j appender supported."); + } + } + + @Override + public void append(LogEvent event) { + logAppender.appendLog(event); + } + + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java similarity index 91% rename from sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java index e9925bb..32a1b48 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.log; +package group.rxcloud.capa.component.log.agent; -import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.UnsynchronizedAppenderBase; +import group.rxcloud.capa.component.log.CapaLogbackAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import java.lang.reflect.Constructor; @@ -27,7 +27,7 @@ /** * The agent of the logback impl. */ -public class CapaLogbackAppenderAgent extends UnsynchronizedAppenderBase { +public class CapaLogbackAppenderAgent extends UnsynchronizedAppenderBase { /** * The log component type. @@ -70,7 +70,7 @@ public static CapaLogbackAppender buildCapaLogbackAppender() { * @param event The log event. */ @Override - protected void append(ILoggingEvent event) { + protected void append(EVENT event) { logbackAppender.appendLog(event); } } diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 9b1a80a..c6cc86f 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -29,6 +29,12 @@ capa-sdk-spi-demo jar capa-sdk-spi-demo + + 2.8.2 + 1.1.7 + 1.7.21 + + @@ -52,25 +58,30 @@ ch.qos.logback logback-classic + ${logback.version} true ch.qos.logback logback-core + ${logback.version} org.slf4j slf4j-api + ${slf4j.version} org.apache.logging.log4j log4j-core + ${log4j.version} org.apache.logging.log4j log4j-api + ${log4j.version} diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java index 985cc6e..0816d23 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -17,21 +17,13 @@ package group.rxcloud.capa.spi.demo.log; import group.rxcloud.capa.component.log.CapaLog4jAppender; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; -import java.io.Serializable; - -public class DemoLog4jAppender extends CapaLog4jAppender { - - public DemoLog4jAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions) { - super(name, filter, layout, ignoreExceptions); - } +public class DemoLog4jAppender implements CapaLog4jAppender { @Override - public void append(LogEvent event) { + public void appendLog(LogEvent event) { System.out.println("test log log4j and content is " + event.getMessage().getFormattedMessage()); } } diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java index 6a2bf37..470fc60 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -19,7 +19,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import group.rxcloud.capa.component.log.CapaLogbackAppender; -public class DemoLogbackAppender implements CapaLogbackAppender { +public class DemoLogbackAppender implements CapaLogbackAppender { public DemoLogbackAppender() { } From 02f4305c4324af66d1bd472c3d158bd3e323e715 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 17 Nov 2021 14:48:55 +0800 Subject: [PATCH 04/36] update conversation --- sdk-spi-demo/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index c6cc86f..4823d38 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -59,6 +59,7 @@ ch.qos.logback logback-classic ${logback.version} + true From df9b1a5a54bf20396c0f2e907479555581655ce3 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 17 Nov 2021 15:08:16 +0800 Subject: [PATCH 05/36] update log path --- examples/src/main/resources/xml/logback.xml | 2 +- .../capa/component/{ => telemetry}/log/CapaLog4jAppender.java | 2 +- .../component/{ => telemetry}/log/CapaLogbackAppender.java | 2 +- .../{ => telemetry}/log/agent/CapaLog4jAppenderAgent.java | 4 ++-- .../{ => telemetry}/log/agent/CapaLogbackAppenderAgent.java | 4 ++-- .../group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java | 2 +- .../group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java | 2 +- sdk-spi-demo/src/main/resources/capa-component-log.properties | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) rename sdk-component/src/main/java/group/rxcloud/capa/component/{ => telemetry}/log/CapaLog4jAppender.java (95%) rename sdk-component/src/main/java/group/rxcloud/capa/component/{ => telemetry}/log/CapaLogbackAppender.java (95%) rename sdk-component/src/main/java/group/rxcloud/capa/component/{ => telemetry}/log/agent/CapaLog4jAppenderAgent.java (97%) rename sdk-component/src/main/java/group/rxcloud/capa/component/{ => telemetry}/log/agent/CapaLogbackAppenderAgent.java (95%) diff --git a/examples/src/main/resources/xml/logback.xml b/examples/src/main/resources/xml/logback.xml index 268d16c..b97e9ee 100644 --- a/examples/src/main/resources/xml/logback.xml +++ b/examples/src/main/resources/xml/logback.xml @@ -17,7 +17,7 @@ --> - + diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java similarity index 95% rename from sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java index bb24f58..1716505 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLog4jAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.log; +package group.rxcloud.capa.component.telemetry.log; import org.apache.logging.log4j.core.LogEvent; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java similarity index 95% rename from sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java index 1259d12..869b72d 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.log; +package group.rxcloud.capa.component.telemetry.log; /** diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java similarity index 97% rename from sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java index f91c489..656311c 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java @@ -14,14 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.log.agent; +package group.rxcloud.capa.component.telemetry.log.agent; /** * @Author gpeng * @Date 2021/11/17 14:16 */ -import group.rxcloud.capa.component.log.CapaLog4jAppender; +import group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java similarity index 95% rename from sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java index 32a1b48..0eb32ef 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.log.agent; +package group.rxcloud.capa.component.telemetry.log.agent; import ch.qos.logback.core.UnsynchronizedAppenderBase; -import group.rxcloud.capa.component.log.CapaLogbackAppender; +import group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import java.lang.reflect.Constructor; diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java index 0816d23..24babde 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -16,7 +16,7 @@ */ package group.rxcloud.capa.spi.demo.log; -import group.rxcloud.capa.component.log.CapaLog4jAppender; +import group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender; import org.apache.logging.log4j.core.LogEvent; diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java index 470fc60..371db21 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -17,7 +17,7 @@ package group.rxcloud.capa.spi.demo.log; import ch.qos.logback.classic.spi.ILoggingEvent; -import group.rxcloud.capa.component.log.CapaLogbackAppender; +import group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender; public class DemoLogbackAppender implements CapaLogbackAppender { diff --git a/sdk-spi-demo/src/main/resources/capa-component-log.properties b/sdk-spi-demo/src/main/resources/capa-component-log.properties index fe4bb5f..e417dcd 100644 --- a/sdk-spi-demo/src/main/resources/capa-component-log.properties +++ b/sdk-spi-demo/src/main/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.log.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender -group.rxcloud.capa.component.log.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender +group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file From bc8da28cf9c02f8de80f2de92cbb9d38abf0f8b3 Mon Sep 17 00:00:00 2001 From: kevinten10 <596823919@qq.com> Date: Wed, 17 Nov 2021 23:22:22 +0800 Subject: [PATCH 06/36] chore: format code --- examples/pom.xml | 11 ++++++----- pom.xml | 9 +++++++++ sdk-component/pom.xml | 2 ++ sdk-infrastructure/pom.xml | 14 ++++++-------- sdk-spi-demo/pom.xml | 34 +++++++++++++++++----------------- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index 6d14731..edc17e8 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -35,6 +35,7 @@ 1.1.7 1.7.32 + @@ -66,11 +67,11 @@ ${log4j.version} - + org.projectlombok diff --git a/pom.xml b/pom.xml index dfe940d..12c1951 100644 --- a/pom.xml +++ b/pom.xml @@ -73,10 +73,12 @@ 8 UTF-8 3.8.1 + 1.7.21 1.0.7.RELEASE 3.3.11.RELEASE 5.3.1 3.6.0 + 3.1.2 0.13 2.7 @@ -132,6 +134,13 @@ true + + + org.slf4j + slf4j-api + ${slf4j.version} + + org.junit.jupiter diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 2dfa33a..98cb6ac 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -72,6 +72,7 @@ kotlin-stdlib-common ${kotlin-stdlib.version} + org.apache.logging.log4j @@ -84,6 +85,7 @@ logback-core ${logback.version} + org.junit.jupiter junit-jupiter-engine diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 9ff9834..2c2f9e4 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -34,7 +34,6 @@ 1.0.0 1.39.0 2.12.4 - 1.7.32 @@ -50,6 +49,12 @@ reactor-core + + + org.slf4j + slf4j-api + + com.kevinten @@ -57,13 +62,6 @@ ${vrml.version} - - - org.slf4j - slf4j-api - ${slf4j-api.version} - - io.grpc diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 4823d38..0be2620 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -29,13 +29,12 @@ capa-sdk-spi-demo jar capa-sdk-spi-demo + 2.8.2 1.1.7 - 1.7.21 - @@ -43,17 +42,12 @@ capa-sdk-spi - - - org.junit.jupiter - junit-jupiter-engine - test - + - org.mockito - mockito-core - test + org.slf4j + slf4j-api + ch.qos.logback @@ -67,12 +61,6 @@ logback-core ${logback.version} - - - org.slf4j - slf4j-api - ${slf4j.version} - org.apache.logging.log4j @@ -84,6 +72,18 @@ log4j-api ${log4j.version} + + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-core + test + From c168419f66001f8cd2cef58612ce622da5f350a8 Mon Sep 17 00:00:00 2001 From: kevinten10 <596823919@qq.com> Date: Wed, 17 Nov 2021 23:31:43 +0800 Subject: [PATCH 07/36] release: release 1.0.7-alpha-1 version --- README.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 60bfb22..91d7ff3 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.4.RELEASE + 1.0.6.RELEASE ... @@ -93,7 +93,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.4.RELEASE + 1.0.6.RELEASE ... diff --git a/examples/pom.xml b/examples/pom.xml index edc17e8..6791f5c 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-examples diff --git a/pom.xml b/pom.xml index 12c1951..771a156 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.6.RELEASE + 1.0.7-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 98cb6ac..d203f0c 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 2c2f9e4..59efc36 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 0be2620..3011327 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index 78521df..a840be9 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index d05e53e..eec4159 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.6.RELEASE + 1.0.7-alpha-1 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 62a8172..fada435 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.6.RELEASE + 1.0.7-alpha-1 capa-sdk From 732d0e17adf0d6b4d522432164b05d1b63c79988 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 18 Nov 2021 17:48:41 +0800 Subject: [PATCH 08/36] feat(Add a new feature): update the abstract log api in compoent Update abstract apis of log4j and logback in compoent, so the users only need to refer to the corresponding abstract apis when configuring, and don't care about the specific implementation. BREAKING CHANGE: #38 --- .../telemetry/log/agent/CapaLog4jAppenderAgent.java | 2 +- .../telemetry/log/agent/CapaLogbackAppenderAgent.java | 2 +- .../telemetry/log/{ => appender}/CapaLog4jAppender.java | 9 ++++----- .../log/{ => appender}/CapaLogbackAppender.java | 8 ++++---- .../rxcloud/capa/spi/demo/log/DemoLog4jAppender.java | 2 +- .../rxcloud/capa/spi/demo/log/DemoLogbackAppender.java | 2 +- .../src/main/resources/capa-component-log.properties | 4 ++-- 7 files changed, 14 insertions(+), 15 deletions(-) rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/{ => appender}/CapaLog4jAppender.java (79%) rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/{ => appender}/CapaLogbackAppender.java (78%) diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java index 656311c..1339ff6 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java @@ -21,7 +21,7 @@ * @Date 2021/11/17 14:16 */ -import group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender; +import group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java index 0eb32ef..8e97a2e 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java @@ -17,7 +17,7 @@ package group.rxcloud.capa.component.telemetry.log.agent; import ch.qos.logback.core.UnsynchronizedAppenderBase; -import group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender; +import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import java.lang.reflect.Constructor; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java similarity index 79% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java index 1716505..1ce66f3 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLog4jAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java @@ -14,20 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log; - +package group.rxcloud.capa.component.telemetry.log.appender; import org.apache.logging.log4j.core.LogEvent; /** - * The interface of the log4j appender impl.Implement this and provide your specific impl. + * The abstract api of the log4j appender impl.Implement this and provide your specific impl. */ -public interface CapaLog4jAppender { +public abstract class CapaLog4jAppender { /** * Deal with the log. * * @param event The log event. */ - void appendLog(LogEvent event); + public abstract void appendLog(LogEvent event); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java similarity index 78% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java index 869b72d..7aabbe1 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java @@ -14,18 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log; +package group.rxcloud.capa.component.telemetry.log.appender; /** - * The interface of the logback appender impl.Implement this and provide your specific impl. + * The abstract api of the logback appender impl.Implement this and provide your specific impl. */ -public interface CapaLogbackAppender { +public abstract class CapaLogbackAppender { /** * Deal with the log. * * @param event The log event. */ - void appendLog(EVENT event); + abstract void appendLog(EVENT event); } diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java index 24babde..ef2b7e1 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -16,7 +16,7 @@ */ package group.rxcloud.capa.spi.demo.log; -import group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender; +import group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender; import org.apache.logging.log4j.core.LogEvent; diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java index 371db21..6e36a61 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -17,7 +17,7 @@ package group.rxcloud.capa.spi.demo.log; import ch.qos.logback.classic.spi.ILoggingEvent; -import group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender; +import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; public class DemoLogbackAppender implements CapaLogbackAppender { diff --git a/sdk-spi-demo/src/main/resources/capa-component-log.properties b/sdk-spi-demo/src/main/resources/capa-component-log.properties index e417dcd..fa0373e 100644 --- a/sdk-spi-demo/src/main/resources/capa-component-log.properties +++ b/sdk-spi-demo/src/main/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.telemetry.log.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender -group.rxcloud.capa.component.telemetry.log.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender +group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file From da37ae3700116d391c1e517ea3f89b9834588dea Mon Sep 17 00:00:00 2001 From: = Date: Thu, 18 Nov 2021 18:39:31 +0800 Subject: [PATCH 09/36] style(update a new feature): update the abstract log api in compoent Update abstract apis of log4j and logback in compoent, so the users only need to refer to the corresponding abstract apis when configuring, and don't care about the specific implementation. BREAKING CHANGE: #38 --- .../component/telemetry/log/appender/CapaLogbackAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java index 7aabbe1..45b8963 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java @@ -27,5 +27,5 @@ public abstract class CapaLogbackAppender { * * @param event The log event. */ - abstract void appendLog(EVENT event); + public abstract void appendLog(EVENT event); } From 968d71a2cfd100a72aa90ca6e591497fcbb9b31c Mon Sep 17 00:00:00 2001 From: = Date: Thu, 18 Nov 2021 19:29:41 +0800 Subject: [PATCH 10/36] update demo --- .../capa/spi/demo/{ => telemetry}/log/DemoLog4jAppender.java | 4 ++-- .../spi/demo/{ => telemetry}/log/DemoLogbackAppender.java | 4 ++-- sdk-spi-demo/src/main/resources/capa-component-log.properties | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/{ => telemetry}/log/DemoLog4jAppender.java (90%) rename sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/{ => telemetry}/log/DemoLogbackAppender.java (89%) diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java similarity index 90% rename from sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java rename to sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java index ef2b7e1..80e8ab4 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.spi.demo.log; +package group.rxcloud.capa.spi.demo.telemetry.log; import group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender; import org.apache.logging.log4j.core.LogEvent; -public class DemoLog4jAppender implements CapaLog4jAppender { +public class DemoLog4jAppender extends CapaLog4jAppender { @Override public void appendLog(LogEvent event) { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java similarity index 89% rename from sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java rename to sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java index 6e36a61..ad7c3a2 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.spi.demo.log; +package group.rxcloud.capa.spi.demo.telemetry.log; import ch.qos.logback.classic.spi.ILoggingEvent; import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; -public class DemoLogbackAppender implements CapaLogbackAppender { +public class DemoLogbackAppender extends CapaLogbackAppender { public DemoLogbackAppender() { } diff --git a/sdk-spi-demo/src/main/resources/capa-component-log.properties b/sdk-spi-demo/src/main/resources/capa-component-log.properties index fa0373e..cdf5815 100644 --- a/sdk-spi-demo/src/main/resources/capa-component-log.properties +++ b/sdk-spi-demo/src/main/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender -group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLog4jAppender +group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLogbackAppender \ No newline at end of file From 232c4056f8ed6c9b9fd725eba2b85cee7d977e6c Mon Sep 17 00:00:00 2001 From: = Date: Thu, 18 Nov 2021 21:02:45 +0800 Subject: [PATCH 11/36] make dependency optional --- sdk-component/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 2dfa33a..b55ff1d 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -76,12 +76,14 @@ org.apache.logging.log4j log4j-core + true ${log4j.version} ch.qos.logback logback-core + true ${logback.version} From d52151779b5c3bcda765023b2cb56dcbd24cc548 Mon Sep 17 00:00:00 2001 From: chenyijiang Date: Tue, 16 Nov 2021 11:23:39 +0800 Subject: [PATCH 12/36] Add trace and metrics components implementation. Modify Line separator Modify Line separator ... --- examples/pom.xml | 2 +- pom.xml | 18 +- sdk-component/pom.xml | 13 +- .../configstore/CapaConfigStore.java | 20 + .../capa/component/http/HttpResponse.java | 6 + .../capa/component/pubsub/CapaPubSub.java | 2 + .../capa/component/telemetry/CapaContext.java | 57 ++ .../telemetry/CapaContextAsyncWrapper.java | 50 ++ .../capa/component/telemetry/SpiUtils.java | 195 ++++++ .../metrics/CapaMeterConfigLoader.java | 31 + .../metrics/CapaMeterProviderBuilder.java | 133 ++++ .../metrics/CapaMeterProviderSettings.java | 17 +- .../telemetry/metrics/MeterConfig.java | 35 + .../metrics/MetricsReaderConfig.java | 84 +++ .../trace/CapaContextPropagatorSettings.java | 31 + .../telemetry/trace/CapaReadWriteSpan.java | 159 +++++ .../telemetry/trace/CapaSampler.java | 59 ++ .../telemetry/trace/CapaSamplerProvider.java | 56 ++ .../telemetry/trace/CapaSpanBuilder.java | 135 ++++ .../component/telemetry/trace/CapaTracer.java | 51 ++ .../telemetry/trace/CapaTracerBuilder.java | 57 ++ .../trace/CapaTracerConfigLoader.java | 35 + .../telemetry/trace/CapaTracerProvider.java | 48 ++ .../trace/CapaTracerProviderBuilder.java | 264 ++++++++ .../trace/CapaTracerProviderSettings.java | 43 ++ .../telemetry/trace/CapaWrapper.java | 89 +++ .../telemetry/trace/EventAttributeKey.java | 61 ++ .../telemetry/trace/StatusAttributeKey.java | 48 ++ .../telemetry/trace/config/SamplerConfig.java | 49 ++ .../trace/config/SpanLimitsConfig.java | 86 +++ .../telemetry/trace/config/TracerConfig.java | 140 ++++ .../component/http/CapaHttpBuilderTest.java | 132 ++-- .../capa/component/http/CapaHttpTest.java | 126 ++-- .../capa/component/http/HttpResponseTest.java | 92 +-- .../capa/component/http/TestCapaHttp.java | 102 +-- .../capa-component-configuration.properties | 2 +- sdk-infrastructure/pom.xml | 12 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- .../telemetry/CapaContextAsyncWrapperSpi.java | 25 + .../telemetry/CapaMeterConfigLoaderSpi.java | 26 + .../spi/telemetry/CapaReadWriteSpanSpi.java | 32 + .../spi/telemetry/CapaSpanBuilderSpi.java | 31 + .../spi/telemetry/CapaTracerBuilderSpi.java | 30 + .../telemetry/CapaTracerConfigLoaderSpi.java | 25 + .../capa/spi/telemetry/CapaTracerSpi.java | 30 + .../spi/config/TestRpcServiceOptions.java | 74 +-- .../capa/spi/config/TestSpiOptionsLoader.java | 60 +- .../TestCapaConfigStoreSpiImpl.java | 4 +- .../spi/http/CapaSerializeHttpSpiTest.java | 611 +++++++++--------- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- .../rxcloud/capa/state/CapaStateClient.java | 8 +- .../capa/telemetry/CapaTelemetryClient.java | 50 ++ .../telemetry/CapaTelemetryClientBuilder.java | 118 ++++ .../telemetry/CapaTelemetryClientGlobal.java | 139 ++++ .../CapaConfigurationClientStoreTest.java | 2 +- .../configuration/TestCapaConfigStore.java | 7 +- .../capa/rpc/CapaRpcClientBuilderTest.java | 460 ++++++------- .../capa/rpc/CapaRpcClientHttpTest.java | 90 +-- .../group/rxcloud/capa/rpc/TestCapaHttp.java | 106 +-- .../InvokeMethodRequestBuilderTest.java | 172 ++--- 62 files changed, 3611 insertions(+), 1037 deletions(-) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java rename sdk/src/main/java/group/rxcloud/capa/metrics/CapaMetricsClient.java => sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java (70%) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaWrapper.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java create mode 100644 sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java create mode 100644 sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClient.java create mode 100644 sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java create mode 100644 sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java diff --git a/examples/pom.xml b/examples/pom.xml index 6791f5c..175cd89 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-examples diff --git a/pom.xml b/pom.xml index 771a156..1c96e27 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk-parent SDK for Capa. https://github.com/reactivegroup @@ -74,10 +74,12 @@ UTF-8 3.8.1 1.7.21 - 1.0.7.RELEASE + 1.0.8.RELEASE 3.3.11.RELEASE 5.3.1 3.6.0 + 1.9.0 + 1.9.0-alpha 3.1.2 0.13 @@ -141,6 +143,18 @@ ${slf4j.version} + + + io.opentelemetry + opentelemetry-api + ${open.telemetry.version} + + + io.opentelemetry + opentelemetry-api-metrics + ${open.telemetry.version.alpha} + + org.junit.jupiter diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 8b47bf9..962127b 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk-component @@ -44,6 +44,17 @@ capa-sdk-infrastructure + + io.opentelemetry + opentelemetry-sdk + 1.9.0 + + + io.opentelemetry + opentelemetry-sdk-metrics + 1.9.0-alpha + + com.squareup.okhttp3 diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java index b6513bb..87831fc 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java @@ -55,6 +55,8 @@ public CapaConfigStore(CapaObjectSerializer objectSerializer) { /** * Init the configuration store. + * + * @param storeConfig storeConfig */ public void init(StoreConfig storeConfig) { this.storeName = storeConfig.getStoreName(); @@ -68,6 +70,8 @@ public void init(StoreConfig storeConfig) { /** * Gets store name. + * + * @return storeName */ public String getStoreName() { return this.storeName; @@ -75,26 +79,42 @@ public String getStoreName() { /** * GetSpecificKeysValue get specific key value. + * + * @param getRequest + * @param type + * @param + * @return */ public abstract Mono>> get(GetRequest getRequest, TypeRef type); /** * Subscribe the configurations updates. + * + * @param subscribeReq + * @param type + * @param + * @return */ public abstract Flux> subscribe(SubscribeReq subscribeReq, TypeRef type); /** * StopSubscribe stop subs + * + * @return */ public abstract String stopSubscribe(); /** * GetDefaultGroup returns default group.This method will be invoked if a request doesn't specify the group field + * + * @return */ public abstract String getDefaultGroup(); /** * GetDefaultLabel returns default label + * + * @return */ public abstract String getDefaultLabel(); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/http/HttpResponse.java b/sdk-component/src/main/java/group/rxcloud/capa/component/http/HttpResponse.java index 82537e1..e0fc625 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/http/HttpResponse.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/http/HttpResponse.java @@ -45,6 +45,8 @@ public HttpResponse(T body, Map headers, int statusCode) { /** * Gets actual response data. + * + * @return */ public T getBody() { return body; @@ -52,6 +54,8 @@ public T getBody() { /** * Gets http headers. + * + * @return */ public Map getHeaders() { return headers; @@ -59,6 +63,8 @@ public Map getHeaders() { /** * Gets http invocation status code. + * + * @return */ public int getStatusCode() { return statusCode; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSub.java b/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSub.java index fb86728..4ed01fd 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSub.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSub.java @@ -38,6 +38,8 @@ public abstract class CapaPubSub implements AutoCloseable { /** * Gets pubsub name. + * + * @return pubsubName */ public String getPubSubName() { return this.pubsubName; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java new file mode 100644 index 0000000..dbf8f8e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledExecutorService; + +/** + */ +public final class CapaContext { + + private static final CapaContextAsyncWrapper WRAPPER = getAsyncWrapper(); + + public static Runnable taskWrapping(Runnable runnable) { + return WRAPPER.wrap(runnable); + } + + public static Callable taskWrapping(Callable callable) { + return WRAPPER.wrap(callable); + } + + public static Executor taskWrapping(Executor executor) { + return WRAPPER.wrap(executor); + } + + public static ExecutorService taskWrapping(ExecutorService executor) { + return WRAPPER.wrap(executor); + } + + public static ScheduledExecutorService taskWrapping(ScheduledExecutorService executor) { + return WRAPPER.wrap(executor); + } + + private static CapaContextAsyncWrapper getAsyncWrapper() { + CapaContextAsyncWrapper WRAPPER = SpiUtils.getFromSpiConfigFile(CapaContextAsyncWrapper.class); + if (WRAPPER == null) { + return new CapaContextAsyncWrapper() {}; + } + return WRAPPER; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java new file mode 100644 index 0000000..1a6775d --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry; + +import io.opentelemetry.context.Context; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledExecutorService; + +/** + */ +public interface CapaContextAsyncWrapper { + + default Runnable wrap(Runnable runnable) { + return Context.current().wrap(runnable); + } + + default Callable wrap(Callable callable) { + return Context.current().wrap(callable); + } + + default Executor wrap(Executor executor) { + return Context.current().wrap(executor); + } + + default ExecutorService wrap(ExecutorService executor) { + return Context.current().wrap(executor); + } + + default ScheduledExecutorService wrap(ScheduledExecutorService executor) { + return Context.current().wrap(executor); + } + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java new file mode 100644 index 0000000..e6a496a --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java @@ -0,0 +1,195 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import group.rxcloud.capa.infrastructure.config.CapaProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + */ +public final class SpiUtils { + + /** + * Shared Json serializer/deserializer as per Jackson's documentation. + */ + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .setSerializationInclusion(JsonInclude.Include.NON_NULL); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private static final Logger log = LoggerFactory.getLogger(SpiUtils.class); + + private SpiUtils() { + } + + @Nullable + public static T getFromSpiConfigFile(Class type) { + return getFromSpiConfigFile(type, null, null); + } + + @Nullable + public static T getFromSpiConfigFile(String path, Class type) { + return getFromSpiConfigFile(path, type, null, null); + } + + @Nullable + public static T getFromSpiConfigFile(String path, Class type, Class[] argTypes, Object[] args) { + if (path == null) { + return null; + } + return load(path, type, argTypes, args); + } + + @Nullable + public static T getFromSpiConfigFile(Class type, Class[] argTypes, Object[] args) { + try { + Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply("telemetry"); + String path = properties.getProperty(type.getName()); + if (path != null) { + return load(path, type, argTypes, args); + } + return null; + } catch (Throwable e) { + log.warn("Fail to load " + type.getName() + " instance from spi config file.", e); + } + return null; + } + + private static String keyOf(String path, Class type, Class[] argTypes) { + StringBuilder builder = new StringBuilder(type.getName()).append('=').append(path); + if (argTypes != null) { + for (Class arg : argTypes) { + builder.append('_').append(arg.getName()); + } + } + return builder.toString(); + } + + @Nonnull + private static T load(String path, Class type, Class[] argTypes, Object[] args) { + String key = keyOf(path, type, argTypes); + Constructor targetCons = CACHE.computeIfAbsent(key, k -> { + try { + Class aClass = path == null ? type : (Class) Class.forName(path); + if (argTypes == null || argTypes.length == 0) { + return aClass.getConstructor(); + } else { + // find the first match constructor. + for (Constructor constructor : aClass.getDeclaredConstructors()) { + if (constructor.getParameterCount() == argTypes.length) { + boolean match = true; + for (int i = 0; i < argTypes.length; i++) { + if (!isSameType(constructor.getParameterTypes()[i], args[i])) { + match = false; + break; + } + } + if (match) { + return constructor; + } + } + } + + StringBuilder message = new StringBuilder("No constructor found. targetType = ") + .append(type.getName()) + .append(" argTypes="); + for (Class argType : argTypes) { + message.append(argType.getName()).append(", "); + } + message.deleteCharAt(message.length() - 1); + throw new NoSuchMethodException(message.toString()); + } + + } catch (ClassNotFoundException | NoSuchMethodException e) { + throw new IllegalArgumentException("Fail to find the constructor. path = " + path, e); + } + }); + + try { + return targetCons.getParameterCount() == 0 ? targetCons.newInstance() : targetCons.newInstance(args); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new IllegalArgumentException("Fail to create component. targetType = " + type.getName(), e); + } + } + + public static T loadConfigNullable(String path, Class configType) { + try (InputStream in = configType.getResourceAsStream(path)) { + InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); + return OBJECT_MAPPER.readValue(inputStreamReader, configType); + } catch (IOException e) { + log.warn(path + " config file not found.", e); + } + return null; + } + + private static boolean isSameType(Class type, Object arg) { + if (arg == null) { + return !type.isPrimitive(); + } + + if (type.isInstance(arg)) { + return true; + } + + if (type.isPrimitive()) { + if (type == boolean.class) { + return arg instanceof Boolean; + } + if (type == short.class) { + return arg instanceof Short; + } + if (type == int.class) { + return arg instanceof Integer; + } + if (type == long.class) { + return arg instanceof Long; + } + if (type == float.class) { + return arg instanceof Float; + } + if (type == double.class) { + return arg instanceof Double; + } + if (type == byte.class) { + return arg instanceof Byte; + } + if (type == char.class) { + return arg instanceof Character; + } + } + + return false; + } + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java new file mode 100644 index 0000000..4ec261b --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java @@ -0,0 +1,31 @@ +/* + * 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.SpiUtils; + +/** + */ +public interface CapaMeterConfigLoader { + CapaMeterConfigLoader DEFAULT = new CapaMeterConfigLoader() {}; + + String FILE_PATH = "/capa-meter.json"; + + default MeterConfig loadMetricsConfig() { + return SpiUtils.loadConfigNullable(FILE_PATH, MeterConfig.class); + } +} 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 new file mode 100644 index 0000000..cf95877 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilder.java @@ -0,0 +1,133 @@ +/* + * 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.SpiUtils; +import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; +import io.opentelemetry.sdk.metrics.exemplar.ExemplarFilter; +import io.opentelemetry.sdk.metrics.export.MetricExporter; +import io.opentelemetry.sdk.metrics.export.MetricReaderFactory; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +/** + * + */ +public class CapaMeterProviderBuilder implements CapaMeterProviderSettings { + + private MeterConfig meterConfigs; + + public MeterConfig getMetricsConfigs() { + return meterConfigs; + } + + @Override + public CapaMeterProviderSettings setMetricsConfig(MeterConfig config) { + meterConfigs = meterConfigs; + return this; + } + + @Override + public CapaMeterProviderSettings addMetricReaderConfig(MetricsReaderConfig config) { + if (meterConfigs == null) { + meterConfigs = new MeterConfig(); + meterConfigs.setReaders(new ArrayList<>()); + } + meterConfigs.getReaders().add(config); + return this; + } + + + private void initMeterConfig() { + if (meterConfigs == null) { + CapaMeterConfigLoader meterConfigLoader = SpiUtils.getFromSpiConfigFile(CapaMeterConfigLoader.class); + if (meterConfigLoader == null) { + meterConfigLoader = CapaMeterConfigLoader.DEFAULT; + } + meterConfigs = meterConfigLoader.loadMetricsConfig(); + } + } + + public MeterProvider buildMeterProvider() { + // if config was not explicitly set, try loading the config from the config loader. + initMeterConfig(); + + MeterConfig meterConfigs = this.meterConfigs; + if (meterConfigs == null) { + return MeterProvider.noop(); + } + List readerConfigs = this.meterConfigs.getReaders(); + if (readerConfigs == null || readerConfigs.isEmpty()) { + return MeterProvider.noop(); + } + + List factories = bulidReaderFactories(readerConfigs); + if (factories.isEmpty()) { + return MeterProvider.noop(); + } + + SdkMeterProviderBuilder builder = SdkMeterProvider.builder() + .setExemplarFilter(ExemplarFilter.alwaysSample()); + factories.forEach(f -> builder.registerMetricReader(f)); + return builder.build(); + } + + private List bulidReaderFactories(List readerConfigs) { + if (readerConfigs == null || readerConfigs.isEmpty()) { + return Collections.emptyList(); + } + List factories = new ArrayList<>(); + for (MetricsReaderConfig config : readerConfigs) { + if (config.isDisable()) { + continue; + } + + MetricExporter exporter = config.getExporterInstance() != null ? config.getExporterInstance() + : SpiUtils.getFromSpiConfigFile(config.getExporterType(), MetricExporter.class); + if (exporter == null) { + throw new IllegalArgumentException( + "Metric Exporter is not configured. readerName = " + config.getReaderName() + '.'); + } + + ScheduledThreadPoolExecutor worker = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { + @Override + public Thread newThread(@NotNull Runnable r) { + Thread thread = new Thread(r); + thread.setDaemon(true); + thread.setName("capa-metric-reader-" + config.getReaderName() + '-' + System + .currentTimeMillis()); + return thread; + } + }); + + factories.add(PeriodicMetricReader.builder(exporter) + .setInterval(config.getExportIntervalMillis(), TimeUnit.MILLISECONDS) + .setExecutor(worker) + .newMetricReaderFactory()); + } + return factories; + } +} diff --git a/sdk/src/main/java/group/rxcloud/capa/metrics/CapaMetricsClient.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java similarity index 70% rename from sdk/src/main/java/group/rxcloud/capa/metrics/CapaMetricsClient.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java index c062ab3..2777a9f 100644 --- a/sdk/src/main/java/group/rxcloud/capa/metrics/CapaMetricsClient.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderSettings.java @@ -14,18 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.metrics; +package group.rxcloud.capa.component.telemetry.metrics; -import group.rxcloud.cloudruntimes.client.DefaultCloudRuntimesClient; -import reactor.core.publisher.Mono; - -public interface CapaMetricsClient extends DefaultCloudRuntimesClient { +/** + */ +public interface CapaMeterProviderSettings { - @Override - default Mono shutdown() { - return Mono.empty(); - } + CapaMeterProviderSettings setMetricsConfig(MeterConfig config); - @Override - void close(); + CapaMeterProviderSettings addMetricReaderConfig(MetricsReaderConfig config); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java new file mode 100644 index 0000000..9d76661 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java @@ -0,0 +1,35 @@ +/* + * 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 java.util.Collections; +import java.util.List; + +/** + */ +public class MeterConfig { + + private List readers = Collections.emptyList(); + + public List getReaders() { + return readers; + } + + public void setReaders(List readers) { + this.readers = readers; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java new file mode 100644 index 0000000..15e7ff1 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java @@ -0,0 +1,84 @@ +/* + * 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.sdk.metrics.export.MetricExporter; + +import java.io.Serializable; +import java.util.concurrent.TimeUnit; + +/** + */ +public class MetricsReaderConfig implements Serializable { + + private static final long serialVersionUID = 5186270483151262376L; + + private String readerName = "UNKNOWN"; + + private boolean disable; + + // default 1min. + private long exportIntervalMillis = TimeUnit.MINUTES.toMillis(1L); + + private String exporterType; + + private transient MetricExporter exporterInstance; + + public boolean isDisable() { + return disable; + } + + public void setDisable(boolean disable) { + this.disable = disable; + } + + public MetricExporter getExporterInstance() { + return exporterInstance; + } + + public void setExporterInstance(MetricExporter exporterInstance) { + this.exporterInstance = exporterInstance; + } + + public String getExporterType() { + return exporterType; + } + + public void setExporterType(String exporterType) { + this.exporterType = exporterType; + } + + public String getReaderName() { + return readerName; + } + + public void setReaderName(String readerName) { + this.readerName = readerName; + } + + public long getExportIntervalMillis() { + return exportIntervalMillis; + } + + public void setExportIntervalMillis(long exportIntervalMillis) { + this.exportIntervalMillis = exportIntervalMillis; + } + + public void setExportMillis(long export, TimeUnit timeUnit) { + this.exportIntervalMillis = timeUnit.toMillis(export); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java new file mode 100644 index 0000000..10b47e4 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java @@ -0,0 +1,31 @@ +/* + * 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.trace; + +import io.opentelemetry.context.propagation.TextMapPropagator; + +import java.util.List; + +/** + */ +public interface CapaContextPropagatorSettings { + + CapaContextPropagatorSettings setContextPropagators(List contextPropagators); + + CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor); + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java new file mode 100644 index 0000000..e438945 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java @@ -0,0 +1,159 @@ +/* + * 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.trace; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.data.SpanData; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.TimeUnit; + +/** + */ +public class CapaReadWriteSpan implements ReadWriteSpan { + + protected final ReadWriteSpan span; + + protected final String tracerName; + + protected final String version; + + protected final String schemaUrl; + + public CapaReadWriteSpan(String tracerName, String version, String schemaUrl, ReadWriteSpan span) { + this.span = span; + this.tracerName = tracerName; + this.version = version; + this.schemaUrl = schemaUrl; + } + + public String getTracerName() { + return tracerName == null ? getInstrumentationLibraryInfo().getName() : tracerName; + } + + public String getVersion() { + return version == null ? getInstrumentationLibraryInfo().getVersion() : version; + } + + public String getSchemaUrl() { + return schemaUrl == null ? getInstrumentationLibraryInfo().getSchemaUrl() : schemaUrl; + } + + @Override + public Span setAttribute(AttributeKey key, T value) { + span.setAttribute(key, value); + return this; + } + + @Override + public Span addEvent(String name, Attributes attributes) { + span.addEvent(name, attributes); + return this; + } + + @Override + public Span addEvent(String name, Attributes attributes, long timestamp, TimeUnit unit) { + span.addEvent(name, attributes, timestamp, unit); + return this; + } + + @Override + public Span setStatus(StatusCode statusCode, String description) { + span.setStatus(statusCode, description); + return this; + } + + @Override + public Span recordException(Throwable exception, Attributes additionalAttributes) { + span.recordException(exception, additionalAttributes); + return this; + } + + @Override + public Span updateName(String name) { + span.updateName(name); + return this; + } + + @Override + public void end() { + span.end(); + } + + @Override + public void end(long timestamp, TimeUnit unit) { + span.end(timestamp, unit); + } + + @Override + public SpanContext getSpanContext() { + return span.getSpanContext(); + } + + @Override + public SpanContext getParentSpanContext() { + return span.getParentSpanContext(); + } + + @Override + public String getName() { + return span.getName(); + } + + @Override + public SpanData toSpanData() { + return span.toSpanData(); + } + + @Override + public InstrumentationLibraryInfo getInstrumentationLibraryInfo() { + return span.getInstrumentationLibraryInfo(); + } + + @Override + public boolean hasEnded() { + return span.hasEnded(); + } + + @Override + public long getLatencyNanos() { + return span.getLatencyNanos(); + } + + @Override + public SpanKind getKind() { + return span.getKind(); + } + + @Nullable + @Override + public T getAttribute(AttributeKey key) { + return span.getAttribute(key); + } + + @Override + public boolean isRecording() { + return span.isRecording(); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java new file mode 100644 index 0000000..92a15e4 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java @@ -0,0 +1,59 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.trace.config.SamplerConfig; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.data.LinkData; +import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.sdk.trace.samplers.SamplingResult; + +import java.util.List; + +/** + * todo add more args ablout sampling + */ +public class CapaSampler implements Sampler { + + private Sampler inner; + + public CapaSampler(SamplerConfig config) { + update(config); + } + + public void update(SamplerConfig config) { + if (config.isDisable()) { + inner = Sampler.alwaysOff(); + } else { + inner = Sampler.alwaysOn(); + } + // todo more. + } + + @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); + } + + @Override + public String getDescription() { + return "Always or never sample the telemetry data."; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java new file mode 100644 index 0000000..182f9d7 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.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.trace; + +import group.rxcloud.capa.component.telemetry.trace.config.SamplerConfig; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Capa Sampler Cache. + */ +final class CapaSamplerProvider { + + private static final Map CACHE = new ConcurrentHashMap<>(); + + @Nonnull + public static Sampler getDefault() { + return getOrCreate(SamplerConfig.DEFAULT_CONFIG); + } + + @Nullable + public Sampler get(String name) { + return CACHE.get(name); + } + + @Nonnull + static Sampler getOrCreate(@Nullable SamplerConfig samplerConfig) { + if (samplerConfig == null) { + return getDefault(); + } + + Sampler sampler = CACHE.computeIfAbsent(samplerConfig.getName(), k -> { + return new CapaSampler(samplerConfig); + }); + return Sampler.parentBased(sampler); + } + +} 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 new file mode 100644 index 0000000..1ff6f5e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSpanBuilder.java @@ -0,0 +1,135 @@ +/* + * 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.trace; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.ReadWriteSpan; + +import java.util.concurrent.TimeUnit; + +/** + */ +public class CapaSpanBuilder implements SpanBuilder { + + protected final String tracerName; + + protected String version; + + protected String schemaUrl; + + protected final String spanName; + + protected final SpanBuilder spanBuilder; + + public CapaSpanBuilder(String tracerName, String version, String schemaUrl, String spanName, + SpanBuilder spanBuilder) { + this.tracerName = tracerName; + this.version = version; + this.schemaUrl = schemaUrl; + this.spanName = spanName; + this.spanBuilder = spanBuilder; + } + + public String getSchemaUrl() { + return schemaUrl; + } + + public String getVersion() { + return version; + } + + @Override + public SpanBuilder setParent(Context context) { + spanBuilder.setParent(context); + return this; + } + + @Override + public SpanBuilder setNoParent() { + spanBuilder.setNoParent(); + return this; + } + + @Override + public SpanBuilder addLink(SpanContext spanContext) { + spanBuilder.addLink(spanContext); + return this; + } + + @Override + public SpanBuilder addLink(SpanContext spanContext, Attributes attributes) { + spanBuilder.addLink(spanContext, attributes); + return this; + } + + @Override + public SpanBuilder setAttribute(String key, String value) { + spanBuilder.setAttribute(key, value); + return this; + } + + @Override + public SpanBuilder setAttribute(String key, long value) { + spanBuilder.setAttribute(key, value); + return this; + } + + @Override + public SpanBuilder setAttribute(String key, double value) { + spanBuilder.setAttribute(key, value); + return this; + } + + @Override + public SpanBuilder setAttribute(String key, boolean value) { + spanBuilder.setAttribute(key, value); + return this; + } + + @Override + public SpanBuilder setAttribute(AttributeKey key, T value) { + spanBuilder.setAttribute(key, value); + return this; + } + + @Override + public SpanBuilder setSpanKind(SpanKind spanKind) { + spanBuilder.setSpanKind(spanKind); + return this; + } + + @Override + public SpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) { + spanBuilder.setStartTimestamp(startTimestamp, unit); + return this; + } + + @Override + public Span startSpan() { + Span span = spanBuilder.startSpan(); + if (span instanceof ReadWriteSpan) { + return CapaWrapper.wrap(tracerName, version, schemaUrl, (ReadWriteSpan) span); + } + return span; + } +} 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 new file mode 100644 index 0000000..363b255 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracer.java @@ -0,0 +1,51 @@ +/* + * 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.trace; + +import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.Tracer; + +/** + */ +public class CapaTracer implements Tracer { + + protected final String tracerName; + protected final String version; + protected final String schemaUrl; + protected final Tracer tracer; + + public CapaTracer(String tracerName, String version, String schemaUrl, Tracer tracer) { + this.tracerName = tracerName; + this.version = version; + this.schemaUrl = schemaUrl; + this.tracer = tracer; + } + + @Override + public SpanBuilder spanBuilder(String spanName) { + SpanBuilder builder = tracer.spanBuilder(spanName); + return CapaWrapper.wrap(tracerName, version, schemaUrl, spanName, builder); + } + + public String getVersion() { + return version; + } + + public String getSchemaUrl() { + return schemaUrl; + } +} 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 new file mode 100644 index 0000000..3a04a35 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerBuilder.java @@ -0,0 +1,57 @@ +/* + * 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.trace; + +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.TracerBuilder; + +/** + */ +public class CapaTracerBuilder implements TracerBuilder { + + protected final TracerBuilder tracerBuilder; + + protected final String tracerName; + + protected String version; + + protected String schemaUrl; + + public CapaTracerBuilder(String tracerName, TracerBuilder tracerBuilder) { + this.tracerName = tracerName; + this.tracerBuilder = tracerBuilder; + } + + @Override + public TracerBuilder setSchemaUrl(String schemaUrl) { + tracerBuilder.setSchemaUrl(schemaUrl); + this.schemaUrl = schemaUrl; + return this; + } + + @Override + public TracerBuilder setInstrumentationVersion(String instrumentationVersion) { + tracerBuilder.setInstrumentationVersion(instrumentationVersion); + this.version = instrumentationVersion; + return this; + } + + @Override + public Tracer build() { + return CapaWrapper.wrap(tracerName, version, schemaUrl, tracerBuilder.build()); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java new file mode 100644 index 0000000..2dc1e27 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java @@ -0,0 +1,35 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.SpiUtils; +import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; + +/** + */ +public interface CapaTracerConfigLoader { + + CapaTracerConfigLoader DEFAULT = new CapaTracerConfigLoader() { + }; + + String FILE_PATH = "/capa-tracer.json"; + + default TracerConfig loadTracerConfig() { + return SpiUtils.loadConfigNullable(FILE_PATH, TracerConfig.class); + } + +} 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 new file mode 100644 index 0000000..5d9e8f9 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProvider.java @@ -0,0 +1,48 @@ +/* + * 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.trace; + +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.TracerBuilder; +import io.opentelemetry.api.trace.TracerProvider; + +/** + */ +public class CapaTracerProvider implements TracerProvider { + + private final TracerProvider provider; + + public CapaTracerProvider(TracerProvider provider) { + this.provider = provider; + } + + @Override + public Tracer get(String instrumentationName) { + return tracerBuilder(instrumentationName).build(); + } + + @Override + public Tracer get(String instrumentationName, String instrumentationVersion) { + return tracerBuilder(instrumentationName).setInstrumentationVersion(instrumentationVersion).build(); + } + + @Override + public TracerBuilder tracerBuilder(String instrumentationName) { + TracerBuilder tracerBuilder = provider.tracerBuilder(instrumentationName); + return CapaWrapper.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 new file mode 100644 index 0000000..592d082 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilder.java @@ -0,0 +1,264 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.SpiUtils; +import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; +import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.trace.IdGenerator; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; +import io.opentelemetry.sdk.trace.SpanLimits; +import io.opentelemetry.sdk.trace.SpanLimitsBuilder; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + */ +public class CapaTracerProviderBuilder implements CapaTracerProviderSettings, CapaContextPropagatorSettings { + + private TracerConfig tracerConfig; + + private IdGenerator idGenerator; + + private Sampler sampler; + + private List processors; + + private SpanLimitsConfig spanLimitsConfig; + + private List contextPropagators; + + private static boolean addSpanLimits(SpanLimitsConfig spanLimits, SpanLimitsBuilder limits) { + if (spanLimits == null) { + return false; + } + boolean added = false; + if (spanLimits.getMaxAttributeValueLength() != null) { + limits.setMaxAttributeValueLength(spanLimits.getMaxAttributeValueLength()); + added = true; + } + if (spanLimits.getMaxNumAttributes() != null) { + limits.setMaxNumberOfAttributes(spanLimits.getMaxNumAttributes()); + added = true; + } + if (spanLimits.getMaxNumEvents() != null) { + limits.setMaxNumberOfEvents(spanLimits.getMaxNumEvents()); + added = true; + } + if (spanLimits.getMaxNumLinks() != null) { + limits.setMaxNumberOfLinks(spanLimits.getMaxNumLinks()); + added = true; + } + if (spanLimits.getMaxNumAttributesPerLink() != null) { + limits.setMaxNumberOfAttributesPerLink(spanLimits.getMaxNumAttributesPerLink()); + added = true; + } + if (spanLimits.getMaxNumAttributesPerEvent() != null) { + limits.setMaxNumberOfAttributesPerEvent(spanLimits.getMaxNumAttributesPerEvent()); + added = true; + } + return added; + } + + @Override + public CapaTracerProviderBuilder setTracerConfig(TracerConfig tracerConfig) { + this.tracerConfig = tracerConfig; + return this; + } + + @Override + public CapaTracerProviderSettings setSpanLimits(SpanLimitsConfig spanLimits) { + this.spanLimitsConfig = spanLimits; + return this; + } + + @Override + public CapaTracerProviderBuilder setIdGenerator(IdGenerator idGenerator) { + this.idGenerator = idGenerator; + return this; + } + + @Override + public CapaTracerProviderBuilder setSampler(Sampler sampler) { + this.sampler = sampler; + return this; + } + + @Override + public CapaTracerProviderBuilder setProcessors(List processors) { + if (processors != null) { + this.processors = new ArrayList<>(processors); + } + return this; + } + + @Override + public CapaTracerProviderBuilder addProcessor(SpanProcessor processor) { + if (processors == null) { + processors = new ArrayList<>(); + } + processors.add(processor); + return this; + } + + @Override + public CapaContextPropagatorSettings setContextPropagators(List contextPropagators) { + if (contextPropagators != null) { + this.contextPropagators = new ArrayList<>(contextPropagators); + } + return this; + } + + @Override + public CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor) { + if (contextPropagators != null) { + contextPropagators = new ArrayList<>(); + } + contextPropagators.add(processor); + return this; + } + + private void initTracerConfig() { + if (tracerConfig == null) { + CapaTracerConfigLoader tracerConfigLoader = SpiUtils.getFromSpiConfigFile(CapaTracerConfigLoader.class); + if (tracerConfigLoader == null) { + tracerConfigLoader = CapaTracerConfigLoader.DEFAULT; + } + tracerConfig = tracerConfigLoader.loadTracerConfig(); + } + } + + public CapaTracerProvider buildTracerProvider() { + // if config was not explicitly set, try loading the config from the config loader. + initTracerConfig(); + + SdkTracerProviderBuilder builder = SdkTracerProvider.builder(); + addSpanLimits(builder); + addIdGenerator(builder); + addSampler(builder); + addProcessors(builder); + + SdkTracerProvider provider = builder.build(); + + if (!tracerConfig.isEnableIdValidate()) { + skipIdValidate(provider); + } + + return new CapaTracerProvider(provider); + } + + public ContextPropagators buildContextPropagators() { + List propagators = contextPropagators; + + if (propagators == null) { + initTracerConfig(); + if (tracerConfig != null) { + propagators = new ArrayList<>(); + if (tracerConfig.getContextPropagatorsInstance() != null && !tracerConfig + .getContextPropagatorsInstance().isEmpty()) { + propagators.addAll(tracerConfig.getContextPropagatorsInstance()); + } + if (tracerConfig.getContextPropagators() != null && !tracerConfig + .getContextPropagators().isEmpty()) { + propagators.addAll(tracerConfig.getContextPropagators().stream() + .map(path -> SpiUtils + .getFromSpiConfigFile(path, TextMapPropagator.class)) + .collect(Collectors.toList())); + } + + } + } + + return propagators == null || propagators.isEmpty() ? ContextPropagators.noop() : ContextPropagators + .create(TextMapPropagator.composite(propagators.toArray(new TextMapPropagator[0]))); + } + + private void addIdGenerator(SdkTracerProviderBuilder builder) { + if (idGenerator != null) { + builder.setIdGenerator(idGenerator); + } else if (tracerConfig != null) { + IdGenerator generator = SpiUtils.getFromSpiConfigFile(tracerConfig.getIdGenerator(), IdGenerator.class); + if (generator != null) { + builder.setIdGenerator(generator); + } + } + } + + private void addSpanLimits(SdkTracerProviderBuilder builder) { + SpanLimitsBuilder limits = SpanLimits.builder(); + boolean added = false; + if (tracerConfig != null && tracerConfig.getSpanLimits() != null) { + added |= addSpanLimits(tracerConfig.getSpanLimits(), limits); + } else if (spanLimitsConfig != null) { + added |= addSpanLimits(spanLimitsConfig, limits); + } + if (added) { + builder.setSpanLimits(limits.build()); + } + } + + private void addSampler(SdkTracerProviderBuilder builder) { + if (sampler != null) { + builder.setSampler(sampler); + } else if (tracerConfig != null) { + builder.setSampler(CapaSamplerProvider.getOrCreate(tracerConfig.getSampler())); + } + } + + private void addProcessors(SdkTracerProviderBuilder builder) { + if (processors != null && !processors.isEmpty()) { + processors.forEach(p -> builder.addSpanProcessor(p)); + } else if (tracerConfig != null) { + if (tracerConfig.getProcessorsInstance() != null) { + tracerConfig.getProcessorsInstance().forEach(p -> builder.addSpanProcessor(p)); + } + if (tracerConfig.getProcessors() != null) { + tracerConfig.getProcessors().forEach(p -> { + SpanProcessor processor = SpiUtils.getFromSpiConfigFile(p, SpanProcessor.class); + if (processor != null) { + builder.addSpanProcessor(processor); + } + }); + } + } + } + + private void skipIdValidate(SdkTracerProvider provider) { + try { + Field fieldTracerSharedState = SdkTracerProvider.class.getDeclaredField("sharedState"); + fieldTracerSharedState.setAccessible(true); + Object sharedStatus = fieldTracerSharedState.get(provider); + Class sharedStatusType = sharedStatus.getClass(); + Field fieldFlag = sharedStatusType.getDeclaredField("idGeneratorSafeToSkipIdValidation"); + fieldFlag.setAccessible(true); + fieldFlag.set(sharedStatus, true); + } catch (NoSuchFieldException | IllegalAccessException e) { + // todo + throw new CapaException(e); + } + } + +} 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 new file mode 100644 index 0000000..795e306 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderSettings.java @@ -0,0 +1,43 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; +import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import io.opentelemetry.sdk.trace.IdGenerator; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +import java.util.List; + +/** + */ +public interface CapaTracerProviderSettings { + + CapaTracerProviderSettings setTracerConfig(TracerConfig tracerConfig); + + CapaTracerProviderSettings setSpanLimits(SpanLimitsConfig spanLimits); + + CapaTracerProviderSettings setIdGenerator(IdGenerator idGenerator); + + CapaTracerProviderSettings setSampler(Sampler sampler); + + CapaTracerProviderSettings setProcessors(List processors); + + CapaTracerProviderSettings addProcessor(SpanProcessor processor); + +} 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/CapaWrapper.java new file mode 100644 index 0000000..0ef14d9 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaWrapper.java @@ -0,0 +1,89 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.SpiUtils; +import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.TracerBuilder; +import io.opentelemetry.sdk.trace.ReadWriteSpan; + +import javax.annotation.Nullable; + +/** + * Load capa implementation. + */ +final class CapaWrapper { + + private CapaWrapper() { + } + + @Nullable + static CapaSpanBuilder wrap(String tracerName, String version, String schemaUrl, String spanName, SpanBuilder builder) { + if (builder instanceof CapaSpanBuilder) { + return (CapaSpanBuilder) builder; + } + CapaSpanBuilder result = SpiUtils + .getFromSpiConfigFile(CapaSpanBuilder.class, new Class[]{String.class, String.class, String.class, String.class, SpanBuilder.class}, + new Object[]{tracerName, version, schemaUrl, spanName, builder}); + if (result == null) { + result = new CapaSpanBuilder(tracerName, version, schemaUrl, spanName, builder); + } + return result; + } + + @Nullable + static CapaReadWriteSpan wrap(String tracerName, String version, String schemaUrl, ReadWriteSpan span) { + if (span instanceof CapaReadWriteSpan) { + return (CapaReadWriteSpan) span; + } + CapaReadWriteSpan result = SpiUtils + .getFromSpiConfigFile(CapaReadWriteSpan.class, new Class[]{String.class, String.class, String.class, ReadWriteSpan.class}, new Object[]{tracerName, version, schemaUrl, span}); + if (result == null) { + result = new CapaReadWriteSpan(tracerName, version, schemaUrl, span); + } + return result; + } + + @Nullable + static CapaTracer wrap(String tracerName, String version, String schemaUrl, Tracer tracer) { + if (tracer instanceof CapaTracer) { + return (CapaTracer) tracer; + } + CapaTracer result = SpiUtils.getFromSpiConfigFile(CapaTracer.class, new Class[]{String.class, String.class, String.class, Tracer.class}, + new Object[]{tracerName, version, schemaUrl, tracer}); + if (result == null) { + result = new CapaTracer(tracerName, version, schemaUrl, tracer); + } + return result; + } + + @Nullable + static CapaTracerBuilder wrap(String tracerName, TracerBuilder tracerBuilder) { + if (tracerBuilder instanceof CapaTracerBuilder) { + return (CapaTracerBuilder) tracerBuilder; + } + CapaTracerBuilder result = SpiUtils + .getFromSpiConfigFile(CapaTracerBuilder.class, new Class[]{String.class, TracerBuilder.class}, + new Object[]{tracerName, tracerBuilder}); + if (result == null) { + result = new CapaTracerBuilder(tracerName, tracerBuilder); + } + return result; + } + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java new file mode 100644 index 0000000..099a60f --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java @@ -0,0 +1,61 @@ +/* + * 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.trace; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.AttributeType; + +/** + */ +public final class EventAttributeKey implements AttributeKey { + + public static EventAttributeKey SIZE = new EventAttributeKey(AttributeKey.longKey("_capa_event_size")); + + public static EventAttributeKey COUNT = new EventAttributeKey(AttributeKey.longKey("_capa_event_count")); + + public static EventAttributeKey FAIL = new EventAttributeKey(AttributeKey.longKey("_capa_event_fail")); + + private final AttributeKey key; + + private EventAttributeKey(AttributeKey key) { + this.key = key; + } + + public Integer getNum(Object value) { + if (!(value instanceof Long)) { + return null; + } + + Long l = (Long) value; + // overflow + if (l.compareTo((long)Integer.MAX_VALUE) > 0 || l.compareTo((long)Integer.MIN_VALUE) < 0 ) { + return null; + } + + return ((Long) value).intValue(); + } + + @Override + public String getKey() { + return key.getKey(); + } + + @Override + public AttributeType getType() { + return key.getType(); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java new file mode 100644 index 0000000..c122988 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java @@ -0,0 +1,48 @@ +/* + * 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.trace; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.AttributeType; + +/** + */ +public final class StatusAttributeKey implements AttributeKey { + + public static StatusAttributeKey MESSAGE = new StatusAttributeKey(AttributeKey.stringKey("_capa_error_message")); + + public static StatusAttributeKey STATUS = new StatusAttributeKey(AttributeKey.stringKey("_capa_status")); + + public static StatusAttributeKey LINK = new StatusAttributeKey(AttributeKey.stringKey("_capa_link")); + + private final AttributeKey key; + + private StatusAttributeKey(AttributeKey key) { + this.key = key; + } + + + @Override + public String getKey() { + return key.getKey(); + } + + @Override + public AttributeType getType() { + return key.getType(); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java new file mode 100644 index 0000000..15baade --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java @@ -0,0 +1,49 @@ +/* + * 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.trace.config; + +import java.io.Serializable; + +/** + */ +public class SamplerConfig implements Serializable { + + private static final long serialVersionUID = -2113523925814197551L; + + // 默认全部取样 + public static final transient SamplerConfig DEFAULT_CONFIG = new SamplerConfig(); + + private String name = "_DEFAULT_SAMPLER"; + + private boolean disable; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isDisable() { + return disable; + } + + public void setDisable(boolean disable) { + this.disable = disable; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java new file mode 100644 index 0000000..9a7c14b --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java @@ -0,0 +1,86 @@ +/* + * 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.trace.config; + +import java.io.Serializable; + +/** + */ +public class SpanLimitsConfig implements Serializable { + + private static final long serialVersionUID = 6918786580143929155L; + + private Integer maxNumAttributes; + + private Integer maxNumEvents; + + private Integer maxNumLinks; + + private Integer maxNumAttributesPerEvent; + + private Integer maxNumAttributesPerLink; + + private Integer maxAttributeValueLength; + + public Integer getMaxNumAttributes() { + return maxNumAttributes; + } + + public void setMaxNumAttributes(Integer maxNumAttributes) { + this.maxNumAttributes = maxNumAttributes; + } + + public Integer getMaxNumEvents() { + return maxNumEvents; + } + + public void setMaxNumEvents(Integer maxNumEvents) { + this.maxNumEvents = maxNumEvents; + } + + public Integer getMaxNumLinks() { + return maxNumLinks; + } + + public void setMaxNumLinks(Integer maxNumLinks) { + this.maxNumLinks = maxNumLinks; + } + + public Integer getMaxNumAttributesPerEvent() { + return maxNumAttributesPerEvent; + } + + public void setMaxNumAttributesPerEvent(Integer maxNumAttributesPerEvent) { + this.maxNumAttributesPerEvent = maxNumAttributesPerEvent; + } + + public Integer getMaxNumAttributesPerLink() { + return maxNumAttributesPerLink; + } + + public void setMaxNumAttributesPerLink(Integer maxNumAttributesPerLink) { + this.maxNumAttributesPerLink = maxNumAttributesPerLink; + } + + public Integer getMaxAttributeValueLength() { + return maxAttributeValueLength; + } + + public void setMaxAttributeValueLength(Integer maxAttributeValueLength) { + this.maxAttributeValueLength = maxAttributeValueLength; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java new file mode 100644 index 0000000..f9df117 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java @@ -0,0 +1,140 @@ +/* + * 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.trace.config; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.trace.SpanProcessor; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + */ +public class TracerConfig implements Serializable { + + private static final long serialVersionUID = 6587103489345563395L; + + private String idGenerator; + + private boolean enableIdValidate; + + private SamplerConfig sampler; + + private SpanLimitsConfig spanLimits; + + private List processors; + + private List contextPropagators; + + private transient List processorsInstance; + + private transient List contextPropagatorsInstance; + + public List getProcessorsInstance() { + return processorsInstance; + } + + public void setProcessorsInstance(List processorsInstance) { + this.processorsInstance = processorsInstance; + } + + public List getContextPropagatorsInstance() { + return contextPropagatorsInstance; + } + + public void setContextPropagatorsInstance( + List contextPropagatorsInstance) { + this.contextPropagatorsInstance = contextPropagatorsInstance; + } + + public List getContextPropagators() { + return contextPropagators; + } + + public void setContextPropagators(List contextPropagators) { + this.contextPropagators = contextPropagators; + } + + public String getIdGenerator() { + return idGenerator; + } + + public void setIdGenerator(String className) { + this.idGenerator = className; + } + + public boolean isEnableIdValidate() { + return enableIdValidate; + } + + public void setEnableIdValidate(boolean enableIdValidate) { + this.enableIdValidate = enableIdValidate; + } + + public SamplerConfig getSampler() { + return sampler; + } + + public void setSampler(SamplerConfig sampler) { + this.sampler = sampler; + } + + public SpanLimitsConfig getSpanLimits() { + return spanLimits; + } + + public void setSpanLimits(SpanLimitsConfig spanLimits) { + this.spanLimits = spanLimits; + } + + public List getProcessors() { + return processors; + } + + public void setProcessors(List processors) { + this.processors = processors; + } + + public void addProcessor(String processor) { + if (processors == null) { + processors = new ArrayList<>(); + } + processors.add(processor); + } + + public void addContextPropagator(String contextPropagator) { + if (contextPropagators == null) { + contextPropagators = new ArrayList<>(); + } + contextPropagators.add(contextPropagator); + } + + public void addProcessorInstance(SpanProcessor processor) { + if (processorsInstance == null) { + processorsInstance = new ArrayList<>(); + } + processorsInstance.add(processor); + } + + public void addContextPropagatorInstance(TextMapPropagator contextPropagator) { + if (contextPropagatorsInstance == null) { + contextPropagatorsInstance = new ArrayList<>(); + } + contextPropagatorsInstance.add(contextPropagator); + } +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpBuilderTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpBuilderTest.java index 2f60a08..b1beb44 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpBuilderTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpBuilderTest.java @@ -1,66 +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.http; - -import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; -import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class CapaHttpBuilderTest { - - @Test - public void testWithObjectSerializer_FailWhenCapaObjectSerializerIsNull() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { - new CapaHttpBuilder().withObjectSerializer(null); - }); - } - - @Test - public void testWithObjectSerializer_FailWhenContentTypeIsNull() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { - new CapaHttpBuilder().withObjectSerializer(new TestObjectSerializer()); - }); - } - - @Test - public void testWithObjectSerializer_SuccessWhenDefaultObjectSerializerIsUsed() { - CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder().withObjectSerializer(new DefaultObjectSerializer()); - Assertions.assertNotNull(capaHttpBuilder); - } - - @Test - public void testBuild_Success() { - CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder(); - capaHttpBuilder.build(); - } - - /** - * serializer/deserializer for request/response objects used in tests only - */ - private class TestObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { - - /** - * {@inheritDoc} - */ - @Override - public String getContentType() { - return ""; - } - } -} +/* + * 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.http; + +import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; +import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; +import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class CapaHttpBuilderTest { + + @Test + public void testWithObjectSerializer_FailWhenCapaObjectSerializerIsNull() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + new CapaHttpBuilder().withObjectSerializer(null); + }); + } + + @Test + public void testWithObjectSerializer_FailWhenContentTypeIsNull() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + new CapaHttpBuilder().withObjectSerializer(new TestObjectSerializer()); + }); + } + + @Test + public void testWithObjectSerializer_SuccessWhenDefaultObjectSerializerIsUsed() { + CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder().withObjectSerializer(new DefaultObjectSerializer()); + Assertions.assertNotNull(capaHttpBuilder); + } + + @Test + public void testBuild_Success() { + CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder(); + capaHttpBuilder.build(); + } + + /** + * serializer/deserializer for request/response objects used in tests only + */ + private class TestObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { + + /** + * {@inheritDoc} + */ + @Override + public String getContentType() { + return ""; + } + } +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java index 443daf5..bcc67ad 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java @@ -1,63 +1,63 @@ -/* - * 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.http; - -import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; -import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.OkHttpClient; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author huijing xu - * @date 2021/10/18 - */ -public class CapaHttpTest { - - @Test - public void testInvokeApi_Success() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); - Mono> responseMono = capaHttp.invokeApi("post", - null, - null, - null, - headers, - null, - TypeRef.STRING); - - HttpResponse block = responseMono.block(); - int statusCode = block.getStatusCode(); - - Assertions.assertEquals(200, statusCode); - } - - @Test - public void testClose_Success() throws Exception { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); - - capaHttp.close(); - } -} +/* + * 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.http; + +import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import okhttp3.OkHttpClient; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author huijing xu + * @date 2021/10/18 + */ +public class CapaHttpTest { + + @Test + public void testInvokeApi_Success() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); + Mono> responseMono = capaHttp.invokeApi("post", + null, + null, + null, + headers, + null, + TypeRef.STRING); + + HttpResponse block = responseMono.block(); + int statusCode = block.getStatusCode(); + + Assertions.assertEquals(200, statusCode); + } + + @Test + public void testClose_Success() throws Exception { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); + + capaHttp.close(); + } +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/HttpResponseTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/HttpResponseTest.java index b61aae4..b4aabb5 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/HttpResponseTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/HttpResponseTest.java @@ -1,46 +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.http; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - -public class HttpResponseTest { - - @Test - public void testGet_Success() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - - HttpResponse httpResponse = new HttpResponse("body", headers, 200); - - Assertions.assertEquals("body", httpResponse.getBody()); - - Map resultMap = headers; - if (httpResponse.getHeaders() != null) { - resultMap = httpResponse.getHeaders(); - } - Assertions.assertEquals("application/json", resultMap.get("Content-Type")); - - Assertions.assertEquals(200, httpResponse.getStatusCode()); - } - - -} +/* + * 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.http; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +public class HttpResponseTest { + + @Test + public void testGet_Success() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + + HttpResponse httpResponse = new HttpResponse("body", headers, 200); + + Assertions.assertEquals("body", httpResponse.getBody()); + + Map resultMap = headers; + if (httpResponse.getHeaders() != null) { + resultMap = httpResponse.getHeaders(); + } + Assertions.assertEquals("application/json", resultMap.get("Content-Type")); + + Assertions.assertEquals(200, httpResponse.getStatusCode()); + } + + +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java index e5dc9de..fa69654 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java @@ -1,51 +1,51 @@ -/* - * 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.http; - -import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.OkHttpClient; -import reactor.util.context.Context; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -/** - * The capa http invoker used in tests only. - */ -public class TestCapaHttp extends CapaHttp { - - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); - } - - @Override - protected CompletableFuture> doInvokeApi(String httpMethod, - String[] pathSegments, - Map> urlParameters, - Object requestData, - Map headers, - Context context, - TypeRef type) { - return CompletableFuture.supplyAsync( - () -> { - return new HttpResponse<>(null, null, 200); - }, - Runnable::run); - } -} +/* + * 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.http; + +import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import okhttp3.OkHttpClient; +import reactor.util.context.Context; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** + * The capa http invoker used in tests only. + */ +public class TestCapaHttp extends CapaHttp { + + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); + } + + @Override + protected CompletableFuture> doInvokeApi(String httpMethod, + String[] pathSegments, + Map> urlParameters, + Object requestData, + Map headers, + Context context, + TypeRef type) { + return CompletableFuture.supplyAsync( + () -> { + return new HttpResponse<>(null, null, 200); + }, + Runnable::run); + } +} diff --git a/sdk-component/src/test/resources/capa-component-configuration.properties b/sdk-component/src/test/resources/capa-component-configuration.properties index 2e1217f..4b98d3f 100644 --- a/sdk-component/src/test/resources/capa-component-configuration.properties +++ b/sdk-component/src/test/resources/capa-component-configuration.properties @@ -1 +1 @@ -group.rxcloud.capa.component.configstore.CapaConfigStore=group.rxcloud.capa.component.configstore.TestCapaConfigStore +group.rxcloud.capa.component.configstore.CapaConfigStore=group.rxcloud.capa.component.configstore.TestCapaConfigStore diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 59efc36..0b0e319 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk-infrastructure @@ -55,6 +55,16 @@ slf4j-api + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry + opentelemetry-api-metrics + + com.kevinten diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 3011327..c260d53 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index a840be9..f2245bc 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk-spi diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java new file mode 100644 index 0000000..bd183d5 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java @@ -0,0 +1,25 @@ +/* + * 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.CapaContextAsyncWrapper; + +/** + */ +public abstract class CapaContextAsyncWrapperSpi implements CapaContextAsyncWrapper { + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java new file mode 100644 index 0000000..201ad3b --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java @@ -0,0 +1,26 @@ +/* + * 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.CapaMeterConfigLoader; + +/** + * + */ +public abstract class CapaMeterConfigLoaderSpi implements CapaMeterConfigLoader { + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java new file mode 100644 index 0000000..546c2f3 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java @@ -0,0 +1,32 @@ +/* + * 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.trace.CapaReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadWriteSpan; + +/** + */ +public abstract class CapaReadWriteSpanSpi extends CapaReadWriteSpan { + + + public CapaReadWriteSpanSpi(String tracerName, String version, String schemaUrl, + ReadWriteSpan span) { + super(tracerName, version, schemaUrl, span); + } + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java new file mode 100644 index 0000000..51cefe5 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java @@ -0,0 +1,31 @@ +/* + * 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.trace.CapaSpanBuilder; +import io.opentelemetry.api.trace.SpanBuilder; + +/** + */ +public abstract class CapaSpanBuilderSpi extends CapaSpanBuilder { + + public CapaSpanBuilderSpi(String tracerName, String version, String schemaUrl, String spanName, + SpanBuilder spanBuilder) { + super(tracerName, version, schemaUrl, spanName, spanBuilder); + } + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java new file mode 100644 index 0000000..6661de1 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java @@ -0,0 +1,30 @@ +/* + * 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.trace.CapaTracerBuilder; +import io.opentelemetry.api.trace.TracerBuilder; + +/** + */ +public abstract class CapaTracerBuilderSpi extends CapaTracerBuilder { + + public CapaTracerBuilderSpi(String tracerName, TracerBuilder builder) { + super(tracerName, builder); + } + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java new file mode 100644 index 0000000..6a1f388 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java @@ -0,0 +1,25 @@ +/* + * 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.trace.CapaTracerConfigLoader; + +/** + */ +public abstract class CapaTracerConfigLoaderSpi implements CapaTracerConfigLoader { + +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java new file mode 100644 index 0000000..45dfc63 --- /dev/null +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java @@ -0,0 +1,30 @@ +/* + * 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.trace.CapaTracer; +import io.opentelemetry.api.trace.Tracer; + +/** + */ +public abstract class CapaTracerSpi extends CapaTracer { + + public CapaTracerSpi(String tracerName, String version, String schemaUrl, Tracer tracer) { + super(tracerName, version, schemaUrl, tracer); + } + +} diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestRpcServiceOptions.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestRpcServiceOptions.java index 647e265..e2d0abe 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestRpcServiceOptions.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestRpcServiceOptions.java @@ -1,37 +1,37 @@ -/* - * 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.config; - -/** - * RPC service options used in tests only. - */ -public class TestRpcServiceOptions implements RpcServiceOptions { - - /** - * Unique rpc service ID - */ - private final String appId; - - /** - * Instantiates a new Capa rpc service options. - * - * @param appId the app id - */ - public TestRpcServiceOptions(String appId) { - this.appId = appId; - } -} +/* + * 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.config; + +/** + * RPC service options used in tests only. + */ +public class TestRpcServiceOptions implements RpcServiceOptions { + + /** + * Unique rpc service ID + */ + private final String appId; + + /** + * Instantiates a new Capa rpc service options. + * + * @param appId the app id + */ + public TestRpcServiceOptions(String appId) { + this.appId = appId; + } +} diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestSpiOptionsLoader.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestSpiOptionsLoader.java index 929fe7e..f53b643 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestSpiOptionsLoader.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/config/TestSpiOptionsLoader.java @@ -1,31 +1,31 @@ -/* - * 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.config; - -import java.util.Objects; - -/** - * The spi options loader used in tests only. - */ -public class TestSpiOptionsLoader implements CapaSpiOptionsLoader { - - @Override - public TestRpcServiceOptions loadRpcServiceOptions(String appId) { - Objects.requireNonNull(appId, "appId"); - return new TestRpcServiceOptions(appId); - } +/* + * 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.config; + +import java.util.Objects; + +/** + * The spi options loader used in tests only. + */ +public class TestSpiOptionsLoader implements CapaSpiOptionsLoader { + + @Override + public TestRpcServiceOptions loadRpcServiceOptions(String appId) { + Objects.requireNonNull(appId, "appId"); + return new TestRpcServiceOptions(appId); + } } \ No newline at end of file diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java index 3a90280..4b8a382 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java @@ -16,7 +16,9 @@ */ package group.rxcloud.capa.spi.configstore; -import group.rxcloud.capa.component.configstore.*; +import group.rxcloud.capa.component.configstore.ConfigurationItem; +import group.rxcloud.capa.component.configstore.StoreConfig; +import group.rxcloud.capa.component.configstore.SubscribeResp; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java index 90ac4b4..4c6bba3 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java @@ -1,302 +1,309 @@ -/* - * 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.http; - -import group.rxcloud.capa.component.http.CapaHttp; -import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.exceptions.CapaException; -import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; -import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; -import group.rxcloud.capa.spi.config.RpcServiceOptions; -import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.*; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import reactor.util.context.Context; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -public class CapaSerializeHttpSpiTest { - - private OkHttpClient okHttpClient; - - private TestCapaSerializeHttpSpi capaSerializeHttpSpi; - - private CapaObjectSerializer defaultObjectSerializer; - - @BeforeEach - public void setUp() { - okHttpClient = new OkHttpClient.Builder().build(); - defaultObjectSerializer = new DefaultObjectSerializer(); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer); - } - - @Test - public void testGetRequestWithSerialize_Success() throws IOException { - byte[] serializerRequest = capaSerializeHttpSpi.getRequestWithSerialize("Object"); - String request = defaultObjectSerializer.deserialize(serializerRequest, TypeRef.STRING); - - Assertions.assertEquals("Object", request); - } - - @Test - public void testGetRequestWithSerialize_FailWhenThrowException() { - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); - Assertions.assertThrows(CapaException.class, () -> { - capaSerializeHttpSpi.getRequestWithSerialize("Object"); - }); - - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); - Assertions.assertThrows(CapaException.class, () -> { - capaSerializeHttpSpi.getRequestWithSerialize("Object"); - }); - } - - @Test - public void testGetRequestBodyWithSerialize_SuccessWhenHeaderHasValue() { - Map headers = new HashMap<>(); - headers.put("content-type", "application/json"); - - RequestBody requestBody = capaSerializeHttpSpi.getRequestBodyWithSerialize("Object", headers); - String type = requestBody.contentType().type(); - String subtype = requestBody.contentType().subtype(); - Assertions.assertEquals("application", type); - Assertions.assertEquals("json", subtype); - } - - @Test - public void testGetRequestBodyWithSerialize_SuccessWhenHeaderIsNull() { - RequestBody requestBody = capaSerializeHttpSpi.getRequestBodyWithSerialize(null, null); - String type = requestBody.contentType().type(); - String subtype = requestBody.contentType().subtype(); - Assertions.assertEquals("application", type); - Assertions.assertEquals("json", subtype); - } - - @Test - public void testGetRequestHeaderWithParams_SuccessWhenHeaderHasValue() { - Map headersParams = new HashMap<>(); - headersParams.put("key", "value"); - Headers requestHeaderWithParams = capaSerializeHttpSpi.getRequestHeaderWithParams(headersParams); - String value = requestHeaderWithParams.get("key"); - Assertions.assertEquals("value", value); - } - - @Test - public void testGetRequestHeaderWithParams_SuccessWhenHeaderIsNull() { - Headers requestHeaderWithParams = capaSerializeHttpSpi.getRequestHeaderWithParams(null); - String value = requestHeaderWithParams.get("key"); - Assertions.assertNull(value); - } - - @Test - public void testDoAsyncInvoke0_Success() { - Request request = new Request.Builder().url("https://www.url/").build(); - - CompletableFuture> responseFuture = capaSerializeHttpSpi.doAsyncInvoke0( - request, - TypeRef.STRING); - responseFuture.cancel(true); - } - - @Test - public void testGetResponseBodyWithDeserialize_Success() { - HttpResponse httpResponse = new HttpResponse<>(null, null, 200); - HttpResponse deserializeHttpResponse = capaSerializeHttpSpi.getResponseBodyWithDeserialize( - TypeRef.STRING, - httpResponse); - - int statusCode = deserializeHttpResponse.getStatusCode(); - Assertions.assertEquals(200, statusCode); - } - - @Test - public void testGetResponseBodyWithDeserialize_FailWhenThrowException() { - HttpResponse httpResponse = new HttpResponse<>(null, null, 200); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); - Assertions.assertThrows(CapaException.class, () -> { - capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); - }); - - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); - Assertions.assertThrows(CapaException.class, () -> { - capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); - }); - } - - @Test - public void testOnResponseInSerializationResponseFutureCallback_Success() throws IOException { - CompletableFuture> future = new CompletableFuture<>(); - CapaSerializeHttpSpi.SerializationResponseFutureCallback responseFutureCallback = - new CapaSerializeHttpSpi.SerializationResponseFutureCallback(future); - - Request request = new Request.Builder().url("https://www.url/").build(); - ResponseBody responseBody = ResponseBody.create(new byte[1], - MediaType.get("application/json; charset=utf-8")); - - Response response = new Response.Builder() - .request(request) - .protocol(Protocol.HTTP_1_1) - .message("message") - .code(200) - .build(); - responseFutureCallback.onResponse(null, response); - future.cancel(true); - - response = new Response.Builder() - .request(request) - .protocol(Protocol.HTTP_1_1) - .message("message") - .code(200) - .body(responseBody) - .build(); - responseFutureCallback.onResponse(null, response); - future.cancel(true); - } - - - @Test - public void testGetRpcServiceOptions_Success() { - RpcServiceOptions rpcServiceOptions = capaSerializeHttpSpi.getRpcServiceOptions("appId"); - String className = rpcServiceOptions.getClass().getName(); - Assertions.assertEquals("group.rxcloud.capa.spi.config.TestRpcServiceOptions", className); - } - - @Test - public void testDoInvokeApi_Success() throws ExecutionException, InterruptedException { - String[] pathSegments = new String[]{ - CapaHttp.API_VERSION, - "invoke", "appId", - "method", "method"}; - - Map> urlParameters = new HashMap<>(); - urlParameters.put("key", new ArrayList<>()); - - Map headers = new HashMap<>(); - headers.put("content-type", "application/json"); - - Context context = Context.of("content", "value"); - - CompletableFuture> responseCompletableFuture = capaSerializeHttpSpi.doInvokeApi( - "httpMethod", - pathSegments, - urlParameters, - "requestData", - headers, - context, - TypeRef.STRING); - - HttpResponse httpResponse = responseCompletableFuture.get(); - int statusCode = httpResponse.getStatusCode(); - Assertions.assertEquals(200, statusCode); - } - - /** - * serializer/deserializer for request/response objects used in tests only - */ - private class TestRuntimeExceptionObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { - - /** - * {@inheritDoc} - */ - @Override - public byte[] serialize(Object o) { - throw new RuntimeException("test serialize exception"); - } - - /** - * {@inheritDoc} - */ - @Override - public T deserialize(byte[] data, TypeRef type) { - throw new RuntimeException("test deserialize exception"); - } - - /** - * {@inheritDoc} - */ - @Override - public String getContentType() { - return ""; - } - } - - - /** - * serializer/deserializer for request/response objects used in tests only - */ - private class TestIOExceptionObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { - - /** - * {@inheritDoc} - */ - @Override - public byte[] serialize(Object o) throws IOException { - throw new IOException("test serialize ioexception"); - } - - /** - * {@inheritDoc} - */ - @Override - public T deserialize(byte[] data, TypeRef type) throws IOException { - throw new IOException("test deserialize ioexception"); - } - - /** - * {@inheritDoc} - */ - @Override - public String getContentType() { - return ""; - } - } - - - /** - * The test capa http invoker. - */ - private class TestCapaSerializeHttpSpi extends CapaSerializeHttpSpi { - - public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); - } - - @Override - protected CompletableFuture> invokeSpiApi(String appId, - String method, - Object requestData, - Map headers, - TypeRef type, - RpcServiceOptions rpcServiceOptions) { - return CompletableFuture.supplyAsync( - () -> { - return new HttpResponse<>(null, null, 200); - }, - Runnable::run); - } - } - -} +/* + * 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.http; + +import group.rxcloud.capa.component.http.CapaHttp; +import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; +import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; +import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; +import group.rxcloud.capa.spi.config.RpcServiceOptions; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import reactor.util.context.Context; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class CapaSerializeHttpSpiTest { + + private OkHttpClient okHttpClient; + + private TestCapaSerializeHttpSpi capaSerializeHttpSpi; + + private CapaObjectSerializer defaultObjectSerializer; + + @BeforeEach + public void setUp() { + okHttpClient = new OkHttpClient.Builder().build(); + defaultObjectSerializer = new DefaultObjectSerializer(); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer); + } + + @Test + public void testGetRequestWithSerialize_Success() throws IOException { + byte[] serializerRequest = capaSerializeHttpSpi.getRequestWithSerialize("Object"); + String request = defaultObjectSerializer.deserialize(serializerRequest, TypeRef.STRING); + + Assertions.assertEquals("Object", request); + } + + @Test + public void testGetRequestWithSerialize_FailWhenThrowException() { + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); + Assertions.assertThrows(CapaException.class, () -> { + capaSerializeHttpSpi.getRequestWithSerialize("Object"); + }); + + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); + Assertions.assertThrows(CapaException.class, () -> { + capaSerializeHttpSpi.getRequestWithSerialize("Object"); + }); + } + + @Test + public void testGetRequestBodyWithSerialize_SuccessWhenHeaderHasValue() { + Map headers = new HashMap<>(); + headers.put("content-type", "application/json"); + + RequestBody requestBody = capaSerializeHttpSpi.getRequestBodyWithSerialize("Object", headers); + String type = requestBody.contentType().type(); + String subtype = requestBody.contentType().subtype(); + Assertions.assertEquals("application", type); + Assertions.assertEquals("json", subtype); + } + + @Test + public void testGetRequestBodyWithSerialize_SuccessWhenHeaderIsNull() { + RequestBody requestBody = capaSerializeHttpSpi.getRequestBodyWithSerialize(null, null); + String type = requestBody.contentType().type(); + String subtype = requestBody.contentType().subtype(); + Assertions.assertEquals("application", type); + Assertions.assertEquals("json", subtype); + } + + @Test + public void testGetRequestHeaderWithParams_SuccessWhenHeaderHasValue() { + Map headersParams = new HashMap<>(); + headersParams.put("key", "value"); + Headers requestHeaderWithParams = capaSerializeHttpSpi.getRequestHeaderWithParams(headersParams); + String value = requestHeaderWithParams.get("key"); + Assertions.assertEquals("value", value); + } + + @Test + public void testGetRequestHeaderWithParams_SuccessWhenHeaderIsNull() { + Headers requestHeaderWithParams = capaSerializeHttpSpi.getRequestHeaderWithParams(null); + String value = requestHeaderWithParams.get("key"); + Assertions.assertNull(value); + } + + @Test + public void testDoAsyncInvoke0_Success() { + Request request = new Request.Builder().url("https://www.url/").build(); + + CompletableFuture> responseFuture = capaSerializeHttpSpi.doAsyncInvoke0( + request, + TypeRef.STRING); + responseFuture.cancel(true); + } + + @Test + public void testGetResponseBodyWithDeserialize_Success() { + HttpResponse httpResponse = new HttpResponse<>(null, null, 200); + HttpResponse deserializeHttpResponse = capaSerializeHttpSpi.getResponseBodyWithDeserialize( + TypeRef.STRING, + httpResponse); + + int statusCode = deserializeHttpResponse.getStatusCode(); + Assertions.assertEquals(200, statusCode); + } + + @Test + public void testGetResponseBodyWithDeserialize_FailWhenThrowException() { + HttpResponse httpResponse = new HttpResponse<>(null, null, 200); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); + Assertions.assertThrows(CapaException.class, () -> { + capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); + }); + + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); + Assertions.assertThrows(CapaException.class, () -> { + capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); + }); + } + + @Test + public void testOnResponseInSerializationResponseFutureCallback_Success() throws IOException { + CompletableFuture> future = new CompletableFuture<>(); + CapaSerializeHttpSpi.SerializationResponseFutureCallback responseFutureCallback = + new CapaSerializeHttpSpi.SerializationResponseFutureCallback(future); + + Request request = new Request.Builder().url("https://www.url/").build(); + ResponseBody responseBody = ResponseBody.create(new byte[1], + MediaType.get("application/json; charset=utf-8")); + + Response response = new Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .message("message") + .code(200) + .build(); + responseFutureCallback.onResponse(null, response); + future.cancel(true); + + response = new Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .message("message") + .code(200) + .body(responseBody) + .build(); + responseFutureCallback.onResponse(null, response); + future.cancel(true); + } + + + @Test + public void testGetRpcServiceOptions_Success() { + RpcServiceOptions rpcServiceOptions = capaSerializeHttpSpi.getRpcServiceOptions("appId"); + String className = rpcServiceOptions.getClass().getName(); + Assertions.assertEquals("group.rxcloud.capa.spi.config.TestRpcServiceOptions", className); + } + + @Test + public void testDoInvokeApi_Success() throws ExecutionException, InterruptedException { + String[] pathSegments = new String[]{ + CapaHttp.API_VERSION, + "invoke", "appId", + "method", "method"}; + + Map> urlParameters = new HashMap<>(); + urlParameters.put("key", new ArrayList<>()); + + Map headers = new HashMap<>(); + headers.put("content-type", "application/json"); + + Context context = Context.of("content", "value"); + + CompletableFuture> responseCompletableFuture = capaSerializeHttpSpi.doInvokeApi( + "httpMethod", + pathSegments, + urlParameters, + "requestData", + headers, + context, + TypeRef.STRING); + + HttpResponse httpResponse = responseCompletableFuture.get(); + int statusCode = httpResponse.getStatusCode(); + Assertions.assertEquals(200, statusCode); + } + + /** + * serializer/deserializer for request/response objects used in tests only + */ + private class TestRuntimeExceptionObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { + + /** + * {@inheritDoc} + */ + @Override + public byte[] serialize(Object o) { + throw new RuntimeException("test serialize exception"); + } + + /** + * {@inheritDoc} + */ + @Override + public T deserialize(byte[] data, TypeRef type) { + throw new RuntimeException("test deserialize exception"); + } + + /** + * {@inheritDoc} + */ + @Override + public String getContentType() { + return ""; + } + } + + + /** + * serializer/deserializer for request/response objects used in tests only + */ + private class TestIOExceptionObjectSerializer extends ObjectSerializer implements CapaObjectSerializer { + + /** + * {@inheritDoc} + */ + @Override + public byte[] serialize(Object o) throws IOException { + throw new IOException("test serialize ioexception"); + } + + /** + * {@inheritDoc} + */ + @Override + public T deserialize(byte[] data, TypeRef type) throws IOException { + throw new IOException("test deserialize ioexception"); + } + + /** + * {@inheritDoc} + */ + @Override + public String getContentType() { + return ""; + } + } + + + /** + * The test capa http invoker. + */ + private class TestCapaSerializeHttpSpi extends CapaSerializeHttpSpi { + + public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); + } + + @Override + protected CompletableFuture> invokeSpiApi(String appId, + String method, + Object requestData, + Map headers, + TypeRef type, + RpcServiceOptions rpcServiceOptions) { + return CompletableFuture.supplyAsync( + () -> { + return new HttpResponse<>(null, null, 200); + }, + Runnable::run); + } + } + +} diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index eec4159..a89baf3 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-1 + 1.0.8.RELEASE sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index fada435..019716a 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-1 + 1.0.8.RELEASE capa-sdk diff --git a/sdk/src/main/java/group/rxcloud/capa/state/CapaStateClient.java b/sdk/src/main/java/group/rxcloud/capa/state/CapaStateClient.java index 73f19c8..d884c39 100644 --- a/sdk/src/main/java/group/rxcloud/capa/state/CapaStateClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/state/CapaStateClient.java @@ -17,14 +17,14 @@ package group.rxcloud.capa.state; import group.rxcloud.cloudruntimes.client.DefaultCloudRuntimesClient; -import group.rxcloud.cloudruntimes.domain.core.state.State; import group.rxcloud.cloudruntimes.domain.core.state.DeleteStateRequest; +import group.rxcloud.cloudruntimes.domain.core.state.ExecuteStateTransactionRequest; import group.rxcloud.cloudruntimes.domain.core.state.GetBulkStateRequest; import group.rxcloud.cloudruntimes.domain.core.state.GetStateRequest; -import group.rxcloud.cloudruntimes.domain.core.state.ExecuteStateTransactionRequest; -import group.rxcloud.cloudruntimes.domain.core.state.TransactionalStateOperation; -import group.rxcloud.cloudruntimes.domain.core.state.StateOptions; import group.rxcloud.cloudruntimes.domain.core.state.SaveStateRequest; +import group.rxcloud.cloudruntimes.domain.core.state.State; +import group.rxcloud.cloudruntimes.domain.core.state.StateOptions; +import group.rxcloud.cloudruntimes.domain.core.state.TransactionalStateOperation; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Mono; diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClient.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClient.java new file mode 100644 index 0000000..b7f06ff --- /dev/null +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClient.java @@ -0,0 +1,50 @@ +/* + * 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.telemetry; + +import group.rxcloud.cloudruntimes.client.DefaultCloudRuntimesClient; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.propagation.ContextPropagators; +import reactor.core.publisher.Mono; + +public interface CapaTelemetryClient extends DefaultCloudRuntimesClient { + + @Override + Mono buildTracer(String tracerName); + + @Override + Mono getContextPropagators(); + + @Override + Mono buildTracer(String tracerName, String version); + + @Override + Mono buildTracer(String tracerName, String version, String schemaUrl); + + @Override + Mono buildMeter(String meterName); + + @Override + Mono buildMeter(String meterName, String version); + + @Override + Mono buildMeter(String meterName, String version, String schemaUrl); + + @Override + void close(); +} diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java new file mode 100644 index 0000000..4e473db --- /dev/null +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java @@ -0,0 +1,118 @@ +/* + * 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.telemetry; + +import group.rxcloud.capa.component.telemetry.metrics.CapaMeterProviderBuilder; +import group.rxcloud.capa.component.telemetry.metrics.CapaMeterProviderSettings; +import group.rxcloud.capa.component.telemetry.metrics.MeterConfig; +import group.rxcloud.capa.component.telemetry.metrics.MetricsReaderConfig; +import group.rxcloud.capa.component.telemetry.trace.CapaContextPropagatorSettings; +import group.rxcloud.capa.component.telemetry.trace.CapaTracerProviderBuilder; +import group.rxcloud.capa.component.telemetry.trace.CapaTracerProviderSettings; +import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; +import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.trace.IdGenerator; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +import java.util.List; + +/** + */ +public class CapaTelemetryClientBuilder implements CapaContextPropagatorSettings, CapaTracerProviderSettings, CapaMeterProviderSettings { + + private final CapaTracerProviderBuilder tracerProviderBuilder = new CapaTracerProviderBuilder(); + private final CapaMeterProviderBuilder meterProviderBuilder = new CapaMeterProviderBuilder(); + + @Override + public CapaTelemetryClientBuilder setTracerConfig(TracerConfig tracerConfig) { + tracerProviderBuilder.setTracerConfig(tracerConfig); + return this; + } + + @Override + public CapaTelemetryClientBuilder setSpanLimits(SpanLimitsConfig spanLimits) { + tracerProviderBuilder.setSpanLimits(spanLimits); + return this; + } + + @Override + public CapaTelemetryClientBuilder setIdGenerator(IdGenerator idGenerator) { + tracerProviderBuilder.setIdGenerator(idGenerator); + return this; + } + + @Override + public CapaTelemetryClientBuilder setSampler(Sampler sampler) { + tracerProviderBuilder.setSampler(sampler); + return this; + } + + @Override + public CapaTelemetryClientBuilder setProcessors(List processors) { + tracerProviderBuilder.setProcessors(processors); + return this; + } + + @Override + public CapaTelemetryClientBuilder addProcessor(SpanProcessor processor) { + tracerProviderBuilder.addProcessor(processor); + return this; + } + + @Override + public CapaTelemetryClientBuilder setContextPropagators(List contextPropagators) { + tracerProviderBuilder.setContextPropagators(contextPropagators); + return this; + } + + @Override + public CapaTelemetryClientBuilder addContextPropagators(TextMapPropagator processor) { + tracerProviderBuilder.addContextPropagators(processor); + return this; + } + + + @Override + public CapaTelemetryClientBuilder setMetricsConfig(MeterConfig config) { + meterProviderBuilder.setMetricsConfig(config); + return this; + } + + @Override + public CapaTelemetryClientBuilder addMetricReaderConfig(MetricsReaderConfig config) { + meterProviderBuilder.addMetricReaderConfig(config); + return this; + } + + public CapaTelemetryClient build() { + CapaTelemetryClientGlobal client = new CapaTelemetryClientGlobal(); + + // context + client.setContextPropagators(tracerProviderBuilder.buildContextPropagators()); + + // tracer + client.setTracerProvider(tracerProviderBuilder.buildTracerProvider()); + + // meter + client.setMeterProvider(meterProviderBuilder.buildMeterProvider()); + + return client; + } + +} diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java new file mode 100644 index 0000000..bbc61cd --- /dev/null +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java @@ -0,0 +1,139 @@ +/* + * 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.telemetry; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.TracerProvider; +import io.opentelemetry.context.propagation.ContextPropagators; +import reactor.core.publisher.Mono; + +public class CapaTelemetryClientGlobal implements CapaTelemetryClient, OpenTelemetry { + + // noop as default. + private static volatile CapaTelemetryClientGlobal instance; + + private TracerProvider tracerProvider = TracerProvider.noop(); + + private MeterProvider meterProvider = MeterProvider.noop(); + + private ContextPropagators contextPropagators = ContextPropagators.noop(); + + public static CapaTelemetryClientGlobal getOrCreate() { + if (instance == null) { + synchronized (CapaTelemetryClientGlobal.class) { + if (instance == null) { + instance = (CapaTelemetryClientGlobal) new CapaTelemetryClientBuilder().build(); + GlobalOpenTelemetry.set(instance); + } + } + } + return instance; + } + + static void set(CapaTelemetryClientGlobal capaTelemetryClient) { + instance = capaTelemetryClient; + } + + @Override + public TracerProvider getTracerProvider() { + return tracerProvider; + } + + void setTracerProvider(TracerProvider tracerProvider) { + this.tracerProvider = tracerProvider; + } + + public MeterProvider getMeterProvider() { + return meterProvider; + } + + void setMeterProvider(MeterProvider meterProvider) { + this.meterProvider = meterProvider; + } + + @Override + public ContextPropagators getPropagators() { + return contextPropagators; + } + + @Override + public Mono buildTracer(String tracerName) { + return Mono.fromSupplier(() -> { + return tracerProvider.tracerBuilder(tracerName).build(); + }); + } + + @Override + public Mono getContextPropagators() { + return Mono.fromSupplier(() -> { + return contextPropagators; + }); + } + + void setContextPropagators(ContextPropagators contextPropagators) { + this.contextPropagators = contextPropagators; + } + + @Override + public Mono buildTracer(String tracerName, String version) { + return Mono.fromSupplier(() -> { + return tracerProvider.tracerBuilder(tracerName).setInstrumentationVersion(version).build(); + }); + } + + @Override + public Mono buildTracer(String tracerName, String version, String schemaUrl) { + return Mono.fromSupplier(() -> { + return tracerProvider.tracerBuilder(tracerName).setInstrumentationVersion(version).setSchemaUrl(schemaUrl) + .build(); + }); + } + + @Override + public Mono buildMeter(String meterName) { + return Mono.fromSupplier(() -> { + return meterProvider.meterBuilder(meterName) + .build(); + }); + } + + @Override + public Mono buildMeter(String meterName, String version) { + return Mono.fromSupplier(() -> { + return meterProvider.meterBuilder(meterName).setInstrumentationVersion(version) + .build(); + }); + } + + @Override + public Mono buildMeter(String meterName, String version, String schemaUrl) { + return Mono.fromSupplier(() -> { + return meterProvider.meterBuilder(meterName).setInstrumentationVersion(version).setSchemaUrl(schemaUrl) + .build(); + }); + } + + + @Override + public void close() { + // todo + } +} diff --git a/sdk/src/test/java/group/rxcloud/capa/configuration/CapaConfigurationClientStoreTest.java b/sdk/src/test/java/group/rxcloud/capa/configuration/CapaConfigurationClientStoreTest.java index 523aa0c..3538fcb 100644 --- a/sdk/src/test/java/group/rxcloud/capa/configuration/CapaConfigurationClientStoreTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/configuration/CapaConfigurationClientStoreTest.java @@ -33,9 +33,9 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.List; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import static org.mockito.ArgumentMatchers.any; diff --git a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java index d3e0ab6..8297fb7 100644 --- a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java +++ b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java @@ -16,7 +16,12 @@ */ package group.rxcloud.capa.configuration; -import group.rxcloud.capa.component.configstore.*; +import group.rxcloud.capa.component.configstore.CapaConfigStore; +import group.rxcloud.capa.component.configstore.ConfigurationItem; +import group.rxcloud.capa.component.configstore.GetRequest; +import group.rxcloud.capa.component.configstore.StoreConfig; +import group.rxcloud.capa.component.configstore.SubscribeReq; +import group.rxcloud.capa.component.configstore.SubscribeResp; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java index 078e320..f345b5a 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java @@ -1,230 +1,230 @@ -/* - * 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.rpc; - -import group.rxcloud.capa.component.http.CapaHttp; -import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.exceptions.CapaException; -import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; -import group.rxcloud.capa.rpc.domain.InvokeMethodRequestBuilder; -import group.rxcloud.cloudruntimes.domain.core.invocation.HttpExtension; -import group.rxcloud.cloudruntimes.domain.core.invocation.InvokeMethodRequest; -import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.OkHttpClient; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; -import reactor.util.context.Context; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - - -public class CapaRpcClientBuilderTest { - - private CapaRpcClientHttp capaRpcClientHttp; - - private OkHttpClient okHttpClient; - - private DefaultObjectSerializer defaultObjectSerializer; - - @BeforeEach - public void setUp() { - okHttpClient = new OkHttpClient.Builder().build(); - defaultObjectSerializer = new DefaultObjectSerializer(); - capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer)); - } - - @Test - public void testInvokeMethod_FailWhenAppIdIsEmpty() { - InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("", "method").build(); - - Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); - - Assertions.assertThrows(IllegalArgumentException.class, () -> { - stringMono.block(); - }); - } - - @Test - public void testInvokeMethod_FailWhenMethodIsEmpty() { - InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "").build(); - - Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); - - Assertions.assertThrows(IllegalArgumentException.class, () -> { - stringMono.block(); - }); - } - - @Test - public void testInvokeMethod_FailWhenHttpExtensionIsNull() { - InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "method") - .withHttpExtension(null) - .build(); - - Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); - - Assertions.assertThrows(IllegalArgumentException.class, () -> { - stringMono.block(); - }); - } - - @Test - public void testInvokeMethod_Success() { - Map metadata = new HashMap<>(); - metadata.put("key", "value"); - - InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "method") - .withHttpExtension(HttpExtension.POST) - .withMetadata(metadata) - .build(); - - Mono responseMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); - String response = responseMono.block(); - - Assertions.assertNull(response); - } - - @Test - public void testAbstractInvokeMethod_Success() { - Map metadata = new HashMap<>(); - metadata.put("key", "value"); - - Mono responseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - "request", - HttpExtension.POST, - metadata, - String.class); - String response = responseMono.block(); - Assertions.assertNull(response); - - responseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - "request", - HttpExtension.POST, - TypeRef.STRING); - response = responseMono.block(); - Assertions.assertNull(response); - - responseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - "request", - HttpExtension.POST, - String.class); - response = responseMono.block(); - Assertions.assertNull(response); - - responseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - HttpExtension.POST, - metadata, - String.class); - response = responseMono.block(); - Assertions.assertNull(response); - - responseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - HttpExtension.POST, - metadata, - TypeRef.STRING); - response = responseMono.block(); - Assertions.assertNull(response); - - Mono voidResponseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - "request", - HttpExtension.POST, - metadata); - voidResponseMono.block(); - - voidResponseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - "request", - HttpExtension.POST); - voidResponseMono.block(); - - voidResponseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - HttpExtension.POST, - metadata); - voidResponseMono.block(); - - Mono byteResponseMono = capaRpcClientHttp.invokeMethod("appId", - "method", - new byte[1], - HttpExtension.POST, - metadata); - byte[] byteResponse = byteResponseMono.block(); - Assertions.assertNull(byteResponse); - - } - - @Test - public void testShutdown_Success() { - Mono shutdown = capaRpcClientHttp.shutdown(); - shutdown.block(); - } - - @Test - public void testClose_Success() { - capaRpcClientHttp.close(); - } - - @Test - public void testClose_FailWhenThrowException() { - - capaRpcClientHttp = new CapaRpcClientHttp(new ExceptionCapaHttp(okHttpClient, defaultObjectSerializer)); - - Assertions.assertThrows(CapaException.class, () -> { - capaRpcClientHttp.close(); - }); - } - - /** - * The capa http invoker used in tests only. - */ - private class ExceptionCapaHttp extends CapaHttp { - - public ExceptionCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); - } - - @Override - protected CompletableFuture> doInvokeApi(String httpMethod, - String[] pathSegments, - Map> urlParameters, - Object requestData, - Map headers, - Context context, - TypeRef type) { - return null; - } - - @Override - public void close() { - throw new RuntimeException() { - }; - } - } - -} +/* + * 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.rpc; + +import group.rxcloud.capa.component.http.CapaHttp; +import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; +import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; +import group.rxcloud.capa.rpc.domain.InvokeMethodRequestBuilder; +import group.rxcloud.cloudruntimes.domain.core.invocation.HttpExtension; +import group.rxcloud.cloudruntimes.domain.core.invocation.InvokeMethodRequest; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import okhttp3.OkHttpClient; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; +import reactor.util.context.Context; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + + +public class CapaRpcClientBuilderTest { + + private CapaRpcClientHttp capaRpcClientHttp; + + private OkHttpClient okHttpClient; + + private DefaultObjectSerializer defaultObjectSerializer; + + @BeforeEach + public void setUp() { + okHttpClient = new OkHttpClient.Builder().build(); + defaultObjectSerializer = new DefaultObjectSerializer(); + capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer)); + } + + @Test + public void testInvokeMethod_FailWhenAppIdIsEmpty() { + InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("", "method").build(); + + Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + stringMono.block(); + }); + } + + @Test + public void testInvokeMethod_FailWhenMethodIsEmpty() { + InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "").build(); + + Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + stringMono.block(); + }); + } + + @Test + public void testInvokeMethod_FailWhenHttpExtensionIsNull() { + InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "method") + .withHttpExtension(null) + .build(); + + Mono stringMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + stringMono.block(); + }); + } + + @Test + public void testInvokeMethod_Success() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + InvokeMethodRequest methodRequest = new InvokeMethodRequestBuilder("appId", "method") + .withHttpExtension(HttpExtension.POST) + .withMetadata(metadata) + .build(); + + Mono responseMono = capaRpcClientHttp.invokeMethod(methodRequest, TypeRef.STRING); + String response = responseMono.block(); + + Assertions.assertNull(response); + } + + @Test + public void testAbstractInvokeMethod_Success() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + Mono responseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + "request", + HttpExtension.POST, + metadata, + String.class); + String response = responseMono.block(); + Assertions.assertNull(response); + + responseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + "request", + HttpExtension.POST, + TypeRef.STRING); + response = responseMono.block(); + Assertions.assertNull(response); + + responseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + "request", + HttpExtension.POST, + String.class); + response = responseMono.block(); + Assertions.assertNull(response); + + responseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + HttpExtension.POST, + metadata, + String.class); + response = responseMono.block(); + Assertions.assertNull(response); + + responseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + HttpExtension.POST, + metadata, + TypeRef.STRING); + response = responseMono.block(); + Assertions.assertNull(response); + + Mono voidResponseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + "request", + HttpExtension.POST, + metadata); + voidResponseMono.block(); + + voidResponseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + "request", + HttpExtension.POST); + voidResponseMono.block(); + + voidResponseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + HttpExtension.POST, + metadata); + voidResponseMono.block(); + + Mono byteResponseMono = capaRpcClientHttp.invokeMethod("appId", + "method", + new byte[1], + HttpExtension.POST, + metadata); + byte[] byteResponse = byteResponseMono.block(); + Assertions.assertNull(byteResponse); + + } + + @Test + public void testShutdown_Success() { + Mono shutdown = capaRpcClientHttp.shutdown(); + shutdown.block(); + } + + @Test + public void testClose_Success() { + capaRpcClientHttp.close(); + } + + @Test + public void testClose_FailWhenThrowException() { + + capaRpcClientHttp = new CapaRpcClientHttp(new ExceptionCapaHttp(okHttpClient, defaultObjectSerializer)); + + Assertions.assertThrows(CapaException.class, () -> { + capaRpcClientHttp.close(); + }); + } + + /** + * The capa http invoker used in tests only. + */ + private class ExceptionCapaHttp extends CapaHttp { + + public ExceptionCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); + } + + @Override + protected CompletableFuture> doInvokeApi(String httpMethod, + String[] pathSegments, + Map> urlParameters, + Object requestData, + Map headers, + Context context, + TypeRef type) { + return null; + } + + @Override + public void close() { + throw new RuntimeException() { + }; + } + } + +} diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientHttpTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientHttpTest.java index b12a56d..2e11b1b 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientHttpTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientHttpTest.java @@ -1,45 +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.rpc; - -import group.rxcloud.capa.component.http.CapaHttpBuilder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.function.Supplier; - -public class CapaRpcClientHttpTest { - - @Test - public void testStructure_Success() { - CapaRpcClientBuilder capaRpcClientBuilder = new CapaRpcClientBuilder(); - Assertions.assertNotNull(capaRpcClientBuilder); - - Supplier capaHttpBuilderSupplier = () -> new CapaHttpBuilder(); - CapaRpcClientBuilder rpcClientBuilder = new CapaRpcClientBuilder(capaHttpBuilderSupplier); - Assertions.assertNotNull(rpcClientBuilder); - } - - @Test - public void testBuild_Success() { - CapaRpcClientBuilder capaRpcClientBuilder = new CapaRpcClientBuilder(); - CapaRpcClient client = capaRpcClientBuilder.build(); - - Assertions.assertNotNull(client); - } - -} +/* + * 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.rpc; + +import group.rxcloud.capa.component.http.CapaHttpBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.function.Supplier; + +public class CapaRpcClientHttpTest { + + @Test + public void testStructure_Success() { + CapaRpcClientBuilder capaRpcClientBuilder = new CapaRpcClientBuilder(); + Assertions.assertNotNull(capaRpcClientBuilder); + + Supplier capaHttpBuilderSupplier = () -> new CapaHttpBuilder(); + CapaRpcClientBuilder rpcClientBuilder = new CapaRpcClientBuilder(capaHttpBuilderSupplier); + Assertions.assertNotNull(rpcClientBuilder); + } + + @Test + public void testBuild_Success() { + CapaRpcClientBuilder capaRpcClientBuilder = new CapaRpcClientBuilder(); + CapaRpcClient client = capaRpcClientBuilder.build(); + + Assertions.assertNotNull(client); + } + +} diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java index dbd32df..823e31f 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java @@ -1,53 +1,53 @@ -/* - * 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.rpc; - -import group.rxcloud.capa.component.http.CapaHttp; -import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.OkHttpClient; -import reactor.util.context.Context; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -/** - * The capa http invoker used in tests only. - */ -public class TestCapaHttp extends CapaHttp { - - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); - } - - @Override - protected CompletableFuture> doInvokeApi(String httpMethod, - String[] pathSegments, - Map> urlParameters, - Object requestData, - Map headers, - Context context, - TypeRef type) { - return CompletableFuture.supplyAsync( - () -> { - return new HttpResponse<>(null, null, 200); - }, - Runnable::run); - } -} +/* + * 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.rpc; + +import group.rxcloud.capa.component.http.CapaHttp; +import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import okhttp3.OkHttpClient; +import reactor.util.context.Context; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** + * The capa http invoker used in tests only. + */ +public class TestCapaHttp extends CapaHttp { + + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); + } + + @Override + protected CompletableFuture> doInvokeApi(String httpMethod, + String[] pathSegments, + Map> urlParameters, + Object requestData, + Map headers, + Context context, + TypeRef type) { + return CompletableFuture.supplyAsync( + () -> { + return new HttpResponse<>(null, null, 200); + }, + Runnable::run); + } +} diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/domain/InvokeMethodRequestBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/domain/InvokeMethodRequestBuilderTest.java index cdd9b5d..a17b102 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/domain/InvokeMethodRequestBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/domain/InvokeMethodRequestBuilderTest.java @@ -1,86 +1,86 @@ -/* - * 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.rpc.domain; - -import group.rxcloud.cloudruntimes.domain.core.invocation.HttpExtension; -import group.rxcloud.cloudruntimes.domain.core.invocation.InvokeMethodRequest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - - -public class InvokeMethodRequestBuilderTest { - - private InvokeMethodRequestBuilder invokeMethodRequestBuilder; - - @BeforeEach - public void setUp() { - invokeMethodRequestBuilder = new InvokeMethodRequestBuilder("appId", "method"); - } - - @Test - public void testWithContentType_Success() { - InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withContentType("application/json"); - Assertions.assertNotNull(requestBuilder); - } - - @Test - public void testWithBody_Success() { - InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withBody("body"); - Assertions.assertNotNull(requestBuilder); - } - - @Test - public void testWithHttpExtension_Success() { - InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withHttpExtension(HttpExtension.POST); - Assertions.assertNotNull(requestBuilder); - } - - @Test - public void testWithMetadata_Success() { - Map metadata = new HashMap<>(); - metadata.put("key", "value"); - - InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withMetadata(metadata); - Assertions.assertNotNull(requestBuilder); - } - - @Test - public void testBuild_Success() { - Map metadata = new HashMap<>(); - metadata.put("key", "value"); - - InvokeMethodRequest invokeMethodRequest = invokeMethodRequestBuilder - .withContentType("application/json") - .withBody("body") - .withHttpExtension(HttpExtension.POST) - .withMetadata(metadata) - .build(); - - Assertions.assertEquals("appId", invokeMethodRequest.getAppId()); - Assertions.assertEquals("method", invokeMethodRequest.getMethod()); - Assertions.assertEquals("application/json", invokeMethodRequest.getContentType()); - Assertions.assertEquals("body", invokeMethodRequest.getBody()); - Assertions.assertEquals(HttpExtension.POST, invokeMethodRequest.getHttpExtension()); - - Map requestMetadata = invokeMethodRequest.getMetadata(); - Assertions.assertEquals("value", requestMetadata.get("key")); - } -} +/* + * 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.rpc.domain; + +import group.rxcloud.cloudruntimes.domain.core.invocation.HttpExtension; +import group.rxcloud.cloudruntimes.domain.core.invocation.InvokeMethodRequest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class InvokeMethodRequestBuilderTest { + + private InvokeMethodRequestBuilder invokeMethodRequestBuilder; + + @BeforeEach + public void setUp() { + invokeMethodRequestBuilder = new InvokeMethodRequestBuilder("appId", "method"); + } + + @Test + public void testWithContentType_Success() { + InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withContentType("application/json"); + Assertions.assertNotNull(requestBuilder); + } + + @Test + public void testWithBody_Success() { + InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withBody("body"); + Assertions.assertNotNull(requestBuilder); + } + + @Test + public void testWithHttpExtension_Success() { + InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withHttpExtension(HttpExtension.POST); + Assertions.assertNotNull(requestBuilder); + } + + @Test + public void testWithMetadata_Success() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + InvokeMethodRequestBuilder requestBuilder = invokeMethodRequestBuilder.withMetadata(metadata); + Assertions.assertNotNull(requestBuilder); + } + + @Test + public void testBuild_Success() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + InvokeMethodRequest invokeMethodRequest = invokeMethodRequestBuilder + .withContentType("application/json") + .withBody("body") + .withHttpExtension(HttpExtension.POST) + .withMetadata(metadata) + .build(); + + Assertions.assertEquals("appId", invokeMethodRequest.getAppId()); + Assertions.assertEquals("method", invokeMethodRequest.getMethod()); + Assertions.assertEquals("application/json", invokeMethodRequest.getContentType()); + Assertions.assertEquals("body", invokeMethodRequest.getBody()); + Assertions.assertEquals(HttpExtension.POST, invokeMethodRequest.getHttpExtension()); + + Map requestMetadata = invokeMethodRequest.getMetadata(); + Assertions.assertEquals("value", requestMetadata.get("key")); + } +} From c099e34d0588737e243f6e6e78fe3fb0f82d961b Mon Sep 17 00:00:00 2001 From: kevinten10 <596823919@qq.com> Date: Fri, 19 Nov 2021 09:21:41 +0800 Subject: [PATCH 13/36] release: release 1.0.7-alpha-2 version --- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index 175cd89..ccebd69 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-examples diff --git a/pom.xml b/pom.xml index 1c96e27..b57e760 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 962127b..4c504c5 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 0b0e319..10fe26a 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index c260d53..2358064 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index f2245bc..6c409ec 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index a89baf3..c4a0795 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.8.RELEASE + 1.0.7-alpha-2 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 019716a..7891bd6 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.8.RELEASE + 1.0.7-alpha-2 capa-sdk From 491ec30f2760508e3197afb1c1f413284254558a Mon Sep 17 00:00:00 2001 From: = Date: Mon, 22 Nov 2021 10:43:14 +0800 Subject: [PATCH 14/36] style(update a new feature): update the abstract log api in compoent Change the abstract layer of log to interface, so that the concrete implementation can inherit the abstract class of logback or log4j to complete related processing. BREAKING CHANGE: #38 --- .../component/telemetry/log/appender/CapaLog4jAppender.java | 4 ++-- .../component/telemetry/log/appender/CapaLogbackAppender.java | 4 ++-- .../capa/spi/demo/telemetry/log/DemoLog4jAppender.java | 2 +- .../capa/spi/demo/telemetry/log/DemoLogbackAppender.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java index 1ce66f3..700b243 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java @@ -21,12 +21,12 @@ /** * The abstract api of the log4j appender impl.Implement this and provide your specific impl. */ -public abstract class CapaLog4jAppender { +public interface CapaLog4jAppender { /** * Deal with the log. * * @param event The log event. */ - public abstract void appendLog(LogEvent event); + void appendLog(LogEvent event); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java index 45b8963..8c2f9f4 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java @@ -20,12 +20,12 @@ /** * The abstract api of the logback appender impl.Implement this and provide your specific impl. */ -public abstract class CapaLogbackAppender { +public interface CapaLogbackAppender { /** * Deal with the log. * * @param event The log event. */ - public abstract void appendLog(EVENT event); + void appendLog(EVENT event); } diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java index 80e8ab4..3e7b4f0 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java @@ -20,7 +20,7 @@ import org.apache.logging.log4j.core.LogEvent; -public class DemoLog4jAppender extends CapaLog4jAppender { +public class DemoLog4jAppender implements CapaLog4jAppender { @Override public void appendLog(LogEvent event) { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java index ad7c3a2..7288349 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java @@ -19,7 +19,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; -public class DemoLogbackAppender extends CapaLogbackAppender { +public class DemoLogbackAppender implements CapaLogbackAppender { public DemoLogbackAppender() { } From 4bb42df0b69dc18844617734c9c6fbd3c2021ec5 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 22 Nov 2021 15:16:40 +0800 Subject: [PATCH 15/36] style(update a new feature): update the abstract log api in compoent Change the abstract layer of log to interface, so that the concrete implementation can inherit the abstract class of logback or log4j to complete related processing. BREAKING CHANGE: #38 --- .../log/agent/CapaLog4jAppenderAgent.java | 17 ++++++---- .../log/agent/CapaLogbackAppenderAgent.java | 14 +++++++- .../log/appender/CapaLog4jAppender.java | 32 ------------------- .../log/appender/CapaLogbackAppender.java | 31 ------------------ .../demo/telemetry/log/DemoLog4jAppender.java | 5 ++- .../telemetry/log/DemoLogbackAppender.java | 4 +-- .../resources/capa-component-log.properties | 4 +-- 7 files changed, 30 insertions(+), 77 deletions(-) delete mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java delete mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java index 1339ff6..37386e8 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java @@ -16,12 +16,6 @@ */ package group.rxcloud.capa.component.telemetry.log.agent; -/** - * @Author gpeng - * @Date 2021/11/17 14:16 - */ - -import group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; @@ -116,5 +110,16 @@ public void append(LogEvent event) { logAppender.appendLog(event); } + /** + * The abstract api of the log4j appender impl.Implement this and provide your specific impl. + */ + public interface CapaLog4jAppender { + /** + * Deal with the log. + * + * @param event The log event. + */ + void appendLog(LogEvent event); + } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java index 8e97a2e..ba43eed 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java @@ -17,7 +17,6 @@ package group.rxcloud.capa.component.telemetry.log.agent; import ch.qos.logback.core.UnsynchronizedAppenderBase; -import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; import group.rxcloud.capa.infrastructure.config.CapaProperties; import java.lang.reflect.Constructor; @@ -73,4 +72,17 @@ public static CapaLogbackAppender buildCapaLogbackAppender() { protected void append(EVENT event) { logbackAppender.appendLog(event); } + + /** + * The abstract api of the logback appender impl.Implement this and provide your specific impl. + */ + public interface CapaLogbackAppender { + + /** + * Deal with the log. + * + * @param event The log event. + */ + void appendLog(EVENT event); + } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java deleted file mode 100644 index 700b243..0000000 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLog4jAppender.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.log.appender; - -import org.apache.logging.log4j.core.LogEvent; - -/** - * The abstract api of the log4j appender impl.Implement this and provide your specific impl. - */ -public interface CapaLog4jAppender { - - /** - * Deal with the log. - * - * @param event The log event. - */ - void appendLog(LogEvent event); -} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java deleted file mode 100644 index 8c2f9f4..0000000 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/appender/CapaLogbackAppender.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.log.appender; - - -/** - * The abstract api of the logback appender impl.Implement this and provide your specific impl. - */ -public interface CapaLogbackAppender { - - /** - * Deal with the log. - * - * @param event The log event. - */ - void appendLog(EVENT event); -} diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java index 3e7b4f0..add96e4 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java @@ -16,11 +16,10 @@ */ package group.rxcloud.capa.spi.demo.telemetry.log; -import group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender; +import group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent; import org.apache.logging.log4j.core.LogEvent; - -public class DemoLog4jAppender implements CapaLog4jAppender { +public class DemoLog4jAppender implements CapaLog4jAppenderAgent.CapaLog4jAppender { @Override public void appendLog(LogEvent event) { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java index 7288349..d11320d 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java @@ -17,9 +17,9 @@ package group.rxcloud.capa.spi.demo.telemetry.log; import ch.qos.logback.classic.spi.ILoggingEvent; -import group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender; +import group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent; -public class DemoLogbackAppender implements CapaLogbackAppender { +public class DemoLogbackAppender implements CapaLogbackAppenderAgent.CapaLogbackAppender { public DemoLogbackAppender() { } diff --git a/sdk-spi-demo/src/main/resources/capa-component-log.properties b/sdk-spi-demo/src/main/resources/capa-component-log.properties index cdf5815..879e78e 100644 --- a/sdk-spi-demo/src/main/resources/capa-component-log.properties +++ b/sdk-spi-demo/src/main/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.telemetry.log.appender.CapaLog4jAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLog4jAppender -group.rxcloud.capa.component.telemetry.log.appender.CapaLogbackAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLog4jAppender +group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLogbackAppender \ No newline at end of file From c0788cb87aab9efa25167f84d4f55ebfaaf59cc6 Mon Sep 17 00:00:00 2001 From: kevinten10 <596823919@qq.com> Date: Tue, 23 Nov 2021 09:20:19 +0800 Subject: [PATCH 16/36] release: release 1.0.7-alpha-3 version --- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index ccebd69..fa91aad 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-examples diff --git a/pom.xml b/pom.xml index b57e760..d227987 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 4c504c5..4b3fd73 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 10fe26a..a5f68de 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 2358064..0e9b530 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index 6c409ec..312b960 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index c4a0795..1adbcd1 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-2 + 1.0.7-alpha-3 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 7891bd6..2f6281e 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-2 + 1.0.7-alpha-3 capa-sdk From 8cf58775d4b02d2c2f2407e2b5a1a41a4918b314 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 26 Nov 2021 15:06:41 +0800 Subject: [PATCH 17/36] test: Add ut for logs Add ut for logs --- .../log/agent/CapaLog4jAppenderAgentTest.java | 182 ++++++++++++++++++ .../agent/CapaLogbackAppenderAgentTest.java | 38 ++++ .../log/agent/TestCapaLog4jAppender.java | 30 +++ .../log/agent/TestCapaLogbackAppender.java | 34 ++++ .../resources/capa-component-log.properties | 2 + 5 files changed, 286 insertions(+) create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java create mode 100644 sdk-component/src/test/resources/capa-component-log.properties diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java new file mode 100644 index 0000000..d424a4c --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java @@ -0,0 +1,182 @@ +/* + * 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.log.agent; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.impl.ThrowableProxy; +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.util.ReadOnlyStringMap; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.util.Map; + +class CapaLog4jAppenderAgentTest { + + @Test + void testCreateAppender() { + Filter filter = Mockito.mock(Filter.class); + Layout layout = Mockito.mock(Layout.class); + new CapaLog4jAppenderAgent("CapaLog4jAppender", filter, layout, true); + } + + @Test + void testBuildCapaLog4jAppender() { + Filter filter = Mockito.mock(Filter.class); + Layout layout = Mockito.mock(Layout.class); + CapaLog4jAppenderAgent.createAppender("CapaLog4jAppender", filter, layout, true); + } + + @Test + void testAppend() { + Filter filter = Mockito.mock(Filter.class); + Layout layout = Mockito.mock(Layout.class); + CapaLog4jAppenderAgent capaLog4jAppender = CapaLog4jAppenderAgent.createAppender("CapaLog4jAppender", filter, layout, true); + LogEvent logEvent = new LogEvent() { + @Override + public LogEvent toImmutable() { + return null; + } + + @Override + public Map getContextMap() { + return null; + } + + @Override + public ReadOnlyStringMap getContextData() { + return null; + } + + @Override + public ThreadContext.ContextStack getContextStack() { + return null; + } + + @Override + public String getLoggerFqcn() { + return null; + } + + @Override + public Level getLevel() { + return null; + } + + @Override + public String getLoggerName() { + return null; + } + + @Override + public Marker getMarker() { + return null; + } + + @Override + public Message getMessage() { + return new Message() { + @Override + public String getFormattedMessage() { + return "TEST"; + } + + @Override + public String getFormat() { + return null; + } + + @Override + public Object[] getParameters() { + return new Object[0]; + } + + @Override + public Throwable getThrowable() { + return null; + } + }; + } + + @Override + public long getTimeMillis() { + return 0; + } + + @Override + public StackTraceElement getSource() { + return null; + } + + @Override + public String getThreadName() { + return null; + } + + @Override + public long getThreadId() { + return 0; + } + + @Override + public int getThreadPriority() { + return 0; + } + + @Override + public Throwable getThrown() { + return null; + } + + @Override + public ThrowableProxy getThrownProxy() { + return null; + } + + @Override + public boolean isEndOfBatch() { + return false; + } + + @Override + public boolean isIncludeLocation() { + return false; + } + + @Override + public void setEndOfBatch(boolean endOfBatch) { + + } + + @Override + public void setIncludeLocation(boolean locationRequired) { + + } + + @Override + public long getNanoTime() { + return 0; + } + }; + capaLog4jAppender.append(logEvent); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java new file mode 100644 index 0000000..bbdee31 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry.log.agent; + +import org.apache.logging.log4j.core.LogEvent; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class CapaLogbackAppenderAgentTest { + + @Test + void testBuildCapaLogbackAppender() { + CapaLogbackAppenderAgent.CapaLogbackAppender capaLogbackAppender = CapaLogbackAppenderAgent.buildCapaLogbackAppender(); + Assertions.assertNotNull(capaLogbackAppender); + } + + @Test + void testAppend() { + CapaLogbackAppenderAgent.CapaLogbackAppender capaLogbackAppender = CapaLogbackAppenderAgent.buildCapaLogbackAppender(); + LogEvent logEvent = Mockito.mock(LogEvent.class); + capaLogbackAppender.appendLog(logEvent); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java new file mode 100644 index 0000000..9c0deb3 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java @@ -0,0 +1,30 @@ +/* + * 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.log.agent; + +import org.apache.logging.log4j.core.LogEvent; + +/** + * The capa log4j appender used in tests only. + */ +public class TestCapaLog4jAppender implements CapaLog4jAppenderAgent.CapaLog4jAppender { + + @Override + public void appendLog(LogEvent event) { + System.out.println("test log log4j and content is " + event.getMessage().getFormattedMessage()); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java new file mode 100644 index 0000000..b0c9798 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java @@ -0,0 +1,34 @@ +/* + * 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.log.agent; + +import org.apache.logging.log4j.core.LogEvent; + +/** + * The capa logback appender used in tests only. + */ +public class TestCapaLogbackAppender implements CapaLogbackAppenderAgent.CapaLogbackAppender { + + public TestCapaLogbackAppender() { + } + + @Override + public void appendLog(LogEvent event) { + System.out.println("test logback log and content is " + event.getMessage()); + } +} + diff --git a/sdk-component/src/test/resources/capa-component-log.properties b/sdk-component/src/test/resources/capa-component-log.properties new file mode 100644 index 0000000..8bb8152 --- /dev/null +++ b/sdk-component/src/test/resources/capa-component-log.properties @@ -0,0 +1,2 @@ +group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.component.telemetry.log.agent.TestCapaLog4jAppender +group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.component.telemetry.log.agent.TestCapaLogbackAppender \ No newline at end of file From df091576597147be750c70297567e0efc6818cd1 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 26 Nov 2021 15:13:48 +0800 Subject: [PATCH 18/36] test: Update ut for logs Update ut for logs --- .../log/agent/CapaLog4jAppenderAgentTest.java | 137 +----------------- .../agent/CapaLogbackAppenderAgentTest.java | 4 + .../log/agent/TestCapaLogbackAppender.java | 2 +- 3 files changed, 9 insertions(+), 134 deletions(-) diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java index d424a4c..72c13d5 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java @@ -16,20 +16,13 @@ */ package group.rxcloud.capa.component.telemetry.log.agent; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.impl.ThrowableProxy; import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import java.util.Map; - class CapaLog4jAppenderAgentTest { @Test @@ -51,132 +44,10 @@ void testAppend() { Filter filter = Mockito.mock(Filter.class); Layout layout = Mockito.mock(Layout.class); CapaLog4jAppenderAgent capaLog4jAppender = CapaLog4jAppenderAgent.createAppender("CapaLog4jAppender", filter, layout, true); - LogEvent logEvent = new LogEvent() { - @Override - public LogEvent toImmutable() { - return null; - } - - @Override - public Map getContextMap() { - return null; - } - - @Override - public ReadOnlyStringMap getContextData() { - return null; - } - - @Override - public ThreadContext.ContextStack getContextStack() { - return null; - } - - @Override - public String getLoggerFqcn() { - return null; - } - - @Override - public Level getLevel() { - return null; - } - - @Override - public String getLoggerName() { - return null; - } - - @Override - public Marker getMarker() { - return null; - } - - @Override - public Message getMessage() { - return new Message() { - @Override - public String getFormattedMessage() { - return "TEST"; - } - - @Override - public String getFormat() { - return null; - } - - @Override - public Object[] getParameters() { - return new Object[0]; - } - - @Override - public Throwable getThrowable() { - return null; - } - }; - } - - @Override - public long getTimeMillis() { - return 0; - } - - @Override - public StackTraceElement getSource() { - return null; - } - - @Override - public String getThreadName() { - return null; - } - - @Override - public long getThreadId() { - return 0; - } - - @Override - public int getThreadPriority() { - return 0; - } - - @Override - public Throwable getThrown() { - return null; - } - - @Override - public ThrowableProxy getThrownProxy() { - return null; - } - - @Override - public boolean isEndOfBatch() { - return false; - } - - @Override - public boolean isIncludeLocation() { - return false; - } - - @Override - public void setEndOfBatch(boolean endOfBatch) { - - } - - @Override - public void setIncludeLocation(boolean locationRequired) { - - } - - @Override - public long getNanoTime() { - return 0; - } - }; + LogEvent logEvent = Mockito.mock(LogEvent.class); + Message message = Mockito.mock(Message.class); + Mockito.when(logEvent.getMessage()).thenReturn(Mockito.mock(Message.class)); + Mockito.when(message.getFormattedMessage()).thenReturn("TEST"); capaLog4jAppender.append(logEvent); } } \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java index bbdee31..ebcec0a 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java @@ -17,6 +17,7 @@ package group.rxcloud.capa.component.telemetry.log.agent; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.message.Message; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -33,6 +34,9 @@ void testBuildCapaLogbackAppender() { void testAppend() { CapaLogbackAppenderAgent.CapaLogbackAppender capaLogbackAppender = CapaLogbackAppenderAgent.buildCapaLogbackAppender(); LogEvent logEvent = Mockito.mock(LogEvent.class); + Message message = Mockito.mock(Message.class); + Mockito.when(logEvent.getMessage()).thenReturn(Mockito.mock(Message.class)); + Mockito.when(message.getFormattedMessage()).thenReturn("TEST"); capaLogbackAppender.appendLog(logEvent); } } \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java index b0c9798..3a39b9d 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java @@ -28,7 +28,7 @@ public TestCapaLogbackAppender() { @Override public void appendLog(LogEvent event) { - System.out.println("test logback log and content is " + event.getMessage()); + System.out.println("test logback log and content is " + event.getMessage().getFormattedMessage()); } } From 3a7499b03f677a6eaf1508747249288f43e9b8c1 Mon Sep 17 00:00:00 2001 From: chenyijiang Date: Fri, 26 Nov 2021 20:13:39 +0800 Subject: [PATCH 19/36] Separate the context related features from trace. Add unit tests and comments. --- examples/pom.xml | 2 +- .../telemetry/DemoTelemetryClient.java | 61 ++++++ .../telemetry/MetricTestExporter.java | 42 ++++ .../examples/telemetry/TraceProcessor.java | 38 ++-- pom.xml | 3 +- sdk-component/pom.xml | 2 +- .../component/telemetry/SamplerConfig.java | 81 ++++++++ .../capa/component/telemetry/SpiUtils.java | 195 ------------------ .../telemetry/{ => context}/CapaContext.java | 14 +- .../CapaContextAsyncWrapper.java | 7 +- .../context/CapaContextPropagatorBuilder.java | 93 +++++++++ .../CapaContextPropagatorSettings.java | 44 ++++ .../telemetry/context/ContextConfig.java | 39 ++++ .../ContextPropagatorLoader.java} | 22 +- .../metrics/CapaMeterProviderBuilder.java | 159 ++++++++------ .../metrics/CapaMeterProviderSettings.java | 27 ++- .../telemetry/metrics/CapaMetricsSampler.java | 81 ++++++++ .../telemetry/metrics/MeterConfig.java | 12 +- .../metrics/MetricsReaderConfig.java | 51 ++--- .../telemetry/trace/CapaReadWriteSpan.java | 1 + .../telemetry/trace/CapaSamplerProvider.java | 56 ----- .../telemetry/trace/CapaSpanBuilder.java | 1 + ...CapaSampler.java => CapaTraceSampler.java} | 29 ++- .../component/telemetry/trace/CapaTracer.java | 1 + .../telemetry/trace/CapaTracerBuilder.java | 1 + .../telemetry/trace/CapaTracerProvider.java | 1 + .../trace/CapaTracerProviderBuilder.java | 187 +++++++---------- .../trace/CapaTracerProviderSettings.java | 45 +++- .../telemetry/trace/CapaWrapper.java | 21 +- .../telemetry/trace/EventAttributeKey.java | 2 + .../trace/{config => }/SpanLimitsConfig.java | 3 +- .../telemetry/trace/StatusAttributeKey.java | 1 + .../telemetry/trace/TracerConfig.java | 81 ++++++++ .../telemetry/trace/config/TracerConfig.java | 140 ------------- .../CapaContextPropagatorBuilderTest.java | 145 +++++++++++++ .../telemetry/context/CapaContextTest.java | 68 ++++++ .../context/TestCapaContextAsyncWrapper.java | 72 +++++++ .../telemetry/context/TestPropagator.java | 59 ++++++ .../metrics/CapaMeterProviderBuilderTest.java | 147 +++++++++++++ .../metrics/CapaMetricsSamplerTest.java | 60 ++++++ .../metrics/TestMetricsExporter.java | 46 +++++ .../trace/CapaReadWriteSpanTest.java | 88 ++++++++ .../telemetry/trace/CapaTraceSamplerTest.java | 55 +++++ .../trace/CapaTracerProviderBuilderTest.java | 136 ++++++++++++ .../trace/CapaTracerProviderTest.java | 49 +++++ .../trace/EventAttributeKeyTest.java | 38 ++++ .../telemetry/trace/TestIdGenerator.java} | 19 +- .../telemetry/trace/TestSpanProcessor.java | 58 ++++++ .../capa-component-telemetry.properties | 1 + .../src/test/resources/capa-context.json | 3 + .../src/test/resources/capa-meter.json | 6 + .../src/test/resources/capa-sample.properties | 2 + .../src/test/resources/capa-tracer.json | 7 + sdk-infrastructure/pom.xml | 2 +- .../infrastructure/config/CapaProperties.java | 16 +- .../capa/infrastructure/utils/SpiUtils.java | 166 +++++++++++++++ .../capa/infrastructure/utils/MyImpl.java | 7 +- .../infrastructure/utils/MyImplWithArgs.java | 22 +- .../infrastructure/utils/MyInterface.java | 22 ++ .../utils/MyInterfaceWithArgs.java | 22 ++ .../infrastructure/utils/SpiUtilsTest.java | 144 +++++++++++++ .../resources/capa-component-test.properties | 2 + .../src/test/resources/config.json | 4 + .../src/test/resources/config.properties | 1 + sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- .../telemetry/CapaContextAsyncWrapperSpi.java | 3 +- .../spi/telemetry/CapaReadWriteSpanSpi.java | 1 + .../spi/telemetry/CapaSpanBuilderSpi.java | 1 + .../spi/telemetry/CapaTracerBuilderSpi.java | 1 + .../capa/spi/telemetry/CapaTracerSpi.java | 1 + ...i.java => ContextPropagatorLoaderSpi.java} | 7 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- .../telemetry/CapaTelemetryClientBuilder.java | 47 +++-- .../telemetry/CapaTelemetryClientGlobal.java | 5 +- .../CapaTelemetryClientBuilderTest.java | 93 +++++++++ .../CapaTelemetryClientGlobalTest.java | 43 ++++ .../capa/telemetry/MetricTestExporter.java | 42 ++++ .../capa/telemetry/TraceProcessor.java | 45 ++++ 80 files changed, 2578 insertions(+), 729 deletions(-) create mode 100644 examples/src/main/java/group/rxcloud/capa/examples/telemetry/DemoTelemetryClient.java create mode 100644 examples/src/main/java/group/rxcloud/capa/examples/telemetry/MetricTestExporter.java rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java => examples/src/main/java/group/rxcloud/capa/examples/telemetry/TraceProcessor.java (55%) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java delete mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/{ => context}/CapaContext.java (82%) rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/{ => context}/CapaContextAsyncWrapper.java (88%) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilder.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/{trace/CapaTracerConfigLoader.java => context/ContextPropagatorLoader.java} (64%) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java delete mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/{CapaSampler.java => CapaTraceSampler.java} (73%) rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/{config => }/SpanLimitsConfig.java (97%) create mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/TracerConfig.java delete mode 100644 sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilderTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestCapaContextAsyncWrapper.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestPropagator.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpanTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderTest.java create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKeyTest.java rename sdk-component/src/{main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java => test/java/group/rxcloud/capa/component/telemetry/trace/TestIdGenerator.java} (70%) create mode 100644 sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestSpanProcessor.java create mode 100644 sdk-component/src/test/resources/capa-component-telemetry.properties create mode 100644 sdk-component/src/test/resources/capa-context.json create mode 100644 sdk-component/src/test/resources/capa-meter.json create mode 100644 sdk-component/src/test/resources/capa-sample.properties create mode 100644 sdk-component/src/test/resources/capa-tracer.json create mode 100644 sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java rename sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java => sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImpl.java (79%) rename sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java => sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImplWithArgs.java (67%) create mode 100644 sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterface.java create mode 100644 sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterfaceWithArgs.java create mode 100644 sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/SpiUtilsTest.java create mode 100644 sdk-infrastructure/src/test/resources/capa-component-test.properties create mode 100644 sdk-infrastructure/src/test/resources/config.json create mode 100644 sdk-infrastructure/src/test/resources/config.properties rename sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/{CapaMeterConfigLoaderSpi.java => ContextPropagatorLoaderSpi.java} (81%) create mode 100644 sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java create mode 100644 sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java create mode 100644 sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java create mode 100644 sdk/src/test/java/group/rxcloud/capa/telemetry/TraceProcessor.java diff --git a/examples/pom.xml b/examples/pom.xml index fa91aad..9623802 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-3 + 1.0.7-alpha-4 capa-examples diff --git a/examples/src/main/java/group/rxcloud/capa/examples/telemetry/DemoTelemetryClient.java b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/DemoTelemetryClient.java new file mode 100644 index 0000000..8ef4efd --- /dev/null +++ b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/DemoTelemetryClient.java @@ -0,0 +1,61 @@ +/* + * 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.examples.telemetry; + +import group.rxcloud.capa.component.telemetry.metrics.MetricsReaderConfig; +import group.rxcloud.capa.telemetry.CapaTelemetryClient; +import group.rxcloud.capa.telemetry.CapaTelemetryClientBuilder; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; + +import java.util.concurrent.TimeUnit; + +public class DemoTelemetryClient { + + public static void main(String[] args) throws InterruptedException { + MetricsReaderConfig readerConfig = new MetricsReaderConfig(); + readerConfig.setExporterType(MetricTestExporter.class.getName()); + readerConfig.setName("metric-reader"); + readerConfig.setExportInterval(1, TimeUnit.SECONDS); + CapaTelemetryClient capaTelemetryClient = new CapaTelemetryClientBuilder() + .addProcessor(new TraceProcessor()) + .addMetricReaderConfig(readerConfig) + .build(); + + // tracer + Tracer tracer = capaTelemetryClient.buildTracer("tracer-test") + .block(); + + LongCounter counter = capaTelemetryClient.buildMeter("meter-test") + .block() + .counterBuilder("counter-test") + .build(); + + Span span = tracer.spanBuilder("span-test") + .setAttribute("key1", 1) + .setAttribute("key2", 2) + .startSpan(); + // working + for (int i = 0; i < 50; i++) { + Thread.sleep(200); + counter.add(i); + } + + span.end(); + } +} diff --git a/examples/src/main/java/group/rxcloud/capa/examples/telemetry/MetricTestExporter.java b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/MetricTestExporter.java new file mode 100644 index 0000000..2615920 --- /dev/null +++ b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/MetricTestExporter.java @@ -0,0 +1,42 @@ +/* + * 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.examples.telemetry; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; + +import java.util.Collection; + +public class MetricTestExporter implements MetricExporter { + + @Override + public CompletableResultCode export(Collection metrics) { + metrics.forEach(System.out::println); + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/TraceProcessor.java similarity index 55% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java rename to examples/src/main/java/group/rxcloud/capa/examples/telemetry/TraceProcessor.java index 15baade..63f5589 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SamplerConfig.java +++ b/examples/src/main/java/group/rxcloud/capa/examples/telemetry/TraceProcessor.java @@ -14,36 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.trace.config; +package group.rxcloud.capa.examples.telemetry; -import java.io.Serializable; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; -/** - */ -public class SamplerConfig implements Serializable { - - private static final long serialVersionUID = -2113523925814197551L; - - // 默认全部取样 - public static final transient SamplerConfig DEFAULT_CONFIG = new SamplerConfig(); - - private String name = "_DEFAULT_SAMPLER"; +public class TraceProcessor implements SpanProcessor { - private boolean disable; + @Override + public void onStart(Context context, ReadWriteSpan span) { - public String getName() { - return name; } - public void setName(String name) { - this.name = name; + @Override + public boolean isStartRequired() { + return false; } - public boolean isDisable() { - return disable; + @Override + public void onEnd(ReadableSpan span) { + System.out.println(span.toSpanData()); } - public void setDisable(boolean disable) { - this.disable = disable; + @Override + public boolean isEndRequired() { + return true; } } diff --git a/pom.xml b/pom.xml index d227987..25dddad 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-alpha-3 + 1.0.7-alpha-4 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup @@ -331,6 +331,7 @@ docs/** spec/** **/generated/** + **/*.json diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 4b3fd73..9dfc7f7 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-3 + 1.0.7-alpha-4 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 new file mode 100644 index 0000000..702962e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SamplerConfig.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry; + +import group.rxcloud.capa.infrastructure.utils.SpiUtils; + +import java.io.Serializable; +import java.util.Properties; + +/** + * Sampler config. + */ +public class SamplerConfig implements Serializable { + + public static final 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 boolean traceSample = true; + + private boolean logSample = true; + + public boolean isMetricsSample() { + return metricsSample; + } + + public void setMetricsSample(boolean metricsSample) { + this.metricsSample = metricsSample; + } + + public boolean isTraceSample() { + return traceSample; + } + + public void setTraceSample(boolean traceSample) { + this.traceSample = traceSample; + } + + public boolean isLogSample() { + return logSample; + } + + 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; + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java deleted file mode 100644 index e6a496a..0000000 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/SpiUtils.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package group.rxcloud.capa.component.telemetry; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import group.rxcloud.capa.infrastructure.config.CapaProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -/** - */ -public final class SpiUtils { - - /** - * Shared Json serializer/deserializer as per Jackson's documentation. - */ - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .setSerializationInclusion(JsonInclude.Include.NON_NULL); - - private static final Map CACHE = new ConcurrentHashMap<>(); - - private static final Logger log = LoggerFactory.getLogger(SpiUtils.class); - - private SpiUtils() { - } - - @Nullable - public static T getFromSpiConfigFile(Class type) { - return getFromSpiConfigFile(type, null, null); - } - - @Nullable - public static T getFromSpiConfigFile(String path, Class type) { - return getFromSpiConfigFile(path, type, null, null); - } - - @Nullable - public static T getFromSpiConfigFile(String path, Class type, Class[] argTypes, Object[] args) { - if (path == null) { - return null; - } - return load(path, type, argTypes, args); - } - - @Nullable - public static T getFromSpiConfigFile(Class type, Class[] argTypes, Object[] args) { - try { - Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply("telemetry"); - String path = properties.getProperty(type.getName()); - if (path != null) { - return load(path, type, argTypes, args); - } - return null; - } catch (Throwable e) { - log.warn("Fail to load " + type.getName() + " instance from spi config file.", e); - } - return null; - } - - private static String keyOf(String path, Class type, Class[] argTypes) { - StringBuilder builder = new StringBuilder(type.getName()).append('=').append(path); - if (argTypes != null) { - for (Class arg : argTypes) { - builder.append('_').append(arg.getName()); - } - } - return builder.toString(); - } - - @Nonnull - private static T load(String path, Class type, Class[] argTypes, Object[] args) { - String key = keyOf(path, type, argTypes); - Constructor targetCons = CACHE.computeIfAbsent(key, k -> { - try { - Class aClass = path == null ? type : (Class) Class.forName(path); - if (argTypes == null || argTypes.length == 0) { - return aClass.getConstructor(); - } else { - // find the first match constructor. - for (Constructor constructor : aClass.getDeclaredConstructors()) { - if (constructor.getParameterCount() == argTypes.length) { - boolean match = true; - for (int i = 0; i < argTypes.length; i++) { - if (!isSameType(constructor.getParameterTypes()[i], args[i])) { - match = false; - break; - } - } - if (match) { - return constructor; - } - } - } - - StringBuilder message = new StringBuilder("No constructor found. targetType = ") - .append(type.getName()) - .append(" argTypes="); - for (Class argType : argTypes) { - message.append(argType.getName()).append(", "); - } - message.deleteCharAt(message.length() - 1); - throw new NoSuchMethodException(message.toString()); - } - - } catch (ClassNotFoundException | NoSuchMethodException e) { - throw new IllegalArgumentException("Fail to find the constructor. path = " + path, e); - } - }); - - try { - return targetCons.getParameterCount() == 0 ? targetCons.newInstance() : targetCons.newInstance(args); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new IllegalArgumentException("Fail to create component. targetType = " + type.getName(), e); - } - } - - public static T loadConfigNullable(String path, Class configType) { - try (InputStream in = configType.getResourceAsStream(path)) { - InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); - return OBJECT_MAPPER.readValue(inputStreamReader, configType); - } catch (IOException e) { - log.warn(path + " config file not found.", e); - } - return null; - } - - private static boolean isSameType(Class type, Object arg) { - if (arg == null) { - return !type.isPrimitive(); - } - - if (type.isInstance(arg)) { - return true; - } - - if (type.isPrimitive()) { - if (type == boolean.class) { - return arg instanceof Boolean; - } - if (type == short.class) { - return arg instanceof Short; - } - if (type == int.class) { - return arg instanceof Integer; - } - if (type == long.class) { - return arg instanceof Long; - } - if (type == float.class) { - return arg instanceof Float; - } - if (type == double.class) { - return arg instanceof Double; - } - if (type == byte.class) { - return arg instanceof Byte; - } - if (type == char.class) { - return arg instanceof Character; - } - } - - return false; - } - -} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContext.java similarity index 82% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContext.java index dbf8f8e..a00c310 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContext.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContext.java @@ -14,7 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry; +package group.rxcloud.capa.component.telemetry.context; + +import group.rxcloud.capa.infrastructure.utils.SpiUtils; import java.util.concurrent.Callable; import java.util.concurrent.Executor; @@ -22,11 +24,15 @@ import java.util.concurrent.ScheduledExecutorService; /** + * Method for async context. */ public final class CapaContext { private static final CapaContextAsyncWrapper WRAPPER = getAsyncWrapper(); + private CapaContext() { + } + public static Runnable taskWrapping(Runnable runnable) { return WRAPPER.wrap(runnable); } @@ -47,8 +53,12 @@ public static ScheduledExecutorService taskWrapping(ScheduledExecutorService exe return WRAPPER.wrap(executor); } + public static String getTraceId() { + return WRAPPER.getTraceId(); + } + private static CapaContextAsyncWrapper getAsyncWrapper() { - CapaContextAsyncWrapper WRAPPER = SpiUtils.getFromSpiConfigFile(CapaContextAsyncWrapper.class); + CapaContextAsyncWrapper WRAPPER = SpiUtils.loadFromSpiComponentFileNullable(CapaContextAsyncWrapper.class, "telemetry"); if (WRAPPER == null) { return new CapaContextAsyncWrapper() {}; } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java similarity index 88% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java index 1a6775d..87bbe2f 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/CapaContextAsyncWrapper.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java @@ -14,8 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry; +package group.rxcloud.capa.component.telemetry.context; +import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import java.util.concurrent.Callable; @@ -47,4 +48,8 @@ default ScheduledExecutorService wrap(ScheduledExecutorService executor) { return Context.current().wrap(executor); } + default String getTraceId() { + return Span.fromContext(Context.current()).getSpanContext().getTraceId(); + } + } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilder.java new file mode 100644 index 0000000..0f19fc0 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilder.java @@ -0,0 +1,93 @@ +/* + * 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.context; + +import group.rxcloud.capa.infrastructure.utils.SpiUtils; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapPropagator; + +import javax.annotation.concurrent.NotThreadSafe; +import java.util.ArrayList; +import java.util.List; + +/** + * Builder for capa context propagator. + */ +@NotThreadSafe +public class CapaContextPropagatorBuilder implements CapaContextPropagatorSettings { + + /** + * Context config. + */ + private ContextConfig contextConfig; + + /** + * Context propagator instances. + */ + private List contextPropagatorsInstance; + + @Override + public CapaContextPropagatorBuilder setContextConfig(ContextConfig config) { + contextConfig = config; + return this; + } + + @Override + public CapaContextPropagatorBuilder addContextPropagators(TextMapPropagator processor) { + if (contextPropagatorsInstance == null) { + contextPropagatorsInstance = new ArrayList<>(); + } + contextPropagatorsInstance.add(processor); + return this; + } + + /** + * Build context propagators. + * + * @return context propagators. + */ + public ContextPropagators buildContextPropagators() { + if (contextPropagatorsInstance != null && !contextPropagatorsInstance.isEmpty()) { + return ContextPropagators + .create(TextMapPropagator.composite(contextPropagatorsInstance.toArray(new TextMapPropagator[0]))); + } + + initContextConfig(); + if (contextConfig != null) { + List types = contextConfig.getContextPropagators(); + if (types != null && !types.isEmpty()) { + return ContextPropagators + .create(TextMapPropagator.composite(types.stream() + .map(path -> SpiUtils + .newInstanceWithConstructorCache(path, TextMapPropagator.class)) + .toArray(TextMapPropagator[]::new))); + } + } + + ContextPropagatorLoader loader = SpiUtils.loadFromSpiComponentFileNullable(ContextPropagatorLoader.class, "telemetry"); + if (loader == null) { + loader = ContextPropagatorLoader.DEFAULT; + } + return loader.load(); + } + + private void initContextConfig() { + if (contextConfig == null) { + contextConfig = SpiUtils.loadConfigNullable(FILE_PATH, ContextConfig.class);; + } + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java new file mode 100644 index 0000000..e49ca4e --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java @@ -0,0 +1,44 @@ +/* + * 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.context; + +import io.opentelemetry.context.propagation.TextMapPropagator; + +/** + * Settings for capa context propagator. + */ +public interface CapaContextPropagatorSettings { + + String FILE_PATH = "/capa-context.json"; + + /** + * Replace the whole context config. + * + * @param config context config + * @return current settings. + */ + CapaContextPropagatorSettings setContextConfig(ContextConfig config); + + /** + * Add one more processor to current context config. + * + * @param processor processor config + * @return current settings. + */ + CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor); + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java new file mode 100644 index 0000000..b9e5db1 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java @@ -0,0 +1,39 @@ +/* + * 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.context; + +import java.io.Serializable; +import java.util.List; + +/** + * Config for context propagators. + */ +public class ContextConfig implements Serializable { + + private static final long serialVersionUID = 6587103489345563395L; + + private List contextPropagators; + + public List getContextPropagators() { + return contextPropagators; + } + + public void setContextPropagators(List contextPropagators) { + this.contextPropagators = contextPropagators; + } + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextPropagatorLoader.java similarity index 64% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextPropagatorLoader.java index 2dc1e27..dff7460 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerConfigLoader.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextPropagatorLoader.java @@ -14,22 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.trace; +package group.rxcloud.capa.component.telemetry.context; -import group.rxcloud.capa.component.telemetry.SpiUtils; -import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import io.opentelemetry.context.propagation.ContextPropagators; /** + * Load default context propagator. */ -public interface CapaTracerConfigLoader { +public interface ContextPropagatorLoader { - CapaTracerConfigLoader DEFAULT = new CapaTracerConfigLoader() { + ContextPropagatorLoader DEFAULT = new ContextPropagatorLoader() { }; - String FILE_PATH = "/capa-tracer.json"; - - default TracerConfig loadTracerConfig() { - return SpiUtils.loadConfigNullable(FILE_PATH, TracerConfig.class); + /** + * Load default context propagator. + * + * @return default context propagator. + */ + default ContextPropagators load() { + return ContextPropagators.noop(); } - } 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 cf95877..2fe96a4 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 @@ -16,118 +16,147 @@ */ package group.rxcloud.capa.component.telemetry.metrics; -import group.rxcloud.capa.component.telemetry.SpiUtils; +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.infrastructure.utils.SpiUtils; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; -import io.opentelemetry.sdk.metrics.exemplar.ExemplarFilter; import io.opentelemetry.sdk.metrics.export.MetricExporter; import io.opentelemetry.sdk.metrics.export.MetricReaderFactory; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import org.jetbrains.annotations.NotNull; +import javax.annotation.concurrent.NotThreadSafe; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; /** - * + * Builder for capa metric provider. */ +@NotThreadSafe public class CapaMeterProviderBuilder implements CapaMeterProviderSettings { + /** + * Config for capa metric provider. + */ private MeterConfig meterConfigs; - public MeterConfig getMetricsConfigs() { - return meterConfigs; + /** + * Sampler config. + */ + private SamplerConfig samplerConfig; + + /** + * Readers manually set. + */ + private List metricsReaderConfigs; + + /** + * Build the reader factories with reader configs. + * Each factory defined the export interval and exporter of the reader it will generate. + * + * @param readerConfigs metrics reader configs. + * @return metrics reader factories. + */ + private static List bulidReaderFactories(List readerConfigs) { + List factories = new ArrayList<>(); + for (MetricsReaderConfig config : readerConfigs) { + MetricExporter exporter = SpiUtils + .newInstanceWithConstructorCache(config.getExporterType(), MetricExporter.class); + if (exporter == null) { + throw new IllegalArgumentException( + "Metric Exporter is not configured. readerName = " + config.getName() + '.'); + } + + ScheduledThreadPoolExecutor worker = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { + @Override + public Thread newThread(@NotNull Runnable r) { + Thread thread = new Thread(r); + thread.setDaemon(true); + thread.setName("capa-metric-reader-" + config.getName() + '-' + System + .currentTimeMillis()); + return thread; + } + }); + + factories.add(PeriodicMetricReader.builder(exporter) + .setInterval(config.getExportIntervalMillis(), TimeUnit.MILLISECONDS) + .setExecutor(worker) + .newMetricReaderFactory()); + } + return factories; } @Override - public CapaMeterProviderSettings setMetricsConfig(MeterConfig config) { - meterConfigs = meterConfigs; + public CapaMeterProviderBuilder setSamplerConfig(SamplerConfig samplerConfig) { + this.samplerConfig = samplerConfig; return this; } @Override - public CapaMeterProviderSettings addMetricReaderConfig(MetricsReaderConfig config) { - if (meterConfigs == null) { - meterConfigs = new MeterConfig(); - meterConfigs.setReaders(new ArrayList<>()); - } - meterConfigs.getReaders().add(config); + public CapaMeterProviderBuilder setMeterConfig(MeterConfig config) { + meterConfigs = config; return this; } - - private void initMeterConfig() { - if (meterConfigs == null) { - CapaMeterConfigLoader meterConfigLoader = SpiUtils.getFromSpiConfigFile(CapaMeterConfigLoader.class); - if (meterConfigLoader == null) { - meterConfigLoader = CapaMeterConfigLoader.DEFAULT; - } - meterConfigs = meterConfigLoader.loadMetricsConfig(); + @Override + public CapaMeterProviderBuilder addMetricReaderConfig(MetricsReaderConfig config) { + if (metricsReaderConfigs == null) { + metricsReaderConfigs = new ArrayList<>(); } + metricsReaderConfigs.add(config); + return this; } + /** + * Build the meter provider with the config. + * In the following cases, a noop implementation will be returned and no new thread will be started. + * 1. No metrics reader was defined. + * + * @return the meter provider. + */ public MeterProvider buildMeterProvider() { - // if config was not explicitly set, try loading the config from the config loader. - initMeterConfig(); - MeterConfig meterConfigs = this.meterConfigs; - if (meterConfigs == null) { - return MeterProvider.noop(); - } - List readerConfigs = this.meterConfigs.getReaders(); - if (readerConfigs == null || readerConfigs.isEmpty()) { - return MeterProvider.noop(); + List metricsReaderConfigs = this.metricsReaderConfigs; + if (metricsReaderConfigs == null || metricsReaderConfigs.isEmpty()) { + // if config was not explicitly set, try loading the config from the config loader. + initMeterConfig(); + + if (meterConfigs != null) { + metricsReaderConfigs = meterConfigs.getReaders(); + } } - List factories = bulidReaderFactories(readerConfigs); - if (factories.isEmpty()) { + if (metricsReaderConfigs == null || metricsReaderConfigs.isEmpty()) { return MeterProvider.noop(); } + List factories = bulidReaderFactories(metricsReaderConfigs); + + initSampleConfig(); + SdkMeterProviderBuilder builder = SdkMeterProvider.builder() - .setExemplarFilter(ExemplarFilter.alwaysSample()); + .setExemplarFilter(CapaMetricsSampler.getInstance() + .update(samplerConfig)); factories.forEach(f -> builder.registerMetricReader(f)); return builder.build(); } - private List bulidReaderFactories(List readerConfigs) { - if (readerConfigs == null || readerConfigs.isEmpty()) { - return Collections.emptyList(); + private void initMeterConfig() { + if (meterConfigs == null) { + meterConfigs = SpiUtils.loadConfigNullable(FILE_PATH, MeterConfig.class); + ; } - List factories = new ArrayList<>(); - for (MetricsReaderConfig config : readerConfigs) { - if (config.isDisable()) { - continue; - } - - MetricExporter exporter = config.getExporterInstance() != null ? config.getExporterInstance() - : SpiUtils.getFromSpiConfigFile(config.getExporterType(), MetricExporter.class); - if (exporter == null) { - throw new IllegalArgumentException( - "Metric Exporter is not configured. readerName = " + config.getReaderName() + '.'); - } - - ScheduledThreadPoolExecutor worker = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { - @Override - public Thread newThread(@NotNull Runnable r) { - Thread thread = new Thread(r); - thread.setDaemon(true); - thread.setName("capa-metric-reader-" + config.getReaderName() + '-' + System - .currentTimeMillis()); - return thread; - } - }); + } - factories.add(PeriodicMetricReader.builder(exporter) - .setInterval(config.getExportIntervalMillis(), TimeUnit.MILLISECONDS) - .setExecutor(worker) - .newMetricReaderFactory()); + private void initSampleConfig() { + if (samplerConfig == null) { + samplerConfig = SamplerConfig.loadOrDefault(); } - return factories; } + + } 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 2777a9f..b03ee8c 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 @@ -16,11 +16,36 @@ */ package group.rxcloud.capa.component.telemetry.metrics; +import group.rxcloud.capa.component.telemetry.SamplerConfig; + /** + * Settings for capa meter provider. */ public interface CapaMeterProviderSettings { - CapaMeterProviderSettings setMetricsConfig(MeterConfig config); + String FILE_PATH ="/capa-meter.json"; + + /** + * Replace the whole config for the meter. + * + * @param config meter config. + * @return current settings. + */ + CapaMeterProviderSettings setMeterConfig(MeterConfig config); + /** + * Add one more reader to current meter config. + * + * @param config metrics reader config. + * @return current settings. + */ CapaMeterProviderSettings addMetricReaderConfig(MetricsReaderConfig config); + + /** + * Set sample config. + * + * @param samplerConfig sample config. + * @return current settings. + */ + CapaMeterProviderSettings setSamplerConfig(SamplerConfig samplerConfig); } 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 new file mode 100644 index 0000000..049a7a0 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSampler.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry.metrics; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.metrics.exemplar.ExemplarFilter; + +/** + * 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 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; + } + + if (config.isMetricsSample()) { + inner = ExemplarFilter.alwaysSample(); + } else { + inner = ExemplarFilter.neverSample(); + } + return this; + } + + @Override + public boolean shouldSampleMeasurement(long value, Attributes attributes, Context context) { + return inner.shouldSampleMeasurement(value, attributes, context); + } + + @Override + public boolean shouldSampleMeasurement(double value, Attributes attributes, Context context) { + return inner.shouldSampleMeasurement(value, attributes, context); + } +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java index 9d76661..aa91b1f 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MeterConfig.java @@ -16,13 +16,21 @@ */ package group.rxcloud.capa.component.telemetry.metrics; +import java.io.Serializable; import java.util.Collections; import java.util.List; /** + * Config for meters. */ -public class MeterConfig { - +public class MeterConfig implements Serializable { + + private static final long serialVersionUID = 7090415828392034412L; + + /** + * Configs for metrics readers. + * Each reader related with a scheduled thread. + */ private List readers = Collections.emptyList(); public List getReaders() { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java index 15e7ff1..aff868b 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/MetricsReaderConfig.java @@ -16,43 +16,32 @@ */ package group.rxcloud.capa.component.telemetry.metrics; -import io.opentelemetry.sdk.metrics.export.MetricExporter; - import java.io.Serializable; import java.util.concurrent.TimeUnit; /** + * Config for metrics reader. + * Control the export interval and target exporter. */ public class MetricsReaderConfig implements Serializable { private static final long serialVersionUID = 5186270483151262376L; - private String readerName = "UNKNOWN"; - - private boolean disable; + /** + * Reader name, used to find the related reader thread. + */ + private String name = "_DEFAULT_METRIC_READER"; - // default 1min. + /** + * Exporter interval. + * default 1min. + */ private long exportIntervalMillis = TimeUnit.MINUTES.toMillis(1L); - - private String exporterType; - - private transient MetricExporter exporterInstance; - public boolean isDisable() { - return disable; - } - - public void setDisable(boolean disable) { - this.disable = disable; - } - - public MetricExporter getExporterInstance() { - return exporterInstance; - } - - public void setExporterInstance(MetricExporter exporterInstance) { - this.exporterInstance = exporterInstance; - } + /** + * Exporter class name. Must have a no-args constructor. + */ + private String exporterType; public String getExporterType() { return exporterType; @@ -62,12 +51,12 @@ public void setExporterType(String exporterType) { this.exporterType = exporterType; } - public String getReaderName() { - return readerName; + public String getName() { + return name; } - public void setReaderName(String readerName) { - this.readerName = readerName; + public void setName(String name) { + this.name = name; } public long getExportIntervalMillis() { @@ -78,7 +67,7 @@ public void setExportIntervalMillis(long exportIntervalMillis) { this.exportIntervalMillis = exportIntervalMillis; } - public void setExportMillis(long export, TimeUnit timeUnit) { - this.exportIntervalMillis = timeUnit.toMillis(export); + public void setExportInterval(long export, TimeUnit timeUnit) { + setExportIntervalMillis(timeUnit.toMillis(export)); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java index e438945..5a9f137 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpan.java @@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit; /** + * Read write span proxy. */ public class CapaReadWriteSpan implements ReadWriteSpan { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java deleted file mode 100644 index 182f9d7..0000000 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSamplerProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.trace; - -import group.rxcloud.capa.component.telemetry.trace.config.SamplerConfig; -import io.opentelemetry.sdk.trace.samplers.Sampler; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Capa Sampler Cache. - */ -final class CapaSamplerProvider { - - private static final Map CACHE = new ConcurrentHashMap<>(); - - @Nonnull - public static Sampler getDefault() { - return getOrCreate(SamplerConfig.DEFAULT_CONFIG); - } - - @Nullable - public Sampler get(String name) { - return CACHE.get(name); - } - - @Nonnull - static Sampler getOrCreate(@Nullable SamplerConfig samplerConfig) { - if (samplerConfig == null) { - return getDefault(); - } - - Sampler sampler = CACHE.computeIfAbsent(samplerConfig.getName(), k -> { - return new CapaSampler(samplerConfig); - }); - return Sampler.parentBased(sampler); - } - -} 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 1ff6f5e..2979570 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 @@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit; /** + * Span builder proxy. */ public class CapaSpanBuilder implements SpanBuilder { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java similarity index 73% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java index 92a15e4..4c1873b 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaSampler.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSampler.java @@ -16,7 +16,7 @@ */ package group.rxcloud.capa.component.telemetry.trace; -import group.rxcloud.capa.component.telemetry.trace.config.SamplerConfig; +import group.rxcloud.capa.component.telemetry.SamplerConfig; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; @@ -27,23 +27,34 @@ import java.util.List; /** - * todo add more args ablout sampling + * Sampler for trace data. + * Choose to sample all or none data according to the config file. */ -public class CapaSampler implements Sampler { +public class CapaTraceSampler implements Sampler { + + private static final CapaTraceSampler INSTANCE = new CapaTraceSampler(SamplerConfig.DEFAULT_CONFIG); private Sampler inner; - public CapaSampler(SamplerConfig config) { + public static CapaTraceSampler getInstance() { + return INSTANCE; + } + + private CapaTraceSampler(SamplerConfig config) { update(config); } - public void update(SamplerConfig config) { - if (config.isDisable()) { - inner = Sampler.alwaysOff(); - } else { + public CapaTraceSampler update(SamplerConfig config) { + if (config == null) { + return this; + } + + if (config.isTraceSample()) { inner = Sampler.alwaysOn(); + } else { + inner = Sampler.alwaysOff(); } - // todo more. + return this; } @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 363b255..15d0a6b 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 @@ -20,6 +20,7 @@ import io.opentelemetry.api.trace.Tracer; /** + * Tracer proxy. */ public class CapaTracer implements Tracer { 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 3a04a35..06708c6 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 @@ -20,6 +20,7 @@ import io.opentelemetry.api.trace.TracerBuilder; /** + * Tracer builder proxy. */ public class CapaTracerBuilder implements TracerBuilder { 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 5d9e8f9..3b102ae 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 @@ -21,6 +21,7 @@ import io.opentelemetry.api.trace.TracerProvider; /** + * Capa tracer provider proxy. */ public class CapaTracerProvider implements TracerProvider { 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 592d082..60f1bba 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 @@ -16,12 +16,11 @@ */ package group.rxcloud.capa.component.telemetry.trace; -import group.rxcloud.capa.component.telemetry.SpiUtils; -import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; -import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.infrastructure.exceptions.CapaErrorContext; import group.rxcloud.capa.infrastructure.exceptions.CapaException; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.context.propagation.TextMapPropagator; +import group.rxcloud.capa.infrastructure.utils.SpiUtils; +import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; @@ -30,26 +29,41 @@ import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.samplers.Sampler; +import javax.annotation.concurrent.NotThreadSafe; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** + * Builder for capa tracer provider. */ -public class CapaTracerProviderBuilder implements CapaTracerProviderSettings, CapaContextPropagatorSettings { +@NotThreadSafe +public class CapaTracerProviderBuilder implements CapaTracerProviderSettings { + /** + * Config for capa tracer provider. + */ private TracerConfig tracerConfig; + /** + * Id generator instance. + */ private IdGenerator idGenerator; - private Sampler sampler; - + /** + * Span processor instances. + */ private List processors; + /** + * Span limits. + */ private SpanLimitsConfig spanLimitsConfig; - private List contextPropagators; + /** + * Sampler config. + */ + private SamplerConfig samplerConfig; private static boolean addSpanLimits(SpanLimitsConfig spanLimits, SpanLimitsBuilder limits) { if (spanLimits == null) { @@ -83,35 +97,41 @@ private static boolean addSpanLimits(SpanLimitsConfig spanLimits, SpanLimitsBuil return added; } - @Override - public CapaTracerProviderBuilder setTracerConfig(TracerConfig tracerConfig) { - this.tracerConfig = tracerConfig; - return this; + private static void skipIdValidate(SdkTracerProvider provider) { + try { + Field fieldTracerSharedState = SdkTracerProvider.class.getDeclaredField("sharedState"); + fieldTracerSharedState.setAccessible(true); + Object sharedStatus = fieldTracerSharedState.get(provider); + Class sharedStatusType = sharedStatus.getClass(); + Field fieldFlag = sharedStatusType.getDeclaredField("idGeneratorSafeToSkipIdValidation"); + fieldFlag.setAccessible(true); + fieldFlag.set(sharedStatus, true); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new CapaException(CapaErrorContext.SYSTEM_ERROR, "Fail to skip id validation.", e); + } } @Override - public CapaTracerProviderSettings setSpanLimits(SpanLimitsConfig spanLimits) { - this.spanLimitsConfig = spanLimits; + public CapaTracerProviderBuilder setSamplerConfig(SamplerConfig samplerConfig) { + this.samplerConfig = samplerConfig; return this; } @Override - public CapaTracerProviderBuilder setIdGenerator(IdGenerator idGenerator) { - this.idGenerator = idGenerator; + public CapaTracerProviderBuilder setTracerConfig(TracerConfig tracerConfig) { + this.tracerConfig = tracerConfig; return this; } @Override - public CapaTracerProviderBuilder setSampler(Sampler sampler) { - this.sampler = sampler; + public CapaTracerProviderBuilder setSpanLimits(SpanLimitsConfig spanLimits) { + spanLimitsConfig = spanLimits; return this; } @Override - public CapaTracerProviderBuilder setProcessors(List processors) { - if (processors != null) { - this.processors = new ArrayList<>(processors); - } + public CapaTracerProviderBuilder setIdGenerator(IdGenerator idGenerator) { + this.idGenerator = idGenerator; return this; } @@ -124,37 +144,29 @@ public CapaTracerProviderBuilder addProcessor(SpanProcessor processor) { return this; } - @Override - public CapaContextPropagatorSettings setContextPropagators(List contextPropagators) { - if (contextPropagators != null) { - this.contextPropagators = new ArrayList<>(contextPropagators); - } - return this; - } - - @Override - public CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor) { - if (contextPropagators != null) { - contextPropagators = new ArrayList<>(); - } - contextPropagators.add(processor); - return this; - } - private void initTracerConfig() { if (tracerConfig == null) { - CapaTracerConfigLoader tracerConfigLoader = SpiUtils.getFromSpiConfigFile(CapaTracerConfigLoader.class); - if (tracerConfigLoader == null) { - tracerConfigLoader = CapaTracerConfigLoader.DEFAULT; - } - tracerConfig = tracerConfigLoader.loadTracerConfig(); + tracerConfig = SpiUtils.loadConfigNullable(CapaTracerProviderSettings.FILE_PATH, TracerConfig.class); } } + /** + * Build the tracer provider with the config. + * In the following cases, a noop implementation will be returned. + * 1. No processor config was defined. + * + * @return the meter provider. + */ public CapaTracerProvider buildTracerProvider() { // if config was not explicitly set, try loading the config from the config loader. initTracerConfig(); + if ((processors == null || processors.isEmpty()) && (tracerConfig == null + || tracerConfig.getProcessors() == null + || tracerConfig.getProcessors().isEmpty())) { + return new CapaTracerProvider(TracerProvider.noop()); + } + SdkTracerProviderBuilder builder = SdkTracerProvider.builder(); addSpanLimits(builder); addIdGenerator(builder); @@ -163,44 +175,19 @@ public CapaTracerProvider buildTracerProvider() { SdkTracerProvider provider = builder.build(); - if (!tracerConfig.isEnableIdValidate()) { + if (tracerConfig != null && !tracerConfig.isEnableIdValidate()) { skipIdValidate(provider); } return new CapaTracerProvider(provider); } - public ContextPropagators buildContextPropagators() { - List propagators = contextPropagators; - - if (propagators == null) { - initTracerConfig(); - if (tracerConfig != null) { - propagators = new ArrayList<>(); - if (tracerConfig.getContextPropagatorsInstance() != null && !tracerConfig - .getContextPropagatorsInstance().isEmpty()) { - propagators.addAll(tracerConfig.getContextPropagatorsInstance()); - } - if (tracerConfig.getContextPropagators() != null && !tracerConfig - .getContextPropagators().isEmpty()) { - propagators.addAll(tracerConfig.getContextPropagators().stream() - .map(path -> SpiUtils - .getFromSpiConfigFile(path, TextMapPropagator.class)) - .collect(Collectors.toList())); - } - - } - } - - return propagators == null || propagators.isEmpty() ? ContextPropagators.noop() : ContextPropagators - .create(TextMapPropagator.composite(propagators.toArray(new TextMapPropagator[0]))); - } - private void addIdGenerator(SdkTracerProviderBuilder builder) { if (idGenerator != null) { builder.setIdGenerator(idGenerator); } else if (tracerConfig != null) { - IdGenerator generator = SpiUtils.getFromSpiConfigFile(tracerConfig.getIdGenerator(), IdGenerator.class); + IdGenerator generator = SpiUtils + .newInstanceWithConstructorCache(tracerConfig.getIdGenerator(), IdGenerator.class); if (generator != null) { builder.setIdGenerator(generator); } @@ -212,53 +199,39 @@ private void addSpanLimits(SdkTracerProviderBuilder builder) { boolean added = false; if (tracerConfig != null && tracerConfig.getSpanLimits() != null) { added |= addSpanLimits(tracerConfig.getSpanLimits(), limits); - } else if (spanLimitsConfig != null) { + } + if (spanLimitsConfig != null) { added |= addSpanLimits(spanLimitsConfig, limits); } + if (added) { builder.setSpanLimits(limits.build()); } } private void addSampler(SdkTracerProviderBuilder builder) { - if (sampler != null) { - builder.setSampler(sampler); - } else if (tracerConfig != null) { - builder.setSampler(CapaSamplerProvider.getOrCreate(tracerConfig.getSampler())); + initSampleConfig(); + builder.setSampler(Sampler.parentBased(CapaTraceSampler.getInstance().update(samplerConfig))); + } + + private void initSampleConfig() { + if (samplerConfig == null) { + samplerConfig = SamplerConfig.loadOrDefault(); } } private void addProcessors(SdkTracerProviderBuilder builder) { + List processors = this.processors; if (processors != null && !processors.isEmpty()) { processors.forEach(p -> builder.addSpanProcessor(p)); - } else if (tracerConfig != null) { - if (tracerConfig.getProcessorsInstance() != null) { - tracerConfig.getProcessorsInstance().forEach(p -> builder.addSpanProcessor(p)); - } - if (tracerConfig.getProcessors() != null) { - tracerConfig.getProcessors().forEach(p -> { - SpanProcessor processor = SpiUtils.getFromSpiConfigFile(p, SpanProcessor.class); - if (processor != null) { - builder.addSpanProcessor(processor); - } - }); - } - } - } - - private void skipIdValidate(SdkTracerProvider provider) { - try { - Field fieldTracerSharedState = SdkTracerProvider.class.getDeclaredField("sharedState"); - fieldTracerSharedState.setAccessible(true); - Object sharedStatus = fieldTracerSharedState.get(provider); - Class sharedStatusType = sharedStatus.getClass(); - Field fieldFlag = sharedStatusType.getDeclaredField("idGeneratorSafeToSkipIdValidation"); - fieldFlag.setAccessible(true); - fieldFlag.set(sharedStatus, true); - } catch (NoSuchFieldException | IllegalAccessException e) { - // todo - throw new CapaException(e); + } else if (tracerConfig != null && tracerConfig.getProcessors() != null) { + tracerConfig.getProcessors().forEach(p -> { + SpanProcessor processor = SpiUtils.newInstanceWithConstructorCache(p, SpanProcessor.class); + if (processor != null) { + builder.addSpanProcessor(processor); + } + }); } } - } + 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 795e306..3f379c4 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 @@ -16,28 +16,55 @@ */ package group.rxcloud.capa.component.telemetry.trace; -import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; -import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import group.rxcloud.capa.component.telemetry.SamplerConfig; import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SpanProcessor; -import io.opentelemetry.sdk.trace.samplers.Sampler; - -import java.util.List; /** + * Settings for capa trace provider. */ public interface CapaTracerProviderSettings { + String FILE_PATH = "/capa-tracer.json"; + + /** + * Replace the whole config for the meter. + * + * @param tracerConfig tracer config + * @return current settings. + */ CapaTracerProviderSettings setTracerConfig(TracerConfig tracerConfig); + /** + * Set the span limits. + * + * @param spanLimits span limits config. + * @return current settings. + */ CapaTracerProviderSettings setSpanLimits(SpanLimitsConfig spanLimits); + /** + * Set the trace/span id generator. + * + * @param idGenerator trace/span id generator. + * @return current settings. + */ CapaTracerProviderSettings setIdGenerator(IdGenerator idGenerator); - CapaTracerProviderSettings setSampler(Sampler sampler); - - CapaTracerProviderSettings setProcessors(List processors); - + /** + * Add one more span processor to current meter config. + * + * @param processor span processor. + * @return current settings. + */ CapaTracerProviderSettings addProcessor(SpanProcessor processor); + /** + * Set sample config. + * + * @param samplerConfig sample config. + * @return current settings. + */ + CapaTracerProviderSettings setSamplerConfig(SamplerConfig 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/CapaWrapper.java index 0ef14d9..fec1d7c 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/CapaWrapper.java @@ -16,7 +16,7 @@ */ package group.rxcloud.capa.component.telemetry.trace; -import group.rxcloud.capa.component.telemetry.SpiUtils; +import group.rxcloud.capa.infrastructure.utils.SpiUtils; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; @@ -28,6 +28,10 @@ * Load capa implementation. */ final class CapaWrapper { + + static final String FILE_SUFFIX = "telemetry"; + + static final boolean CACHE = true; private CapaWrapper() { } @@ -38,8 +42,8 @@ static CapaSpanBuilder wrap(String tracerName, String version, String schemaUrl, return (CapaSpanBuilder) builder; } CapaSpanBuilder result = SpiUtils - .getFromSpiConfigFile(CapaSpanBuilder.class, new Class[]{String.class, String.class, String.class, String.class, SpanBuilder.class}, - new Object[]{tracerName, version, schemaUrl, spanName, builder}); + .loadFromSpiComponentFileNullable(CapaSpanBuilder.class, new Class[]{String.class, String.class, String.class, String.class, SpanBuilder.class}, + new Object[]{tracerName, version, schemaUrl, spanName, builder}, FILE_SUFFIX, CACHE); if (result == null) { result = new CapaSpanBuilder(tracerName, version, schemaUrl, spanName, builder); } @@ -52,7 +56,8 @@ static CapaReadWriteSpan wrap(String tracerName, String version, String schemaUr return (CapaReadWriteSpan) span; } CapaReadWriteSpan result = SpiUtils - .getFromSpiConfigFile(CapaReadWriteSpan.class, new Class[]{String.class, String.class, String.class, ReadWriteSpan.class}, new Object[]{tracerName, version, schemaUrl, span}); + .loadFromSpiComponentFileNullable(CapaReadWriteSpan.class, new Class[]{String.class, String.class, String.class, ReadWriteSpan.class}, new Object[]{tracerName, version, schemaUrl, span}, + FILE_SUFFIX, CACHE); if (result == null) { result = new CapaReadWriteSpan(tracerName, version, schemaUrl, span); } @@ -64,8 +69,8 @@ static CapaTracer wrap(String tracerName, String version, String schemaUrl, Trac if (tracer instanceof CapaTracer) { return (CapaTracer) tracer; } - CapaTracer result = SpiUtils.getFromSpiConfigFile(CapaTracer.class, new Class[]{String.class, String.class, String.class, Tracer.class}, - new Object[]{tracerName, version, schemaUrl, tracer}); + CapaTracer result = SpiUtils.loadFromSpiComponentFileNullable(CapaTracer.class, new Class[]{String.class, String.class, String.class, Tracer.class}, + new Object[]{tracerName, version, schemaUrl, tracer}, FILE_SUFFIX, CACHE); if (result == null) { result = new CapaTracer(tracerName, version, schemaUrl, tracer); } @@ -78,8 +83,8 @@ static CapaTracerBuilder wrap(String tracerName, TracerBuilder tracerBuilder) { return (CapaTracerBuilder) tracerBuilder; } CapaTracerBuilder result = SpiUtils - .getFromSpiConfigFile(CapaTracerBuilder.class, new Class[]{String.class, TracerBuilder.class}, - new Object[]{tracerName, tracerBuilder}); + .loadFromSpiComponentFileNullable(CapaTracerBuilder.class, new Class[]{String.class, TracerBuilder.class}, + new Object[]{tracerName, tracerBuilder}, FILE_SUFFIX, CACHE); if (result == null) { result = new CapaTracerBuilder(tracerName, tracerBuilder); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java index 099a60f..057896a 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKey.java @@ -19,7 +19,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeType; + /** + * Attribute key for event params. */ public final class EventAttributeKey implements AttributeKey { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/SpanLimitsConfig.java similarity index 97% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/SpanLimitsConfig.java index 9a7c14b..5f3c010 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/SpanLimitsConfig.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/SpanLimitsConfig.java @@ -14,11 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.trace.config; +package group.rxcloud.capa.component.telemetry.trace; import java.io.Serializable; /** + * Span limits. */ public class SpanLimitsConfig implements Serializable { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java index c122988..2730207 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/StatusAttributeKey.java @@ -20,6 +20,7 @@ import io.opentelemetry.api.common.AttributeType; /** + * Attribute key for status params. */ public final class StatusAttributeKey implements AttributeKey { diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/TracerConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/TracerConfig.java new file mode 100644 index 0000000..5f8edb1 --- /dev/null +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/TracerConfig.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry.trace; + +import java.io.Serializable; +import java.util.List; + +/** + * Trace config. + */ +public class TracerConfig implements Serializable { + + private static final long serialVersionUID = 6587103489345563395L; + + /** + * Id generator class. + */ + private String idGenerator; + + /** + * Will trace/span id be validated with open telemetry restriction. + */ + private boolean enableIdValidate; + + /** + * Span limits. + */ + private SpanLimitsConfig spanLimits; + + /** + * Span processor classes. + */ + private List processors; + + public String getIdGenerator() { + return idGenerator; + } + + public void setIdGenerator(String className) { + this.idGenerator = className; + } + + public boolean isEnableIdValidate() { + return enableIdValidate; + } + + public void setEnableIdValidate(boolean enableIdValidate) { + this.enableIdValidate = enableIdValidate; + } + + public SpanLimitsConfig getSpanLimits() { + return spanLimits; + } + + public void setSpanLimits(SpanLimitsConfig spanLimits) { + this.spanLimits = spanLimits; + } + + public List getProcessors() { + return processors; + } + + public void setProcessors(List processors) { + this.processors = processors; + } + +} diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java deleted file mode 100644 index f9df117..0000000 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/config/TracerConfig.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * 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.trace.config; - -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.sdk.trace.SpanProcessor; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - */ -public class TracerConfig implements Serializable { - - private static final long serialVersionUID = 6587103489345563395L; - - private String idGenerator; - - private boolean enableIdValidate; - - private SamplerConfig sampler; - - private SpanLimitsConfig spanLimits; - - private List processors; - - private List contextPropagators; - - private transient List processorsInstance; - - private transient List contextPropagatorsInstance; - - public List getProcessorsInstance() { - return processorsInstance; - } - - public void setProcessorsInstance(List processorsInstance) { - this.processorsInstance = processorsInstance; - } - - public List getContextPropagatorsInstance() { - return contextPropagatorsInstance; - } - - public void setContextPropagatorsInstance( - List contextPropagatorsInstance) { - this.contextPropagatorsInstance = contextPropagatorsInstance; - } - - public List getContextPropagators() { - return contextPropagators; - } - - public void setContextPropagators(List contextPropagators) { - this.contextPropagators = contextPropagators; - } - - public String getIdGenerator() { - return idGenerator; - } - - public void setIdGenerator(String className) { - this.idGenerator = className; - } - - public boolean isEnableIdValidate() { - return enableIdValidate; - } - - public void setEnableIdValidate(boolean enableIdValidate) { - this.enableIdValidate = enableIdValidate; - } - - public SamplerConfig getSampler() { - return sampler; - } - - public void setSampler(SamplerConfig sampler) { - this.sampler = sampler; - } - - public SpanLimitsConfig getSpanLimits() { - return spanLimits; - } - - public void setSpanLimits(SpanLimitsConfig spanLimits) { - this.spanLimits = spanLimits; - } - - public List getProcessors() { - return processors; - } - - public void setProcessors(List processors) { - this.processors = processors; - } - - public void addProcessor(String processor) { - if (processors == null) { - processors = new ArrayList<>(); - } - processors.add(processor); - } - - public void addContextPropagator(String contextPropagator) { - if (contextPropagators == null) { - contextPropagators = new ArrayList<>(); - } - contextPropagators.add(contextPropagator); - } - - public void addProcessorInstance(SpanProcessor processor) { - if (processorsInstance == null) { - processorsInstance = new ArrayList<>(); - } - processorsInstance.add(processor); - } - - public void addContextPropagatorInstance(TextMapPropagator contextPropagator) { - if (contextPropagatorsInstance == null) { - contextPropagatorsInstance = new ArrayList<>(); - } - contextPropagatorsInstance.add(contextPropagator); - } -} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilderTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilderTest.java new file mode 100644 index 0000000..8256824 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorBuilderTest.java @@ -0,0 +1,145 @@ +/* + * 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.context; + +import com.google.common.collect.Lists; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.ContextKey; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapSetter; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * @author: chenyijiang + * @date: 2021/11/25 21:03 + */ +public class CapaContextPropagatorBuilderTest { + + @Test + public void setContextConfig() { + TestPropagator.clean(); + ContextConfig config = new ContextConfig(); + config.setContextPropagators( + Lists.newArrayList("group.rxcloud.capa.component.telemetry.context.TestPropagator")); + ContextPropagators propagators = new CapaContextPropagatorBuilder().setContextConfig(config) + .buildContextPropagators(); + propagators.getTextMapPropagator().inject(new Context() { + @Nullable + @Override + public V get(ContextKey key) { + return null; + } + + @Override + public Context with(ContextKey k1, V v1) { + return null; + } + }, null, new TextMapSetter() { + @Override + public void set(@Nullable Object carrier, String key, String value) { + + } + }); + assertEquals(1, TestPropagator.getCalled()); + } + + @Test + public void addContextPropagators() { + TestPropagator.clean(); + ContextPropagators propagators = new CapaContextPropagatorBuilder().addContextPropagators(new TestPropagator()) + .addContextPropagators(new TestPropagator()) + .buildContextPropagators(); + + propagators.getTextMapPropagator().inject(new Context() { + @Nullable + @Override + public V get(ContextKey key) { + return null; + } + + @Override + public Context with(ContextKey k1, V v1) { + return null; + } + }, null, new TextMapSetter() { + @Override + public void set(@Nullable Object carrier, String key, String value) { + + } + }); + + assertEquals(2, TestPropagator.getCalled()); + } + + + @Test + public void buildFromContextConfig() { + TestPropagator.clean(); + ContextPropagators propagators = new CapaContextPropagatorBuilder() + .buildContextPropagators(); + propagators.getTextMapPropagator().inject(new Context() { + @Nullable + @Override + public V get(ContextKey key) { + return null; + } + + @Override + public Context with(ContextKey k1, V v1) { + return null; + } + }, null, new TextMapSetter() { + @Override + public void set(@Nullable Object carrier, String key, String value) { + + } + }); + assertEquals(3, TestPropagator.getCalled()); + } + + @Test + public void buildFromLoader() { + TestPropagator.clean(); + ContextPropagators propagators = new CapaContextPropagatorBuilder() + .setContextConfig(new ContextConfig()) + .buildContextPropagators(); + propagators.getTextMapPropagator().inject(new Context() { + @Nullable + @Override + public V get(ContextKey key) { + return null; + } + + @Override + public Context with(ContextKey k1, V v1) { + return null; + } + }, null, new TextMapSetter() { + @Override + public void set(@Nullable Object carrier, String key, String value) { + + } + }); + assertNotNull(propagators); + assertEquals(0, TestPropagator.getCalled()); + } + +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextTest.java new file mode 100644 index 0000000..b1493b4 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/CapaContextTest.java @@ -0,0 +1,68 @@ +/* + * 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.context; + +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author: chenyijiang + * @date: 2021/11/25 20:53 + */ +public class CapaContextTest { + + @Test + public void taskWrapping() { + CapaContext.taskWrapping(new Runnable() { + @Override + public void run() { + + } + }); + assertTrue(TestCapaContextAsyncWrapper.called(Runnable.class)); + CapaContext.taskWrapping(new Callable() { + + @Override + public Boolean call() throws Exception { + return true; + } + }); + assertTrue(TestCapaContextAsyncWrapper.called(Callable.class)); + CapaContext.taskWrapping(Executors.newSingleThreadExecutor()); + assertTrue(TestCapaContextAsyncWrapper.called(ExecutorService.class)); + CapaContext.taskWrapping(new Executor() { + @Override + public void execute(@NotNull Runnable command) { + + } + }); + assertTrue(TestCapaContextAsyncWrapper.called(Executor.class)); + CapaContext.taskWrapping(Executors.newScheduledThreadPool(1)); + assertTrue(TestCapaContextAsyncWrapper.called(ScheduledExecutorService.class)); + + assertNotNull(CapaContext.getTraceId()); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestCapaContextAsyncWrapper.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestCapaContextAsyncWrapper.java new file mode 100644 index 0000000..8c114e1 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestCapaContextAsyncWrapper.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.context; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledExecutorService; + +/** + * @author: chenyijiang + * @date: 2021/11/25 20:55 + */ +public class TestCapaContextAsyncWrapper implements CapaContextAsyncWrapper { + + private static Set called = new HashSet<>(); + + @Override + public Runnable wrap(Runnable runnable) { + called.add(Runnable.class); + return CapaContextAsyncWrapper.super.wrap(runnable); + } + + @Override + public Callable wrap(Callable callable) { + called.add(Callable.class); + return CapaContextAsyncWrapper.super.wrap(callable); + } + + @Override + public Executor wrap(Executor executor) { + called.add(Executor.class); + return CapaContextAsyncWrapper.super.wrap(executor); + } + + @Override + public ExecutorService wrap(ExecutorService executor) { + called.add(ExecutorService.class); + return CapaContextAsyncWrapper.super.wrap(executor); + } + + @Override + public ScheduledExecutorService wrap(ScheduledExecutorService executor) { + called.add(ScheduledExecutorService.class); + return CapaContextAsyncWrapper.super.wrap(executor); + } + + @Override + public String getTraceId() { + return CapaContextAsyncWrapper.super.getTraceId(); + } + + public static boolean called(Class type) { + return called.contains(type); + } +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestPropagator.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestPropagator.java new file mode 100644 index 0000000..605ecfc --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/context/TestPropagator.java @@ -0,0 +1,59 @@ +/* + * 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.context; + +import com.google.common.collect.Lists; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author: chenyijiang + * @date: 2021/11/25 21:07 + */ +public class TestPropagator implements TextMapPropagator { + + private static AtomicInteger called = new AtomicInteger(); + + @Override + public Collection fields() { + return Lists.newArrayList("a"); + } + + @Override + public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { + called.incrementAndGet(); + } + + @Override + public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { + return null; + } + + public static int getCalled() { + return called.get(); + } + + public static void clean() { + called.set(0); + } +} 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 new file mode 100644 index 0000000..f12879e --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterProviderBuilderTest.java @@ -0,0 +1,147 @@ +/* + * 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 com.google.common.collect.Lists; +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.api.metrics.internal.NoopMeterProvider; +import org.junit.jupiter.api.Test; + +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; + +/** + * @author: chenyijiang + * @date: 2021/11/25 17:31 + */ +public class CapaMeterProviderBuilderTest { + + + @Test + public void buildWithConfigFile() { + + MeterProvider meterProvider = new CapaMeterProviderBuilder() + .buildMeterProvider(); + + ThreadGroup currentGroup = + Thread.currentThread().getThreadGroup(); + int noThreads = currentGroup.activeCount(); + Thread[] lstThreads = new Thread[noThreads]; + 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)); + } + + + @Test + public void buildWithEmptyConfig() { + + MeterProvider meterProvider = new CapaMeterProviderBuilder() + .setMeterConfig(new MeterConfig()) + .buildMeterProvider(); + + assertTrue(meterProvider instanceof NoopMeterProvider); + } + + @Test + public void buildWithUnknownExporterConfig() { + Throwable throwable = null; + try { + new CapaMeterProviderBuilder() + .addMetricReaderConfig(new MetricsReaderConfig() {{ + setExporterType("aaaaa"); + }}) + .buildMeterProvider(); + } catch (Throwable throwable1) { + throwable = throwable1; + } + + assertTrue(throwable instanceof IllegalArgumentException); + } + + @Test + public void addReaderConfig() { + MetricsReaderConfig readerConfigByInstance = new MetricsReaderConfig(); + readerConfigByInstance.setName("reader_a2"); + readerConfigByInstance.setExportInterval(2, TimeUnit.SECONDS); + readerConfigByInstance.setExporterType(TestMetricsExporter.class.getName()); + MetricsReaderConfig readerConfigByPath = new MetricsReaderConfig(); + readerConfigByPath.setName("reader_b2"); + readerConfigByPath.setExportInterval(4, TimeUnit.SECONDS); + readerConfigByPath.setExporterType("group.rxcloud.capa.component.telemetry.metrics.TestMetricsExporter"); + + MeterProvider meterProvider = new CapaMeterProviderBuilder() + .addMetricReaderConfig(readerConfigByInstance) + .addMetricReaderConfig(readerConfigByPath) + .buildMeterProvider(); + + ThreadGroup currentGroup = + Thread.currentThread().getThreadGroup(); + int noThreads = currentGroup.activeCount(); + Thread[] lstThreads = new Thread[noThreads]; + currentGroup.enumerate(lstThreads); + + 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)); + } + + + @Test + public void setMeterConfig() { + MeterConfig meterConfig = new MeterConfig(); + MetricsReaderConfig readerConfigByInstance = new MetricsReaderConfig(); + readerConfigByInstance.setName("reader_a3"); + readerConfigByInstance.setExportInterval(2, TimeUnit.SECONDS); + readerConfigByInstance.setExporterType(TestMetricsExporter.class.getName()); + meterConfig.setReaders(Lists.newArrayList(readerConfigByInstance)); + + MetricsReaderConfig readerConfigByPath = new MetricsReaderConfig(); + readerConfigByPath.setName("reader_b3"); + readerConfigByPath.setExportInterval(4, TimeUnit.SECONDS); + readerConfigByPath.setExporterType("group.rxcloud.capa.component.telemetry.metrics.TestMetricsExporter"); + + SamplerConfig samplerConfig = new SamplerConfig(); + samplerConfig.setMetricsSample(false); + + MeterProvider meterProvider = new CapaMeterProviderBuilder() + .addMetricReaderConfig(readerConfigByPath) + .setMeterConfig(meterConfig) + .setSamplerConfig(samplerConfig) + .buildMeterProvider(); + + ThreadGroup currentGroup = + Thread.currentThread().getThreadGroup(); + int noThreads = currentGroup.activeCount(); + Thread[] lstThreads = new Thread[noThreads]; + currentGroup.enumerate(lstThreads); + + 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 new file mode 100644 index 0000000..d05d7e1 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/CapaMetricsSamplerTest.java @@ -0,0 +1,60 @@ +/* + * 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 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; + +/** + * @author: chenyijiang + * @date: 2021/11/25 17:16 + */ +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()); + } +} \ 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 new file mode 100644 index 0000000..ede215b --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/metrics/TestMetricsExporter.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.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; + +import java.util.Collection; + +/** + * @author: chenyijiang + * @date: 2021/11/25 17:04 + */ +public class TestMetricsExporter implements MetricExporter { + + @Override + public CompletableResultCode export(Collection metrics) { + metrics.forEach(System.out::println); + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } +} diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpanTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpanTest.java new file mode 100644 index 0000000..3b74075 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaReadWriteSpanTest.java @@ -0,0 +1,88 @@ +/* + * 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.trace; + +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +/** + * @author: chenyijiang + * @date: 2021/11/25 22:48 + */ +public class CapaReadWriteSpanTest { + + @Test + public void getTracerName() { + ReadWriteSpan span = Mockito.mock(ReadWriteSpan.class); + CapaReadWriteSpan readWriteSpan = new CapaReadWriteSpan("aaa", "1.1", "url", span); + + readWriteSpan.getName(); + verify(span).getName(); + + readWriteSpan.getKind(); + verify(span).getKind(); + + readWriteSpan.getParentSpanContext(); + verify(span).getParentSpanContext(); + + assertEquals("aaa", readWriteSpan.getTracerName()); + verify(span, never()).getInstrumentationLibraryInfo(); + + assertEquals("1.1", readWriteSpan.getVersion()); + verify(span, never()).getInstrumentationLibraryInfo(); + + assertEquals("url", readWriteSpan.getSchemaUrl()); + verify(span, never()).getInstrumentationLibraryInfo(); + + long mills = System.currentTimeMillis(); + readWriteSpan.addEvent("aaa", null, mills, TimeUnit.MILLISECONDS); + verify(span).addEvent("aaa", null, mills, TimeUnit.MILLISECONDS); + + readWriteSpan.updateName("lll"); + verify(span).updateName("lll"); + + readWriteSpan.toSpanData(); + verify(span).toSpanData(); + + readWriteSpan.getInstrumentationLibraryInfo(); + verify(span).getInstrumentationLibraryInfo(); + + doReturn(true).when(span).hasEnded(); + assertTrue(readWriteSpan.hasEnded()); + + doReturn(System.nanoTime()).when(span).getLatencyNanos(); + readWriteSpan.getLatencyNanos(); + verify(span).getLatencyNanos(); + + readWriteSpan.getAttribute(StatusAttributeKey.STATUS); + verify(span).getAttribute(StatusAttributeKey.STATUS); + + + doReturn(true).when(span).isRecording(); + assertTrue(readWriteSpan.isRecording()); + + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..9bff803 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTraceSamplerTest.java @@ -0,0 +1,55 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import io.opentelemetry.sdk.trace.samplers.SamplingResult; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * @author: chenyijiang + * @date: 2021/11/25 21:41 + */ +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); + + assertNotNull(CapaTraceSampler.getInstance().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 new file mode 100644 index 0000000..c3a49a6 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderBuilderTest.java @@ -0,0 +1,136 @@ +/* + * 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.trace; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.sdk.trace.IdGenerator; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; +import io.opentelemetry.sdk.trace.data.SpanData; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatcher; + +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +/** + * @author: chenyijiang + * @date: 2021/11/25 21:45 + */ +public class CapaTracerProviderBuilderTest { + + @Test + public void buildFromTraceConfg() { + TracerConfig config = new TracerConfig(); + config.setEnableIdValidate(false); + config.setSpanLimits(new SpanLimitsConfig()); + config.getSpanLimits().setMaxAttributeValueLength(1); + config.getSpanLimits().setMaxNumAttributes(5); + config.getSpanLimits().setMaxNumAttributesPerEvent(2); + config.getSpanLimits().setMaxNumAttributesPerLink(2); + config.getSpanLimits().setMaxNumEvents(2); + config.getSpanLimits().setMaxNumLinks(2); + + SpanLimitsConfig outter = new SpanLimitsConfig(); + outter.setMaxAttributeValueLength(5); + + SpanProcessor processor = mock(SpanProcessor.class); + CapaTracerProvider provider = new CapaTracerProviderBuilder() + .setTracerConfig(config) + .addProcessor(processor) + .setSpanLimits(outter) + .setIdGenerator(IdGenerator.random()) + .setSamplerConfig(SamplerConfig.DEFAULT_CONFIG) + .buildTracerProvider(); + Span spanAnother = provider.tracerBuilder("otherTracer").build().spanBuilder("otherSpan").startSpan(); + spanAnother.end(System.currentTimeMillis(), TimeUnit.MILLISECONDS); + + + Span span = provider.tracerBuilder("test") + .build() + .spanBuilder("???") + .setSpanKind(SpanKind.SERVER) + .setNoParent() + .setAttribute("len", "aaaaaaaa") + .setAttribute("aaa", 1L) + .setAttribute("bbb", 2.0) + .setAttribute("ccc", true) + .setAttribute(AttributeKey.stringKey("ssss"), "str") + .addLink(spanAnother.getSpanContext()) + .addLink(spanAnother.getSpanContext(), Attributes.builder().put(StatusAttributeKey.MESSAGE, "testing").build()) + .startSpan(); + + span.updateName("span").recordException(new RuntimeException(), Attributes.builder().put(StatusAttributeKey.MESSAGE, "fail").build()); + + span.setStatus(StatusCode.OK); + span.setAttribute("lalala", "hahaha"); + span.addEvent("countEvent", Attributes.builder().put(EventAttributeKey.COUNT, 1L).build()); + + span.end(); + + verify(processor).onEnd(argThat(new ArgumentMatcher() { + @Override + public boolean matches(ReadableSpan span) { + if ("span".equals(span.getName())) { + assertEquals("test", span.getInstrumentationLibraryInfo().getName()); + assertEquals("span", span.getName()); + assertEquals(SpanKind.SERVER, span.getKind()); + assertEquals(SpanContext.getInvalid(), span.getParentSpanContext()); + SpanData spanData = span.toSpanData(); + assertEquals(2, spanData.getEvents().size()); + assertEquals(2, spanData.getLinks().size()); + assertEquals(5, spanData.getAttributes().size()); + assertEquals(StatusCode.OK, spanData.getStatus().getStatusCode()); + return span.getAttribute(AttributeKey.stringKey("len")).length() == 5; + } + return false; + } + })); + } + + @Test + public void buildFromTraceConfig() { + CapaTracerProvider provider = new CapaTracerProviderBuilder() + .buildTracerProvider(); + + Span span = provider.tracerBuilder("test") + .setSchemaUrl("url") + .setInstrumentationVersion("1.1.1") + .build() + .spanBuilder("span2") + .setSpanKind(SpanKind.SERVER) + .setAttribute("len", "aaaaaaaa") + .startSpan(); + + span.recordException(new RuntimeException(), Attributes.builder().put(StatusAttributeKey.MESSAGE, "fail").build()); + + span.end(); + + assertTrue(TestSpanProcessor.called("span2")); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderTest.java new file mode 100644 index 0000000..c29f2d6 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/CapaTracerProviderTest.java @@ -0,0 +1,49 @@ +/* + * 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.trace; + +import io.opentelemetry.api.trace.Tracer; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author: chenyijiang + * @date: 2021/11/25 22:35 + */ +public class CapaTracerProviderTest { + + @Test + public void get() { + Tracer tracer = new CapaTracerProviderBuilder().buildTracerProvider().get("aaa"); + assertTrue(tracer instanceof CapaTracer); + assertEquals("aaa", ((CapaTracer) tracer).tracerName); + + tracer = new CapaTracerProviderBuilder().buildTracerProvider().get("aaa", "1.1"); + assertTrue(tracer instanceof CapaTracer); + assertEquals("aaa", ((CapaTracer) tracer).tracerName); + assertEquals("1.1", ((CapaTracer) tracer).getVersion()); + + + tracer = new CapaTracerProviderBuilder().buildTracerProvider().tracerBuilder("aaa").setSchemaUrl("url").setInstrumentationVersion("1.1").build(); + assertTrue(tracer instanceof CapaTracer); + assertEquals("aaa", ((CapaTracer) tracer).tracerName); + assertEquals("1.1", ((CapaTracer) tracer).getVersion()); + assertEquals("url", ((CapaTracer) tracer).getSchemaUrl()); + } +} \ No newline at end of file diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKeyTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKeyTest.java new file mode 100644 index 0000000..5faf1a1 --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/EventAttributeKeyTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package group.rxcloud.capa.component.telemetry.trace; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * @author: chenyijiang + * @date: 2021/11/25 23:00 + */ +public class EventAttributeKeyTest { + + @Test + public void getNum() { + assertNull(EventAttributeKey.COUNT.getNum("aaa")); + + assertNull(EventAttributeKey.COUNT.getNum(Long.MAX_VALUE)); + assertNull(EventAttributeKey.COUNT.getNum(Long.MIN_VALUE)); + assertEquals(22, EventAttributeKey.COUNT.getNum(22L).intValue()); + } +} \ No newline at end of file diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestIdGenerator.java similarity index 70% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java rename to sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestIdGenerator.java index 10b47e4..8ab6d0d 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/trace/CapaContextPropagatorSettings.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestIdGenerator.java @@ -16,16 +16,21 @@ */ package group.rxcloud.capa.component.telemetry.trace; -import io.opentelemetry.context.propagation.TextMapPropagator; - -import java.util.List; +import io.opentelemetry.sdk.trace.IdGenerator; /** + * @author: chenyijiang + * @date: 2021/11/25 22:20 */ -public interface CapaContextPropagatorSettings { - - CapaContextPropagatorSettings setContextPropagators(List contextPropagators); +public class TestIdGenerator implements IdGenerator { - CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor); + @Override + public String generateSpanId() { + return String.valueOf(System.nanoTime()); + } + @Override + public String generateTraceId() { + return String.valueOf(System.nanoTime()); + } } diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestSpanProcessor.java b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestSpanProcessor.java new file mode 100644 index 0000000..2fd98bb --- /dev/null +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/trace/TestSpanProcessor.java @@ -0,0 +1,58 @@ +/* + * 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.trace; + +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author: chenyijiang + * @date: 2021/11/25 21:52 + */ +public class TestSpanProcessor implements SpanProcessor { + + static Set spanNames = new HashSet<>(); + + @Override + public void onStart(Context context, ReadWriteSpan span) { + + } + + @Override + public boolean isStartRequired() { + return false; + } + + @Override + public void onEnd(ReadableSpan span) { + spanNames.add(span.getName()); + } + + @Override + public boolean isEndRequired() { + return false; + } + + public static boolean called(String name) { + return spanNames.contains(name); + } +} diff --git a/sdk-component/src/test/resources/capa-component-telemetry.properties b/sdk-component/src/test/resources/capa-component-telemetry.properties new file mode 100644 index 0000000..33bbdf7 --- /dev/null +++ b/sdk-component/src/test/resources/capa-component-telemetry.properties @@ -0,0 +1 @@ +group.rxcloud.capa.component.telemetry.context.CapaContextAsyncWrapper=group.rxcloud.capa.component.telemetry.context.TestCapaContextAsyncWrapper \ No newline at end of file diff --git a/sdk-component/src/test/resources/capa-context.json b/sdk-component/src/test/resources/capa-context.json new file mode 100644 index 0000000..e9c202c --- /dev/null +++ b/sdk-component/src/test/resources/capa-context.json @@ -0,0 +1,3 @@ +{ + "contextPropagators": ["group.rxcloud.capa.component.telemetry.context.TestPropagator","group.rxcloud.capa.component.telemetry.context.TestPropagator","group.rxcloud.capa.component.telemetry.context.TestPropagator"] +} \ No newline at end of file diff --git a/sdk-component/src/test/resources/capa-meter.json b/sdk-component/src/test/resources/capa-meter.json new file mode 100644 index 0000000..2e10339 --- /dev/null +++ b/sdk-component/src/test/resources/capa-meter.json @@ -0,0 +1,6 @@ +{ + "readers": [{ + "name": "my-reader", + "exporterType": "group.rxcloud.capa.component.telemetry.metrics.TestMetricsExporter" + }] +} \ No newline at end of file diff --git a/sdk-component/src/test/resources/capa-sample.properties b/sdk-component/src/test/resources/capa-sample.properties new file mode 100644 index 0000000..d22c308 --- /dev/null +++ b/sdk-component/src/test/resources/capa-sample.properties @@ -0,0 +1,2 @@ +metricsSample=true +traceSample=true \ No newline at end of file diff --git a/sdk-component/src/test/resources/capa-tracer.json b/sdk-component/src/test/resources/capa-tracer.json new file mode 100644 index 0000000..3d12acc --- /dev/null +++ b/sdk-component/src/test/resources/capa-tracer.json @@ -0,0 +1,7 @@ +{ + "enableIdValidate" : false, + "idGenerator": "group.rxcloud.capa.component.telemetry.trace.TestIdGenerator", + "processors" : [ + "group.rxcloud.capa.component.telemetry.trace.TestSpanProcessor" + ] +} \ No newline at end of file diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index a5f68de..7f8cf6b 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-3 + 1.0.7-alpha-4 capa-sdk-infrastructure diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/config/CapaProperties.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/config/CapaProperties.java index 8789899..05be730 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/config/CapaProperties.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/config/CapaProperties.java @@ -14,12 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package group.rxcloud.capa.infrastructure.config; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; +import group.rxcloud.capa.infrastructure.utils.SpiUtils; + import java.util.Map; import java.util.Objects; import java.util.Properties; @@ -77,13 +76,6 @@ private static Properties loadCapaComponentProperties(final String componentDoma + componentDomain.toLowerCase() + CAPA_COMPONENT_PROPERTIES_SUFFIX; - try (InputStream in = CapaProperties.class.getResourceAsStream(fileName)) { - InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); - Properties properties = new Properties(); - properties.load(inputStreamReader); - return properties; - } catch (IOException e) { - throw new IllegalArgumentException(fileName + " file not found."); - } + return SpiUtils.loadProperties(fileName); } } diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java new file mode 100644 index 0000000..888587a --- /dev/null +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java @@ -0,0 +1,166 @@ +/* + * 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.infrastructure.utils; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import group.rxcloud.capa.infrastructure.config.CapaProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Load class and create instance from config file. + */ +public final class SpiUtils { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .setSerializationInclusion(JsonInclude.Include.NON_NULL); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private static final Logger log = LoggerFactory.getLogger(SpiUtils.class); + + private SpiUtils() { + } + + public static T loadConfigNullable(String path, Class configType) { + try (InputStream in = configType.getResourceAsStream(path)) { + if (in != null) { + InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); + return OBJECT_MAPPER.readValue(inputStreamReader, configType); + } else { + log.warn(path + " file not found."); + } + } catch (IOException e) { + log.warn(path + " config file not found.", e); + } + return null; + } + + public static Properties loadPropertiesNullable(String path) { + try (InputStream in = SpiUtils.class.getResourceAsStream(path)) { + if (in != null) { + InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); + Properties properties = new Properties(); + properties.load(inputStreamReader); + return properties; + } else { + log.warn(path + " file not found."); + } + } catch (IOException e) { + log.warn(path + " file not found.", e); + } + return null; + } + + + public static Properties loadProperties(String path) { + try (InputStream in = SpiUtils.class.getResourceAsStream(path)) { + if (in != null) { + InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); + Properties properties = new Properties(); + properties.load(inputStreamReader); + return properties; + } else { + throw new IllegalArgumentException(path + " file not found."); + } + } catch (IOException e) { + throw new IllegalArgumentException(path + " file not found.", e); + } + } + + @Nullable + public static T loadFromSpiComponentFileNullable(Class type, String fileSuffix) { + return loadFromSpiComponentFileNullable(type, null, null, fileSuffix, false); + } + + @Nullable + public static T loadFromSpiComponentFileNullable(Class type, Class[] argTypes, Object[] args, + String fileSuffix, boolean cache) { + try { + Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(fileSuffix); + String path = properties.getProperty(type.getName()); + if (path != null) { + return doNewInstance(path, type, argTypes, args, cache); + } + return null; + } catch (Throwable e) { + log.warn("Fail to load " + type.getName() + " instance from spi config file.", e); + } + return null; + } + + @Nullable + public static T newInstanceWithConstructorCache(String path, Class type) { + return newInstance(path, type, null, null, true); + } + + @Nullable + public static T newInstance(String path, Class type, Class[] argTypes, Object[] args, boolean cache) { + if (path == null) { + return null; + } + return doNewInstance(path, type, argTypes, args, cache); + } + + private static String keyOf(String path, Class type, Class[] argTypes) { + StringBuilder builder = new StringBuilder(type.getName()).append('=').append(path); + if (argTypes != null) { + for (Class arg : argTypes) { + builder.append('_').append(arg.getName()); + } + } + return builder.toString(); + } + + @Nonnull + private static T doNewInstance(String path, Class type, Class[] argTypes, Object[] args, boolean cache) { + String key = keyOf(path, type, argTypes); + Constructor targetCons = cache + ? CACHE.computeIfAbsent(key, k -> findConstructor(path, type, argTypes)) + : findConstructor(path, type, argTypes); + try { + return targetCons.getParameterCount() == 0 ? targetCons.newInstance() : targetCons.newInstance(args); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new IllegalArgumentException("Fail to create component. targetType = " + type.getName(), e); + } + } + + private static Constructor findConstructor(String path, Class type, Class[] argTypes) { + try { + Class aClass = path == null ? type : (Class) Class.forName(path); + return aClass.getConstructor(argTypes); + } catch (ClassNotFoundException | NoSuchMethodException e) { + throw new IllegalArgumentException("Fail to find the constructor. path = " + path, e); + } + } +} diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImpl.java similarity index 79% rename from sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java rename to sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImpl.java index 6a1f388..1791222 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerConfigLoaderSpi.java +++ b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImpl.java @@ -14,12 +14,9 @@ * 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.trace.CapaTracerConfigLoader; +package group.rxcloud.capa.infrastructure.utils; -/** - */ -public abstract class CapaTracerConfigLoaderSpi implements CapaTracerConfigLoader { +public class MyImpl implements MyInterface{ } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImplWithArgs.java similarity index 67% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java rename to sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImplWithArgs.java index 4ec261b..5232dca 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/metrics/CapaMeterConfigLoader.java +++ b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyImplWithArgs.java @@ -14,18 +14,22 @@ * 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.SpiUtils; +package group.rxcloud.capa.infrastructure.utils; -/** - */ -public interface CapaMeterConfigLoader { - CapaMeterConfigLoader DEFAULT = new CapaMeterConfigLoader() {}; +public class MyImplWithArgs implements MyInterfaceWithArgs{ + + private MyImplWithArgs(Integer a) { + + } + public MyImplWithArgs(String a) { + + } + public MyImplWithArgs(Integer a, String b) { + + } - String FILE_PATH = "/capa-meter.json"; + public MyImplWithArgs(boolean a, short b, int c, long d, float e, double f, byte g, char h, String i) { - default MeterConfig loadMetricsConfig() { - return SpiUtils.loadConfigNullable(FILE_PATH, MeterConfig.class); } } diff --git a/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterface.java b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterface.java new file mode 100644 index 0000000..70fb329 --- /dev/null +++ b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterface.java @@ -0,0 +1,22 @@ +/* + * 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.infrastructure.utils; + +public interface MyInterface { + +} diff --git a/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterfaceWithArgs.java b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterfaceWithArgs.java new file mode 100644 index 0000000..fe69c4c --- /dev/null +++ b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/MyInterfaceWithArgs.java @@ -0,0 +1,22 @@ +/* + * 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.infrastructure.utils; + +public interface MyInterfaceWithArgs { + +} diff --git a/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/SpiUtilsTest.java b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/SpiUtilsTest.java new file mode 100644 index 0000000..ddefc30 --- /dev/null +++ b/sdk-infrastructure/src/test/java/group/rxcloud/capa/infrastructure/utils/SpiUtilsTest.java @@ -0,0 +1,144 @@ +/* + * 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.infrastructure.utils; + +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SpiUtilsTest { + + @Test + public void loadConfigNullable() { + Config config = SpiUtils.loadConfigNullable("/config.json", Config.class); + assertEquals("aaa", config.str); + assertEquals(2, config.getList().size()); + assertEquals("zzz", config.getList().get(0)); + + assertNull(SpiUtils.loadConfigNullable("aaa", Config.class)); + assertNull(SpiUtils.loadConfigNullable("/config.json", Integer.class)); + } + + @Test + public void loadPropertiesNullable() { + Properties properties = SpiUtils.loadPropertiesNullable("/config.properties"); + assertEquals("aaa", properties.getProperty("str")); + + assertNull(SpiUtils.loadPropertiesNullable("lalala")); + } + + @Test + public void loadProperties() { + Properties properties = SpiUtils.loadProperties("/config.properties"); + assertEquals("aaa", properties.getProperty("str")); + } + + @Test + public void loadPropertiesFail() { + Throwable t = null; + try { + Properties properties = SpiUtils.loadProperties("aaaa"); + } catch (Throwable throwable) { + t = throwable; + } + assertNotNull(t); + } + @Test + public void loadFromSpiComponentFileNullable() { + MyInterface myInterface = SpiUtils.loadFromSpiComponentFileNullable(MyInterface.class, "test"); + assertTrue(myInterface instanceof MyImpl); + } + + @Test + public void loadFromSpiComponentFileNullable2() { + MyInterfaceWithArgs myInterfaceWithArgs = SpiUtils.loadFromSpiComponentFileNullable(MyInterfaceWithArgs.class, new Class[] {boolean.class, short.class, int.class, long.class, float.class, double.class, byte.class, char.class, String.class}, new Object[] {true, (short)1, 2, 3L, 4.0f, 5.0, (byte)0x1, 'x', "a"}, "test", true); + + assertTrue(myInterfaceWithArgs instanceof MyImplWithArgs); + + + } + + @Test + public void loadFromSpiComponentFileNullable2Fail() { + MyInterfaceWithArgs myInterfaceWithArgs = SpiUtils.loadFromSpiComponentFileNullable(MyInterfaceWithArgs.class, "test"); + assertNull(myInterfaceWithArgs); + + + assertNull(SpiUtils.loadFromSpiComponentFileNullable(MyImplWithArgs.class, new Class[] {String.class}, new Object[] {"a"}, "test", true)); + + assertNull(SpiUtils.loadFromSpiComponentFileNullable(MyInterfaceWithArgs.class, new Class[] {Long.class}, new Object[] {1L}, "test", false)); + + assertNull(SpiUtils.loadFromSpiComponentFileNullable(MyInterfaceWithArgs.class, new Class[] {Integer.class}, new Object[] {1}, "test", false)); + + assertNull(SpiUtils.loadFromSpiComponentFileNullable(MyInterfaceWithArgs.class, new Class[] {boolean.class, short.class, int.class, long.class, float.class, double.class, byte.class, char.class, String.class}, new Object[] {true, (short)1, 2, 3L, 4.0f, 5.0, null, 'x', "a"}, "test", true)); + + + } + + @Test + public void newInstance() { + assertNull(SpiUtils.newInstance(null, Config.class, null, null, false)); + + MyImpl my = SpiUtils.newInstanceWithConstructorCache(MyImpl.class.getCanonicalName(), MyImpl.class); + assertNotNull(my); + + MyImplWithArgs myImplWithArgs = SpiUtils.newInstance(MyImplWithArgs.class.getCanonicalName(),MyImplWithArgs.class, new Class[] {String.class}, new Object[] {"a"}, false); + assertNotNull(myImplWithArgs); + } + + @Test + public void newInstanceFail() { + Throwable t = null; + try { + Config my = SpiUtils.newInstanceWithConstructorCache(Config.class.getCanonicalName(), Config.class); + } catch (Throwable throwable) { + t = throwable; + } + assertNotNull(t); + } + + static class Config { + + private String str; + + private List list; + + public String getStr() { + return str; + } + + public Config setStr(String str) { + this.str = str; + return this; + } + + public List getList() { + return list; + } + + public Config setList(List list) { + this.list = list; + return this; + } + } +} \ No newline at end of file diff --git a/sdk-infrastructure/src/test/resources/capa-component-test.properties b/sdk-infrastructure/src/test/resources/capa-component-test.properties new file mode 100644 index 0000000..dafd0e8 --- /dev/null +++ b/sdk-infrastructure/src/test/resources/capa-component-test.properties @@ -0,0 +1,2 @@ +group.rxcloud.capa.infrastructure.utils.MyInterface=group.rxcloud.capa.infrastructure.utils.MyImpl +group.rxcloud.capa.infrastructure.utils.MyInterfaceWithArgs=group.rxcloud.capa.infrastructure.utils.MyImplWithArgs \ No newline at end of file diff --git a/sdk-infrastructure/src/test/resources/config.json b/sdk-infrastructure/src/test/resources/config.json new file mode 100644 index 0000000..0de38f1 --- /dev/null +++ b/sdk-infrastructure/src/test/resources/config.json @@ -0,0 +1,4 @@ +{ + "str": "aaa", + "list": ["zzz", "yyy"] +} \ No newline at end of file diff --git a/sdk-infrastructure/src/test/resources/config.properties b/sdk-infrastructure/src/test/resources/config.properties new file mode 100644 index 0000000..2b9c2c9 --- /dev/null +++ b/sdk-infrastructure/src/test/resources/config.properties @@ -0,0 +1 @@ +str=aaa \ No newline at end of file diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 0e9b530..4bfa3af 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-3 + 1.0.7-alpha-4 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index 312b960..effd7c2 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-3 + 1.0.7-alpha-4 capa-sdk-spi diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java index bd183d5..8062b67 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaContextAsyncWrapperSpi.java @@ -16,9 +16,10 @@ */ package group.rxcloud.capa.spi.telemetry; -import group.rxcloud.capa.component.telemetry.CapaContextAsyncWrapper; +import group.rxcloud.capa.component.telemetry.context.CapaContextAsyncWrapper; /** + * SPI Capa context async wrapper. */ public abstract class CapaContextAsyncWrapperSpi implements CapaContextAsyncWrapper { diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java index 546c2f3..bc7fc7f 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java @@ -20,6 +20,7 @@ import io.opentelemetry.sdk.trace.ReadWriteSpan; /** + * SPI Capa read write span. */ public abstract class CapaReadWriteSpanSpi extends CapaReadWriteSpan { diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java index 51cefe5..1f1d830 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java @@ -20,6 +20,7 @@ import io.opentelemetry.api.trace.SpanBuilder; /** + * SPI Capa span builder. */ public abstract class CapaSpanBuilderSpi extends CapaSpanBuilder { diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java index 6661de1..2ae161c 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java @@ -20,6 +20,7 @@ import io.opentelemetry.api.trace.TracerBuilder; /** + * SPI Capa tracer builder. */ public abstract class CapaTracerBuilderSpi extends CapaTracerBuilder { diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java index 45dfc63..ff04b72 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java @@ -20,6 +20,7 @@ import io.opentelemetry.api.trace.Tracer; /** + * SPI Capa tracer. */ public abstract class CapaTracerSpi extends CapaTracer { diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/ContextPropagatorLoaderSpi.java similarity index 81% rename from sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java rename to sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/ContextPropagatorLoaderSpi.java index 201ad3b..148165d 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaMeterConfigLoaderSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/ContextPropagatorLoaderSpi.java @@ -16,11 +16,12 @@ */ package group.rxcloud.capa.spi.telemetry; -import group.rxcloud.capa.component.telemetry.metrics.CapaMeterConfigLoader; +import group.rxcloud.capa.component.telemetry.context.ContextPropagatorLoader; + /** - * + * SPI context propagator loader. */ -public abstract class CapaMeterConfigLoaderSpi implements CapaMeterConfigLoader { +public abstract class ContextPropagatorLoaderSpi implements ContextPropagatorLoader { } diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index 1adbcd1..f399094 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-3 + 1.0.7-alpha-4 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 2f6281e..27efeb9 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-3 + 1.0.7-alpha-4 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 4e473db..9b5023a 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilder.java @@ -16,29 +16,33 @@ */ package group.rxcloud.capa.telemetry; +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.component.telemetry.context.CapaContextPropagatorBuilder; +import group.rxcloud.capa.component.telemetry.context.CapaContextPropagatorSettings; +import group.rxcloud.capa.component.telemetry.context.ContextConfig; import group.rxcloud.capa.component.telemetry.metrics.CapaMeterProviderBuilder; import group.rxcloud.capa.component.telemetry.metrics.CapaMeterProviderSettings; import group.rxcloud.capa.component.telemetry.metrics.MeterConfig; import group.rxcloud.capa.component.telemetry.metrics.MetricsReaderConfig; -import group.rxcloud.capa.component.telemetry.trace.CapaContextPropagatorSettings; import group.rxcloud.capa.component.telemetry.trace.CapaTracerProviderBuilder; import group.rxcloud.capa.component.telemetry.trace.CapaTracerProviderSettings; -import group.rxcloud.capa.component.telemetry.trace.config.SpanLimitsConfig; -import group.rxcloud.capa.component.telemetry.trace.config.TracerConfig; +import group.rxcloud.capa.component.telemetry.trace.SpanLimitsConfig; +import group.rxcloud.capa.component.telemetry.trace.TracerConfig; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SpanProcessor; -import io.opentelemetry.sdk.trace.samplers.Sampler; - -import java.util.List; /** + * A builder for the {@link CapaTelemetryClient} */ public class CapaTelemetryClientBuilder implements CapaContextPropagatorSettings, CapaTracerProviderSettings, CapaMeterProviderSettings { private final CapaTracerProviderBuilder tracerProviderBuilder = new CapaTracerProviderBuilder(); + private final CapaMeterProviderBuilder meterProviderBuilder = new CapaMeterProviderBuilder(); + private final CapaContextPropagatorBuilder contextPropagatorBuilder = new CapaContextPropagatorBuilder(); + @Override public CapaTelemetryClientBuilder setTracerConfig(TracerConfig tracerConfig) { tracerProviderBuilder.setTracerConfig(tracerConfig); @@ -57,18 +61,6 @@ public CapaTelemetryClientBuilder setIdGenerator(IdGenerator idGenerator) { return this; } - @Override - public CapaTelemetryClientBuilder setSampler(Sampler sampler) { - tracerProviderBuilder.setSampler(sampler); - return this; - } - - @Override - public CapaTelemetryClientBuilder setProcessors(List processors) { - tracerProviderBuilder.setProcessors(processors); - return this; - } - @Override public CapaTelemetryClientBuilder addProcessor(SpanProcessor processor) { tracerProviderBuilder.addProcessor(processor); @@ -76,21 +68,21 @@ public CapaTelemetryClientBuilder addProcessor(SpanProcessor processor) { } @Override - public CapaTelemetryClientBuilder setContextPropagators(List contextPropagators) { - tracerProviderBuilder.setContextPropagators(contextPropagators); + public CapaTelemetryClientBuilder setContextConfig(ContextConfig config) { + contextPropagatorBuilder.setContextConfig(config); return this; } @Override public CapaTelemetryClientBuilder addContextPropagators(TextMapPropagator processor) { - tracerProviderBuilder.addContextPropagators(processor); + contextPropagatorBuilder.addContextPropagators(processor); return this; } @Override - public CapaTelemetryClientBuilder setMetricsConfig(MeterConfig config) { - meterProviderBuilder.setMetricsConfig(config); + public CapaTelemetryClientBuilder setMeterConfig(MeterConfig config) { + meterProviderBuilder.setMeterConfig(config); return this; } @@ -100,11 +92,18 @@ public CapaTelemetryClientBuilder addMetricReaderConfig(MetricsReaderConfig conf return this; } + @Override + public CapaTelemetryClientBuilder setSamplerConfig(SamplerConfig samplerConfig) { + meterProviderBuilder.setSamplerConfig(samplerConfig); + tracerProviderBuilder.setSamplerConfig(samplerConfig); + return this; + } + public CapaTelemetryClient build() { CapaTelemetryClientGlobal client = new CapaTelemetryClientGlobal(); // context - client.setContextPropagators(tracerProviderBuilder.buildContextPropagators()); + client.setContextPropagators(contextPropagatorBuilder.buildContextPropagators()); // tracer client.setTracerProvider(tracerProviderBuilder.buildTracerProvider()); diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java index bbc61cd..ab33e92 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java @@ -52,6 +52,9 @@ static void set(CapaTelemetryClientGlobal capaTelemetryClient) { instance = capaTelemetryClient; } + CapaTelemetryClientGlobal() { + } + @Override public TracerProvider getTracerProvider() { return tracerProvider; @@ -131,9 +134,7 @@ public Mono buildMeter(String meterName, String version, String schemaUrl }); } - @Override public void close() { - // todo } } diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java new file mode 100644 index 0000000..d79bf17 --- /dev/null +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientBuilderTest.java @@ -0,0 +1,93 @@ +/* + * 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.telemetry; + +import group.rxcloud.capa.component.telemetry.SamplerConfig; +import group.rxcloud.capa.component.telemetry.context.ContextConfig; +import group.rxcloud.capa.component.telemetry.metrics.MeterConfig; +import group.rxcloud.capa.component.telemetry.metrics.MetricsReaderConfig; +import group.rxcloud.capa.component.telemetry.trace.SpanLimitsConfig; +import group.rxcloud.capa.component.telemetry.trace.TracerConfig; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.sdk.trace.IdGenerator; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * @author: chenyijiang + * @date: 2021/11/26 13:33 + */ +public class CapaTelemetryClientBuilderTest { + + @Test + public void build() { + CapaTelemetryClient client = new CapaTelemetryClientBuilder().build(); + assertNotNull(client.getContextPropagators().block()); + assertNotNull(client.buildTracer("aaa").block()); + assertNotNull(client.buildTracer("aaa", "ccc", "fff").block()); + assertNotNull(client.buildTracer("aaa", "sss").block()); + assertNotNull(client.buildMeter("bbb").block()); + assertNotNull(client.buildMeter("bbb", "shdas", "dasoi").block()); + assertNotNull(client.buildMeter("bbb", "dhasiug").block()); + } + + @Test + public void buildManual() throws InterruptedException { + MetricsReaderConfig readerConfig = new MetricsReaderConfig(); + readerConfig.setExporterType(MetricTestExporter.class.getName()); + readerConfig.setName("metric-reader"); + readerConfig.setExportInterval(1, TimeUnit.SECONDS); + CapaTelemetryClient capaTelemetryClient = new CapaTelemetryClientBuilder() + .addProcessor(new TraceProcessor()) + .setSamplerConfig(SamplerConfig.DEFAULT_CONFIG) + .setSpanLimits(new SpanLimitsConfig()) + .setIdGenerator(IdGenerator.random()) + .setTracerConfig(new TracerConfig()) + .setMeterConfig(new MeterConfig()) + .addMetricReaderConfig(readerConfig) + .setContextConfig(new ContextConfig()) + .addContextPropagators(W3CTraceContextPropagator.getInstance()) + .build(); + + // tracer + Tracer tracer = capaTelemetryClient.buildTracer("tracer-test") + .block(); + + LongCounter counter = capaTelemetryClient.buildMeter("meter-test") + .block() + .counterBuilder("counter-test") + .build(); + + Span span = tracer.spanBuilder("span-test") + .setAttribute("key1", 1) + .setAttribute("key2", 2) + .startSpan(); + // working + for (int i = 0; i < 10; i++) { + Thread.sleep(200); + counter.add(i); + } + + span.end(); + } +} \ No newline at end of file diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java new file mode 100644 index 0000000..579d125 --- /dev/null +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobalTest.java @@ -0,0 +1,43 @@ +/* + * 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.telemetry; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author: chenyijiang + * @date: 2021/11/26 14:12 + */ +public class CapaTelemetryClientGlobalTest { + + @Test + public void getOrCreate() { + CapaTelemetryClient client = CapaTelemetryClientGlobal.getOrCreate(); + assertTrue(client instanceof CapaTelemetryClientGlobal); + assertNotNull(client.getContextPropagators()); + assertNotNull(((CapaTelemetryClientGlobal) client).getPropagators()); + assertNotNull(((CapaTelemetryClientGlobal) client).getMeterProvider()); + assertNotNull(((CapaTelemetryClientGlobal) client).getTracerProvider()); + assertNotNull(GlobalOpenTelemetry.get()); + assertEquals(client, CapaTelemetryClientGlobal.getOrCreate()); + } +} \ No newline at end of file diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java new file mode 100644 index 0000000..6149cf5 --- /dev/null +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/MetricTestExporter.java @@ -0,0 +1,42 @@ +/* + * 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.telemetry; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; + +import java.util.Collection; + +public class MetricTestExporter implements MetricExporter { + + @Override + public CompletableResultCode export(Collection metrics) { + metrics.forEach(System.out::println); + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } +} \ No newline at end of file diff --git a/sdk/src/test/java/group/rxcloud/capa/telemetry/TraceProcessor.java b/sdk/src/test/java/group/rxcloud/capa/telemetry/TraceProcessor.java new file mode 100644 index 0000000..ab579b0 --- /dev/null +++ b/sdk/src/test/java/group/rxcloud/capa/telemetry/TraceProcessor.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.telemetry; + +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.trace.ReadWriteSpan; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SpanProcessor; + +public class TraceProcessor implements SpanProcessor { + + @Override + public void onStart(Context context, ReadWriteSpan span) { + + } + + @Override + public boolean isStartRequired() { + return false; + } + + @Override + public void onEnd(ReadableSpan span) { + System.out.println(span.toSpanData()); + } + + @Override + public boolean isEndRequired() { + return true; + } +} \ No newline at end of file From f61fecd522a95128b38b40f4503b5d4497d6f59d Mon Sep 17 00:00:00 2001 From: kevinten <596823919@qq.com> Date: Sun, 28 Nov 2021 13:01:00 +0800 Subject: [PATCH 20/36] refactor: format unit test code style --- .../context/CapaContextAsyncWrapper.java | 1 - .../CapaContextPropagatorSettings.java | 2 +- .../telemetry/context/ContextConfig.java | 1 - .../log/agent/CapaLog4jAppenderAgent.java | 18 ++------- .../log/agent/CapaLogbackAppenderAgent.java | 21 +++------- .../metrics/CapaMeterProviderBuilder.java | 4 -- .../metrics/CapaMeterProviderSettings.java | 1 + .../trace/CapaTracerProviderSettings.java | 1 + sdk-infrastructure/pom.xml | 2 +- .../capa/infrastructure/CapaConstants.java | 7 +++- .../capa/infrastructure/CapaProperties.java | 38 +++++++++++++++---- .../capa/infrastructure/utils/SpiUtils.java | 3 +- 12 files changed, 50 insertions(+), 49 deletions(-) diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java index 87bbe2f..94fc790 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextAsyncWrapper.java @@ -51,5 +51,4 @@ default ScheduledExecutorService wrap(ScheduledExecutorService executor) { default String getTraceId() { return Span.fromContext(Context.current()).getSpanContext().getTraceId(); } - } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java index e49ca4e..bba38ab 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/CapaContextPropagatorSettings.java @@ -23,6 +23,7 @@ */ public interface CapaContextPropagatorSettings { + // FIXME: 2021/11/28 change to capa-component-telemetry-context.json String FILE_PATH = "/capa-context.json"; /** @@ -40,5 +41,4 @@ public interface CapaContextPropagatorSettings { * @return current settings. */ CapaContextPropagatorSettings addContextPropagators(TextMapPropagator processor); - } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java index b9e5db1..5b17317 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/context/ContextConfig.java @@ -35,5 +35,4 @@ public List getContextPropagators() { public void setContextPropagators(List contextPropagators) { this.contextPropagators = contextPropagators; } - } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java index 37386e8..4cdf775 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java @@ -16,7 +16,7 @@ */ package group.rxcloud.capa.component.telemetry.log.agent; -import group.rxcloud.capa.infrastructure.config.CapaProperties; +import group.rxcloud.capa.infrastructure.CapaClassLoader; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; @@ -28,9 +28,6 @@ import org.apache.logging.log4j.core.config.plugins.PluginFactory; import java.io.Serializable; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Properties; /** * The abstract log4j appender. Extend this and provide your specific impl. @@ -93,16 +90,9 @@ public static CapaLog4jAppenderAgent createAppender(@PluginAttribute("name") Str */ public static CapaLog4jAppender buildCapaLog4jAppender() { // load spi capa Log4j appender impl - try { - Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(LOG_COMPONENT_TYPE); - String capaLogAppenderClassPath = properties.getProperty(CapaLog4jAppender.class.getName()); - Class aClass = (Class) Class.forName(capaLogAppenderClassPath); - Constructor constructor = aClass.getConstructor(); - Object newInstance = constructor.newInstance(); - return (CapaLog4jAppender) newInstance; - } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - throw new IllegalArgumentException("No Capa log4j appender supported."); - } + return CapaClassLoader.loadComponentClassObj( + LOG_COMPONENT_TYPE, + CapaLog4jAppender.class); } @Override diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java index ba43eed..31c7423 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java @@ -17,11 +17,7 @@ package group.rxcloud.capa.component.telemetry.log.agent; import ch.qos.logback.core.UnsynchronizedAppenderBase; -import group.rxcloud.capa.infrastructure.config.CapaProperties; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Properties; +import group.rxcloud.capa.infrastructure.CapaClassLoader; /** * The agent of the logback impl. @@ -50,17 +46,10 @@ public class CapaLogbackAppenderAgent extends UnsynchronizedAppenderBase< * @return CapaLogbackAppender instance. */ public static CapaLogbackAppender buildCapaLogbackAppender() { - // load spi capa Log4j appender impl - try { - Properties properties = CapaProperties.COMPONENT_PROPERTIES_SUPPLIER.apply(LOG_COMPONENT_TYPE); - String capaLogbackAppenderClassPath = properties.getProperty(CapaLogbackAppender.class.getName()); - Class aClass = (Class) Class.forName(capaLogbackAppenderClassPath); - Constructor constructor = aClass.getConstructor(); - Object newInstance = constructor.newInstance(); - return (CapaLogbackAppender) newInstance; - } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - throw new IllegalArgumentException("No Capa Logback Appender supported."); - } + // load spi capa logback appender impl + return CapaClassLoader.loadComponentClassObj( + LOG_COMPONENT_TYPE, + CapaLogbackAppender.class); } /** 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 2fe96a4..044eb92 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 @@ -119,7 +119,6 @@ public CapaMeterProviderBuilder addMetricReaderConfig(MetricsReaderConfig config * @return the meter provider. */ public MeterProvider buildMeterProvider() { - List metricsReaderConfigs = this.metricsReaderConfigs; if (metricsReaderConfigs == null || metricsReaderConfigs.isEmpty()) { // if config was not explicitly set, try loading the config from the config loader. @@ -148,7 +147,6 @@ public MeterProvider buildMeterProvider() { private void initMeterConfig() { if (meterConfigs == null) { meterConfigs = SpiUtils.loadConfigNullable(FILE_PATH, MeterConfig.class); - ; } } @@ -157,6 +155,4 @@ private void initSampleConfig() { 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 b03ee8c..01967a6 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 @@ -23,6 +23,7 @@ */ public interface CapaMeterProviderSettings { + // FIXME: 2021/11/28 change to capa-component-telemetry-meter.json String FILE_PATH ="/capa-meter.json"; /** 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 3f379c4..f1ac0da 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 @@ -25,6 +25,7 @@ */ public interface CapaTracerProviderSettings { + // FIXME: 2021/11/28 change to capa-component-telemetry-tracer.json String FILE_PATH = "/capa-tracer.json"; /** diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 7f8cf6b..dbae170 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -31,7 +31,7 @@ SDK infrastructure for Capa - 1.0.0 + 1.0.1-RELEASE 1.39.0 2.12.4 diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaConstants.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaConstants.java index 04fb156..752ea46 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaConstants.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaConstants.java @@ -30,15 +30,18 @@ interface Properties { * The {@code infrastructure} properties prefix. */ String CAPA_INFRASTRUCTURE_PROPERTIES_PREFIX = "/capa-infrastructure-"; - /** * The {@code component} properties prefix. */ String CAPA_COMPONENT_PROPERTIES_PREFIX = "/capa-component-"; /** - * The constant SUFFIX. + * The properties suffix. */ String CAPA_PROPERTIES_SUFFIX = ".properties"; + /** + * The json suffix. + */ + String CAPA_JSON_SUFFIX = ".json"; } } diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java index ce0ddfd..05b90f2 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java @@ -16,6 +16,12 @@ */ package group.rxcloud.capa.infrastructure; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -27,9 +33,8 @@ import java.util.function.Function; import java.util.function.Supplier; -import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_COMPONENT_PROPERTIES_PREFIX; -import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_INFRASTRUCTURE_PROPERTIES_PREFIX; -import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_PROPERTIES_SUFFIX; +import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.*; +import static group.rxcloud.capa.infrastructure.Module.OBJECT_MAPPER; /** * Global properties for Capa's SDK, using Supplier so they are dynamically resolved. @@ -60,13 +65,13 @@ public abstract class CapaProperties { /** * Capa's properties cache map. */ - private static final Map PROPERTIES_MAP = new ConcurrentHashMap<>(); + private static final Map PROPERTIES_MAP = new ConcurrentHashMap<>(); /** * Capa's infrastructure properties. */ public static final Function INFRASTRUCTURE_PROPERTIES_SUPPLIER - = (infrastructureDomain) -> PROPERTIES_MAP.computeIfAbsent(infrastructureDomain, + = (infrastructureDomain) -> (Properties) PROPERTIES_MAP.computeIfAbsent(infrastructureDomain, s -> { final String fileName = CAPA_INFRASTRUCTURE_PROPERTIES_PREFIX + infrastructureDomain.toLowerCase() @@ -78,7 +83,7 @@ public abstract class CapaProperties { * Capa's component properties. */ public static final Function COMPONENT_PROPERTIES_SUPPLIER - = (componentDomain) -> PROPERTIES_MAP.computeIfAbsent(componentDomain, + = (componentDomain) -> (Properties) PROPERTIES_MAP.computeIfAbsent(componentDomain, s -> { final String fileName = CAPA_COMPONENT_PROPERTIES_PREFIX + componentDomain.toLowerCase() @@ -87,7 +92,7 @@ public abstract class CapaProperties { }); private static Properties loadCapaProperties(final String fileName) { - Objects.requireNonNull(fileName, "fileName not found."); + Objects.requireNonNull(fileName, "fileName not found.3444444444444444444"); try (InputStream in = CapaProperties.class.getResourceAsStream(fileName)) { InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); Properties properties = new Properties(); @@ -97,4 +102,23 @@ private static Properties loadCapaProperties(final String fileName) { throw new IllegalArgumentException(fileName + " file not found."); } } + + public static T loadCapaConfig(final String fileName, Class configClazz) { + Objects.requireNonNull(fileName, "fileName not found."); + try (InputStream in = configClazz.getResourceAsStream(fileName)) { + InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); + return OBJECT_MAPPER.readValue(inputStreamReader, configClazz); + } catch (JsonParseException | JsonMappingException e) { + throw new IllegalArgumentException(fileName + " file not load."); + } catch (IOException e) { + throw new IllegalArgumentException(fileName + " file not found."); + } + } } + +interface Module { + + ObjectMapper OBJECT_MAPPER = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .setSerializationInclusion(JsonInclude.Include.NON_NULL); +} \ No newline at end of file diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java index 888587a..89b02ac 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/utils/SpiUtils.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import group.rxcloud.capa.infrastructure.config.CapaProperties; +import group.rxcloud.capa.infrastructure.CapaProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,7 +82,6 @@ public static Properties loadPropertiesNullable(String path) { return null; } - public static Properties loadProperties(String path) { try (InputStream in = SpiUtils.class.getResourceAsStream(path)) { if (in != null) { From 499a2953325f13ad633a1a7c335c3e614b37dfcf Mon Sep 17 00:00:00 2001 From: kevinten <596823919@qq.com> Date: Sun, 28 Nov 2021 13:07:36 +0800 Subject: [PATCH 21/36] release: release 1.0.7.RELEASE version --- README.md | 4 ++-- README_ZH.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- .../group/rxcloud/capa/infrastructure/CapaProperties.java | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7abfb85..7bc5757 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.6.RELEASE + 1.0.7.RELEASE ... @@ -140,7 +140,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.6.RELEASE + 1.0.7.RELEASE ... diff --git a/README_ZH.md b/README_ZH.md index 15e2d00..a13a2ae 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -118,7 +118,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.6.RELEASE + 1.0.7.RELEASE ... @@ -138,7 +138,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.6.RELEASE + 1.0.7.RELEASE ... diff --git a/examples/pom.xml b/examples/pom.xml index 9623802..739a0b7 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-examples diff --git a/pom.xml b/pom.xml index 25dddad..8d6c431 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 9dfc7f7..22941a3 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index dbae170..17a1891 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk-infrastructure diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java index 05b90f2..9685c45 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java @@ -121,4 +121,4 @@ interface Module { ObjectMapper OBJECT_MAPPER = new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .setSerializationInclusion(JsonInclude.Include.NON_NULL); -} \ No newline at end of file +} diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 4bfa3af..4256367 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index effd7c2..dc3077f 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index f399094..7d038dc 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-alpha-4 + 1.0.7.RELEASE sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 27efeb9..b1e9a06 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-alpha-4 + 1.0.7.RELEASE capa-sdk From dfbb98d8700d5917f1064ccb99e9a2e8c6d4af41 Mon Sep 17 00:00:00 2001 From: kevinten <596823919@qq.com> Date: Sun, 28 Nov 2021 13:10:16 +0800 Subject: [PATCH 22/36] chore: fix checkstyle error --- .../group/rxcloud/capa/infrastructure/CapaProperties.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java index 9685c45..f44e787 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java @@ -33,7 +33,9 @@ import java.util.function.Function; import java.util.function.Supplier; -import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.*; +import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_COMPONENT_PROPERTIES_PREFIX; +import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_INFRASTRUCTURE_PROPERTIES_PREFIX; +import static group.rxcloud.capa.infrastructure.CapaConstants.Properties.CAPA_PROPERTIES_SUFFIX; import static group.rxcloud.capa.infrastructure.Module.OBJECT_MAPPER; /** From 23bf8638ab661b4a0e45aca583ded690a3f9cfc0 Mon Sep 17 00:00:00 2001 From: kevinten <596823919@qq.com> Date: Sun, 28 Nov 2021 13:26:50 +0800 Subject: [PATCH 23/36] release: release 1.0.7-beta-1 version --- README.md | 4 ++-- README_ZH.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7bc5757..030da4a 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7.RELEASE + 1.0.7-beta-1 ... @@ -140,7 +140,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7.RELEASE + 1.0.7-beta-1 ... diff --git a/README_ZH.md b/README_ZH.md index a13a2ae..a5d3a27 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -118,7 +118,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7.RELEASE + 1.0.7-beta-1 ... @@ -138,7 +138,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7.RELEASE + 1.0.7-beta-1 ... diff --git a/examples/pom.xml b/examples/pom.xml index 739a0b7..b6d20b1 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7.RELEASE + 1.0.7-beta-1 capa-examples diff --git a/pom.xml b/pom.xml index 8d6c431..3ef950c 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7.RELEASE + 1.0.7-beta-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..618a7d6 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.7-beta-1 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index 17a1891..d0b329d 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.7-beta-1 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 4256367..94446c4 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.7-beta-1 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index dc3077f..a3d8c85 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.7-beta-1 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index 7d038dc..9e6946c 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.7-beta-1 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index b1e9a06..dcda224 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7.RELEASE + 1.0.7-beta-1 capa-sdk From e92c8a2ea6ba4ecbe93d8aeb16bdf960ce0f1a50 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Mon, 29 Nov 2021 15:34:30 +0800 Subject: [PATCH 24/36] chore: upgrade pom version --- README.md | 4 ++-- README_ZH.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 030da4a..778c8bc 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-1 + 1.0.7-beta-2 ... @@ -140,7 +140,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-1 + 1.0.7-beta-2 ... diff --git a/README_ZH.md b/README_ZH.md index a5d3a27..3c2ab60 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -118,7 +118,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-1 + 1.0.7-beta-2 ... @@ -138,7 +138,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-1 + 1.0.7-beta-2 ... diff --git a/examples/pom.xml b/examples/pom.xml index b6d20b1..c006cb5 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-1 + 1.0.7-beta-2 capa-examples diff --git a/pom.xml b/pom.xml index aff1999..0f14209 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 618a7d6..714aee9 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index d0b329d..d4f811f 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 94446c4..71b1266 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index a3d8c85..9c81d69 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index e184eaa..d5ebda5 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-1 + 1.0.7-beta-2 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index dcda224..bf282e2 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-1 + 1.0.7-beta-2 capa-sdk From c1b2ce536e112003da88dfc9a35a1dbca08d9a94 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Mon, 29 Nov 2021 15:42:15 +0800 Subject: [PATCH 25/36] chore: upgrade pom --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 0f14209..c45dd65 100644 --- a/pom.xml +++ b/pom.xml @@ -331,6 +331,7 @@ docs/** spec/** **/generated/** + **/*.json From 3dbf70ad92e1baad7d66514a47eda8c1807e5294 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Mon, 29 Nov 2021 23:35:57 +0800 Subject: [PATCH 26/36] feat: add hooks interface and builder --- examples/src/main/resources/xml/logback.xml | 2 +- .../configstore/CapaConfigStore.java | 29 ++++--- .../configstore/CapaConfigStoreBuilder.java | 15 +++- .../rxcloud/capa/component/http/CapaHttp.java | 16 +++- .../capa/component/http/CapaHttpBuilder.java | 31 ++++++- .../log/agent/CapaLog4jAppenderAgent.java | 2 +- .../log/agent/CapaLogbackAppenderAgent.java | 2 +- .../configstore/TestCapaConfigStore.java | 5 +- .../capa/component/http/CapaHttpTest.java | 4 +- .../capa/component/http/TestCapaHttp.java | 7 +- .../log/agent/CapaLog4jAppenderAgentTest.java | 2 +- .../agent/CapaLogbackAppenderAgentTest.java | 2 +- .../log/agent/TestCapaLog4jAppender.java | 2 +- .../log/agent/TestCapaLogbackAppender.java | 2 +- .../resources/capa-component-log.properties | 4 +- .../hook/ConfigurationHooks.java | 82 +++++++++++++++++++ .../infrastructure/hook/TelemetryHooks.java | 61 ++++++++++++++ .../infrastructure/hook/package-info.java | 21 +++++ .../demo/configstore/DemoCapaConfigStore.java | 5 +- .../capa/spi/demo/http/DemoCapaHttp.java | 7 +- .../log/DemoLog4jAppender.java | 4 +- .../log/DemoLogbackAppender.java | 4 +- .../resources/capa-component-log.properties | 4 +- .../spi/configstore/CapaConfigStoreSpi.java | 5 +- .../rxcloud/capa/spi/http/CapaHttpSpi.java | 7 +- .../capa/spi/http/CapaSerializeHttpSpi.java | 7 +- .../configstore/CapaConfigStoreSpiTest.java | 22 ++--- .../TestCapaConfigStoreSpiImpl.java | 5 +- .../spi/http/CapaSerializeHttpSpiTest.java | 26 ++++-- .../CapaConfigurationClientBuilder.java | 10 +++ .../capa/rpc/CapaRpcClientBuilder.java | 18 ++++ .../configuration/TestCapaConfigStore.java | 5 +- .../capa/rpc/CapaRpcClientBuilderTest.java | 11 ++- .../group/rxcloud/capa/rpc/TestCapaHttp.java | 7 +- 34 files changed, 357 insertions(+), 79 deletions(-) rename sdk-component/src/main/java/group/rxcloud/capa/component/{telemetry => }/log/agent/CapaLog4jAppenderAgent.java (98%) rename sdk-component/src/main/java/group/rxcloud/capa/component/{telemetry => }/log/agent/CapaLogbackAppenderAgent.java (97%) rename sdk-component/src/test/java/group/rxcloud/capa/component/{telemetry => }/log/agent/CapaLog4jAppenderAgentTest.java (97%) rename sdk-component/src/test/java/group/rxcloud/capa/component/{telemetry => }/log/agent/CapaLogbackAppenderAgentTest.java (96%) rename sdk-component/src/test/java/group/rxcloud/capa/component/{telemetry => }/log/agent/TestCapaLog4jAppender.java (95%) rename sdk-component/src/test/java/group/rxcloud/capa/component/{telemetry => }/log/agent/TestCapaLogbackAppender.java (95%) create mode 100644 sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java create mode 100644 sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java create mode 100644 sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java rename sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/{telemetry => }/log/DemoLog4jAppender.java (89%) rename sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/{telemetry => }/log/DemoLogbackAppender.java (89%) diff --git a/examples/src/main/resources/xml/logback.xml b/examples/src/main/resources/xml/logback.xml index b97e9ee..268d16c 100644 --- a/examples/src/main/resources/xml/logback.xml +++ b/examples/src/main/resources/xml/logback.xml @@ -17,7 +17,7 @@ --> - + diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java index 87831fc..89c59ac 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java @@ -17,6 +17,7 @@ package group.rxcloud.capa.component.configstore; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -39,6 +40,8 @@ public abstract class CapaConfigStore implements AutoCloseable { */ protected final CapaObjectSerializer objectSerializer; + protected final TelemetryHooks telemetryHooks; + /** * The configuration store name. */ @@ -48,9 +51,11 @@ public abstract class CapaConfigStore implements AutoCloseable { * Instantiates a new Capa ConfigStore. * * @param objectSerializer Serializer for transient request/response objects. + * @param telemetryHooks optional telemetry hooks */ - public CapaConfigStore(CapaObjectSerializer objectSerializer) { + public CapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { this.objectSerializer = objectSerializer; + this.telemetryHooks = telemetryHooks; } /** @@ -80,41 +85,41 @@ public String getStoreName() { /** * GetSpecificKeysValue get specific key value. * - * @param getRequest - * @param type - * @param - * @return + * @param getRequest request + * @param type response type + * @param type + * @return mono of response */ public abstract Mono>> get(GetRequest getRequest, TypeRef type); /** * Subscribe the configurations updates. * - * @param subscribeReq - * @param type - * @param - * @return + * @param subscribeReq request + * @param type response type + * @param type + * @return flux of subscribe */ public abstract Flux> subscribe(SubscribeReq subscribeReq, TypeRef type); /** * StopSubscribe stop subs * - * @return + * @return result */ public abstract String stopSubscribe(); /** * GetDefaultGroup returns default group.This method will be invoked if a request doesn't specify the group field * - * @return + * @return default */ public abstract String getDefaultGroup(); /** * GetDefaultLabel returns default label * - * @return + * @return default */ public abstract String getDefaultLabel(); } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java index fe5baef..d689abf 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java @@ -18,6 +18,7 @@ import group.rxcloud.capa.infrastructure.CapaClassLoader; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; @@ -31,6 +32,8 @@ public class CapaConfigStoreBuilder { */ private CapaObjectSerializer objectSerializer; + private TelemetryHooks telemetryHooks; + private final StoreConfig storeConfig; /** @@ -63,6 +66,14 @@ public CapaConfigStoreBuilder withObjectSerializer(CapaObjectSerializer objectSe return this; } + public CapaConfigStoreBuilder withTelemetryHooks(TelemetryHooks telemetryHooks) { + if (telemetryHooks == null) { + throw new IllegalArgumentException("TelemetryHooks is required"); + } + this.telemetryHooks = telemetryHooks; + return this; + } + /** * Build an instance of the client based on the provided setup. * @@ -85,7 +96,7 @@ private CapaConfigStore buildCapaConfigStore() { return CapaClassLoader.loadComponentClassObj( "configuration", CapaConfigStore.class, - new Class[]{CapaObjectSerializer.class}, - new Object[]{this.objectSerializer}); + new Class[]{CapaObjectSerializer.class, TelemetryHooks.class}, + new Object[]{this.objectSerializer, this.telemetryHooks}); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java index 65c7a72..47e5278 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java @@ -16,6 +16,8 @@ */ package group.rxcloud.capa.component.http; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.MediaType; @@ -68,16 +70,24 @@ public abstract class CapaHttp implements AutoCloseable { */ protected final CapaObjectSerializer objectSerializer; + protected final TelemetryHooks telemetryHooks; + protected final ConfigurationHooks configurationHooks; + /** * Instantiates a new Capa http. * - * @param httpClient RestClient used for all API calls in this new instance. - * @param objectSerializer Serializer for transient request/response objects. + * @param httpClient RestClient used for all API calls in this new instance. + * @param objectSerializer Serializer for transient request/response objects. + * @param telemetryHooks optional + * @param configurationHooks optional * @see CapaHttpBuilder */ - public CapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + public CapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { this.httpClient = httpClient; this.objectSerializer = objectSerializer; + this.telemetryHooks = telemetryHooks; + this.configurationHooks = configurationHooks; } /** diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java index 2d3d9c5..7a8ad27 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java @@ -19,6 +19,8 @@ import group.rxcloud.capa.infrastructure.CapaClassLoader; import group.rxcloud.capa.infrastructure.CapaProperties; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; import okhttp3.OkHttpClient; @@ -46,6 +48,9 @@ public class CapaHttpBuilder { */ private CapaObjectSerializer objectSerializer; + private TelemetryHooks telemetryHooks; + private ConfigurationHooks configurationHooks; + /** * Creates a constructor for CapaHttp. *

@@ -75,6 +80,22 @@ public CapaHttpBuilder withObjectSerializer(CapaObjectSerializer objectSerialize return this; } + public CapaHttpBuilder withTelemetryHooks(TelemetryHooks telemetryHooks) { + if (telemetryHooks == null) { + throw new IllegalArgumentException("TelemetryHooks is required"); + } + this.telemetryHooks = telemetryHooks; + return this; + } + + public CapaHttpBuilder withConfigurationHooks(ConfigurationHooks configurationHooks) { + if (configurationHooks == null) { + throw new IllegalArgumentException("ConfigurationHooks is required"); + } + this.configurationHooks = configurationHooks; + return this; + } + /** * Build an instance of the Http client based on the provided setup. * @@ -108,7 +129,13 @@ private CapaHttp buildCapaHttp() { return CapaClassLoader.loadComponentClassObj( "rpc", CapaHttp.class, - new Class[]{OkHttpClient.class, CapaObjectSerializer.class}, - new Object[]{OK_HTTP_CLIENT.get(), this.objectSerializer}); + new Class[]{OkHttpClient.class, + CapaObjectSerializer.class, + TelemetryHooks.class, + ConfigurationHooks.class}, + new Object[]{OK_HTTP_CLIENT.get(), + this.objectSerializer, + this.telemetryHooks, + this.configurationHooks}); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java similarity index 98% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java index 4cdf775..e05cd68 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgent.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import group.rxcloud.capa.infrastructure.CapaClassLoader; import org.apache.logging.log4j.core.Appender; diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java similarity index 97% rename from sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java rename to sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java index 31c7423..c4c0d54 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgent.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgent.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import ch.qos.logback.core.UnsynchronizedAppenderBase; import group.rxcloud.capa.infrastructure.CapaClassLoader; diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java b/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java index 4c2b740..e099d68 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java @@ -16,6 +16,7 @@ */ package group.rxcloud.capa.component.configstore; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -36,8 +37,8 @@ public class TestCapaConfigStore extends CapaConfigStore { * * @param objectSerializer Serializer for transient request/response objects. */ - public TestCapaConfigStore(CapaObjectSerializer objectSerializer) { - super(objectSerializer); + public TestCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + super(objectSerializer, telemetryHooks); } @Override diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java index bcc67ad..1120726 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java @@ -38,7 +38,7 @@ public void testInvokeApi_Success() { headers.put("Content-Type", "application/json"); OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer(), null, null); Mono> responseMono = capaHttp.invokeApi("post", null, null, @@ -56,7 +56,7 @@ public void testInvokeApi_Success() { @Test public void testClose_Success() throws Exception { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer(), null, null); capaHttp.close(); } diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java index fa69654..7197cf7 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java @@ -16,6 +16,8 @@ */ package group.rxcloud.capa.component.http; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; @@ -30,8 +32,9 @@ */ public class TestCapaHttp extends CapaHttp { - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } @Override diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgentTest.java similarity index 97% rename from sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java rename to sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgentTest.java index 72c13d5..2b1ab7d 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLog4jAppenderAgentTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLog4jAppenderAgentTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgentTest.java similarity index 96% rename from sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java rename to sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgentTest.java index ebcec0a..16b61fc 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/CapaLogbackAppenderAgentTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/CapaLogbackAppenderAgentTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.message.Message; diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLog4jAppender.java similarity index 95% rename from sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java rename to sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLog4jAppender.java index 9c0deb3..4dbdca6 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLog4jAppender.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLog4jAppender.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import org.apache.logging.log4j.core.LogEvent; diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLogbackAppender.java similarity index 95% rename from sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java rename to sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLogbackAppender.java index 3a39b9d..af58bcd 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/telemetry/log/agent/TestCapaLogbackAppender.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/log/agent/TestCapaLogbackAppender.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.component.telemetry.log.agent; +package group.rxcloud.capa.component.log.agent; import org.apache.logging.log4j.core.LogEvent; diff --git a/sdk-component/src/test/resources/capa-component-log.properties b/sdk-component/src/test/resources/capa-component-log.properties index 8bb8152..17fc340 100644 --- a/sdk-component/src/test/resources/capa-component-log.properties +++ b/sdk-component/src/test/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.component.telemetry.log.agent.TestCapaLog4jAppender -group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.component.telemetry.log.agent.TestCapaLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.component.log.agent.TestCapaLog4jAppender +group.rxcloud.capa.component.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.component.log.agent.TestCapaLogbackAppender \ No newline at end of file diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java new file mode 100644 index 0000000..871f886 --- /dev/null +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java @@ -0,0 +1,82 @@ +/* + * 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.infrastructure.hook; + +import group.rxcloud.cloudruntimes.domain.core.ConfigurationRuntimes; +import group.rxcloud.cloudruntimes.domain.core.configuration.ConfigurationItem; +import group.rxcloud.cloudruntimes.domain.core.configuration.ConfigurationRequestItem; +import group.rxcloud.cloudruntimes.domain.core.configuration.SaveConfigurationRequest; +import group.rxcloud.cloudruntimes.domain.core.configuration.SubConfigurationResp; +import group.rxcloud.cloudruntimes.utils.TypeRef; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; + +public interface ConfigurationHooks extends ConfigurationRuntimes { + + @Override + default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, String group, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, String group, String label, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono>> getConfiguration(ConfigurationRequestItem configurationRequestItem, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono saveConfiguration(SaveConfigurationRequest saveConfigurationRequest) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono deleteConfiguration(ConfigurationRequestItem configurationRequestItem) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Flux> subscribeConfiguration(String storeName, String appId, List keys, Map metadata, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Flux> subscribeConfiguration(String storeName, String appId, List keys, Map metadata, String group, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Flux> subscribeConfiguration(String storeName, String appId, List keys, Map metadata, String group, String label, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Flux> subscribeConfiguration(ConfigurationRequestItem configurationRequestItem, TypeRef type) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } +} diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java new file mode 100644 index 0000000..c117e16 --- /dev/null +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java @@ -0,0 +1,61 @@ +/* + * 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.infrastructure.hook; + +import group.rxcloud.cloudruntimes.domain.enhanced.TelemetryRuntimes; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.propagation.ContextPropagators; +import reactor.core.publisher.Mono; + +public interface TelemetryHooks extends TelemetryRuntimes { + + @Override + default Mono buildTracer(String tracerName) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono buildTracer(String tracerName, String version) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono buildTracer(String tracerName, String version, String schemaUrl) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono getContextPropagators() { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono buildMeter(String meterName) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono buildMeter(String meterName, String version) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } + + @Override + default Mono buildMeter(String meterName, String version, String schemaUrl) { + throw new UnsupportedOperationException("If you want to use this operate, please impl this."); + } +} diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java new file mode 100644 index 0000000..56138f5 --- /dev/null +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ +/** + * Hooks design: + * TODO + */ +package group.rxcloud.capa.infrastructure.hook; \ No newline at end of file diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java index 7b2dc7a..3f1dbb0 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java @@ -19,6 +19,7 @@ import group.rxcloud.capa.component.configstore.ConfigurationItem; import group.rxcloud.capa.component.configstore.StoreConfig; import group.rxcloud.capa.component.configstore.SubscribeResp; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.spi.configstore.CapaConfigStoreSpi; import group.rxcloud.cloudruntimes.utils.TypeRef; @@ -41,8 +42,8 @@ public class DemoCapaConfigStore extends CapaConfigStoreSpi { * * @param objectSerializer Serializer for transient request/response objects. */ - public DemoCapaConfigStore(CapaObjectSerializer objectSerializer) { - super(objectSerializer); + public DemoCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + super(objectSerializer, telemetryHooks); } @Override diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java index 921ac11..7b29b6c 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java @@ -17,6 +17,8 @@ package group.rxcloud.capa.spi.demo.http; import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.spi.http.config.RpcServiceOptions; import group.rxcloud.capa.spi.demo.http.config.DemoRpcServiceOptions; @@ -42,8 +44,9 @@ public class DemoCapaHttp extends CapaSerializeHttpSpi { * @param httpClient the http client * @param objectSerializer the object serializer */ - public DemoCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public DemoCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } @Override diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java similarity index 89% rename from sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java rename to sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java index add96e4..ccf07cc 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLog4jAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLog4jAppender.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.spi.demo.telemetry.log; +package group.rxcloud.capa.spi.demo.log; -import group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent; +import group.rxcloud.capa.component.log.agent.CapaLog4jAppenderAgent; import org.apache.logging.log4j.core.LogEvent; public class DemoLog4jAppender implements CapaLog4jAppenderAgent.CapaLog4jAppender { diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java similarity index 89% rename from sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java rename to sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java index d11320d..c6029cd 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/telemetry/log/DemoLogbackAppender.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/log/DemoLogbackAppender.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package group.rxcloud.capa.spi.demo.telemetry.log; +package group.rxcloud.capa.spi.demo.log; import ch.qos.logback.classic.spi.ILoggingEvent; -import group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent; +import group.rxcloud.capa.component.log.agent.CapaLogbackAppenderAgent; public class DemoLogbackAppender implements CapaLogbackAppenderAgent.CapaLogbackAppender { diff --git a/sdk-spi-demo/src/main/resources/capa-component-log.properties b/sdk-spi-demo/src/main/resources/capa-component-log.properties index 879e78e..2b10f8d 100644 --- a/sdk-spi-demo/src/main/resources/capa-component-log.properties +++ b/sdk-spi-demo/src/main/resources/capa-component-log.properties @@ -1,2 +1,2 @@ -group.rxcloud.capa.component.telemetry.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLog4jAppender -group.rxcloud.capa.component.telemetry.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.spi.demo.telemetry.log.DemoLogbackAppender \ No newline at end of file +group.rxcloud.capa.component.log.agent.CapaLog4jAppenderAgent$CapaLog4jAppender=group.rxcloud.capa.spi.demo.log.DemoLog4jAppender +group.rxcloud.capa.component.log.agent.CapaLogbackAppenderAgent$CapaLogbackAppender=group.rxcloud.capa.spi.demo.log.DemoLogbackAppender \ No newline at end of file diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java index 09901ae..00db4d1 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java @@ -21,6 +21,7 @@ import group.rxcloud.capa.component.configstore.GetRequest; import group.rxcloud.capa.component.configstore.SubscribeReq; import group.rxcloud.capa.component.configstore.SubscribeResp; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import org.slf4j.Logger; @@ -43,8 +44,8 @@ public abstract class CapaConfigStoreSpi extends CapaConfigStore { * * @param objectSerializer Serializer for transient request/response objects. */ - public CapaConfigStoreSpi(CapaObjectSerializer objectSerializer) { - super(objectSerializer); + public CapaConfigStoreSpi(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + super(objectSerializer, telemetryHooks); } @Override diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java index f0d07c3..786dbb2 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java @@ -18,6 +18,8 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.spi.http.config.CapaSpiOptionsLoader; import group.rxcloud.capa.spi.http.config.CapaSpiProperties; @@ -41,8 +43,9 @@ public abstract class CapaHttpSpi extends CapaHttp { private static final Logger logger = LoggerFactory.getLogger(CapaHttpSpi.class); - public CapaHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public CapaHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } /** diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java index 1a92894..1c8c31f 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java @@ -20,6 +20,8 @@ import group.rxcloud.capa.component.http.HttpResponse; import group.rxcloud.capa.infrastructure.exceptions.CapaErrorContext; import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.domain.core.invocation.Metadata; import group.rxcloud.cloudruntimes.utils.TypeRef; @@ -55,8 +57,9 @@ public abstract class CapaSerializeHttpSpi extends CapaHttpSpi { * @param httpClient the http client * @param objectSerializer the object serializer */ - public CapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public CapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } /** diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java index c32c34a..bea6829 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java @@ -40,7 +40,7 @@ public class CapaConfigStoreSpiTest { @Test public void testGet_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); Mono>> listMono = configStoreSpiImpl.get(constructGetRequest(), TypeRef.STRING); List> configurationItems = listMono.block(); Assertions.assertNotNull(configurationItems); @@ -63,19 +63,19 @@ public void testGet_Success() { @Test public void testSubscribe_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); Flux> subscribeFlux = configStoreSpiImpl.subscribe(constructSubscribeReq(), TypeRef.STRING); SubscribeResp resp = subscribeFlux.blockFirst(); Assertions.assertNotNull(resp); - Assertions.assertEquals("12345",resp.getAppId()); + Assertions.assertEquals("12345", resp.getAppId()); - Assertions.assertEquals(2,resp.getItems().size()); + Assertions.assertEquals(2, resp.getItems().size()); ConfigurationItem firstConfigurationItem = resp.getItems().get(0); - Assertions.assertEquals("testKey1",firstConfigurationItem.getKey()); + Assertions.assertEquals("testKey1", firstConfigurationItem.getKey()); Assertions.assertNull(firstConfigurationItem.getContent()); - Assertions.assertEquals("testGroup",firstConfigurationItem.getGroup()); - Assertions.assertEquals("testLabel",firstConfigurationItem.getLabel()); + Assertions.assertEquals("testGroup", firstConfigurationItem.getGroup()); + Assertions.assertEquals("testLabel", firstConfigurationItem.getLabel()); Assertions.assertNotNull(firstConfigurationItem.getLabel()); Assertions.assertEquals(2, firstConfigurationItem.getTags().size()); @@ -88,14 +88,14 @@ public void testSubscribe_Success() { @Test public void testGetDefaultGroup_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); String defaultGroup = configStoreSpiImpl.getDefaultGroup(); Assertions.assertEquals("application", defaultGroup); } @Test public void testGetDefaultLabel_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); String defaultLabel = configStoreSpiImpl.getDefaultLabel(); Assertions.assertEquals("", defaultLabel); } @@ -114,12 +114,12 @@ private GetRequest constructGetRequest() { return getRequest; } - private SubscribeReq constructSubscribeReq(){ + private SubscribeReq constructSubscribeReq() { SubscribeReq req = new SubscribeReq(); req.setAppId("12345"); req.setGroup("testGroup"); req.setLabel("testLabel"); - req.setKeys(Lists.newArrayList("testKey1","testKey2")); + req.setKeys(Lists.newArrayList("testKey1", "testKey2")); Map metaDataMap = new HashMap<>(); metaDataMap.put("cluster", "default"); diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java index a6ad800..09d1648 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java @@ -19,6 +19,7 @@ import group.rxcloud.capa.component.configstore.ConfigurationItem; import group.rxcloud.capa.component.configstore.StoreConfig; import group.rxcloud.capa.component.configstore.SubscribeResp; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -40,8 +41,8 @@ public class TestCapaConfigStoreSpiImpl extends CapaConfigStoreSpi { * * @param objectSerializer Serializer for transient request/response objects. */ - public TestCapaConfigStoreSpiImpl(CapaObjectSerializer objectSerializer) { - super(objectSerializer); + public TestCapaConfigStoreSpiImpl(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + super(objectSerializer, telemetryHooks); } @Override diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java index 51ed60d..ef4c4c3 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java @@ -19,12 +19,21 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; import group.rxcloud.capa.spi.http.config.RpcServiceOptions; import group.rxcloud.cloudruntimes.utils.TypeRef; -import okhttp3.*; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -50,7 +59,7 @@ public class CapaSerializeHttpSpiTest { public void setUp() { okHttpClient = new OkHttpClient.Builder().build(); defaultObjectSerializer = new DefaultObjectSerializer(); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer, null, null); } @Test @@ -63,12 +72,12 @@ public void testGetRequestWithSerialize_Success() throws IOException { @Test public void testGetRequestWithSerialize_FailWhenThrowException() { - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer(), null, null); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getRequestWithSerialize("Object"); }); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer(),null,null); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getRequestWithSerialize("Object"); }); @@ -135,12 +144,12 @@ public void testGetResponseBodyWithDeserialize_Success() { @Test public void testGetResponseBodyWithDeserialize_FailWhenThrowException() { HttpResponse httpResponse = new HttpResponse<>(null, null, 200); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer(), null, null); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); }); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer(), null, null); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); }); @@ -280,8 +289,9 @@ public String getContentType() { */ private class TestCapaSerializeHttpSpi extends CapaSerializeHttpSpi { - public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } @Override diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java index 3cb0c08..f1d9a85 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java @@ -20,6 +20,7 @@ import group.rxcloud.capa.component.configstore.CapaConfigStore; import group.rxcloud.capa.component.configstore.CapaConfigStoreBuilder; import group.rxcloud.capa.component.configstore.StoreConfig; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import java.util.Collections; import java.util.List; @@ -43,6 +44,15 @@ public CapaConfigurationClientBuilder(StoreConfig storeConfig) { this(Collections.singletonList(new CapaConfigStoreBuilder(storeConfig))); } + /** + * Creates a constructor for {@link CapaConfigurationClient}. + */ + public CapaConfigurationClientBuilder(StoreConfig storeConfig, TelemetryHooks telemetryHooks) { + CapaConfigStoreBuilder capaConfigStoreBuilder = new CapaConfigStoreBuilder(storeConfig); + capaConfigStoreBuilder.withTelemetryHooks(telemetryHooks); + this.configStoreBuilders = Collections.singletonList(capaConfigStoreBuilder); + } + /** * Creates a constructor for {@link CapaConfigurationClient} with custom {@link CapaConfigStoreBuilder}. */ diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java index e3ef4f0..529d161 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java @@ -19,6 +19,8 @@ import group.rxcloud.capa.component.http.CapaHttpBuilder; import group.rxcloud.capa.infrastructure.CapaProperties; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import java.util.function.Supplier; @@ -44,6 +46,22 @@ public CapaRpcClientBuilder() { this(new CapaHttpBuilder()); } + /** + * Creates a constructor for {@link CapaRpcClient}. + */ + public CapaRpcClientBuilder(TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + this.apiProtocol = CapaApiProtocol.parseProtocol(CapaProperties.API_PROTOCOL.get()); + + CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder(); + if (telemetryHooks != null) { + capaHttpBuilder.withTelemetryHooks(telemetryHooks); + } + if (configurationHooks != null) { + capaHttpBuilder.withConfigurationHooks(configurationHooks); + } + this.httpBuilder = capaHttpBuilder; + } + /** * Creates a constructor for {@link CapaRpcClient} with custom {@link CapaHttpBuilder}. */ diff --git a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java index 5468c06..3378e75 100644 --- a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java +++ b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java @@ -22,6 +22,7 @@ import group.rxcloud.capa.component.configstore.StoreConfig; import group.rxcloud.capa.component.configstore.SubscribeReq; import group.rxcloud.capa.component.configstore.SubscribeResp; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -42,8 +43,8 @@ public class TestCapaConfigStore extends CapaConfigStore { * * @param objectSerializer Serializer for transient request/response objects. */ - public TestCapaConfigStore(CapaObjectSerializer objectSerializer) { - super(objectSerializer); + public TestCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + super(objectSerializer, telemetryHooks); } @Override diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java index 438e3c6..2a5ee52 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java @@ -19,6 +19,8 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; import group.rxcloud.capa.infrastructure.exceptions.CapaException; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; import group.rxcloud.capa.rpc.domain.InvokeMethodRequestBuilder; @@ -50,7 +52,7 @@ public class CapaRpcClientBuilderTest { public void setUp() { okHttpClient = new OkHttpClient.Builder().build(); defaultObjectSerializer = new DefaultObjectSerializer(); - capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer)); + capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer, null, null)); } @Test @@ -193,7 +195,7 @@ public void testClose_Success() { @Test public void testClose_FailWhenThrowException() { - capaRpcClientHttp = new CapaRpcClientHttp(new ExceptionCapaHttp(okHttpClient, defaultObjectSerializer)); + capaRpcClientHttp = new CapaRpcClientHttp(new ExceptionCapaHttp(okHttpClient, defaultObjectSerializer, null, null)); Assertions.assertThrows(CapaException.class, () -> { capaRpcClientHttp.close(); @@ -205,8 +207,9 @@ public void testClose_FailWhenThrowException() { */ private class ExceptionCapaHttp extends CapaHttp { - public ExceptionCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public ExceptionCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } @Override diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java index 823e31f..839eb7f 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java @@ -18,6 +18,8 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; +import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; +import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; @@ -32,8 +34,9 @@ */ public class TestCapaHttp extends CapaHttp { - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { - super(httpClient, objectSerializer); + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, + TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + super(httpClient, objectSerializer, telemetryHooks, configurationHooks); } @Override From a2c787b4de79c07263fd2c3300b2783b6f1ff637 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Mon, 29 Nov 2021 23:38:14 +0800 Subject: [PATCH 27/36] chore: fix checkstyle error --- .../group/rxcloud/capa/infrastructure/hook/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java index 56138f5..1aba000 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/package-info.java @@ -18,4 +18,4 @@ * Hooks design: * TODO */ -package group.rxcloud.capa.infrastructure.hook; \ No newline at end of file +package group.rxcloud.capa.infrastructure.hook; From b6f883b9002cac2160df0e9ebe52b0be6115a10d Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 08:28:47 +0800 Subject: [PATCH 28/36] refactor: use global hooks --- .../configstore/CapaConfigStore.java | 7 +---- .../configstore/CapaConfigStoreBuilder.java | 15 ++-------- .../rxcloud/capa/component/http/CapaHttp.java | 16 ++-------- .../capa/component/http/CapaHttpBuilder.java | 29 ++----------------- .../configstore/TestCapaConfigStore.java | 5 ++-- .../capa/component/http/CapaHttpTest.java | 4 +-- .../capa/component/http/TestCapaHttp.java | 7 ++--- .../capa/infrastructure/hook/Mixer.java | 24 +++++++++++++++ .../demo/configstore/DemoCapaConfigStore.java | 5 ++-- .../capa/spi/demo/http/DemoCapaHttp.java | 9 ++---- .../spi/configstore/CapaConfigStoreSpi.java | 4 +-- .../rxcloud/capa/spi/http/CapaHttpSpi.java | 7 ++--- .../capa/spi/http/CapaSerializeHttpSpi.java | 7 ++--- .../configstore/CapaConfigStoreSpiTest.java | 8 ++--- .../TestCapaConfigStoreSpiImpl.java | 5 ++-- .../spi/http/CapaSerializeHttpSpiTest.java | 17 +++++------ .../CapaConfigurationClientBuilder.java | 9 ------ .../capa/rpc/CapaRpcClientBuilder.java | 16 ---------- .../configuration/TestCapaConfigStore.java | 2 +- .../capa/rpc/CapaRpcClientBuilderTest.java | 2 +- .../group/rxcloud/capa/rpc/TestCapaHttp.java | 2 +- 21 files changed, 65 insertions(+), 135 deletions(-) create mode 100644 sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java index 89c59ac..c4dd186 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStore.java @@ -17,7 +17,6 @@ package group.rxcloud.capa.component.configstore; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -40,8 +39,6 @@ public abstract class CapaConfigStore implements AutoCloseable { */ protected final CapaObjectSerializer objectSerializer; - protected final TelemetryHooks telemetryHooks; - /** * The configuration store name. */ @@ -51,11 +48,9 @@ public abstract class CapaConfigStore implements AutoCloseable { * Instantiates a new Capa ConfigStore. * * @param objectSerializer Serializer for transient request/response objects. - * @param telemetryHooks optional telemetry hooks */ - public CapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { + public CapaConfigStore(CapaObjectSerializer objectSerializer) { this.objectSerializer = objectSerializer; - this.telemetryHooks = telemetryHooks; } /** diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java index d689abf..fe5baef 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java @@ -18,7 +18,6 @@ import group.rxcloud.capa.infrastructure.CapaClassLoader; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; @@ -32,8 +31,6 @@ public class CapaConfigStoreBuilder { */ private CapaObjectSerializer objectSerializer; - private TelemetryHooks telemetryHooks; - private final StoreConfig storeConfig; /** @@ -66,14 +63,6 @@ public CapaConfigStoreBuilder withObjectSerializer(CapaObjectSerializer objectSe return this; } - public CapaConfigStoreBuilder withTelemetryHooks(TelemetryHooks telemetryHooks) { - if (telemetryHooks == null) { - throw new IllegalArgumentException("TelemetryHooks is required"); - } - this.telemetryHooks = telemetryHooks; - return this; - } - /** * Build an instance of the client based on the provided setup. * @@ -96,7 +85,7 @@ private CapaConfigStore buildCapaConfigStore() { return CapaClassLoader.loadComponentClassObj( "configuration", CapaConfigStore.class, - new Class[]{CapaObjectSerializer.class, TelemetryHooks.class}, - new Object[]{this.objectSerializer, this.telemetryHooks}); + new Class[]{CapaObjectSerializer.class}, + new Object[]{this.objectSerializer}); } } diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java index 47e5278..65c7a72 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttp.java @@ -16,8 +16,6 @@ */ package group.rxcloud.capa.component.http; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.MediaType; @@ -70,24 +68,16 @@ public abstract class CapaHttp implements AutoCloseable { */ protected final CapaObjectSerializer objectSerializer; - protected final TelemetryHooks telemetryHooks; - protected final ConfigurationHooks configurationHooks; - /** * Instantiates a new Capa http. * - * @param httpClient RestClient used for all API calls in this new instance. - * @param objectSerializer Serializer for transient request/response objects. - * @param telemetryHooks optional - * @param configurationHooks optional + * @param httpClient RestClient used for all API calls in this new instance. + * @param objectSerializer Serializer for transient request/response objects. * @see CapaHttpBuilder */ - public CapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + public CapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { this.httpClient = httpClient; this.objectSerializer = objectSerializer; - this.telemetryHooks = telemetryHooks; - this.configurationHooks = configurationHooks; } /** diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java index 7a8ad27..087ceba 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/http/CapaHttpBuilder.java @@ -19,8 +19,6 @@ import group.rxcloud.capa.infrastructure.CapaClassLoader; import group.rxcloud.capa.infrastructure.CapaProperties; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; import okhttp3.OkHttpClient; @@ -48,9 +46,6 @@ public class CapaHttpBuilder { */ private CapaObjectSerializer objectSerializer; - private TelemetryHooks telemetryHooks; - private ConfigurationHooks configurationHooks; - /** * Creates a constructor for CapaHttp. *

@@ -80,22 +75,6 @@ public CapaHttpBuilder withObjectSerializer(CapaObjectSerializer objectSerialize return this; } - public CapaHttpBuilder withTelemetryHooks(TelemetryHooks telemetryHooks) { - if (telemetryHooks == null) { - throw new IllegalArgumentException("TelemetryHooks is required"); - } - this.telemetryHooks = telemetryHooks; - return this; - } - - public CapaHttpBuilder withConfigurationHooks(ConfigurationHooks configurationHooks) { - if (configurationHooks == null) { - throw new IllegalArgumentException("ConfigurationHooks is required"); - } - this.configurationHooks = configurationHooks; - return this; - } - /** * Build an instance of the Http client based on the provided setup. * @@ -130,12 +109,8 @@ private CapaHttp buildCapaHttp() { "rpc", CapaHttp.class, new Class[]{OkHttpClient.class, - CapaObjectSerializer.class, - TelemetryHooks.class, - ConfigurationHooks.class}, + CapaObjectSerializer.class}, new Object[]{OK_HTTP_CLIENT.get(), - this.objectSerializer, - this.telemetryHooks, - this.configurationHooks}); + this.objectSerializer}); } } diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java b/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java index e099d68..4c2b740 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/configstore/TestCapaConfigStore.java @@ -16,7 +16,6 @@ */ package group.rxcloud.capa.component.configstore; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -37,8 +36,8 @@ public class TestCapaConfigStore extends CapaConfigStore { * * @param objectSerializer Serializer for transient request/response objects. */ - public TestCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { - super(objectSerializer, telemetryHooks); + public TestCapaConfigStore(CapaObjectSerializer objectSerializer) { + super(objectSerializer); } @Override diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java index 1120726..bcc67ad 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/CapaHttpTest.java @@ -38,7 +38,7 @@ public void testInvokeApi_Success() { headers.put("Content-Type", "application/json"); OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer(), null, null); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); Mono> responseMono = capaHttp.invokeApi("post", null, null, @@ -56,7 +56,7 @@ public void testInvokeApi_Success() { @Test public void testClose_Success() throws Exception { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer(), null, null); + TestCapaHttp capaHttp = new TestCapaHttp(builder.build(), new DefaultObjectSerializer()); capaHttp.close(); } diff --git a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java index 7197cf7..fa69654 100644 --- a/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java +++ b/sdk-component/src/test/java/group/rxcloud/capa/component/http/TestCapaHttp.java @@ -16,8 +16,6 @@ */ package group.rxcloud.capa.component.http; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; @@ -32,9 +30,8 @@ */ public class TestCapaHttp extends CapaHttp { - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); } @Override diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java new file mode 100644 index 0000000..f889c2d --- /dev/null +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java @@ -0,0 +1,24 @@ +package group.rxcloud.capa.infrastructure.hook; + +public abstract class Mixer { + + private static ConfigurationHooks configurationHooks; + + private static TelemetryHooks telemetryHooks; + + public static void setConfigurationHooks(ConfigurationHooks configurationHooks) { + Mixer.configurationHooks = configurationHooks; + } + + public static void setTelemetryHooks(TelemetryHooks telemetryHooks) { + Mixer.telemetryHooks = telemetryHooks; + } + + public static ConfigurationHooks getConfigurationHooks() { + return configurationHooks; + } + + public static TelemetryHooks getTelemetryHooks() { + return telemetryHooks; + } +} diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java index 3f1dbb0..7b2dc7a 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/configstore/DemoCapaConfigStore.java @@ -19,7 +19,6 @@ import group.rxcloud.capa.component.configstore.ConfigurationItem; import group.rxcloud.capa.component.configstore.StoreConfig; import group.rxcloud.capa.component.configstore.SubscribeResp; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.spi.configstore.CapaConfigStoreSpi; import group.rxcloud.cloudruntimes.utils.TypeRef; @@ -42,8 +41,8 @@ public class DemoCapaConfigStore extends CapaConfigStoreSpi { * * @param objectSerializer Serializer for transient request/response objects. */ - public DemoCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { - super(objectSerializer, telemetryHooks); + public DemoCapaConfigStore(CapaObjectSerializer objectSerializer) { + super(objectSerializer); } @Override diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java index 7b29b6c..abba5ae 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java @@ -17,12 +17,10 @@ package group.rxcloud.capa.spi.demo.http; import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; -import group.rxcloud.capa.spi.http.config.RpcServiceOptions; import group.rxcloud.capa.spi.demo.http.config.DemoRpcServiceOptions; import group.rxcloud.capa.spi.http.CapaSerializeHttpSpi; +import group.rxcloud.capa.spi.http.config.RpcServiceOptions; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; import org.slf4j.Logger; @@ -44,9 +42,8 @@ public class DemoCapaHttp extends CapaSerializeHttpSpi { * @param httpClient the http client * @param objectSerializer the object serializer */ - public DemoCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + public DemoCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); } @Override diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java index 00db4d1..117f44d 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java @@ -44,8 +44,8 @@ public abstract class CapaConfigStoreSpi extends CapaConfigStore { * * @param objectSerializer Serializer for transient request/response objects. */ - public CapaConfigStoreSpi(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { - super(objectSerializer, telemetryHooks); + public CapaConfigStoreSpi(CapaObjectSerializer objectSerializer) { + super(objectSerializer); } @Override diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java index 786dbb2..f0d07c3 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java @@ -18,8 +18,6 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.spi.http.config.CapaSpiOptionsLoader; import group.rxcloud.capa.spi.http.config.CapaSpiProperties; @@ -43,9 +41,8 @@ public abstract class CapaHttpSpi extends CapaHttp { private static final Logger logger = LoggerFactory.getLogger(CapaHttpSpi.class); - public CapaHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + public CapaHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); } /** diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java index 1c8c31f..1a92894 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpi.java @@ -20,8 +20,6 @@ import group.rxcloud.capa.component.http.HttpResponse; import group.rxcloud.capa.infrastructure.exceptions.CapaErrorContext; import group.rxcloud.capa.infrastructure.exceptions.CapaException; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.domain.core.invocation.Metadata; import group.rxcloud.cloudruntimes.utils.TypeRef; @@ -57,9 +55,8 @@ public abstract class CapaSerializeHttpSpi extends CapaHttpSpi { * @param httpClient the http client * @param objectSerializer the object serializer */ - public CapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + public CapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); } /** diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java index bea6829..b747a87 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpiTest.java @@ -40,7 +40,7 @@ public class CapaConfigStoreSpiTest { @Test public void testGet_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); Mono>> listMono = configStoreSpiImpl.get(constructGetRequest(), TypeRef.STRING); List> configurationItems = listMono.block(); Assertions.assertNotNull(configurationItems); @@ -63,7 +63,7 @@ public void testGet_Success() { @Test public void testSubscribe_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); Flux> subscribeFlux = configStoreSpiImpl.subscribe(constructSubscribeReq(), TypeRef.STRING); SubscribeResp resp = subscribeFlux.blockFirst(); Assertions.assertNotNull(resp); @@ -88,14 +88,14 @@ public void testSubscribe_Success() { @Test public void testGetDefaultGroup_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); String defaultGroup = configStoreSpiImpl.getDefaultGroup(); Assertions.assertEquals("application", defaultGroup); } @Test public void testGetDefaultLabel_Success() { - TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer(), null); + TestCapaConfigStoreSpiImpl configStoreSpiImpl = new TestCapaConfigStoreSpiImpl(new DefaultObjectSerializer()); String defaultLabel = configStoreSpiImpl.getDefaultLabel(); Assertions.assertEquals("", defaultLabel); } diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java index 09d1648..a6ad800 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/configstore/TestCapaConfigStoreSpiImpl.java @@ -19,7 +19,6 @@ import group.rxcloud.capa.component.configstore.ConfigurationItem; import group.rxcloud.capa.component.configstore.StoreConfig; import group.rxcloud.capa.component.configstore.SubscribeResp; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Flux; @@ -41,8 +40,8 @@ public class TestCapaConfigStoreSpiImpl extends CapaConfigStoreSpi { * * @param objectSerializer Serializer for transient request/response objects. */ - public TestCapaConfigStoreSpiImpl(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { - super(objectSerializer, telemetryHooks); + public TestCapaConfigStoreSpiImpl(CapaObjectSerializer objectSerializer) { + super(objectSerializer); } @Override diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java index ef4c4c3..59846f4 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java @@ -19,8 +19,6 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; import group.rxcloud.capa.infrastructure.exceptions.CapaException; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.DefaultObjectSerializer; import group.rxcloud.capa.infrastructure.serializer.ObjectSerializer; @@ -59,7 +57,7 @@ public class CapaSerializeHttpSpiTest { public void setUp() { okHttpClient = new OkHttpClient.Builder().build(); defaultObjectSerializer = new DefaultObjectSerializer(); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer, null, null); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, defaultObjectSerializer); } @Test @@ -72,12 +70,12 @@ public void testGetRequestWithSerialize_Success() throws IOException { @Test public void testGetRequestWithSerialize_FailWhenThrowException() { - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer(), null, null); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getRequestWithSerialize("Object"); }); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer(),null,null); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getRequestWithSerialize("Object"); }); @@ -144,12 +142,12 @@ public void testGetResponseBodyWithDeserialize_Success() { @Test public void testGetResponseBodyWithDeserialize_FailWhenThrowException() { HttpResponse httpResponse = new HttpResponse<>(null, null, 200); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer(), null, null); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestIOExceptionObjectSerializer()); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); }); - capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer(), null, null); + capaSerializeHttpSpi = new TestCapaSerializeHttpSpi(okHttpClient, new TestRuntimeExceptionObjectSerializer()); Assertions.assertThrows(CapaException.class, () -> { capaSerializeHttpSpi.getResponseBodyWithDeserialize(TypeRef.STRING, httpResponse); }); @@ -289,9 +287,8 @@ public String getContentType() { */ private class TestCapaSerializeHttpSpi extends CapaSerializeHttpSpi { - public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { + super(httpClient, objectSerializer); } @Override diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java index f1d9a85..2294651 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java @@ -44,15 +44,6 @@ public CapaConfigurationClientBuilder(StoreConfig storeConfig) { this(Collections.singletonList(new CapaConfigStoreBuilder(storeConfig))); } - /** - * Creates a constructor for {@link CapaConfigurationClient}. - */ - public CapaConfigurationClientBuilder(StoreConfig storeConfig, TelemetryHooks telemetryHooks) { - CapaConfigStoreBuilder capaConfigStoreBuilder = new CapaConfigStoreBuilder(storeConfig); - capaConfigStoreBuilder.withTelemetryHooks(telemetryHooks); - this.configStoreBuilders = Collections.singletonList(capaConfigStoreBuilder); - } - /** * Creates a constructor for {@link CapaConfigurationClient} with custom {@link CapaConfigStoreBuilder}. */ diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java index 529d161..4e728f2 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java @@ -46,22 +46,6 @@ public CapaRpcClientBuilder() { this(new CapaHttpBuilder()); } - /** - * Creates a constructor for {@link CapaRpcClient}. - */ - public CapaRpcClientBuilder(TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - this.apiProtocol = CapaApiProtocol.parseProtocol(CapaProperties.API_PROTOCOL.get()); - - CapaHttpBuilder capaHttpBuilder = new CapaHttpBuilder(); - if (telemetryHooks != null) { - capaHttpBuilder.withTelemetryHooks(telemetryHooks); - } - if (configurationHooks != null) { - capaHttpBuilder.withConfigurationHooks(configurationHooks); - } - this.httpBuilder = capaHttpBuilder; - } - /** * Creates a constructor for {@link CapaRpcClient} with custom {@link CapaHttpBuilder}. */ diff --git a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java index 3378e75..c9b0374 100644 --- a/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java +++ b/sdk/src/test/java/group/rxcloud/capa/configuration/TestCapaConfigStore.java @@ -44,7 +44,7 @@ public class TestCapaConfigStore extends CapaConfigStore { * @param objectSerializer Serializer for transient request/response objects. */ public TestCapaConfigStore(CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks) { - super(objectSerializer, telemetryHooks); + super(objectSerializer); } @Override diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java index 2a5ee52..5492e7f 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java @@ -209,7 +209,7 @@ private class ExceptionCapaHttp extends CapaHttp { public ExceptionCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + super(httpClient, objectSerializer); } @Override diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java index 839eb7f..cc69b80 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java @@ -36,7 +36,7 @@ public class TestCapaHttp extends CapaHttp { public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { - super(httpClient, objectSerializer, telemetryHooks, configurationHooks); + super(httpClient, objectSerializer); } @Override From 2680d998e42e92a539441370839621b35042bcc9 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 08:33:01 +0800 Subject: [PATCH 29/36] docs: add mixer doc --- .../capa/infrastructure/hook/Mixer.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java index f889c2d..a492df4 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java @@ -1,23 +1,61 @@ +/* + * 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.infrastructure.hook; +/** + * The Inner Runtimes Mixer. + */ public abstract class Mixer { private static ConfigurationHooks configurationHooks; - private static TelemetryHooks telemetryHooks; - public static void setConfigurationHooks(ConfigurationHooks configurationHooks) { + /** + * Register configuration hooks. + * + * @param configurationHooks the configuration hooks + */ + public static void registerConfigurationHooks(ConfigurationHooks configurationHooks) { Mixer.configurationHooks = configurationHooks; } - public static void setTelemetryHooks(TelemetryHooks telemetryHooks) { + /** + * Register telemetry hooks. + * + * @param telemetryHooks the telemetry hooks + */ + public static void registerTelemetryHooks(TelemetryHooks telemetryHooks) { Mixer.telemetryHooks = telemetryHooks; } + /** + * Gets configuration hooks. + * + * @return the configuration hooks + */ public static ConfigurationHooks getConfigurationHooks() { return configurationHooks; } + /** + * Gets telemetry hooks. + * + * @return the telemetry hooks + */ public static TelemetryHooks getTelemetryHooks() { return telemetryHooks; } From 122e1aab07388d6c56febb3b249bd14d10c8fc9c Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 08:45:38 +0800 Subject: [PATCH 30/36] docs: add mixer doc --- .../capa/infrastructure/hook/Mixer.java | 42 ++++++++++++++++++- .../capa-infrastructure-mixer.properties | 1 + .../CapaConfigurationClientBuilder.java | 1 - .../capa/rpc/CapaRpcClientBuilder.java | 2 - 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 sdk-infrastructure/src/main/resources/sample/capa-infrastructure-mixer.properties diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java index a492df4..77350e4 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java @@ -16,20 +16,58 @@ */ package group.rxcloud.capa.infrastructure.hook; +import group.rxcloud.capa.infrastructure.CapaClassLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * The Inner Runtimes Mixer. */ public abstract class Mixer { + private static final Logger logger = LoggerFactory.getLogger(Mixer.class); + private static ConfigurationHooks configurationHooks; private static TelemetryHooks telemetryHooks; + static { + try { + MixerProvider mixerProvider = CapaClassLoader.loadInfrastructureClassObj("mixer", MixerProvider.class); + if (mixerProvider != null) { + registerConfigurationHooks(mixerProvider.provideConfigurationHooks()); + registerTelemetryHooks(mixerProvider.provideTelemetryHooks()); + } + } catch (Exception e) { + logger.info("[CapaMixer] load empty mixer. expected error: ", e); + } + } + + /** + * The SPI Mixer provider. + */ + interface MixerProvider { + + /** + * Provide global configuration hooks. + * + * @return the configuration hooks + */ + ConfigurationHooks provideConfigurationHooks(); + + /** + * Provide global telemetry hooks. + * + * @return the telemetry hooks + */ + TelemetryHooks provideTelemetryHooks(); + } + /** * Register configuration hooks. * * @param configurationHooks the configuration hooks */ - public static void registerConfigurationHooks(ConfigurationHooks configurationHooks) { + private static void registerConfigurationHooks(ConfigurationHooks configurationHooks) { Mixer.configurationHooks = configurationHooks; } @@ -38,7 +76,7 @@ public static void registerConfigurationHooks(ConfigurationHooks configurationHo * * @param telemetryHooks the telemetry hooks */ - public static void registerTelemetryHooks(TelemetryHooks telemetryHooks) { + private static void registerTelemetryHooks(TelemetryHooks telemetryHooks) { Mixer.telemetryHooks = telemetryHooks; } diff --git a/sdk-infrastructure/src/main/resources/sample/capa-infrastructure-mixer.properties b/sdk-infrastructure/src/main/resources/sample/capa-infrastructure-mixer.properties new file mode 100644 index 0000000..105ef32 --- /dev/null +++ b/sdk-infrastructure/src/main/resources/sample/capa-infrastructure-mixer.properties @@ -0,0 +1 @@ +# optional \ No newline at end of file diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java index 2294651..3cb0c08 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientBuilder.java @@ -20,7 +20,6 @@ import group.rxcloud.capa.component.configstore.CapaConfigStore; import group.rxcloud.capa.component.configstore.CapaConfigStoreBuilder; import group.rxcloud.capa.component.configstore.StoreConfig; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import java.util.Collections; import java.util.List; diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java index 4e728f2..e3ef4f0 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientBuilder.java @@ -19,8 +19,6 @@ import group.rxcloud.capa.component.http.CapaHttpBuilder; import group.rxcloud.capa.infrastructure.CapaProperties; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import java.util.function.Supplier; From f0c059ca1cfb15b8121480a72ebc859f43a27262 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 08:47:15 +0800 Subject: [PATCH 31/36] chore: fix checkstyle error --- .../group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java index 117f44d..09901ae 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/configstore/CapaConfigStoreSpi.java @@ -21,7 +21,6 @@ import group.rxcloud.capa.component.configstore.GetRequest; import group.rxcloud.capa.component.configstore.SubscribeReq; import group.rxcloud.capa.component.configstore.SubscribeResp; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import org.slf4j.Logger; From f1b8b40fbb8cc948400423d1a36406700dade629 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 08:55:23 +0800 Subject: [PATCH 32/36] feat: mixer nullable --- .../capa/infrastructure/hook/Mixer.java | 27 +++++++++++++++++-- .../capa/rpc/CapaRpcClientBuilderTest.java | 2 +- .../group/rxcloud/capa/rpc/TestCapaHttp.java | 5 +--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java index 77350e4..bc1b4f0 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java @@ -20,6 +20,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; +import java.util.Optional; + /** * The Inner Runtimes Mixer. */ @@ -85,16 +88,36 @@ private static void registerTelemetryHooks(TelemetryHooks telemetryHooks) { * * @return the configuration hooks */ - public static ConfigurationHooks getConfigurationHooks() { + @Nullable + public static ConfigurationHooks configurationHooks() { return configurationHooks; } + /** + * Gets configuration hooks. + * + * @return the configuration hooks + */ + public static Optional configurationHooksNullable() { + return Optional.ofNullable(configurationHooks); + } + /** * Gets telemetry hooks. * * @return the telemetry hooks */ - public static TelemetryHooks getTelemetryHooks() { + @Nullable + public static TelemetryHooks telemetryHooks() { return telemetryHooks; } + + /** + * Gets telemetry hooks. + * + * @return the telemetry hooks + */ + public static Optional telemetryHooksNullable() { + return Optional.ofNullable(telemetryHooks); + } } diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java index 5492e7f..178176d 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/CapaRpcClientBuilderTest.java @@ -52,7 +52,7 @@ public class CapaRpcClientBuilderTest { public void setUp() { okHttpClient = new OkHttpClient.Builder().build(); defaultObjectSerializer = new DefaultObjectSerializer(); - capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer, null, null)); + capaRpcClientHttp = new CapaRpcClientHttp(new TestCapaHttp(okHttpClient, defaultObjectSerializer)); } @Test diff --git a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java index cc69b80..823e31f 100644 --- a/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java +++ b/sdk/src/test/java/group/rxcloud/capa/rpc/TestCapaHttp.java @@ -18,8 +18,6 @@ import group.rxcloud.capa.component.http.CapaHttp; import group.rxcloud.capa.component.http.HttpResponse; -import group.rxcloud.capa.infrastructure.hook.ConfigurationHooks; -import group.rxcloud.capa.infrastructure.hook.TelemetryHooks; import group.rxcloud.capa.infrastructure.serializer.CapaObjectSerializer; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; @@ -34,8 +32,7 @@ */ public class TestCapaHttp extends CapaHttp { - public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer, - TelemetryHooks telemetryHooks, ConfigurationHooks configurationHooks) { + public TestCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { super(httpClient, objectSerializer); } From 5956e4f3d76d5931a3270ff054eb2c820fb4d822 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 09:02:57 +0800 Subject: [PATCH 33/36] release: release 1.0.7-beta-3 version --- README.md | 4 ++-- README_ZH.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 2 +- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 778c8bc..70e845a 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-2 + 1.0.7-beta-3 ... @@ -140,7 +140,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-2 + 1.0.7-beta-3 ... diff --git a/README_ZH.md b/README_ZH.md index 3c2ab60..2a75165 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -118,7 +118,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-2 + 1.0.7-beta-3 ... @@ -138,7 +138,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-2 + 1.0.7-beta-3 ... diff --git a/examples/pom.xml b/examples/pom.xml index c006cb5..700fa86 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-2 + 1.0.7-beta-3 capa-examples diff --git a/pom.xml b/pom.xml index c45dd65..d71b05f 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk-parent SDK for Capa. https://github.com/reactivegroup diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 714aee9..894c59f 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index d4f811f..d06c334 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk-infrastructure diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 71b1266..862a271 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index 9c81d69..726446c 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index d5ebda5..55ec71a 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-2 + 1.0.7-beta-3 sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index bf282e2..5a91e58 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-2 + 1.0.7-beta-3 capa-sdk From 30406b686754e5865b07ba327284adf963cd3f19 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 15:32:00 +0800 Subject: [PATCH 34/36] feat: add mixer current config --- .../group/rxcloud/capa/infrastructure/CapaProperties.java | 2 +- .../rxcloud/capa/infrastructure/hook/ConfigurationHooks.java | 4 ++++ .../java/group/rxcloud/capa/infrastructure/hook/Mixer.java | 2 +- .../rxcloud/capa/configuration/CapaConfigurationClient.java | 1 - 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java index f44e787..c47bdc0 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/CapaProperties.java @@ -94,7 +94,7 @@ public abstract class CapaProperties { }); private static Properties loadCapaProperties(final String fileName) { - Objects.requireNonNull(fileName, "fileName not found.3444444444444444444"); + Objects.requireNonNull(fileName, "fileName not found."); try (InputStream in = CapaProperties.class.getResourceAsStream(fileName)) { InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); Properties properties = new Properties(); diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java index 871f886..90346e1 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java @@ -30,6 +30,10 @@ public interface ConfigurationHooks extends ConfigurationRuntimes { + String currentStoreName(); + + String currentAppId(); + @Override default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, TypeRef type) { throw new UnsupportedOperationException("If you want to use this operate, please impl this."); diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java index bc1b4f0..3a28b05 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/Mixer.java @@ -48,7 +48,7 @@ public abstract class Mixer { /** * The SPI Mixer provider. */ - interface MixerProvider { + public interface MixerProvider { /** * Provide global configuration hooks. diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClient.java b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClient.java index edd780f..aa213e1 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClient.java @@ -63,7 +63,6 @@ public interface CapaConfigurationClient extends DefaultCloudRuntimesClient { @Override Mono deleteConfiguration(ConfigurationRequestItem configurationRequestItem); - @Override default Mono shutdown() { return Mono.empty(); From fc6a2a1f75740341518c92e0db488887b6222e17 Mon Sep 17 00:00:00 2001 From: Kevin_T <596823919@qq.com> Date: Tue, 30 Nov 2021 18:56:38 +0800 Subject: [PATCH 35/36] feat: add multi component support --- .../configstore/CapaConfigStoreBuilder.java | 1 + .../component/pubsub/CapaPubSubBuilder.java | 1 + .../hook/ConfigurationHooks.java | 10 ++-- .../infrastructure/hook/TelemetryHooks.java | 3 ++ .../capa/spi/demo/http/DemoCapaHttp.java | 16 ++++--- .../rxcloud/capa/spi/http/CapaHttpSpi.java | 48 ++++++++----------- .../spi/telemetry/CapaReadWriteSpanSpi.java | 2 - .../spi/telemetry/CapaSpanBuilderSpi.java | 1 - .../spi/telemetry/CapaTracerBuilderSpi.java | 1 - .../capa/spi/telemetry/CapaTracerSpi.java | 1 - .../spi/http/CapaSerializeHttpSpiTest.java | 15 +++--- .../AbstractCapaConfigurationClient.java | 2 + .../CapaConfigurationClientStore.java | 3 ++ .../capa/pubsub/AbstractCapaPubSubClient.java | 3 ++ .../capa/pubsub/CapaPubSubClientPubSub.java | 4 ++ .../capa/rpc/AbstractCapaRpcClient.java | 3 ++ .../rxcloud/capa/rpc/CapaRpcClientHttp.java | 4 ++ .../telemetry/CapaTelemetryClientGlobal.java | 17 +++++-- 18 files changed, 83 insertions(+), 52 deletions(-) diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java index fe5baef..c12e3c8 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/configstore/CapaConfigStoreBuilder.java @@ -81,6 +81,7 @@ public CapaConfigStore build() { * @return Instance of {@link CapaConfigStore} implementor */ private CapaConfigStore buildCapaConfigStore() { + // TODO: 2021/11/30 build multi component // load spi capa config store impl return CapaClassLoader.loadComponentClassObj( "configuration", diff --git a/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSubBuilder.java b/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSubBuilder.java index 4f4e8cf..3ed6f04 100644 --- a/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSubBuilder.java +++ b/sdk-component/src/main/java/group/rxcloud/capa/component/pubsub/CapaPubSubBuilder.java @@ -52,6 +52,7 @@ public CapaPubSub build() { * @return Instance of {@link CapaPubSub} implementor */ private CapaPubSub buildCapaPubSub() { + // TODO: 2021/11/30 build multi component return CapaClassLoader.loadComponentClassObj("pubsub", CapaPubSub.class); } } diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java index 90346e1..f469c00 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java @@ -28,11 +28,15 @@ import java.util.List; import java.util.Map; +/** + * The Mixer configuration hooks. + */ public interface ConfigurationHooks extends ConfigurationRuntimes { - String currentStoreName(); - - String currentAppId(); + /** + * Registry Store Names. + */ + List registryStoreNames(); @Override default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, TypeRef type) { diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java index c117e16..b48fbf9 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/TelemetryHooks.java @@ -22,6 +22,9 @@ import io.opentelemetry.context.propagation.ContextPropagators; import reactor.core.publisher.Mono; +/** + * The Mixer telemetry hooks. + */ public interface TelemetryHooks extends TelemetryRuntimes { @Override diff --git a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java index abba5ae..0f93d72 100644 --- a/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java +++ b/sdk-spi-demo/src/main/java/group/rxcloud/capa/spi/demo/http/DemoCapaHttp.java @@ -26,6 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -47,12 +48,15 @@ public DemoCapaHttp(OkHttpClient httpClient, CapaObjectSerializer objectSerializ } @Override - protected CompletableFuture> invokeSpiApi(String appId, - String method, - Object requestData, - Map headers, - TypeRef type, - RpcServiceOptions rpcServiceOptions) { + protected CompletableFuture> invokeSpiApi( + String appId, + String method, + Object requestData, + String httpMethod, + Map headers, + Map> urlParameters, + TypeRef type, + RpcServiceOptions rpcServiceOptions) { DemoRpcServiceOptions demoRpcServiceOptions = (DemoRpcServiceOptions) rpcServiceOptions; logger.info("[DemoCapaHttp.invokeSpiApi] rpcServiceOptions[{}]", demoRpcServiceOptions); diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java index f0d07c3..711b514 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/http/CapaHttpSpi.java @@ -22,7 +22,6 @@ import group.rxcloud.capa.spi.http.config.CapaSpiOptionsLoader; import group.rxcloud.capa.spi.http.config.CapaSpiProperties; import group.rxcloud.capa.spi.http.config.RpcServiceOptions; -import group.rxcloud.cloudruntimes.domain.core.invocation.HttpExtension; import group.rxcloud.cloudruntimes.utils.TypeRef; import okhttp3.OkHttpClient; import org.slf4j.Logger; @@ -41,15 +40,18 @@ public abstract class CapaHttpSpi extends CapaHttp { private static final Logger logger = LoggerFactory.getLogger(CapaHttpSpi.class); + /** + * Instantiates a new Capa http spi. + * + * @param httpClient the http client + * @param objectSerializer the object serializer + */ public CapaHttpSpi(OkHttpClient httpClient, CapaObjectSerializer objectSerializer) { super(httpClient, objectSerializer); } /** * Templates, delegate to specific http invoker. - * - * @param httpMethod Ignore, fix to POST. FIXME - * @param urlParameters Ignore, fix to EMPTY. FIXME */ @Override protected CompletableFuture> doInvokeApi(String httpMethod, @@ -73,22 +75,6 @@ protected CompletableFuture> doInvokeApi(String httpMethod, logger.debug("[CapaHttpSpi] invoke rpc context[{}]", context); } } - // FIXME Ignore, fix to POST. - if (!HttpExtension.POST.getMethod().toString().equalsIgnoreCase(httpMethod)) { - if (logger.isWarnEnabled()) { - logger.warn("[CapaHttpSpi] invoke rpc httpMethod[{}] only support POST now.", - httpMethod); - } - httpMethod = HttpExtension.POST.getMethod().toString(); - } - // FIXME Ignore, fix to EMPTY. - if (urlParameters != null && !urlParameters.isEmpty()) { - if (logger.isWarnEnabled()) { - logger.warn("[CapaHttpSpi] invoke rpc urlParameters[{}] not supported now.", - urlParameters); - } - urlParameters = null; - } // parse url path segments Objects.requireNonNull(pathSegments, "pathSegments"); @@ -112,7 +98,7 @@ protected CompletableFuture> doInvokeApi(String httpMethod, // spi invoke CompletableFuture> invokeSpiApi = - invokeSpiApi(appId, method, requestData, headers, type, rpcServiceOptions); + invokeSpiApi(appId, method, requestData, httpMethod, headers, urlParameters, type, rpcServiceOptions); invokeSpiApi.whenComplete((tHttpResponse, throwable) -> { if (throwable != null) { if (logger.isWarnEnabled()) { @@ -141,6 +127,9 @@ protected CompletableFuture> doInvokeApi(String httpMethod, /** * Override to get the configuration of the corresponding appId. + * + * @param appId the app id + * @return the rpc service options */ protected RpcServiceOptions getRpcServiceOptions(String appId) { CapaSpiOptionsLoader capaSpiOptionsLoader = CapaSpiProperties.getSpiOptionsLoader(); @@ -154,15 +143,20 @@ protected RpcServiceOptions getRpcServiceOptions(String appId) { * @param appId the app id * @param method the invoke method * @param requestData the request data + * @param httpMethod the http method * @param headers the headers + * @param urlParameters the url parameters * @param type the response type * @param rpcServiceOptions the rpc service options * @return the async completable future */ - protected abstract CompletableFuture> invokeSpiApi(String appId, - String method, - Object requestData, - Map headers, - TypeRef type, - RpcServiceOptions rpcServiceOptions); + protected abstract CompletableFuture> invokeSpiApi( + String appId, + String method, + Object requestData, + String httpMethod, + Map headers, + Map> urlParameters, + TypeRef type, + RpcServiceOptions rpcServiceOptions); } diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java index bc7fc7f..a317306 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaReadWriteSpanSpi.java @@ -24,10 +24,8 @@ */ public abstract class CapaReadWriteSpanSpi extends CapaReadWriteSpan { - public CapaReadWriteSpanSpi(String tracerName, String version, String schemaUrl, ReadWriteSpan span) { super(tracerName, version, schemaUrl, span); } - } diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java index 1f1d830..f9c3686 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaSpanBuilderSpi.java @@ -28,5 +28,4 @@ public CapaSpanBuilderSpi(String tracerName, String version, String schemaUrl, S SpanBuilder spanBuilder) { super(tracerName, version, schemaUrl, spanName, spanBuilder); } - } diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java index 2ae161c..3599480 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerBuilderSpi.java @@ -27,5 +27,4 @@ public abstract class CapaTracerBuilderSpi extends CapaTracerBuilder { public CapaTracerBuilderSpi(String tracerName, TracerBuilder builder) { super(tracerName, builder); } - } diff --git a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java index ff04b72..53239a5 100644 --- a/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java +++ b/sdk-spi/src/main/java/group/rxcloud/capa/spi/telemetry/CapaTracerSpi.java @@ -27,5 +27,4 @@ public abstract class CapaTracerSpi extends CapaTracer { public CapaTracerSpi(String tracerName, String version, String schemaUrl, Tracer tracer) { super(tracerName, version, schemaUrl, tracer); } - } diff --git a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java index 59846f4..b8dafe3 100644 --- a/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java +++ b/sdk-spi/src/test/java/group/rxcloud/capa/spi/http/CapaSerializeHttpSpiTest.java @@ -292,12 +292,15 @@ public TestCapaSerializeHttpSpi(OkHttpClient httpClient, CapaObjectSerializer ob } @Override - protected CompletableFuture> invokeSpiApi(String appId, - String method, - Object requestData, - Map headers, - TypeRef type, - RpcServiceOptions rpcServiceOptions) { + protected CompletableFuture> invokeSpiApi( + String appId, + String method, + Object requestData, + String httpMethod, + Map headers, + Map> urlParameters, + TypeRef type, + RpcServiceOptions rpcServiceOptions) { return CompletableFuture.supplyAsync( () -> { return new HttpResponse<>(null, null, 200); diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java b/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java index b43d6d5..d3fc2c2 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java @@ -34,6 +34,8 @@ */ public abstract class AbstractCapaConfigurationClient implements CapaConfigurationClient { + protected List registryNames; + @Override public Mono saveConfiguration(SaveConfigurationRequest saveConfigurationRequest) { return Mono.error(new UnsupportedOperationException("unsupported save configuration")); diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientStore.java b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientStore.java index 67454d9..2a143e4 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientStore.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/CapaConfigurationClientStore.java @@ -28,6 +28,7 @@ import reactor.core.publisher.Mono; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -50,11 +51,13 @@ public class CapaConfigurationClientStore extends AbstractCapaConfigurationClien public CapaConfigurationClientStore(List stores) { if (stores == null || stores.isEmpty()) { this.configStores = new HashMap<>(2, 1); + this.registryNames = Collections.emptyList(); } else { this.configStores = stores.stream() .collect(Collectors.toMap( CapaConfigStore::getStoreName, Function.identity())); + this.registryNames = new ArrayList<>(this.configStores.keySet()); } } diff --git a/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java b/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java index d91d0bd..08b1bee 100644 --- a/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java @@ -19,6 +19,7 @@ import group.rxcloud.cloudruntimes.domain.core.pubsub.PublishEventRequest; import reactor.core.publisher.Mono; +import java.util.List; import java.util.Map; /** @@ -28,6 +29,8 @@ */ public abstract class AbstractCapaPubSubClient implements CapaPubSubClient { + protected List registryNames; + @Override public Mono publishEvent(String pubsubName, String topicName, Object data) { PublishEventRequest publishEventRequest = new PublishEventRequest(pubsubName, topicName, data); diff --git a/sdk/src/main/java/group/rxcloud/capa/pubsub/CapaPubSubClientPubSub.java b/sdk/src/main/java/group/rxcloud/capa/pubsub/CapaPubSubClientPubSub.java index f7d089f..2816c5b 100644 --- a/sdk/src/main/java/group/rxcloud/capa/pubsub/CapaPubSubClientPubSub.java +++ b/sdk/src/main/java/group/rxcloud/capa/pubsub/CapaPubSubClientPubSub.java @@ -22,6 +22,8 @@ import group.rxcloud.cloudruntimes.domain.core.pubsub.PublishEventRequest; import reactor.core.publisher.Mono; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,11 +46,13 @@ public class CapaPubSubClientPubSub extends AbstractCapaPubSubClient { public CapaPubSubClientPubSub(List pubSubs) { if (pubSubs == null || pubSubs.isEmpty()) { this.pubSubs = new HashMap<>(2, 1); + this.registryNames = Collections.emptyList(); } else { this.pubSubs = pubSubs.stream() .collect(Collectors.toMap( CapaPubSub::getPubSubName, Function.identity())); + this.registryNames = new ArrayList<>(this.pubSubs.keySet()); } } diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java b/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java index 38bbd27..145a59e 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java @@ -22,6 +22,7 @@ import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Mono; +import java.util.List; import java.util.Map; /** @@ -31,6 +32,8 @@ */ public abstract class AbstractCapaRpcClient implements CapaRpcClient { + protected List registryNames; + @Override public Mono invokeMethod(String appId, String methodName, Object request, HttpExtension httpExtension, Map metadata, TypeRef type) { InvokeMethodRequestBuilder builder = new InvokeMethodRequestBuilder(appId, methodName); diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientHttp.java b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientHttp.java index 6c7ebe8..6e7ea9c 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientHttp.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/CapaRpcClientHttp.java @@ -23,6 +23,7 @@ import group.rxcloud.cloudruntimes.utils.TypeRef; import reactor.core.publisher.Mono; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,6 +42,9 @@ public class CapaRpcClientHttp extends AbstractCapaRpcClient { public CapaRpcClientHttp(CapaHttp client) { this.client = client; + + this.registryNames = new ArrayList<>(1); + this.registryNames.add("http"); } @Override diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java index ab33e92..5b38f39 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java @@ -25,6 +25,9 @@ import io.opentelemetry.context.propagation.ContextPropagators; import reactor.core.publisher.Mono; +import java.util.ArrayList; +import java.util.List; + public class CapaTelemetryClientGlobal implements CapaTelemetryClient, OpenTelemetry { // noop as default. @@ -52,7 +55,11 @@ static void set(CapaTelemetryClientGlobal capaTelemetryClient) { instance = capaTelemetryClient; } - CapaTelemetryClientGlobal() { + protected List registryNames; + + CapaTelemetryClientGlobal() { + this.registryNames = new ArrayList<>(1); + this.registryNames.add("opentelemetry"); } @Override @@ -106,7 +113,7 @@ public Mono buildTracer(String tracerName, String version) { public Mono buildTracer(String tracerName, String version, String schemaUrl) { return Mono.fromSupplier(() -> { return tracerProvider.tracerBuilder(tracerName).setInstrumentationVersion(version).setSchemaUrl(schemaUrl) - .build(); + .build(); }); } @@ -114,7 +121,7 @@ public Mono buildTracer(String tracerName, String version, String schema public Mono buildMeter(String meterName) { return Mono.fromSupplier(() -> { return meterProvider.meterBuilder(meterName) - .build(); + .build(); }); } @@ -122,7 +129,7 @@ public Mono buildMeter(String meterName) { public Mono buildMeter(String meterName, String version) { return Mono.fromSupplier(() -> { return meterProvider.meterBuilder(meterName).setInstrumentationVersion(version) - .build(); + .build(); }); } @@ -130,7 +137,7 @@ public Mono buildMeter(String meterName, String version) { public Mono buildMeter(String meterName, String version, String schemaUrl) { return Mono.fromSupplier(() -> { return meterProvider.meterBuilder(meterName).setInstrumentationVersion(version).setSchemaUrl(schemaUrl) - .build(); + .build(); }); } From 623b3f648f5cef92b749a4dc55a4cb657092ce99 Mon Sep 17 00:00:00 2001 From: kevinten10 <596823919@qq.com> Date: Tue, 30 Nov 2021 21:19:19 +0800 Subject: [PATCH 36/36] release: release 1.0.7.RELEASE version --- README.md | 4 ++-- README_ZH.md | 4 ++-- examples/pom.xml | 2 +- pom.xml | 4 ++-- sdk-component/pom.xml | 2 +- sdk-infrastructure/pom.xml | 2 +- .../rxcloud/capa/infrastructure/hook/ConfigurationHooks.java | 5 +++++ sdk-spi-demo/pom.xml | 2 +- sdk-spi/pom.xml | 2 +- sdk-springboot/pom.xml | 2 +- sdk/pom.xml | 2 +- .../capa/configuration/AbstractCapaConfigurationClient.java | 5 +++++ .../group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java | 5 +++++ .../java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java | 5 +++++ .../rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java | 5 +++++ 15 files changed, 38 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 70e845a..7bc5757 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-3 + 1.0.7.RELEASE ... @@ -140,7 +140,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-3 + 1.0.7.RELEASE ... diff --git a/README_ZH.md b/README_ZH.md index 2a75165..a13a2ae 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -118,7 +118,7 @@ For a Maven project, add the following to your pom.xml file: group.rxcloud capa-sdk - 1.0.7-beta-3 + 1.0.7.RELEASE ... @@ -138,7 +138,7 @@ Sample implementation library: group.rxcloud capa-sdk-spi-demo - 1.0.7-beta-3 + 1.0.7.RELEASE ... diff --git a/examples/pom.xml b/examples/pom.xml index 700fa86..739a0b7 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-3 + 1.0.7.RELEASE capa-examples diff --git a/pom.xml b/pom.xml index d71b05f..8928e20 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent pom - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk-parent SDK for Capa. https://github.com/reactivegroup @@ -73,7 +73,7 @@ 8 UTF-8 3.8.1 - 1.0.8.RELEASE + 1.0.9.RELEASE 3.3.22.RELEASE 1.7.21 1.9.0 diff --git a/sdk-component/pom.xml b/sdk-component/pom.xml index 894c59f..22941a3 100644 --- a/sdk-component/pom.xml +++ b/sdk-component/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk-component diff --git a/sdk-infrastructure/pom.xml b/sdk-infrastructure/pom.xml index d06c334..17a1891 100644 --- a/sdk-infrastructure/pom.xml +++ b/sdk-infrastructure/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk-infrastructure diff --git a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java index f469c00..8845bba 100644 --- a/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java +++ b/sdk-infrastructure/src/main/java/group/rxcloud/capa/infrastructure/hook/ConfigurationHooks.java @@ -38,6 +38,11 @@ public interface ConfigurationHooks extends ConfigurationRuntimes { */ List registryStoreNames(); + /** + * Default configuration appI. + */ + String defaultConfigurationAppId(); + @Override default Mono>> getConfiguration(String storeName, String appId, List keys, Map metadata, TypeRef type) { throw new UnsupportedOperationException("If you want to use this operate, please impl this."); diff --git a/sdk-spi-demo/pom.xml b/sdk-spi-demo/pom.xml index 862a271..4256367 100644 --- a/sdk-spi-demo/pom.xml +++ b/sdk-spi-demo/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk-spi-demo diff --git a/sdk-spi/pom.xml b/sdk-spi/pom.xml index 726446c..dc3077f 100644 --- a/sdk-spi/pom.xml +++ b/sdk-spi/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk-spi diff --git a/sdk-springboot/pom.xml b/sdk-springboot/pom.xml index 55ec71a..8febac5 100644 --- a/sdk-springboot/pom.xml +++ b/sdk-springboot/pom.xml @@ -23,7 +23,7 @@ capa-parent group.rxcloud - 1.0.7-beta-3 + 1.0.7.RELEASE sdk-springboot diff --git a/sdk/pom.xml b/sdk/pom.xml index 5a91e58..b1e9a06 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -23,7 +23,7 @@ group.rxcloud capa-parent - 1.0.7-beta-3 + 1.0.7.RELEASE capa-sdk diff --git a/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java b/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java index d3fc2c2..e11cbaa 100644 --- a/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/configuration/AbstractCapaConfigurationClient.java @@ -36,6 +36,11 @@ public abstract class AbstractCapaConfigurationClient implements CapaConfigurati protected List registryNames; + @Override + public List registryNames() { + return registryNames; + } + @Override public Mono saveConfiguration(SaveConfigurationRequest saveConfigurationRequest) { return Mono.error(new UnsupportedOperationException("unsupported save configuration")); diff --git a/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java b/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java index 08b1bee..1c051ec 100644 --- a/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/pubsub/AbstractCapaPubSubClient.java @@ -31,6 +31,11 @@ public abstract class AbstractCapaPubSubClient implements CapaPubSubClient { protected List registryNames; + @Override + public List registryNames() { + return registryNames; + } + @Override public Mono publishEvent(String pubsubName, String topicName, Object data) { PublishEventRequest publishEventRequest = new PublishEventRequest(pubsubName, topicName, data); diff --git a/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java b/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java index 145a59e..ebaf8ef 100644 --- a/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java +++ b/sdk/src/main/java/group/rxcloud/capa/rpc/AbstractCapaRpcClient.java @@ -34,6 +34,11 @@ public abstract class AbstractCapaRpcClient implements CapaRpcClient { protected List registryNames; + @Override + public List registryNames() { + return registryNames; + } + @Override public Mono invokeMethod(String appId, String methodName, Object request, HttpExtension httpExtension, Map metadata, TypeRef type) { InvokeMethodRequestBuilder builder = new InvokeMethodRequestBuilder(appId, methodName); diff --git a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java index 5b38f39..5755b13 100644 --- a/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java +++ b/sdk/src/main/java/group/rxcloud/capa/telemetry/CapaTelemetryClientGlobal.java @@ -57,6 +57,11 @@ static void set(CapaTelemetryClientGlobal capaTelemetryClient) { protected List registryNames; + @Override + public List registryNames() { + return registryNames; + } + CapaTelemetryClientGlobal() { this.registryNames = new ArrayList<>(1); this.registryNames.add("opentelemetry");