diff --git a/jicofo/src/main/java/org/jitsi/jicofo/jibri/JibriSession.java b/jicofo/src/main/java/org/jitsi/jicofo/jibri/JibriSession.java index 5325ffad6e..8c57373062 100644 --- a/jicofo/src/main/java/org/jitsi/jicofo/jibri/JibriSession.java +++ b/jicofo/src/main/java/org/jitsi/jicofo/jibri/JibriSession.java @@ -18,9 +18,12 @@ package org.jitsi.jicofo.jibri; import edu.umd.cs.findbugs.annotations.*; +import io.opentelemetry.api.trace.*; +import io.opentelemetry.context.*; import org.jetbrains.annotations.Nullable; import org.jitsi.jicofo.*; import org.jitsi.jicofo.xmpp.*; +import org.jitsi.xmpp.extensions.*; import org.jitsi.xmpp.extensions.jibri.*; import org.jitsi.xmpp.extensions.jibri.JibriIq.*; import org.jetbrains.annotations.*; @@ -370,6 +373,18 @@ synchronized public void stop(Jid initiator) stopRequest.setAction(JibriIq.Action.STOP); stopRequest.setSessionId(this.sessionId); + Span span = Span.fromContextOrNull(Context.current()); + if (span != null) + { + stopRequest.addExtension( + new TraceParent( + span.getSpanContext().getTraceId(), + span.getSpanContext().getSpanId(), + span.getSpanContext().getTraceFlags().asHex() + ) + ); + } + logger.info("Sending stop IQ (fire-and-forget): " + stopRequest.toXML()); try @@ -512,6 +527,17 @@ private void sendJibriStartIq(final Jid jibriJid) // Insert name of the room into Jibri START IQ startIq.setRoom(roomName); + Span span = Span.fromContextOrNull(Context.current()); + if (span != null) + { + startIq.addExtension( + new TraceParent( + span.getSpanContext().getTraceId(), + span.getSpanContext().getSpanId(), + span.getSpanContext().getTraceFlags().asHex() + ) + ); + } // We will not wait forever for the Jibri to start. This method can be // run multiple times on retry, so we want to restart the pending // timeout each time. @@ -532,6 +558,19 @@ private void sendJibriStartIq(final Jid jibriJid) stopRequest.setTo(jibriJid); stopRequest.setAction(JibriIq.Action.STOP); stopRequest.setSessionId(sessionId); + + span = Span.fromContextOrNull(Context.current()); + if (span != null) + { + stopRequest.addExtension( + new TraceParent( + span.getSpanContext().getTraceId(), + span.getSpanContext().getSpanId(), + span.getSpanContext().getTraceFlags().asHex() + ) + ); + } + try { jibriDetector.getXmppConnection().trySendStanza(stopRequest); diff --git a/jicofo/src/main/kotlin/org/jitsi/jicofo/jibri/BaseJibri.kt b/jicofo/src/main/kotlin/org/jitsi/jicofo/jibri/BaseJibri.kt index 7f9b42c945..f91b9bc2e2 100644 --- a/jicofo/src/main/kotlin/org/jitsi/jicofo/jibri/BaseJibri.kt +++ b/jicofo/src/main/kotlin/org/jitsi/jicofo/jibri/BaseJibri.kt @@ -17,6 +17,8 @@ */ package org.jitsi.jicofo.jibri +import io.opentelemetry.api.trace.StatusCode +import io.opentelemetry.api.trace.Tracer import org.jitsi.jicofo.ConferenceConfig import org.jitsi.jicofo.conference.JitsiMeetConferenceImpl import org.jitsi.jicofo.jibri.JibriSession.StateListener @@ -27,12 +29,14 @@ import org.jitsi.jicofo.xmpp.IqProcessingResult.RejectedWithError import org.jitsi.jicofo.xmpp.IqRequest import org.jitsi.jicofo.xmpp.muc.hasModeratorRights import org.jitsi.jicofo.xmpp.tryToSendStanza +import org.jitsi.tracing.TracingGlobal import org.jitsi.utils.logging2.Logger import org.jitsi.xmpp.extensions.jibri.JibriIq import org.jitsi.xmpp.extensions.jibri.JibriIq.Action import org.jivesoftware.smack.packet.IQ import org.jivesoftware.smack.packet.StanzaError import java.lang.Exception +import kotlin.use import org.jitsi.jicofo.util.ErrorResponse.create as error /** @@ -48,6 +52,7 @@ abstract class BaseJibri internal constructor( ) : StateListener { protected val logger: Logger = parentLogger.createChildLogger(BaseJibri::class.simpleName) + val tracer: Tracer = TracingGlobal.sdk.getTracer("org.jitsi.jicofo.jibri") fun handleJibriRequest(request: JibriRequest): IqProcessingResult = if (accept(request.iq)) { logger.info("Accepted jibri request: ${request.iq.toXML()}") @@ -58,14 +63,23 @@ abstract class BaseJibri internal constructor( } chatRoom.queueXmppTask { + val span = tracer.spanBuilder("jibri.${request.iq.action}") + .setAttribute("client.id", request.iq.from.toString()) + .setAttribute("recording-mode", request.iq.recordingMode.toString()) + .startSpan() val response = try { - doHandleIQRequest(request.iq) + span.makeCurrent().use { + doHandleIQRequest(request.iq) + } } catch (e: Exception) { logger.warn("Failed to handle request: ${request.iq}", e) request.connection.tryToSendStanza( IQ.createErrorResponse(request.iq, StanzaError.Condition.internal_server_error) ) + span.setStatus(StatusCode.ERROR, e.message ?: "") null + } finally { + span.end() } response?.let { request.connection.tryToSendStanza(it) } }