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 (1,025 forks)batch import
help wantedtype: enhancement

Repository metrics

Stars
 (5,882 stars)
PR merge metrics
 (Avg merge 18d 12h) (60 merged PRs in 30d)

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