diff --git a/sdk/log/example_test.go b/sdk/log/example_test.go index fa3b283575d..4210a7fe54b 100644 --- a/sdk/log/example_test.go +++ b/sdk/log/example_test.go @@ -11,6 +11,55 @@ import ( logsdk "go.opentelemetry.io/otel/sdk/log" ) +// Use a processor that filters out records based on the provided context. +func ExampleProcessor_filtering() { + // Existing processor that emits telemetry. + var processor logsdk.Processor = logsdk.NewBatchProcessor(nil) + + // Wrap the processor so that it ignores processing log records + // when a context deriving from WithIgnoreLogs is passed + // to the logging methods. + processor = &ContextFilterProcessor{processor} + + // The created processor can then be registered with + // the OpenTelemetry Logs SDK using the WithProcessor option. + _ = logsdk.NewLoggerProvider( + logsdk.WithProcessor(processor), + ) +} + +type key struct{} + +var igoreLogsKey key + +// WithIgnoreLogs returns a context which is used by [ContextFilterProcessor] +// to filter out log records. +func WithIgnoreLogs(ctx context.Context) context.Context { + return context.WithValue(ctx, igoreLogsKey, true) +} + +// ContextFilterProcessor filters out logs when a context deriving from +// [WithIgnoreLogs] is passed to its methods. +type ContextFilterProcessor struct { + logsdk.Processor +} + +func (p *ContextFilterProcessor) OnEmit(ctx context.Context, record logsdk.Record) error { + if ignoreLogs(ctx) { + return nil + } + return p.Processor.OnEmit(ctx, record) +} + +func (p *ContextFilterProcessor) Enabled(ctx context.Context, record logsdk.Record) bool { + return !ignoreLogs(ctx) && p.Processor.Enabled(ctx, record) +} + +func ignoreLogs(ctx context.Context) bool { + _, ok := ctx.Value(igoreLogsKey).(bool) + return ok +} + // Use a processor which redacts sensitive data from some attributes. func ExampleProcessor_redact() { // Existing processor that emits telemetry.