diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index dfa1890..802bebe 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,7 +1,7 @@ [package] org = "ballerina" name = "observe" -version = "1.5.0" +version = "1.6.0" distribution = "2201.12.0" [[package.modules]] @@ -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.6.0.jar" groupId = "ballerina" artifactId = "observe" diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 6ed799a..c623243 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.6.0" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] diff --git a/ballerina/natives.bal b/ballerina/natives.bal index 4e59e23..03128d9 100644 --- a/ballerina/natives.bal +++ b/ballerina/natives.bal @@ -91,6 +91,16 @@ public isolated function finishSpan(int spanId) returns error? = @java:Method { name: "finishSpan" } external; +# Finish the current span. +# +# + spanId - Id of span to finish +# + '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", + name: "finishSpanWithError" +} external; + # Retrieve a map of span context data. # # + return - Map of span context data (traceId and spanId). 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" diff --git a/gradle.properties b/gradle.properties index 66d9a21..8d0a86f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ org.gradle.caching=true group=io.ballerina.stdlib -version=1.6.0-SNAPSHOT +version=1.6.1-SNAPSHOT ballerinaLangVersion=2201.13.0-20251016-073200-0d348172 spotbugsPluginVersion=6.0.18 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..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,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; /** * 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, BError error) { + boolean isFinished = OpenTracerBallerinaWrapper.getInstance().finishSpanWithError(env, spanId, + error); + + 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..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 @@ -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; @@ -36,6 +37,7 @@ 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; @@ -165,6 +167,33 @@ 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, BError error) { + + if (!enabled) { + return false; + } + ObserverContext observerContext = observerContextMap.get(spanId); + if (observerContext != null) { + observerContext.addProperty(PROPERTY_ERROR_VALUE, error); + 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. *