micronaut-projects/micronaut-core

Support Datadog Tracing

Open

#5,201 opened on Mar 31, 2021

View on GitHub
 (6 comments) (0 reactions) (0 assignees)Java (5,882 stars) (1,025 forks)batch import
help wantedtype: enhancement

Description

Looks like this would be another implementation of tracing that would be nice to have: https://github.com/DataDog/dd-trace-java/blob/master/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java

I believe this would be required to work with @NewSpan and @ContinueSpan, and @SpanTag annotations: https://docs.micronaut.io/latest/guide/index.html#distributedTracing

Datadog has their own annotation for tracing: https://docs.datadoghq.com/tracing/setup_overview/setup/java/?tab=containers#trace-annotation

Required dependencies:

        <dependency>
            <groupId>com.datadoghq</groupId>
            <artifactId>dd-trace-ot</artifactId>
            <version>0.75.0</version>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-tracing</artifactId>
        </dependency>

Barebones factory:

import datadog.opentracing.DDTracer;
import datadog.trace.core.CoreTracer;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Primary;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.micronaut.context.exceptions.BeanInstantiationException;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import lombok.extern.slf4j.Slf4j;
import lombok.val;

import javax.inject.Singleton;

@Slf4j
@Factory
public class DatadogTracerFactory {

    @Primary
    @Singleton
    @Requires(classes = { DDTracer.class, Tracer.class }, env = Environment.CLOUD, notEnv = Environment.TEST)
    Tracer ddTracer() {
        val ddGlobalTracer = datadog.trace.api.GlobalTracer.get();
        if (ddGlobalTracer instanceof DDTracer) {
            val ddTracer = (DDTracer) ddGlobalTracer;
            GlobalTracer.registerIfAbsent(ddTracer);
            return ddTracer;
        } else if (ddGlobalTracer instanceof CoreTracer) {
            val ddTracer = new DDTracer((CoreTracer) ddGlobalTracer);
            GlobalTracer.registerIfAbsent(ddTracer);
            log.info("Successfully registered DDTracer for opentracing support");
            return ddTracer;
        }
        // TODO: create DDTracer instance with builder and register
    }

}

Contributor guide