diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLogger.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLogger.java index 5897166a3a85..b6e1b13afc7e 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLogger.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLogger.java @@ -17,6 +17,9 @@ package com.google.cloud.bigquery.jdbc; import com.google.common.base.Strings; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.context.Context; import java.io.IOException; import java.lang.management.ManagementFactory; import java.time.Instant; @@ -84,6 +87,18 @@ public static Formatter getFormatter() { return new Formatter() { private static final int MAX_THREAD_NAME_LENGTH = 15; + private void appendTraceBlock(StringBuilder sb) { + SpanContext spanContext = Span.fromContext(Context.current()).getSpanContext(); + if (!spanContext.isValid()) { + return; + } + sb.append("[trace_id=") + .append(spanContext.getTraceId()) + .append(" span_id=") + .append(spanContext.getSpanId()) + .append("] "); + } + @Override public String format(LogRecord record) { String date = DATE_FORMATTER.format(Instant.ofEpochMilli(record.getMillis())); @@ -114,14 +129,12 @@ public String format(LogRecord record) { : record.getLoggerName(); String sourceMethodName = record.getSourceMethodName(); - // Expected log format: yyyy-MM-dd HH:mm:ss.SSS [CONNECTION_ID] LEVEL PID --- [THREAD] CLASS - // METHOD: MESSAGE + // Expected log format: yyyy-MM-dd HH:mm:ss.SSS [CONNECTION_ID] [trace_id= + // span_id=] LEVEL PID --- [THREAD] CLASS METHOD: MESSAGE StringBuilder sb = new StringBuilder(256); - sb.append(date) - .append(" [") - .append(connStr) - .append("] ") - .append(Strings.padEnd(record.getLevel().getName(), 7, ' ')) + sb.append(date).append(" [").append(connStr).append("] "); + appendTraceBlock(sb); + sb.append(Strings.padEnd(record.getLevel().getName(), 7, ' ')) .append(" ") .append(PROCESS_ID) .append(" --- [") diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLoggerTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLoggerTest.java index addae7b907bc..82ca5e003767 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLoggerTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcRootLoggerTest.java @@ -20,6 +20,11 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Scope; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -71,4 +76,23 @@ public void testGetThreadNameNotFound() { String name = BigQueryJdbcRootLogger.getThreadName(-1); assertEquals("", name); } + + @Test + public void testFormatterWithOpenTelemetrySpan() { + SpanContext spanContext = + SpanContext.create( + "00000000000000000000000000000001", + "0000000000000002", + TraceFlags.getDefault(), + TraceState.getDefault()); + Span span = Span.wrap(spanContext); + try (Scope scope = span.makeCurrent()) { + Formatter formatter = BigQueryJdbcRootLogger.getFormatter(); + LogRecord record = new LogRecord(Level.INFO, "Test message with span"); + String formatted = formatter.format(record); + assertTrue( + formatted.contains( + "[trace_id=00000000000000000000000000000001 span_id=0000000000000002] ")); + } + } }