Escolar Documentos
Profissional Documentos
Cultura Documentos
Antes de correlacionar traces com logs, verifique se seus logs são enviados como JSON
ou são analisados pelo processador de log apropriado no nível de linguagem. Seus logs
de nível de linguagem devem ser convertidos em atributos do Datadog para que a
correlação de traces e logs funcione.
Para saber mais sobre a conexão automática ou manual de seus logs com seus traces,
selecione sua linguagem abaixo:
Injeção automática
Injeção manual
Se preferir correlacionar manualmente seus traces com seus logs, use a API do tracer
do Java para recuperar identificadores de correlação. Use os métodos
CorrelationIdentifier.getTraceId e CorrelationIdentifier.getSpanId para injetar
identificadores no início do span que está sendo registrado e remova os identificadores
quando o span estiver completo.
import org.apache.logging.log4j.ThreadContext;
import datadog.trace.api.CorrelationIdentifier;
try {
ThreadContext.put("dd.trace_id", CorrelationIdentifier.getTraceId());
ThreadContext.put("dd.span_id", CorrelationIdentifier.getSpanId());
// Log something
} finally {
ThreadContext.remove("dd.trace_id");
ThreadContext.remove("dd.span_id");
Observação: Se você não estiver usando uma Integração de Log do Datadog para
analisar seus logs, regras de análise de logs personalizadas precisam garantir que
dd.trace_id e dd.span_id estejam sendo analisados como strings. Para obter mais
informações, consulte Logs correlacionados não aparecem no painel de ID de trace.
Consulte a documentação de coleta de logs do Java para obter mais detalhes sobre a
implementação de loggers específicos e instruções para registro em formato JSON.
Adicionando tags
import org.apache.cxf.transport.servlet.AbstractHTTPServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
@WebServlet
@Override
if (span != null) {
span.setTag("customer.tier", customer_tier);
span.setTag("cart.value", cart_value);
// [...]
A propriedade dd.tags permite definir tags em todos os spans gerados por uma
aplicação. Isso pode ser útil para agrupar estatísticas para suas aplicações, datacenters
ou qualquer outra tag que você gostaria de ver dentro da interface do Datadog.
java -javaagent:<DD-JAVA-AGENT-PATH>.jar \
-Ddd.tags=datacenter:njc,<TAG_KEY>:<TAG_VALUE> \
-jar <YOUR_APPLICATION_PATH>.jar
Para personalizar um erro associado a um dos seus spans, defina a tag de erro no span
e use Span.log() para definir um "evento de erro". O evento de erro é um
Map<String,Object> contendo uma entrada Fields.ERROR_OBJECT->Throwable,
Fields.MESSAGE->String, ou ambos.
import io.opentracing.Span;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import io.opentracing.log.Fields;
...
if (span != null) {
span.setTag(Tags.ERROR, true);
span.log(Collections.singletonMap(Fields.ERROR_OBJECT, ex));
import io.opentracing.Span;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import datadog.trace.api.DDTags;
import java.io.PrintWriter;
import java.io.StringWriter;
...
if (span != null) {
span.setTag(Tags.ERROR, true);
span.setTag(DDTags.ERROR_MSG, ex.getMessage());
span.setTag(DDTags.ERROR_TYPE, ex.getClass().getName());
ex.printStackTrace(new PrintWriter(errorString));
span.setTag(DDTags.ERROR_STACK, errorString.toString());
import io.opentracing.Span;
import io.opentracing.Scope;
import datadog.trace.api.interceptor.MutableSpan;
import io.opentracing.log.Fields;
import io.opentracing.util.GlobalTracer;
import io.opentracing.util.Tracer;
// to call scope.close().
localRootSpan.setError(true);
localRootSpan.setTag("some.other.tag", "value");
} finally {
span.finish();
Se você não estiver criando manualmente um span, ainda é possível acessar o span raiz
por meio do GlobalTracer:
import io.opentracing.Span;
import io.opentracing.util.GlobalTracer;
import datadog.trace.api.interceptor.MutableSpan;
...
final Span span = GlobalTracer.get().activeSpan();
Adicionando spans
Se você tiver anotações @Trace existentes ou similares, ou preferir usar anotações para
completar quaisquer traces incompletas no Datadog, use as Anotações de Trace.
A única diferença entre esta abordagem e o uso de anotações @Trace são as opções de
personalização para os nomes de operação e recurso. Com os Métodos de Trace do DD,
operationName é trace.annotation e resourceName é SessionManager.saveSession.
Anotações de trace
Adicione @Trace a métodos para que eles sejam rastreados quando executados com
dd-java-agent.jar. Se o agente não estiver anexado, esta anotação não terá efeito no
seu aplicativo.
import datadog.trace.api.Trace;
import datadog.trace.api.DDTags;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
class SomeClass {
void someMethod() {
.withTag(DDTags.RESOURCE_NAME, "<RESOURCE_NAME>")
.start();
// to call scope.close().
span.setTag("my.tag", "value");
} catch (Exception e) {
} finally {
span.finish();
}
Extendendo os rastreadores
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import datadog.trace.api.interceptor.TraceInterceptor;
import datadog.trace.api.interceptor.MutableSpan;
@Override
filteredTrace.add(span);
return filteredTrace;
@Override
return 100;
}
}
@Override
}
return trace;
@Override
datadog.trace.api.GlobalTracer.get().addTraceInterceptor(new FilteringInterceptor());
datadog.trace.api.GlobalTracer.get().addTraceInterceptor(new PricingInterceptor());
Filtragem de recursos
Os traces podem ser excluídos com base em seus nomes de recursos, para remover
tráfego sintético, como verificações de saúde, do relatório de traces para o Datadog.
Essas e outras configurações de segurança e ajuste fino podem ser encontradas na
página de Segurança ou em Ignorando recursos indesejados.
Injeção
Para correlacionar seus traces com seus logs, atualize o formato do seu log para
incluir os atributos necessários do registro de log e chame
ddtrace.patch(logging=True).
import logging
'- %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger(__name__)
log.level = logging.INFO
@tracer.wrap()
def hello():
log.info('Hello, World!')
hello()
span = tracer.current_span()
Como ilustração desta abordagem, o exemplo a seguir define uma função como
um processador em structlog para adicionar campos de tracer à saída do log:
import ddtrace
span = tracer.current_span()
event_dict['dd.trace_id'] = str(trace_id or 0)
event_dict['dd.span_id'] = str(span_id or 0)
# add the env, service, and version configured for the tracer
return event_dict
structlog.configure(
processors=[
tracer_injection,
structlog.processors.JSONRenderer()
log = structlog.get_logger()
>>> traced_func()
Observação: Se você não estiver usando uma Integração de Log Datadog para
analisar seus logs, as regras personalizadas de análise de log devem garantir
que dd.trace_id e dd.span_id estejam sendo analisados como strings e
remapeados usando o Trace Remapper. Para obter mais informações, consulte
Correlated Logs Not Showing Up in the Trace ID Panel.