micronaut-projects/micronaut-core

Support Datadog Tracing

Aberta

#5.201 aberto em 31 de mar. de 2021

 (6 comentários) (0 reação) (0 responsável)Java (1.025 forks)batch import
help wantedtype: enhancement

Métricas do repositório

Stars
 (5.882 estrelas)
Métricas de merge de PR
 (Mesclagem média 18d 12h) (60 fundiu PRs em 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
    }

}

Guia do colaborador