7
7
8
8
import static io .opentelemetry .sdk .testing .assertj .LogAssertions .assertThat ;
9
9
import static org .assertj .core .api .Assertions .as ;
10
+ import static org .assertj .core .api .Assertions .entry ;
10
11
import static org .mockito .Mockito .mock ;
11
12
import static org .mockito .Mockito .times ;
12
13
import static org .mockito .Mockito .verify ;
21
22
import io .opentelemetry .api .trace .TraceFlags ;
22
23
import io .opentelemetry .api .trace .TraceState ;
23
24
import io .opentelemetry .context .Context ;
25
+ import io .opentelemetry .context .ContextKey ;
26
+ import io .opentelemetry .context .Scope ;
24
27
import io .opentelemetry .internal .testing .slf4j .SuppressLogger ;
25
28
import io .opentelemetry .sdk .common .Clock ;
26
29
import io .opentelemetry .sdk .common .CompletableResultCode ;
29
32
import io .opentelemetry .sdk .resources .Resource ;
30
33
import java .util .ArrayList ;
31
34
import java .util .List ;
35
+ import java .util .Optional ;
32
36
import java .util .concurrent .TimeUnit ;
33
37
import java .util .concurrent .atomic .AtomicReference ;
34
38
import org .assertj .core .api .InstanceOfAssertFactories ;
@@ -222,7 +226,7 @@ void loggerBuilder_WithLogRecordProcessor() {
222
226
SdkLoggerProvider .builder ()
223
227
.setResource (resource )
224
228
.addLogRecordProcessor (
225
- logRecord -> {
229
+ ( unused , logRecord ) -> {
226
230
logRecord .setAttribute (null , null );
227
231
// Overwrite k1
228
232
logRecord .setAttribute (AttributeKey .stringKey ("k1" ), "new-v1" );
@@ -262,6 +266,50 @@ void loggerBuilder_WithLogRecordProcessor() {
262
266
Attributes .builder ().put ("k1" , "new-v1" ).put ("k2" , "v2" ).put ("k3" , "v3" ).build ());
263
267
}
264
268
269
+ @ Test
270
+ void loggerBuilder_ProcessorWithContext () {
271
+ ContextKey <String > contextKey = ContextKey .named ("my-context-key" );
272
+ AtomicReference <LogRecordData > logRecordData = new AtomicReference <>();
273
+
274
+ sdkLoggerProvider =
275
+ SdkLoggerProvider .builder ()
276
+ .addLogRecordProcessor (
277
+ (context , logRecord ) ->
278
+ logRecord .setAttribute (
279
+ AttributeKey .stringKey ("my-context-key" ),
280
+ Optional .ofNullable (context .get (contextKey )).orElse ("" )))
281
+ .addLogRecordProcessor (
282
+ (unused , logRecord ) -> logRecordData .set (logRecord .toLogRecordData ()))
283
+ .build ();
284
+
285
+ // With implicit context
286
+ try (Scope unused = Context .current ().with (contextKey , "context-value1" ).makeCurrent ()) {
287
+ sdkLoggerProvider
288
+ .loggerBuilder ("test" )
289
+ .build ()
290
+ .logRecordBuilder ()
291
+ .setBody ("log message1" )
292
+ .emit ();
293
+ }
294
+ assertThat (logRecordData .get ())
295
+ .hasBody ("log message1" )
296
+ .hasAttributes (entry (AttributeKey .stringKey ("my-context-key" ), "context-value1" ));
297
+
298
+ // With explicit context
299
+ try (Scope unused = Context .current ().with (contextKey , "context-value2" ).makeCurrent ()) {
300
+ sdkLoggerProvider
301
+ .loggerBuilder ("test" )
302
+ .build ()
303
+ .logRecordBuilder ()
304
+ .setContext (Context .current ())
305
+ .setBody ("log message2" )
306
+ .emit ();
307
+ }
308
+ assertThat (logRecordData .get ())
309
+ .hasBody ("log message2" )
310
+ .hasAttributes (entry (AttributeKey .stringKey ("my-context-key" ), "context-value2" ));
311
+ }
312
+
265
313
@ Test
266
314
void forceFlush () {
267
315
sdkLoggerProvider .forceFlush ();
@@ -288,7 +336,7 @@ void canSetClock() {
288
336
Clock clock = mock (Clock .class );
289
337
when (clock .now ()).thenReturn (now );
290
338
List <ReadWriteLogRecord > seenLogs = new ArrayList <>();
291
- logRecordProcessor = seenLogs :: add ;
339
+ logRecordProcessor = ( context , logRecord ) -> seenLogs . add ( logRecord ) ;
292
340
sdkLoggerProvider =
293
341
SdkLoggerProvider .builder ()
294
342
.setClock (clock )
0 commit comments