diff --git a/functions-framework-api/pom.xml b/functions-framework-api/pom.xml
index 26b466a8..9e68a03b 100644
--- a/functions-framework-api/pom.xml
+++ b/functions-framework-api/pom.xml
@@ -28,6 +28,11 @@
dapr-sdk
1.8.0
+
+ org.apache.eventmesh
+ eventmesh-sdk-java
+ 1.9.0-release
+
@@ -38,7 +43,7 @@
dev.openfunction.functions
functions-framework-api
- 1.2.0-SNAPSHOT
+ 1.3.0-SNAPSHOT
UTF-8
diff --git a/functions-framework-api/src/main/java/dev/openfunction/functions/Context.java b/functions-framework-api/src/main/java/dev/openfunction/functions/Context.java
index d3863eb9..071b4971 100644
--- a/functions-framework-api/src/main/java/dev/openfunction/functions/Context.java
+++ b/functions-framework-api/src/main/java/dev/openfunction/functions/Context.java
@@ -16,6 +16,8 @@
package dev.openfunction.functions;
+import org.apache.eventmesh.client.grpc.producer.EventMeshGrpcProducer;
+
import io.cloudevents.CloudEvent;
import io.dapr.client.DaprClient;
@@ -121,5 +123,7 @@ public interface Context {
*/
DaprClient getDaprClient();
- CloudEvent packageAsCloudevent(String payload);
+ EventMeshGrpcProducer getEventMeshProducer();
+
+ byte[] packageAsCloudevent(String payload);
}
diff --git a/functions-framework-invoker/pom.xml b/functions-framework-invoker/pom.xml
index 35a70084..516f88a8 100644
--- a/functions-framework-invoker/pom.xml
+++ b/functions-framework-invoker/pom.xml
@@ -10,7 +10,7 @@
dev.openfunction.functions
functions-framework-invoker
- 1.2.0-SNAPSHOT
+ 1.3.0-SNAPSHOT
3.8.0
@@ -20,6 +20,7 @@
11
11
2.4.2
+ 8.16.0
@@ -60,7 +61,17 @@
dev.openfunction.functions
functions-framework-api
- 1.2.0-SNAPSHOT
+ 1.3.0-SNAPSHOT
+
+
+ org.apache.eventmesh
+ eventmesh-connector-openfunction
+ 1.9.0-release
+
+
+ org.apache.eventmesh
+ eventmesh-sdk-java
+ 1.9.0-release
io.cloudevents
@@ -72,6 +83,11 @@
cloudevents-core
${cloudevents.sdk.version}
+
+ io.cloudevents
+ cloudevents-protobuf
+ ${cloudevents.sdk.version}
+
com.google.auto.value
auto-value
@@ -179,6 +195,12 @@
jackson-databind
2.14.2
+
+
+ org.apache.skywalking
+ apm-toolkit-trace
+ ${skywalking.version}
+
diff --git a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/Runner.java b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/Runner.java
index efb73116..004d24dd 100644
--- a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/Runner.java
+++ b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/Runner.java
@@ -19,6 +19,7 @@
import dev.openfunction.invoker.context.RuntimeContext;
import dev.openfunction.invoker.trigger.DaprTrigger;
+import dev.openfunction.invoker.trigger.EventMeshTrigger;
import dev.openfunction.invoker.trigger.HttpTrigger;
import dev.openfunction.invoker.trigger.Trigger;
import org.apache.commons.lang3.StringUtils;
@@ -82,6 +83,10 @@ public static void main(String[] args) {
triggers.add(new DaprTrigger(runtimeContext, functionClasses));
}
+ if (runtimeContext.hasEventMeshTrigger()) {
+ triggers.add(new EventMeshTrigger(runtimeContext, functionClasses));
+ }
+
for (Trigger trigger : triggers) {
trigger.start();
}
diff --git a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/FunctionContext.java b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/FunctionContext.java
index 8ef77d22..66138cb8 100644
--- a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/FunctionContext.java
+++ b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/FunctionContext.java
@@ -128,16 +128,6 @@ public void setPluginsTracing(TracingConfig pluginsTracing) {
this.pluginsTracing = pluginsTracing;
}
- public boolean isTracingEnabled() {
- if (tracing != null ) {
- return tracing.isEnabled();
- } else if (pluginsTracing != null) {
- return pluginsTracing.isEnabled();
- } else {
- return false;
- }
- }
-
public Map getStates() {
return states;
}
@@ -182,6 +172,8 @@ static class Triggers {
private HttpTrigger http;
private DaprTrigger[] dapr;
+ private EventMeshTrigger eventMesh;
+
public HttpTrigger getHttp() {
return http;
}
@@ -197,6 +189,14 @@ public DaprTrigger[] getDapr() {
public void setDapr(DaprTrigger[] dapr) {
this.dapr = dapr;
}
+
+ public EventMeshTrigger getEventMesh() {
+ return eventMesh;
+ }
+
+ public void setEventMesh(EventMeshTrigger eventMesh) {
+ this.eventMesh = eventMesh;
+ }
}
static class HttpTrigger {
@@ -250,4 +250,99 @@ public void setInputName(String inputName) {
this.inputName = inputName;
}
}
+
+ static class EventMeshTrigger {
+ private String name;
+
+ private String type;
+
+ private String topic;
+
+ private String eventMeshConnectorAddr;
+
+ private String eventMeshConnectorPort;
+
+ private String producerGroup;
+
+ private String env;
+
+ private String idc;
+
+ private String sysId;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTopic() {
+ return topic;
+ }
+
+ public void setTopic(String topic) {
+ this.topic = topic;
+ }
+
+
+ public String getEventMeshConnectorAddr() {
+ return eventMeshConnectorAddr;
+ }
+
+ public void setEventMeshConnectorAddr(String eventMeshConnectorAddr) {
+ this.eventMeshConnectorAddr = eventMeshConnectorAddr;
+ }
+
+ public String getEventMeshConnectorPort() {
+ return eventMeshConnectorPort;
+ }
+
+ public void setEventMeshConnectorPort(String eventMeshConnectorPort) {
+ this.eventMeshConnectorPort = eventMeshConnectorPort;
+ }
+
+ public String getProducerGroup() {
+ return producerGroup;
+ }
+
+ public void setProducerGroup(String producerGroup) {
+ this.producerGroup = producerGroup;
+ }
+
+ public String getEnv() {
+ return env;
+ }
+
+ public void setEnv(String env) {
+ this.env = env;
+ }
+
+ public String getIdc() {
+ return idc;
+ }
+
+ public void setIdc(String idc) {
+ this.idc = idc;
+ }
+
+ public String getSysId() {
+ return sysId;
+ }
+
+ public void setSysId(String sysId) {
+ this.sysId = sysId;
+ }
+ }
+
+
}
diff --git a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/RuntimeContext.java b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/RuntimeContext.java
index d116426c..f153ed45 100644
--- a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/RuntimeContext.java
+++ b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/RuntimeContext.java
@@ -26,7 +26,7 @@
import dev.openfunction.invoker.tracing.TracingProvider;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.provider.EventFormatProvider;
-import org.apache.commons.collections.CollectionUtils;
+
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
@@ -66,26 +66,41 @@ public RuntimeContext(String context, ClassLoader classLoader) throws Exception
loadHooks(classLoader);
- if (functionContext.isTracingEnabled() && functionContext.getPluginsTracing().getProvider() != null) {
- String provider = functionContext.getPluginsTracing().getProvider().getName();
+ TracingConfig tracingConfig = getTracingConfig();
+ if (tracingConfig != null && tracingConfig.isEnabled() && tracingConfig.getProvider() != null) {
+ String provider = tracingConfig.getProvider().getName();
if (!Objects.equals(provider, TracingSkywalking) && !Objects.equals(provider, TracingOpentelemetry)) {
throw new IllegalArgumentException("unsupported tracing provider " + provider);
}
switch (provider) {
case TracingSkywalking:
- tracingProvider = new SkywalkingProvider();
+ tracingProvider = new SkywalkingProvider(tracingConfig,
+ functionContext.getName(),
+ System.getenv(RuntimeContext.PodNameEnvName),
+ System.getenv(RuntimeContext.PodNamespaceEnvName));
+ break;
case TracingOpentelemetry:
- tracingProvider = new OpenTelemetryProvider(functionContext.getPluginsTracing(),
+ tracingProvider = new OpenTelemetryProvider(tracingConfig,
functionContext.getName(),
System.getenv(RuntimeContext.PodNameEnvName),
System.getenv(RuntimeContext.PodNamespaceEnvName));
+ break;
}
}
EventFormatProvider.getInstance().registerFormat(new JsonEventFormat());
}
+ private TracingConfig getTracingConfig() {
+ TracingConfig tracingConfig = functionContext.getTracing();
+ if (tracingConfig != null) {
+ return tracingConfig;
+ }
+
+ return functionContext.getPluginsTracing();
+ }
+
private void loadHooks(ClassLoader classLoader) {
String[] preHookNames = functionContext.getPreHooks();
if (ArrayUtils.isEmpty(preHookNames)) {
@@ -212,6 +227,36 @@ public Map getDaprTrigger() {
return null;
}
+
+ public boolean hasEventMeshTrigger() {
+ return functionContext.getTriggers() != null && functionContext.getTriggers().getEventMesh() != null;
+ }
+
+ public Component getEventMeshTrigger() {
+ if (functionContext.getTriggers() != null &&
+ functionContext.getTriggers().getEventMesh() != null) {
+ FunctionContext.EventMeshTrigger trigger = functionContext.getTriggers().getEventMesh();
+
+ Component component = new Component();
+ component.setComponentName(trigger.getName());
+ component.setComponentType(trigger.getType());
+ component.setTopic(trigger.getTopic());
+ Map metaDataMap = new HashMap<>();
+ metaDataMap.put("eventMeshConnectorAddr", trigger.getEventMeshConnectorAddr());
+ metaDataMap.put("eventMeshConnectorPort", trigger.getEventMeshConnectorPort());
+ metaDataMap.put("producerGroup", trigger.getProducerGroup());
+ metaDataMap.put("env", trigger.getEnv());
+ metaDataMap.put("idc", trigger.getIdc());
+ metaDataMap.put("sysId", trigger.getSysId());
+
+ component.setMetadata(metaDataMap);
+
+ return component;
+ }
+
+ return null;
+ }
+
public FunctionContext getFunctionContext() {
return functionContext;
}
diff --git a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/UserContext.java b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/UserContext.java
index b8d14f32..82521bae 100644
--- a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/UserContext.java
+++ b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/context/UserContext.java
@@ -24,6 +24,8 @@
import io.dapr.client.DaprClient;
import jakarta.servlet.http.HttpServletResponse;
+import org.apache.eventmesh.client.grpc.producer.EventMeshGrpcProducer;
+
import java.net.URI;
import java.util.*;
import java.util.logging.Level;
@@ -44,7 +46,9 @@ public class UserContext implements Context {
);
private final RuntimeContext runtimeContext;
- private final DaprClient daprClient;
+ private DaprClient daprClient;
+
+ private EventMeshGrpcProducer eventMeshGrpcProducer;
private Out out;
@@ -62,6 +66,11 @@ public UserContext(RuntimeContext runtimeContext, DaprClient daprClient) {
this.daprClient = daprClient;
}
+ public UserContext(RuntimeContext runtimeContext, EventMeshGrpcProducer eventMeshGrpcProducer) {
+ this.runtimeContext = runtimeContext;
+ this.eventMeshGrpcProducer = eventMeshGrpcProducer;
+ }
+
public UserContext withHttp(HttpRequest httpRequest, HttpResponse httpResponse) {
this.httpRequest = httpRequest;
this.httpResponse = httpResponse;
@@ -101,8 +110,7 @@ public Error send(String outputName, String data) {
// binding must be in CloudEvent format, otherwise pubsub cannot parse the data.
byte[] payload = data.getBytes();
if (MiddlewaresCloudEventFormatRequired.contains(output.getComponentType())) {
- CloudEvent event = packageAsCloudevent(data);
- payload = new JsonEventFormat().serialize(event);
+ payload = packageAsCloudevent(data);
}
daprClient.invokeBinding(output.getComponentName(), output.getOperation(), payload).block();
@@ -169,14 +177,20 @@ public DaprClient getDaprClient() {
}
@Override
- public CloudEvent packageAsCloudevent(String payload) {
- return new CloudEventBuilder()
+ public EventMeshGrpcProducer getEventMeshProducer() {
+ return eventMeshGrpcProducer;
+ }
+
+ @Override
+ public byte[] packageAsCloudevent(String payload) {
+ CloudEvent event = new CloudEventBuilder()
.withId(UUID.randomUUID().toString())
.withType("dapr.invoke")
.withSource(URI.create("openfunction/invokeBinding"))
.withData(payload.getBytes())
.withDataContentType(JsonEventFormat.CONTENT_TYPE)
.build();
+ return new JsonEventFormat().serialize(event);
}
@Override
diff --git a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/tracing/OpenTelemetryProvider.java b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/tracing/OpenTelemetryProvider.java
index 50d7a107..781bd398 100644
--- a/functions-framework-invoker/src/main/java/dev/openfunction/invoker/tracing/OpenTelemetryProvider.java
+++ b/functions-framework-invoker/src/main/java/dev/openfunction/invoker/tracing/OpenTelemetryProvider.java
@@ -48,7 +48,7 @@ public class OpenTelemetryProvider implements TracingProvider {
private static final String Protocol_HTTP = "http";
private final String functionName;
- private final Map tags;
+ private Map tags;
private final Map baggage;
private final TextMapGetter