From 56c5b5d133ee6d6cdcad9857d8862e45d9367954 Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 11:21:42 +0530 Subject: [PATCH 01/10] [Automated] Update the native jar versions --- ballerina/Ballerina.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index dfa1890..838457d 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,8 +1,8 @@ [package] org = "ballerina" name = "observe" -version = "1.5.0" -distribution = "2201.12.0" +version = "1.5.1" +distribution = "2201.11.0" [[package.modules]] name = "observe.mockextension" @@ -13,7 +13,7 @@ export = true graalvmCompatible = true [[platform.java21.dependency]] -path = "../native/build/libs/observe-native-1.5.0.jar" +path = "../native/build/libs/observe-native-1.5.1-SNAPSHOT.jar" groupId = "ballerina" artifactId = "observe" From ad329892b824789b45b29dad61eb8bb48fe4ac9f Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 11:23:01 +0530 Subject: [PATCH 02/10] [Automated] Update the native jar versions --- ballerina/Dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 6ed799a..5e21c37 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -18,7 +18,7 @@ modules = [ [[package]] org = "ballerina" name = "observe" -version = "1.5.0" +version = "1.5.1" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] From 05011ae7347262fa5dbfe5c9153167e316484d2f Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 11:23:39 +0530 Subject: [PATCH 03/10] Provide API to to finish span with error --- ballerina/natives.bal | 10 ++++++ .../stdlib/observe/nativeimpl/FinishSpan.java | 13 ++++++++ .../OpenTracerBallerinaWrapper.java | 31 +++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/ballerina/natives.bal b/ballerina/natives.bal index ca77e69..9ac3407 100644 --- a/ballerina/natives.bal +++ b/ballerina/natives.bal @@ -72,6 +72,16 @@ public isolated function finishSpan(int spanId) returns error? = @java:Method { name: "finishSpan" } external; +# Finish the current span. +# +# + spanId - Id of span to finish +# + errorMessage - Error message to be recorded in the span +# + return - An error if an error occurred while finishing the span +public isolated function finishSpanWithError(int spanId, string errorMessage) returns error? = @java:Method { + 'class: "io.ballerina.stdlib.observe.nativeimpl.FinishSpan", + name: "finishSpanWithError" +} external; + # Retrieve a map of span context data. # # + return - Map of span context data (traceId and spanId). diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java index 6682f85..1322067 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java @@ -22,6 +22,7 @@ import io.ballerina.runtime.api.Environment; import io.ballerina.runtime.api.creators.ErrorCreator; import io.ballerina.runtime.api.utils.StringUtils; +import io.ballerina.runtime.api.values.BString; /** * This function which implements the finishSpan method for observe. @@ -40,4 +41,16 @@ public static Object finishSpan(Environment env, long spanId) { return ErrorCreator.createError(StringUtils.fromString(("Can not finish span with id " + spanId + ". Span " + "already finished"))); } + + public static Object finishSpanWithError(Environment env, long spanId, BString errorMessage) { + boolean isFinished = OpenTracerBallerinaWrapper.getInstance().finishSpanWithError(env, spanId, + errorMessage.getValue()); + + if (isFinished) { + return null; + } + + return ErrorCreator.createError(StringUtils.fromString(("Can not finish span with id " + spanId + ". Span " + + "already finished"))); + } } diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java index ba59839..d9345be 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java @@ -36,10 +36,13 @@ import java.util.concurrent.atomic.AtomicLong; import static io.ballerina.runtime.observability.ObservabilityConstants.DEFAULT_SERVICE_NAME; +import static io.ballerina.runtime.observability.ObservabilityConstants.PROPERTY_ERROR_VALUE; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_FUNCTION_MODULE; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_FUNCTION_NAME; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_RESOURCE_ACCESSOR; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_SERVICE_NAME; +import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ERROR; +import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_TRUE_VALUE; /** * This class wraps opentracing apis and exposes extern functions to use within ballerina. @@ -165,6 +168,34 @@ public boolean finishSpan(Environment env, long spanId) { } } + /** + * Method to mark a span as finished. + * + * @param env current environment + * @param spanId id of the Span + * @return boolean to indicate if span was finished + */ + public boolean finishSpanWithError(Environment env, long spanId, String errorValue) { + + if (!enabled) { + return false; + } + ObserverContext observerContext = observerContextMap.get(spanId); + if (observerContext != null) { + observerContext.addTag(TAG_KEY_ERROR, TAG_TRUE_VALUE); + observerContext.addProperty(PROPERTY_ERROR_VALUE, errorValue); + if (observerContext.isSystemSpan()) { + ObserveUtils.setObserverContextToCurrentFrame(env, observerContext.getParent()); + } + TracingUtils.stopObservation(observerContext); + observerContext.setFinished(); + observerContextMap.remove(spanId); + return true; + } else { + return false; + } + } + /** * Method to add tags to an existing span. * From a31ae4a1aacb7a0941ae058a54681664e086b9eb Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 13:50:17 +0530 Subject: [PATCH 04/10] Update finishSpanWithError API --- ballerina/natives.bal | 2 +- .../io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java | 6 +++--- .../observe/nativeimpl/OpenTracerBallerinaWrapper.java | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ballerina/natives.bal b/ballerina/natives.bal index 9ac3407..d8b485c 100644 --- a/ballerina/natives.bal +++ b/ballerina/natives.bal @@ -77,7 +77,7 @@ public isolated function finishSpan(int spanId) returns error? = @java:Method { # + spanId - Id of span to finish # + errorMessage - Error message to be recorded in the span # + return - An error if an error occurred while finishing the span -public isolated function finishSpanWithError(int spanId, string errorMessage) returns error? = @java:Method { +public isolated function finishSpanWithError(int spanId, error 'error) returns error? = @java:Method { 'class: "io.ballerina.stdlib.observe.nativeimpl.FinishSpan", name: "finishSpanWithError" } external; diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java index 1322067..c324a59 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/FinishSpan.java @@ -22,7 +22,7 @@ import io.ballerina.runtime.api.Environment; import io.ballerina.runtime.api.creators.ErrorCreator; import io.ballerina.runtime.api.utils.StringUtils; -import io.ballerina.runtime.api.values.BString; +import io.ballerina.runtime.api.values.BError; /** * This function which implements the finishSpan method for observe. @@ -42,9 +42,9 @@ public static Object finishSpan(Environment env, long spanId) { "already finished"))); } - public static Object finishSpanWithError(Environment env, long spanId, BString errorMessage) { + public static Object finishSpanWithError(Environment env, long spanId, BError error) { boolean isFinished = OpenTracerBallerinaWrapper.getInstance().finishSpanWithError(env, spanId, - errorMessage.getValue()); + error); if (isFinished) { return null; diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java index d9345be..4e74504 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java @@ -22,6 +22,7 @@ import io.ballerina.runtime.api.Environment; import io.ballerina.runtime.api.creators.ErrorCreator; import io.ballerina.runtime.api.utils.StringUtils; +import io.ballerina.runtime.api.values.BError; import io.ballerina.runtime.observability.ObserveUtils; import io.ballerina.runtime.observability.ObserverContext; import io.ballerina.runtime.observability.tracer.BSpan; @@ -175,7 +176,7 @@ public boolean finishSpan(Environment env, long spanId) { * @param spanId id of the Span * @return boolean to indicate if span was finished */ - public boolean finishSpanWithError(Environment env, long spanId, String errorValue) { + public boolean finishSpanWithError(Environment env, long spanId, BError error) { if (!enabled) { return false; @@ -183,7 +184,7 @@ public boolean finishSpanWithError(Environment env, long spanId, String errorVal ObserverContext observerContext = observerContextMap.get(spanId); if (observerContext != null) { observerContext.addTag(TAG_KEY_ERROR, TAG_TRUE_VALUE); - observerContext.addProperty(PROPERTY_ERROR_VALUE, errorValue); + observerContext.addProperty(PROPERTY_ERROR_VALUE, error); if (observerContext.isSystemSpan()) { ObserveUtils.setObserverContextToCurrentFrame(env, observerContext.getParent()); } From e0099e95f13ced8acda4496cc99a87c566ccc7f9 Mon Sep 17 00:00:00 2001 From: Nipuna Madhushan <51471998+NipunaMadhushan@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:04:42 +0530 Subject: [PATCH 05/10] Update ballerina/Ballerina.toml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ballerina/Ballerina.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index 838457d..186cdfe 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -2,7 +2,7 @@ org = "ballerina" name = "observe" version = "1.5.1" -distribution = "2201.11.0" +distribution = "2201.12.0" [[package.modules]] name = "observe.mockextension" From d0f53787451c42eaa5dfafab6f3b366538bdb9dc Mon Sep 17 00:00:00 2001 From: Nipuna Madhushan <51471998+NipunaMadhushan@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:04:58 +0530 Subject: [PATCH 06/10] Update ballerina/natives.bal Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ballerina/natives.bal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ballerina/natives.bal b/ballerina/natives.bal index d8b485c..cfb5c8b 100644 --- a/ballerina/natives.bal +++ b/ballerina/natives.bal @@ -75,7 +75,7 @@ public isolated function finishSpan(int spanId) returns error? = @java:Method { # Finish the current span. # # + spanId - Id of span to finish -# + errorMessage - Error message to be recorded in the span +# + error - Error to be recorded in the span # + return - An error if an error occurred while finishing the span public isolated function finishSpanWithError(int spanId, error 'error) returns error? = @java:Method { 'class: "io.ballerina.stdlib.observe.nativeimpl.FinishSpan", From 6647c2d71e18d3c433342f810763d0d824db74ab Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 14:07:37 +0530 Subject: [PATCH 07/10] Update distribution version --- build-config/resources/Ballerina.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-config/resources/Ballerina.toml b/build-config/resources/Ballerina.toml index ae1f262..36dfbd0 100644 --- a/build-config/resources/Ballerina.toml +++ b/build-config/resources/Ballerina.toml @@ -2,7 +2,7 @@ org = "ballerina" name = "observe" version = "@toml.version@" -distribution = "2201.11.0" +distribution = "2201.12.0" [[package.modules]] name = "observe.mockextension" From a2441e7180402f69e61ad06a0bb823be7eabd055 Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 14:08:26 +0530 Subject: [PATCH 08/10] Update description --- ballerina/natives.bal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ballerina/natives.bal b/ballerina/natives.bal index cfb5c8b..b4fec93 100644 --- a/ballerina/natives.bal +++ b/ballerina/natives.bal @@ -75,7 +75,7 @@ public isolated function finishSpan(int spanId) returns error? = @java:Method { # Finish the current span. # # + spanId - Id of span to finish -# + error - Error to be recorded in the span +# + 'error - Error to be recorded in the span # + return - An error if an error occurred while finishing the span public isolated function finishSpanWithError(int spanId, error 'error) returns error? = @java:Method { 'class: "io.ballerina.stdlib.observe.nativeimpl.FinishSpan", From eb3d8b333c4cd0c370c0272015a045d304c67dd6 Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 15:09:08 +0530 Subject: [PATCH 09/10] Remove adding error tag --- .../stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java index 4e74504..dd752e8 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java @@ -183,7 +183,6 @@ public boolean finishSpanWithError(Environment env, long spanId, BError error) { } ObserverContext observerContext = observerContextMap.get(spanId); if (observerContext != null) { - observerContext.addTag(TAG_KEY_ERROR, TAG_TRUE_VALUE); observerContext.addProperty(PROPERTY_ERROR_VALUE, error); if (observerContext.isSystemSpan()) { ObserveUtils.setObserverContextToCurrentFrame(env, observerContext.getParent()); From 7656fada5f3660f6b66a87efb51e8b420c00979a Mon Sep 17 00:00:00 2001 From: NipunaMadhushan Date: Wed, 22 Oct 2025 15:18:30 +0530 Subject: [PATCH 10/10] Remove unused imports --- .../stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java index dd752e8..f5c5ded 100644 --- a/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java +++ b/native/src/main/java/io/ballerina/stdlib/observe/nativeimpl/OpenTracerBallerinaWrapper.java @@ -42,8 +42,6 @@ import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_FUNCTION_NAME; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_RESOURCE_ACCESSOR; import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ENTRYPOINT_SERVICE_NAME; -import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_KEY_ERROR; -import static io.ballerina.runtime.observability.ObservabilityConstants.TAG_TRUE_VALUE; /** * This class wraps opentracing apis and exposes extern functions to use within ballerina.