From 8e60bdcdc7c0e68b4048f831ea85664851ac4066 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 28 Jul 2026 21:25:38 +0000 Subject: [PATCH 1/2] feat(bigquery-jdbc): add otel trace and span IDs to local logs --- .../bigquery/jdbc/BigQueryJdbcRootLogger.java | 22 +++++++++++++++-- .../jdbc/BigQueryJdbcRootLoggerTest.java | 24 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) 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..646e98eda7ff 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 String getTraceBlock() { + SpanContext spanContext = Span.fromContext(Context.current()).getSpanContext(); + if (!spanContext.isValid()) { + return ""; + } + return "[trace_id=" + + spanContext.getTraceId() + + " span_id=" + + spanContext.getSpanId() + + "] "; + } + @Override public String format(LogRecord record) { String date = DATE_FORMATTER.format(Instant.ofEpochMilli(record.getMillis())); @@ -114,13 +129,16 @@ 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 + String traceBlock = getTraceBlock(); + + // Expected log format: yyyy-MM-dd HH:mm:ss.SSS [CONNECTION_ID] [trace_id=XXX span_id=YYY] + // LEVEL PID --- [THREAD] CLASS METHOD: MESSAGE StringBuilder sb = new StringBuilder(256); sb.append(date) .append(" [") .append(connStr) .append("] ") + .append(traceBlock) .append(Strings.padEnd(record.getLevel().getName(), 7, ' ')) .append(" ") .append(PROCESS_ID) 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] ")); + } + } } From 76b25631bfabf3fdd3ed1ea08f0529ea0cc09030 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Wed, 29 Jul 2026 14:08:37 +0000 Subject: [PATCH 2/2] chore: use sb append isntead of string concat --- .../bigquery/jdbc/BigQueryJdbcRootLogger.java | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) 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 646e98eda7ff..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 @@ -87,16 +87,16 @@ public static Formatter getFormatter() { return new Formatter() { private static final int MAX_THREAD_NAME_LENGTH = 15; - private String getTraceBlock() { + private void appendTraceBlock(StringBuilder sb) { SpanContext spanContext = Span.fromContext(Context.current()).getSpanContext(); if (!spanContext.isValid()) { - return ""; + return; } - return "[trace_id=" - + spanContext.getTraceId() - + " span_id=" - + spanContext.getSpanId() - + "] "; + sb.append("[trace_id=") + .append(spanContext.getTraceId()) + .append(" span_id=") + .append(spanContext.getSpanId()) + .append("] "); } @Override @@ -129,17 +129,12 @@ public String format(LogRecord record) { : record.getLoggerName(); String sourceMethodName = record.getSourceMethodName(); - String traceBlock = getTraceBlock(); - - // Expected log format: yyyy-MM-dd HH:mm:ss.SSS [CONNECTION_ID] [trace_id=XXX span_id=YYY] - // 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(traceBlock) - .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(" --- [")