From 9f97cdeb4b9e3720bba180fba882083c7f15cb0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Wed, 12 Aug 2026 11:52:51 +0200 Subject: [PATCH 1/5] Update pom.xml --- pom.xml | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index ecd83385f..735dc48b4 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 5.7.2 1.13.8 3.4.3 - 1.1-170-g3f48c50 + 1.1-178-ga09ed33 1.0-127-g6c65524 12.0.35 @@ -65,12 +65,6 @@ ${project.groupId} jicoco-config ${jicoco.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - ${project.groupId} @@ -125,7 +119,7 @@ ${project.groupId} jitsi-xmpp-extensions - 1.0-110-g00660c3 + 1.0-118-g64ecd07 com.datadoghq @@ -181,13 +175,7 @@ ${project.groupId} jitsi-metaconfig - 1.0-11-g8cf950e - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - + 1.0-12-g02d4bd5 ${project.groupId} @@ -197,7 +185,7 @@ com.typesafe config - 1.4.0 + 1.4.2 @@ -278,6 +266,17 @@ ${jicoco.version} compile + + org.jitsi + jicoco-tracing + ${jicoco.version} + + + io.opentelemetry + opentelemetry-sdk + 1.48.0 + + From 29437440ce93e2742a26e2f3614584af3bbfb29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Wed, 12 Aug 2026 11:53:06 +0200 Subject: [PATCH 2/5] Add tracing config to reference --- src/main/resources/reference.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 721e3bd1a..10f16065e 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -197,3 +197,8 @@ jibri { ice-connection-timeout = 30 seconds } } + +tracing { + enabled = false + service-name = "jibri" +} From 6f75d31329b37e70eb5e4618bf21436ed332b892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Mon, 3 Aug 2026 15:52:40 +0200 Subject: [PATCH 3/5] Build trace WIP: the context is not being read correctly for some reason --- .../org/jitsi/jibri/api/xmpp/XmppApi.kt | 85 ++++++++++++++++++- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt index f96619c8a..fa4d3015c 100644 --- a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt +++ b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt @@ -19,6 +19,12 @@ package org.jitsi.jibri.api.xmpp import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue +import io.opentelemetry.api.trace.Span +import io.opentelemetry.api.trace.SpanContext +import io.opentelemetry.api.trace.StatusCode +import io.opentelemetry.api.trace.TraceFlags +import io.opentelemetry.api.trace.TraceState +import io.opentelemetry.context.Context import org.jitsi.jibri.FileRecordingRequestParams import org.jitsi.jibri.JibriBusyException import org.jitsi.jibri.JibriManager @@ -36,7 +42,10 @@ import org.jitsi.jibri.status.ComponentState import org.jitsi.jibri.status.JibriStatus import org.jitsi.jibri.status.JibriStatusManager import org.jitsi.jibri.util.getCallUrlInfoFromJid +import org.jitsi.tracing.TracingGlobal import org.jitsi.utils.logging2.createLogger +import org.jitsi.xmpp.extensions.TraceParent +import org.jitsi.xmpp.extensions.TraceParentProvider import org.jitsi.xmpp.extensions.jibri.JibriIq import org.jitsi.xmpp.extensions.jibri.JibriIqProvider import org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt @@ -52,6 +61,34 @@ import org.jivesoftware.smack.provider.ProviderManager import org.jivesoftware.smackx.ping.PingManager import org.jxmpp.jid.impl.JidCreate +/** + * Extracts a remote [Span] from the `traceparent` extension of an IQ, if present. + * + * Inlined from jicoco-tracing's TracingUtil, which was removed because it pulled in a Smack + * dependency that isn't available on Maven Central: https://github.com/jitsi/jicoco/pull/241 + */ +private fun remoteSpanFromIq(iq: IQ): Span? { + val extension = iq.getExtension(TraceParent::class.java) ?: return null + return Span.wrap( + SpanContext.createFromRemoteParent( + extension.traceId, + extension.parentId, + TraceFlags.fromHex(extension.traceFlags, 0), + TraceState.getDefault() + ) + ) +} + +/** + * Extracts a remote [Context] from the `traceparent` extension of an IQ, if present, or the root + * context otherwise. + */ +private fun remoteContextFromIq(iq: IQ): Context { + val root = Context.root() + val span = remoteSpanFromIq(iq) ?: return root + return root.with(span) +} + private class UnsupportedIqMode(val iqMode: String) : Exception() /** @@ -71,6 +108,7 @@ class XmppApi( private val jibriStatusManager: JibriStatusManager, ) : IQListener { private val logger = createLogger() + private val tracer = TracingGlobal.sdk.getTracer("org.jitsi.jibri.xmpp") private val connectionStateListener = object : ConnectionStateListener { override fun connected(mucClient: MucClient) { @@ -136,6 +174,11 @@ class XmppApi( JibriIq.NAMESPACE, JibriIqProvider() ) + ProviderManager.addExtensionProvider( + TraceParent.ELEMENT, + TraceParent.NAMESPACE, + TraceParentProvider() + ) updatePresence(jibriStatusManager.overallStatus) jibriStatusManager.addStatusHandler(::updatePresence) @@ -343,10 +386,20 @@ class XmppApi( * response with [JibriIq.Status.OFF]. */ private fun handleStopJibriIq(stopJibriIq: JibriIq): IQ { - jibriManager.stopService() - // By this point the service has been fully stopped - return stopJibriIq.createResult { - status = JibriIq.Status.OFF + val span = tracer.spanBuilder("jibri.stop") + .setParent(remoteContextFromIq(stopJibriIq)) + .startSpan() + try { + jibriManager.stopService() + // By this point the service has been fully stopped + return stopJibriIq.createResult { + status = JibriIq.Status.OFF + } + } catch (e: Throwable) { + span.setStatus(StatusCode.ERROR, e.message ?: "") + throw e + } finally { + span.end() } } @@ -360,6 +413,30 @@ class XmppApi( xmppEnvironment: XmppEnvironmentConfig, environmentContext: EnvironmentContext, serviceStatusHandler: JibriServiceStatusHandler + ) { + val span = tracer.spanBuilder("jibri.start") + .setParent(remoteContextFromIq(startIq)) + .setAttribute("room", startIq.room.toString()) + .setAttribute("session.id", startIq.sessionId) + .setAttribute("recording-mode", startIq.recordingMode.toString()) + .startSpan() + try { + span.makeCurrent().use { + doHandleStartService(startIq, xmppEnvironment, environmentContext, serviceStatusHandler) + } + } catch (e: Throwable) { + span.setStatus(StatusCode.ERROR, e.message ?: "") + throw e + } finally { + span.end() + } + } + + private fun doHandleStartService( + startIq: JibriIq, + xmppEnvironment: XmppEnvironmentConfig, + environmentContext: EnvironmentContext, + serviceStatusHandler: JibriServiceStatusHandler ) { val callUrlInfo = getCallUrlInfoFromJid( startIq.room, From 313a2a7aaa6955f6e859e9f41838ca4c2f0ed4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Mon, 17 Aug 2026 13:08:32 +0200 Subject: [PATCH 4/5] Add session.id to jibri.stop --- src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt index fa4d3015c..6b95788e0 100644 --- a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt +++ b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt @@ -387,6 +387,7 @@ class XmppApi( */ private fun handleStopJibriIq(stopJibriIq: JibriIq): IQ { val span = tracer.spanBuilder("jibri.stop") + .setAttribute("session.id", stopJibriIq.sessionId) .setParent(remoteContextFromIq(stopJibriIq)) .startSpan() try { From 5672226d566f7c691c98804e9809d68c4a3a857b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Tue, 18 Aug 2026 11:05:55 +0200 Subject: [PATCH 5/5] Address review --- pom.xml | 6 ------ src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 735dc48b4..59310ebde 100644 --- a/pom.xml +++ b/pom.xml @@ -271,12 +271,6 @@ jicoco-tracing ${jicoco.version} - - io.opentelemetry - opentelemetry-sdk - 1.48.0 - - diff --git a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt index 6b95788e0..d348210cc 100644 --- a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt +++ b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt @@ -21,6 +21,7 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue 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.api.trace.TraceFlags import io.opentelemetry.api.trace.TraceState @@ -389,6 +390,7 @@ class XmppApi( val span = tracer.spanBuilder("jibri.stop") .setAttribute("session.id", stopJibriIq.sessionId) .setParent(remoteContextFromIq(stopJibriIq)) + .setSpanKind(SpanKind.SERVER) .startSpan() try { jibriManager.stopService() @@ -398,6 +400,7 @@ class XmppApi( } } catch (e: Throwable) { span.setStatus(StatusCode.ERROR, e.message ?: "") + span.recordException(e) throw e } finally { span.end() @@ -420,6 +423,7 @@ class XmppApi( .setAttribute("room", startIq.room.toString()) .setAttribute("session.id", startIq.sessionId) .setAttribute("recording-mode", startIq.recordingMode.toString()) + .setSpanKind(SpanKind.SERVER) .startSpan() try { span.makeCurrent().use { @@ -427,6 +431,7 @@ class XmppApi( } } catch (e: Throwable) { span.setStatus(StatusCode.ERROR, e.message ?: "") + span.recordException(e) throw e } finally { span.end()