micronaut-projects/micronaut-core

Support Datadog Tracing

Open

#5 201 ouverte le 31 mars 2021

Voir sur GitHub
 (6 commentaires) (0 réactions) (0 assignés)Java (1 025 forks)batch import
help wantedtype: enhancement

Métriques du dépôt

Stars
 (5 882 stars)
Métriques de merge PR
 (Merge moyen 18j 12h) (60 PRs mergées en 30 j)

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
    }

}

Guide contributeur