Skip to content

Commit 5ba79fc

Browse files
committed
feat: extract MDC from Context in "contextWrite" and thus simplifies context writing
1 parent 42b18d0 commit 5ba79fc

File tree

3 files changed

+102
-28
lines changed

3 files changed

+102
-28
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=2.0.1
1+
version=2.1.0
22
group=io.github.numichi
33
developerId=numichi
44
developerName=Donát Csongor

src/main/java/io/github/numichi/reactive/logger/reactor/MDCContext.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,26 @@ object MDCContext {
2323
return newContext
2424
}
2525

26+
@JvmStatic
27+
fun getMDCOrNull(context: ContextView): MDC? {
28+
return getMDCOrNull(context, DefaultValues.getInstance().defaultReactorContextMdcKey)
29+
}
30+
31+
@JvmStatic
32+
fun getMDCOrNull(context: ContextView, mdcContextKey: Any): MDC? {
33+
return runCatching { context.get<MDC>(mdcContextKey) }.getOrNull()
34+
}
35+
36+
@JvmStatic
37+
fun getMDCOrDefault(context: ContextView, mdcContextKey: Any): MDC {
38+
return getMDCOrNull(context, mdcContextKey) ?: MDC(mdcContextKey.toString())
39+
}
40+
41+
@JvmStatic
42+
fun getMDCOrDefault(context: ContextView): MDC {
43+
return getMDCOrNull(context) ?: MDC()
44+
}
45+
2646
@JvmStatic
2747
fun read(): Mono<MDC> {
2848
return read(DefaultValues.getInstance().defaultReactorContextMdcKey)

src/test/java/io/github/numichi/reactive/logger/reactor/MDCContextTest.kt

Lines changed: 81 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package io.github.numichi.reactive.logger.reactor
33
import io.github.numichi.reactive.logger.DefaultValues
44
import io.github.numichi.reactive.logger.MDC
55
import io.github.numichi.reactive.logger.exception.InvalidContextDataException
6-
import io.github.numichi.reactive.logger.reactor.MDCContext.put
7-
import io.github.numichi.reactive.logger.reactor.MDCContext.read
86
import org.junit.jupiter.api.Test
97
import reactor.core.publisher.Mono
108
import reactor.test.StepVerifier
@@ -18,26 +16,26 @@ internal class MDCContextTest {
1816
val mdc2 = MDC(ANOTHER_CONTEXT_KEY)
1917
mdc2["mdcKey"] = "mdcValue"
2018

21-
val resultDefaultByContext: Mono<MDC> = Mono.deferContextual { read(it) }
22-
.contextWrite { put(it, mdc1) }
19+
val resultDefaultByContext: Mono<MDC> = Mono.deferContextual { MDCContext.read(it) }
20+
.contextWrite { MDCContext.put(it, mdc1) }
2321
StepVerifier.create(resultDefaultByContext)
2422
.expectNext(mdc1)
2523
.verifyComplete()
2624

27-
val resultDefault: Mono<MDC> = Mono.defer { read() }
28-
.contextWrite { put(it, mdc1) }
25+
val resultDefault: Mono<MDC> = MDCContext.read()
26+
.contextWrite { MDCContext.put(it, mdc1) }
2927
StepVerifier.create(resultDefault)
3028
.expectNext(mdc1)
3129
.verifyComplete()
3230

33-
val resultAnotherByContext: Mono<MDC> = Mono.deferContextual { read(it, ANOTHER_CONTEXT_KEY) }
34-
.contextWrite { put(it, mdc2) }
31+
val resultAnotherByContext: Mono<MDC> = Mono.deferContextual { MDCContext.read(it, ANOTHER_CONTEXT_KEY) }
32+
.contextWrite { MDCContext.put(it, mdc2) }
3533
StepVerifier.create(resultAnotherByContext)
3634
.expectNext(mdc2)
3735
.verifyComplete()
3836

39-
val resultAnother: Mono<MDC> = Mono.defer { read(ANOTHER_CONTEXT_KEY) }
40-
.contextWrite { put(it, mdc2) }
37+
val resultAnother: Mono<MDC> = MDCContext.read(ANOTHER_CONTEXT_KEY)
38+
.contextWrite { MDCContext.put(it, mdc2) }
4139
StepVerifier.create(resultAnother)
4240
.expectNext(mdc2)
4341
.verifyComplete()
@@ -52,49 +50,105 @@ internal class MDCContextTest {
5250
anotherMdc["mdcKey"] = "mdcValue"
5351

5452
val contextSize1 = Mono.deferContextual { Mono.just(it.size()) }
55-
.contextWrite { put(it, defaultMdc) }
56-
.contextWrite { put(it, anotherMdc) }
53+
.contextWrite { MDCContext.put(it, defaultMdc) }
54+
.contextWrite { MDCContext.put(it, anotherMdc) }
5755
StepVerifier.create(contextSize1)
5856
.expectNext(2)
5957
.verifyComplete()
6058

6159
val contextSize2 = Mono.deferContextual { Mono.just(it.size()) }
62-
.contextWrite { put(it, defaultMdc, anotherMdc) }
60+
.contextWrite { MDCContext.put(it, defaultMdc, anotherMdc) }
6361
StepVerifier.create(contextSize2)
6462
.expectNext(2)
6563
.verifyComplete()
6664

6765
val contextSize3 = Mono.deferContextual { Mono.just(it.size()) }
68-
.contextWrite { put(it, defaultMdc, null) }
66+
.contextWrite { MDCContext.put(it, defaultMdc, null) }
6967
StepVerifier.create(contextSize3)
7068
.expectNext(1)
7169
.verifyComplete()
7270

7371
val contextSize4 = Mono.deferContextual { Mono.just(it.size()) }
74-
.contextWrite { put(it, defaultMdc, null) }
72+
.contextWrite { MDCContext.put(it, defaultMdc, null) }
7573
.contextWrite { it.put("A", "B") }
7674
StepVerifier.create(contextSize4)
7775
.expectNext(2)
7876
.verifyComplete()
7977
}
8078

79+
@Test
80+
fun `should write within writeContext`() {
81+
val data1 = MDCContext.read()
82+
.mapNotNull { it["key"] }
83+
.contextWrite {
84+
val mdc = MDCContext.getMDCOrDefault(it)
85+
mdc["key"] = "example"
86+
MDCContext.put(it, mdc)
87+
}
88+
StepVerifier.create(data1)
89+
.expectNext("example")
90+
.verifyComplete()
91+
92+
val data2 = MDCContext.read("another")
93+
.mapNotNull { it["key"] }
94+
.contextWrite {
95+
val mdc = MDCContext.getMDCOrDefault(it, "another")
96+
mdc["key"] = "example"
97+
MDCContext.put(it, mdc)
98+
}
99+
StepVerifier.create(data2)
100+
.expectNext("example")
101+
.verifyComplete()
102+
103+
val data3 = MDCContext.read()
104+
.mapNotNull { it["key"] }
105+
.contextWrite {
106+
var mdc = MDCContext.getMDCOrNull(it)
107+
if (mdc == null) {
108+
mdc = MDC()
109+
}
110+
111+
mdc["key"] = "example"
112+
MDCContext.put(it, mdc)
113+
}
114+
StepVerifier.create(data3)
115+
.expectNext("example")
116+
.verifyComplete()
117+
118+
val data4 = MDCContext.read("another")
119+
.mapNotNull { it["key"] }
120+
.contextWrite {
121+
var mdc = MDCContext.getMDCOrNull(it, "another")
122+
123+
if (mdc == null) {
124+
mdc = MDC("another")
125+
mdc!!["key"] = "example"
126+
}
127+
128+
MDCContext.put(it, mdc)
129+
}
130+
StepVerifier.create(data4)
131+
.expectNext("example")
132+
.verifyComplete()
133+
}
134+
81135
@Test
82136
fun `should give the MDC you are looking for (more MDC Context)`() {
83137
val defaultMdc = MDC()
84138
defaultMdc["mdcKey"] = "mdcValue"
85139
val anotherMdc = MDC(ANOTHER_CONTEXT_KEY)
86140
anotherMdc["mdcKey"] = "mdcValue"
87141

88-
val resultDefault: Mono<MDC> = Mono.defer { read() }
89-
.contextWrite { put(it, defaultMdc) }
90-
.contextWrite { put(it, anotherMdc) }
142+
val resultDefault: Mono<MDC> = Mono.defer { MDCContext.read() }
143+
.contextWrite { MDCContext.put(it, defaultMdc) }
144+
.contextWrite { MDCContext.put(it, anotherMdc) }
91145
StepVerifier.create(resultDefault)
92146
.expectNext(defaultMdc)
93147
.verifyComplete()
94148

95-
val resultAnother: Mono<MDC> = Mono.defer { read(ANOTHER_CONTEXT_KEY) }
96-
.contextWrite { put(it, defaultMdc) }
97-
.contextWrite { put(it, anotherMdc) }
149+
val resultAnother: Mono<MDC> = Mono.defer { MDCContext.read(ANOTHER_CONTEXT_KEY) }
150+
.contextWrite { MDCContext.put(it, defaultMdc) }
151+
.contextWrite { MDCContext.put(it, anotherMdc) }
98152
StepVerifier.create(resultAnother)
99153
.expectNext(anotherMdc)
100154
.verifyComplete()
@@ -105,26 +159,26 @@ internal class MDCContextTest {
105159
val mdc = MDC(ANOTHER_CONTEXT_KEY)
106160
mdc["mdcKey2"] = "mdcValue2"
107161

108-
val result1: Mono<MDC> = Mono.defer { read() }
109-
.contextWrite { put(it, mdc) }
162+
val result1: Mono<MDC> = Mono.defer { MDCContext.read() }
163+
.contextWrite { MDCContext.put(it, mdc) }
110164
StepVerifier.create(result1)
111165
.expectError(InvalidContextDataException::class.java)
112166
.verify()
113167

114168

115-
val result2: Mono<MDC> = Mono.defer { read("not-exist-context-id") }
116-
.contextWrite { put(it!!, mdc) }
169+
val result2: Mono<MDC> = Mono.defer { MDCContext.read("not-exist-context-id") }
170+
.contextWrite { MDCContext.put(it!!, mdc) }
117171
StepVerifier.create(result2)
118172
.expectError(InvalidContextDataException::class.java)
119173
.verify()
120174

121-
val result3: Mono<MDC> = Mono.defer { read() }
175+
val result3: Mono<MDC> = Mono.defer { MDCContext.read() }
122176
.contextWrite { it.put(DefaultValues.getInstance().defaultReactorContextMdcKey, "") }
123177
StepVerifier.create(result3)
124178
.expectError(InvalidContextDataException::class.java)
125179
.verify()
126180

127-
val result4: Mono<MDC> = Mono.defer { read() }
181+
val result4: Mono<MDC> = Mono.defer { MDCContext.read() }
128182
.contextWrite { it.put(DefaultValues.getInstance().defaultReactorContextMdcKey, 100) }
129183
StepVerifier.create(result4)
130184
.expectError(InvalidContextDataException::class.java)

0 commit comments

Comments
 (0)