Skip to content

Commit 86b3c4d

Browse files
committed
Initial trace id using a bit of a hack.
1 parent 86cf055 commit 86b3c4d

8 files changed

Lines changed: 150 additions & 13 deletions

File tree

cda-gui/package-lock.json

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cwms-data-api/build.gradle

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ dependencies {
7575
implementation(libs.google.flogger.api)
7676
implementation(libs.google.findbugs)
7777
implementation(libs.google.errorProne)
78-
runtimeOnly(libs.google.flogger.backend)
78+
runtimeOnly(libs.google.flogger.system.backend)
79+
runtimeOnly(libs.google.flogger.slf4j.backend)
80+
runtimeOnly(libs.ch.qos.logback)
7981

8082
implementation(libs.nucleus.data) {
8183
exclude group: "org.jdom"
@@ -154,15 +156,15 @@ dependencies {
154156
tomcatLibs(libs.bundles.tomcat.embedded)
155157
tomcatLibs(libs.bundles.tomcat.support)
156158
tomcatLibs(libs.google.flogger.api)
157-
tomcatLibs(libs.google.flogger.backend)
159+
tomcatLibs(libs.google.flogger.system.backend)
160+
tomcatLibs(libs.google.flogger.slf4j.backend)
161+
tomcatLibs(libs.ch.qos.logback)
158162

159163
testImplementation(libs.bundles.testcontainers)
160164

161165
testImplementation(libs.apache.commons.csv)
162166
testImplementation(libs.cwms.tomcat.auth)
163-
testImplementation(libs.apache.freemarker)
164-
165-
testRuntimeOnly("org.slf4j:slf4j-jdk14:2.0.16")
167+
testImplementation(libs.apache.freemarker)
166168

167169
webjars(project(":cda-gui"))
168170

@@ -256,6 +258,7 @@ task run(type: JavaExec) {
256258
args "$buildDir/tomcat", "$buildDir/libs/${project.name}-${project.version}.war", context
257259
jvmArgs += "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
258260
jvmArgs += "-Djava.util.logging.config.file=$projectDir/logging.properties"
261+
jvmArgs += "-Dlogback.configurationFile=${projectDir}/logback.xml"
259262
jvmArgs += "-DTOMCAT_RESOURCES=$buildDir/tomcat/conf/context.xml"
260263
jvmArgs += "-Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource"
261264
jvmArgs += "-Dcatalina.base=$buildDir/tomcat"
@@ -285,6 +288,7 @@ task integrationTests(type: Test) {
285288
jvmArgs += "-DwarContext=/cwms-data"
286289
jvmArgs += "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
287290
jvmArgs += "-Djava.util.logging.config.file=$projectDir/logging.properties"
291+
jvmArgs += "-Dlogback.configurationFile=${projectDir}/logback.xml"
288292
jvmArgs += "-Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource"
289293
jvmArgs += "-Dcwms.dataapi.access.provider=MultipleAccessManager"
290294
jvmArgs += "-Dcwms.dataapi.access.providers=KeyAccessManager,CwmsAccessManager"

cwms-data-api/logback.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE configuration>
3+
<configuration>
4+
<import class="ch.qos.logback.classic.encoder.JsonEncoder"/>
5+
<import class="ch.qos.logback.core.ConsoleAppender"/>
6+
<import class="ch.qos.logback.core.FileAppender"/>
7+
<variable name="LOG_LEVEL" value="${LOG_LEVEL:-FINE}"/>
8+
<contextName>CWMS-Data-API</contextName>
9+
<appender name="STDERR" class="ConsoleAppender">
10+
<encoder class="JsonEncoder"/>
11+
<target>System.err</target>
12+
</appender>
13+
14+
<appender name="FILE" class="FileAppender">
15+
<encoder class="JsonEncoder"/>
16+
<append>false</append>
17+
<immediateFlush>true</immediateFlush>
18+
<file>build/cda.log</file>
19+
</appender>
20+
21+
<logger name="cwms.cda" level="${LOG_LEVEL}"/>
22+
<logger name="fixtures" level="${LOG_LEVEL}"/>
23+
<logger name="org.apache" level="ERROR"/>
24+
25+
<root level="INFO">
26+
<appender-ref ref="STDERR"/>
27+
<appender-ref ref="FILE"/>
28+
</root>
29+
</configuration>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package cwms.cda.logging;
2+
3+
import java.io.IOException;
4+
import java.util.UUID;
5+
import java.util.regex.Pattern;
6+
7+
import javax.servlet.Filter;
8+
import javax.servlet.FilterChain;
9+
import javax.servlet.ServletException;
10+
import javax.servlet.ServletRequest;
11+
import javax.servlet.ServletResponse;
12+
import javax.servlet.annotation.WebFilter;
13+
import javax.servlet.http.HttpServletRequest;
14+
15+
import org.slf4j.MDC;
16+
17+
import com.google.common.flogger.MetadataKey;
18+
import com.google.common.flogger.context.ScopedLoggingContext;
19+
import com.google.common.flogger.context.ScopedLoggingContexts;
20+
21+
@WebFilter("/*")
22+
public class TraceIdFilter implements Filter
23+
{
24+
public static final String CONTEXT_TRACE_ID = "traceID";
25+
public static final String HEADER_TRACE_ID = "X-Trace-ID";
26+
27+
public static final Pattern UUID_MATCHER = Pattern.compile("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}");
28+
29+
@Override
30+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
31+
throws IOException, ServletException {
32+
if (request instanceof HttpServletRequest) {
33+
var httpRequest = (HttpServletRequest)request;
34+
35+
var xTraceId = httpRequest.getHeader(HEADER_TRACE_ID);
36+
String traceId = null;
37+
if (xTraceId == null || xTraceId.isBlank())
38+
{
39+
traceId = UUID.randomUUID().toString();
40+
}
41+
else
42+
{
43+
traceId = validate(xTraceId); //well that needs some validation.
44+
}
45+
try (var idContext = MDC.putCloseable("traceId", traceId)) {
46+
chain.doFilter(httpRequest, response);
47+
}
48+
// ScopedLoggingContexts.newContext()
49+
// .withMetadata(MetadataKey.single("traceId", String.class), traceId)
50+
// .callUnchecked(() -> {
51+
// chain.doFilter(httpRequest, response);
52+
// return null;
53+
// });
54+
} else {
55+
chain.doFilter(request, response);
56+
}
57+
}
58+
59+
private static String validate(String id) throws IOException
60+
{
61+
if (UUID_MATCHER.matcher(id).matches())
62+
{
63+
return id;
64+
}
65+
else
66+
{
67+
throw new IOException("Trace id '" + id + "' is not a valid UUIDish value.");
68+
}
69+
}
70+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE configuration>
3+
<configuration>
4+
<import class="ch.qos.logback.classic.encoder.JsonEncoder"/>
5+
<import class="ch.qos.logback.core.ConsoleAppender"/>
6+
<variable name="APP_NAME" value="${APP_NAME:-app}"/>
7+
<variable name="LOG_LEVEL" value="${LOG_LEVEL:-INFO}"/>
8+
<contextName>${APP_NAME}</contextName>
9+
<appender name="STDERR" class="ConsoleAppender">
10+
<encoder class="JsonEncoder"/>
11+
<target>System.err</target>
12+
</appender>
13+
14+
<root level="${LOG_LEVEL}">
15+
<appender-ref ref="STDERR"/>
16+
</root>
17+
</configuration>

cwms-data-api/src/test/java/cwms/cda/api/DataApiTestIT.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,18 @@ private static Template loadTemplateFromResource(String resource) throws Excepti
153153
@BeforeAll
154154
public static void load_queries() throws Exception {
155155
createLocationQuery = IOUtils.toString(
156-
TimeseriesControllerTestIT.class
156+
TimeSeriesControllerTestIT.class
157157
.getClassLoader()
158158
.getResourceAsStream("cwms/cda/data/sql_templates/create_location.sql"), "UTF-8"
159159
);
160160
createTimeseriesQuery = IOUtils.toString(
161-
TimeseriesControllerTestIT.class
161+
TimeSeriesControllerTestIT.class
162162
.getClassLoader()
163163
.getResourceAsStream("cwms/cda/data/sql_templates/create_timeseries.sql"), "UTF-8"
164164
);
165165

166166
createTimeseriesOffsetQuery = IOUtils.toString(
167-
TimeseriesControllerTestIT.class
167+
TimeSeriesControllerTestIT.class
168168
.getClassLoader()
169169
.getResourceAsStream("cwms/cda/data/sql_templates/create_timeseries_offset.sql"), "UTF-8"
170170
);

cwms-data-api/src/test/java/cwms/cda/api/TimeseriesControllerTestIT.java renamed to cwms-data-api/src/test/java/cwms/cda/api/TimeSeriesControllerTestIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
import java.util.List;
6868

6969
@Tag("integration")
70-
final class TimeseriesControllerTestIT extends DataApiTestIT {
70+
final class TimeSeriesControllerTestIT extends DataApiTestIT {
7171
public static final int MINIMUM_SCHEMA = 999999;
7272

7373
@Test

gradle/libs.versions.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ jooq = "3.18.7-jdk11"
77
slf4j = "2.0.9"
88
hec-monolith = "3.3.20"
99
hec-nucleus = "2.0.1"
10-
flogger = "0.7.4"
10+
flogger = "0.9"
11+
logback = "1.4.14"
1112
google-findbugs = "3.0.2"
1213
error_prone_annotations = "2.15.0"
1314
cwms-ratings = "4.2.3"
@@ -55,10 +56,12 @@ jaxb-core = { module = "com.sun.xml.bind:jaxb-core", version.ref = "jaxb-impl" }
5556
cwms-db-jooq-codegen = { module = "mil.army.usace.hec:cwms-db-jooq-codegen_java11", version.ref = "jooq-codegen" }
5657
cwms-db-jooq-codegen-shadow = { module = "mil.army.usace.hec:cwms-db-jooq-codegen_java8", version.ref = "jooq-codegen-shadow" }
5758
jooq = { module = "org.jooq.pro-java-11:jooq", version.ref ="jooq" }
58-
slf4j = { module = "org.slf4j:slf4j-jdk14", version.ref = "slf4j" }
59+
slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
5960
monolith = { module = "mil.army.usace.hec:hec-monolith", version.ref = "hec-monolith" }
6061
google-flogger-api = { module = "com.google.flogger:flogger", version.ref = "flogger" }
61-
google-flogger-backend = { module = "com.google.flogger:flogger-system-backend", version.ref = "flogger" }
62+
google-flogger-system-backend = { module = "com.google.flogger:flogger-system-backend", version.ref = "flogger" }
63+
google-flogger-slf4j-backend = { module = "com.google.flogger:flogger-slf4j-backend", version.ref = "flogger" }
64+
ch-qos-logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
6265
google-findbugs = { module = "com.google.code.findbugs:jsr305", version.ref = "google-findbugs" }
6366
google-errorProne = { module = "com.google.errorprone:error_prone_annotations", version.ref = "error_prone_annotations"}
6467
nucleus-data = { module = "mil.army.usace.hec:hec-nucleus-data", version.ref = "hec-nucleus" }

0 commit comments

Comments
 (0)