All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kr.jadekim.jext.apm.datadog.extensions.kt Maven / Gradle / Ivy

The newest version!
package kr.jadekim.jext.apm.datadog

import io.opentracing.Span
import io.opentracing.SpanContext
import io.opentracing.Tracer
import io.opentracing.propagation.Format
import io.opentracing.propagation.TextMap
import io.opentracing.propagation.TextMapAdapter
import io.opentracing.propagation.TextMapExtract
import kotlinx.coroutines.Job
import java.io.PrintWriter
import java.io.StringWriter
import kotlin.coroutines.coroutineContext

fun Map.toTextMap(): TextMapExtract = TextMapAdapter(this)

fun MutableMap.toTextMap(): TextMap = TextMapAdapter(this)

val Span.context: SpanContext
    get() = context()

suspend fun Span.addOnJobCompletion(
    body: Span.(error: Throwable?) -> Unit = { this.finish() },
) {
    coroutineContext[Job]?.invokeOnCompletion {
        it?.also {
            val errors = StringWriter()
            it.printStackTrace(PrintWriter(errors))
            setTag("error", true)
            log(mapOf("stack" to errors))
        }
        body(it)
    }
}

inline fun Tracer.span(
    operationName: String,
    builderBody: Tracer.SpanBuilder.() -> Tracer.SpanBuilder,
): Span = buildSpan(operationName).builderBody()
    .start()

suspend inline fun span(
    operationName: String,
    builderBody: Tracer.SpanBuilder.() -> Tracer.SpanBuilder,
): Span = coroutineContext.tracer.span(operationName, builderBody)

fun  Tracer.SpanBuilder.extractSpan(carrier: T, format: Format, tracer: Tracer): Tracer.SpanBuilder {
    val context: SpanContext? = tracer.extract(format, carrier)

    return context?.let { asChildOf(it) } ?: this
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy