From 8ad6a12bc1732c53479390aa1335700ee85c721e Mon Sep 17 00:00:00 2001 From: Mayur-Rokade78 Date: Tue, 3 Mar 2026 12:50:23 +0530 Subject: [PATCH 1/4] changes --- .../context/RequestContextConstants.java | 4 ++++ .../context/ScanMetadataBuilder.java | 19 +++++++++++++++++++ .../grpcutils/context/RequestContextTest.java | 17 +++++++++++++++++ grpc-server-utils/build.gradle.kts | 1 + grpc-server-utils/gradle.lockfile | 18 ++++++++++-------- ...equestContextLoggingServerInterceptor.java | 4 ++++ 6 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java diff --git a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java index 9dfd39e..e27b230 100644 --- a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java +++ b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java @@ -20,12 +20,16 @@ public class RequestContextConstants { public static final String AUTHORIZATION_HEADER = "authorization"; + public static final String CTX_HEADER_PREFIX = "x-ctx-"; + public static final String CTX_SCAN_ID_HEADER_KEY = "x-ctx-scan-id"; + /** The values in this set are looked up with case insensitivity. */ public static final Set HEADER_PREFIXES_TO_BE_PROPAGATED = Set.of( TENANT_ID_HEADER_KEY, CONTEXT_ID_HEADER_KEY, SUPPRESS_USER_TRACKING_HEADER_KEY, + CTX_HEADER_PREFIX, "X-B3-", "grpc-trace-bin", "traceparent", diff --git a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java new file mode 100644 index 0000000..23a03e4 --- /dev/null +++ b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java @@ -0,0 +1,19 @@ +package org.hypertrace.core.grpcutils.context; + +import static org.hypertrace.core.grpcutils.context.RequestContextConstants.CTX_SCAN_ID_HEADER_KEY; +import static org.hypertrace.core.grpcutils.context.RequestContextConstants.REQUEST_ID_HEADER_KEY; +import static org.hypertrace.core.grpcutils.context.RequestContextConstants.TENANT_ID_HEADER_KEY; + +import io.grpc.Metadata; + +public class ScanMetadataBuilder { + + public static Metadata build(String tenantId, String requestId, String scanId) { + Metadata metadata = new Metadata(); + metadata.put(Metadata.Key.of(TENANT_ID_HEADER_KEY, Metadata.ASCII_STRING_MARSHALLER), tenantId); + metadata.put( + Metadata.Key.of(REQUEST_ID_HEADER_KEY, Metadata.ASCII_STRING_MARSHALLER), requestId); + metadata.put(Metadata.Key.of(CTX_SCAN_ID_HEADER_KEY, Metadata.ASCII_STRING_MARSHALLER), scanId); + return metadata; + } +} diff --git a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java index 165a946..f027124 100644 --- a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java +++ b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java @@ -320,6 +320,23 @@ void testWithUserTrackingSuppressedOverridesExisting() { assertTrue(suppressedContext.isUserTrackingSuppressed()); } + @Test + void testCtxHeadersPropagatedFromMetadata() { + Metadata metadata = new Metadata(); + metadata.put(RequestContextConstants.TENANT_ID_METADATA_KEY, "test-tenant"); + metadata.put(Metadata.Key.of("x-ctx-scan-id", Metadata.ASCII_STRING_MARSHALLER), "scan-123"); + metadata.put(Metadata.Key.of("x-ctx-trace-id", Metadata.ASCII_STRING_MARSHALLER), "trace-456"); + metadata.put( + Metadata.Key.of("x-unknown-header", Metadata.ASCII_STRING_MARSHALLER), "should-be-dropped"); + + RequestContext requestContext = RequestContext.fromMetadata(metadata); + + assertEquals(Optional.of("test-tenant"), requestContext.getTenantId()); + assertEquals(Optional.of("scan-123"), requestContext.getHeaderValue("x-ctx-scan-id")); + assertEquals(Optional.of("trace-456"), requestContext.getHeaderValue("x-ctx-trace-id")); + assertEquals(Optional.empty(), requestContext.getHeaderValue("x-unknown-header")); + } + @Test void testUserTrackingSuppressedHeaderPropagation() { Metadata metadata = new Metadata(); diff --git a/grpc-server-utils/build.gradle.kts b/grpc-server-utils/build.gradle.kts index de8bfed..79e4fd5 100644 --- a/grpc-server-utils/build.gradle.kts +++ b/grpc-server-utils/build.gradle.kts @@ -21,4 +21,5 @@ dependencies { testImplementation(commonLibs.junit.jupiter) testImplementation(commonLibs.mockito.core) testImplementation(commonLibs.mockito.junit) + testRuntimeOnly("ch.qos.logback:logback-classic:1.4.14") } diff --git a/grpc-server-utils/gradle.lockfile b/grpc-server-utils/gradle.lockfile index ffd3b06..29f3554 100644 --- a/grpc-server-utils/gradle.lockfile +++ b/grpc-server-utils/gradle.lockfile @@ -1,12 +1,14 @@ # This is a Gradle generated file for dependency locking. # Manual edits can break the build and are not advised. # This file is expected to be part of source control. +ch.qos.logback:logback-classic:1.4.14=testRuntimeClasspath +ch.qos.logback:logback-core:1.4.14=testRuntimeClasspath com.auth0:java-jwt:4.4.0=runtimeClasspath,testRuntimeClasspath com.auth0:jwks-rsa:0.22.0=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-annotations:2.16.1=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-core:2.16.1=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-databind:2.16.1=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson:jackson-bom:2.16.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.21=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-core:2.21.1=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.21.1=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson:jackson-bom:2.21.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.android:annotations:4.1.1.4=runtimeClasspath,testRuntimeClasspath com.google.code.findbugs:jsr305:3.0.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.code.gson:gson:2.13.1=runtimeClasspath,testRuntimeClasspath @@ -20,16 +22,16 @@ io.grpc:grpc-api:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,t io.grpc:grpc-bom:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.grpc:grpc-context:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.grpc:grpc-core:1.75.0=runtimeClasspath,testRuntimeClasspath -io.netty:netty-bom:4.1.125.Final=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-bom:4.1.130.Final=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.perfmark:perfmark-api:0.27.0=runtimeClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy-agent:1.14.10=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.14.10=testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath org.checkerframework:checker-qual:3.43.0=runtimeClasspath,testRuntimeClasspath org.codehaus.mojo:animal-sniffer-annotations:1.24=runtimeClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-bom:11.0.24=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hypertrace.bom:hypertrace-bom:0.3.65=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hypertrace.core.kafkastreams.framework:kafka-bom:0.6.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-bom:11.0.26=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hypertrace.bom:hypertrace-bom:0.3.73=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hypertrace.core.kafkastreams.framework:kafka-bom:0.6.4=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.junit.jupiter:junit-jupiter-api:5.10.0=testCompileClasspath org.junit.jupiter:junit-jupiter-api:5.10.1=testRuntimeClasspath org.junit.jupiter:junit-jupiter-engine:5.10.1=testRuntimeClasspath diff --git a/grpc-server-utils/src/main/java/org/hypertrace/core/grpcutils/server/RequestContextLoggingServerInterceptor.java b/grpc-server-utils/src/main/java/org/hypertrace/core/grpcutils/server/RequestContextLoggingServerInterceptor.java index 670bf64..a71ab5f 100644 --- a/grpc-server-utils/src/main/java/org/hypertrace/core/grpcutils/server/RequestContextLoggingServerInterceptor.java +++ b/grpc-server-utils/src/main/java/org/hypertrace/core/grpcutils/server/RequestContextLoggingServerInterceptor.java @@ -1,6 +1,7 @@ package org.hypertrace.core.grpcutils.server; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.CONTEXT_ID_HEADER_KEY; +import static org.hypertrace.core.grpcutils.context.RequestContextConstants.CTX_HEADER_PREFIX; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.REQUEST_ID_HEADER_KEY; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.TENANT_ID_HEADER_KEY; @@ -69,6 +70,9 @@ public void onMessage(ReqT message) { MDC.put(REQUEST_ID_HEADER_KEY, requestId); opTenantId.ifPresent(s -> MDC.put(TENANT_ID_HEADER_KEY, s)); opContextId.ifPresent(s -> MDC.put(CONTEXT_ID_HEADER_KEY, s)); + currentContext.getAllHeaders().stream() + .filter(header -> header.getName().startsWith(CTX_HEADER_PREFIX)) + .forEach(header -> MDC.put(header.getName(), header.getValue())); } catch (Exception e) { log.error("Error while setting request context details in MDC params", e); } From da6be4767a45b71569f61f8bb2e4b7f2cc66b44a Mon Sep 17 00:00:00 2001 From: Mayur-Rokade78 Date: Tue, 3 Mar 2026 13:40:45 +0530 Subject: [PATCH 2/4] changes --- .../core/grpcutils/context/RequestContextConstants.java | 1 - .../hypertrace/core/grpcutils/context/ScanMetadataBuilder.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java index e27b230..d713bcf 100644 --- a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java +++ b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/RequestContextConstants.java @@ -21,7 +21,6 @@ public class RequestContextConstants { public static final String AUTHORIZATION_HEADER = "authorization"; public static final String CTX_HEADER_PREFIX = "x-ctx-"; - public static final String CTX_SCAN_ID_HEADER_KEY = "x-ctx-scan-id"; /** The values in this set are looked up with case insensitivity. */ public static final Set HEADER_PREFIXES_TO_BE_PROPAGATED = diff --git a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java index 23a03e4..c84b550 100644 --- a/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java +++ b/grpc-context-utils/src/main/java/org/hypertrace/core/grpcutils/context/ScanMetadataBuilder.java @@ -1,6 +1,5 @@ package org.hypertrace.core.grpcutils.context; -import static org.hypertrace.core.grpcutils.context.RequestContextConstants.CTX_SCAN_ID_HEADER_KEY; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.REQUEST_ID_HEADER_KEY; import static org.hypertrace.core.grpcutils.context.RequestContextConstants.TENANT_ID_HEADER_KEY; @@ -8,6 +7,8 @@ public class ScanMetadataBuilder { + public static final String CTX_SCAN_ID_HEADER_KEY = "x-ctx-scan-id"; + public static Metadata build(String tenantId, String requestId, String scanId) { Metadata metadata = new Metadata(); metadata.put(Metadata.Key.of(TENANT_ID_HEADER_KEY, Metadata.ASCII_STRING_MARSHALLER), tenantId); From 5085a8ca77190d13f35b41b9262e30fb545dd863 Mon Sep 17 00:00:00 2001 From: Mayur-Rokade78 Date: Tue, 3 Mar 2026 15:17:22 +0530 Subject: [PATCH 3/4] nit --- .../grpcutils/context/RequestContextTest.java | 17 ----------------- grpc-server-utils/build.gradle.kts | 1 - grpc-server-utils/gradle.lockfile | 2 -- settings-gradle.lockfile | 5 +++++ 4 files changed, 5 insertions(+), 20 deletions(-) create mode 100644 settings-gradle.lockfile diff --git a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java index f027124..165a946 100644 --- a/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java +++ b/grpc-context-utils/src/test/java/org/hypertrace/core/grpcutils/context/RequestContextTest.java @@ -320,23 +320,6 @@ void testWithUserTrackingSuppressedOverridesExisting() { assertTrue(suppressedContext.isUserTrackingSuppressed()); } - @Test - void testCtxHeadersPropagatedFromMetadata() { - Metadata metadata = new Metadata(); - metadata.put(RequestContextConstants.TENANT_ID_METADATA_KEY, "test-tenant"); - metadata.put(Metadata.Key.of("x-ctx-scan-id", Metadata.ASCII_STRING_MARSHALLER), "scan-123"); - metadata.put(Metadata.Key.of("x-ctx-trace-id", Metadata.ASCII_STRING_MARSHALLER), "trace-456"); - metadata.put( - Metadata.Key.of("x-unknown-header", Metadata.ASCII_STRING_MARSHALLER), "should-be-dropped"); - - RequestContext requestContext = RequestContext.fromMetadata(metadata); - - assertEquals(Optional.of("test-tenant"), requestContext.getTenantId()); - assertEquals(Optional.of("scan-123"), requestContext.getHeaderValue("x-ctx-scan-id")); - assertEquals(Optional.of("trace-456"), requestContext.getHeaderValue("x-ctx-trace-id")); - assertEquals(Optional.empty(), requestContext.getHeaderValue("x-unknown-header")); - } - @Test void testUserTrackingSuppressedHeaderPropagation() { Metadata metadata = new Metadata(); diff --git a/grpc-server-utils/build.gradle.kts b/grpc-server-utils/build.gradle.kts index 79e4fd5..de8bfed 100644 --- a/grpc-server-utils/build.gradle.kts +++ b/grpc-server-utils/build.gradle.kts @@ -21,5 +21,4 @@ dependencies { testImplementation(commonLibs.junit.jupiter) testImplementation(commonLibs.mockito.core) testImplementation(commonLibs.mockito.junit) - testRuntimeOnly("ch.qos.logback:logback-classic:1.4.14") } diff --git a/grpc-server-utils/gradle.lockfile b/grpc-server-utils/gradle.lockfile index 29f3554..cf3c7fa 100644 --- a/grpc-server-utils/gradle.lockfile +++ b/grpc-server-utils/gradle.lockfile @@ -1,8 +1,6 @@ # This is a Gradle generated file for dependency locking. # Manual edits can break the build and are not advised. # This file is expected to be part of source control. -ch.qos.logback:logback-classic:1.4.14=testRuntimeClasspath -ch.qos.logback:logback-core:1.4.14=testRuntimeClasspath com.auth0:java-jwt:4.4.0=runtimeClasspath,testRuntimeClasspath com.auth0:jwks-rsa:0.22.0=runtimeClasspath,testRuntimeClasspath com.fasterxml.jackson.core:jackson-annotations:2.21=runtimeClasspath,testRuntimeClasspath diff --git a/settings-gradle.lockfile b/settings-gradle.lockfile new file mode 100644 index 0000000..b1d5896 --- /dev/null +++ b/settings-gradle.lockfile @@ -0,0 +1,5 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +org.hypertrace.bom:hypertrace-version-catalog:0.3.52=incomingCatalogForCommonLibs0 +empty=incomingCatalogForLocalLibs0 From de6ab58fc8192ed2bd3c707e212e300e84a295cb Mon Sep 17 00:00:00 2001 From: Mayur-Rokade78 Date: Tue, 3 Mar 2026 15:19:45 +0530 Subject: [PATCH 4/4] nit --- grpc-server-utils/gradle.lockfile | 16 ++++++++-------- settings-gradle.lockfile | 5 ----- 2 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 settings-gradle.lockfile diff --git a/grpc-server-utils/gradle.lockfile b/grpc-server-utils/gradle.lockfile index cf3c7fa..ffd3b06 100644 --- a/grpc-server-utils/gradle.lockfile +++ b/grpc-server-utils/gradle.lockfile @@ -3,10 +3,10 @@ # This file is expected to be part of source control. com.auth0:java-jwt:4.4.0=runtimeClasspath,testRuntimeClasspath com.auth0:jwks-rsa:0.22.0=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-annotations:2.21=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-core:2.21.1=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-databind:2.21.1=runtimeClasspath,testRuntimeClasspath -com.fasterxml.jackson:jackson-bom:2.21.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.16.1=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-core:2.16.1=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.16.1=runtimeClasspath,testRuntimeClasspath +com.fasterxml.jackson:jackson-bom:2.16.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.android:annotations:4.1.1.4=runtimeClasspath,testRuntimeClasspath com.google.code.findbugs:jsr305:3.0.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.google.code.gson:gson:2.13.1=runtimeClasspath,testRuntimeClasspath @@ -20,16 +20,16 @@ io.grpc:grpc-api:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,t io.grpc:grpc-bom:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.grpc:grpc-context:1.75.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.grpc:grpc-core:1.75.0=runtimeClasspath,testRuntimeClasspath -io.netty:netty-bom:4.1.130.Final=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +io.netty:netty-bom:4.1.125.Final=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath io.perfmark:perfmark-api:0.27.0=runtimeClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy-agent:1.14.10=testCompileClasspath,testRuntimeClasspath net.bytebuddy:byte-buddy:1.14.10=testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath org.checkerframework:checker-qual:3.43.0=runtimeClasspath,testRuntimeClasspath org.codehaus.mojo:animal-sniffer-annotations:1.24=runtimeClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-bom:11.0.26=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hypertrace.bom:hypertrace-bom:0.3.73=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hypertrace.core.kafkastreams.framework:kafka-bom:0.6.4=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-bom:11.0.24=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hypertrace.bom:hypertrace-bom:0.3.65=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hypertrace.core.kafkastreams.framework:kafka-bom:0.6.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.junit.jupiter:junit-jupiter-api:5.10.0=testCompileClasspath org.junit.jupiter:junit-jupiter-api:5.10.1=testRuntimeClasspath org.junit.jupiter:junit-jupiter-engine:5.10.1=testRuntimeClasspath diff --git a/settings-gradle.lockfile b/settings-gradle.lockfile deleted file mode 100644 index b1d5896..0000000 --- a/settings-gradle.lockfile +++ /dev/null @@ -1,5 +0,0 @@ -# This is a Gradle generated file for dependency locking. -# Manual edits can break the build and are not advised. -# This file is expected to be part of source control. -org.hypertrace.bom:hypertrace-version-catalog:0.3.52=incomingCatalogForCommonLibs0 -empty=incomingCatalogForLocalLibs0