-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Page Feedback]: Please add Go examples of how to create LoggerProvider for doing recording and asserting in unit tests #6110
Comments
I am trying to create otel providers for unit testing, to record in-memory metrics, spans, and logs for doing assertions. In my example below, I am trying to create them to use in gofiber unit test, but the same use case for recording all 3 probably applies to other libs that support otel instrumentation too. I found working code for creating TextMapPropagator, MeterProvider, and TracerProvider suitable for unit testing here: However, there are no examples for recording logs and asserting. I did a lot of googling, looking through otel docs and code, but I can't find any working code examples for how to create LoggerProvider for capturing logs, and using it for assertions in unit testing. package main
import (
"github.com/gofiber/contrib/otelfiber/v2"
"github.com/gofiber/fiber/v2"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/log/logtest"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/log"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
"testing"
)
func TestOtelMetersTracersLoggers(t *testing.T) {
metricReader := metric.NewManualReader()
spanRecorder := tracetest.NewSpanRecorder()
logRecorder := logtest.NewRecorder()
// Create otel providers suitable for unit testing
TextMapPropagator := propagation.TraceContext{}
MeterProvider := metric.NewMeterProvider(metric.WithReader(metricReader))
TracerProvider := trace.NewTracerProvider(trace.WithSpanProcessor(spanRecorder))
LoggerProvider := log.NewLoggerProvider(log.WithProcessor(logRecorder)) // COMPILE ERROR: Cannot use logRecorder (type *Recorder) as the type Processor Type does not implement Processor as some methods are missing
otel.SetTextMapPropagator(TextMapPropagator)
otel.SetMeterProvider(MeterProvider)
otel.SetTracerProvider(TracerProvider)
otel.SetLogger(LoggerProvider) // COMPILE ERROR: Cannot use 'LoggerProvider' (type *LoggerProvider) as the type logr. Logger
// Try using the above Otel providers in a library
app := fiber.New()
app.Use(
otelfiber.Middleware(
otelfiber.WithServerName("localhost"),
otelfiber.WithPort(8080),
otelfiber.WithCollectClientIP(true),
otelfiber.WithPropagators(TextMapPropagator),
otelfiber.WithTracerProvider(TracerProvider),
otelfiber.WithMeterProvider(MeterProvider),
otelfiber.WithLoggerProvider(LoggerProvider), // COMPILE ERROR: Unresolved reference 'WithLoggerProvider'
),
)
} It would be great if otel Go docs (and source) could include examples for how to create each of the providers suitable for unit testing. Thank you. |
Note, https://opentelemetry.io/docs/specs/otel/logs/sdk_exporters/ only lists a Standard output exporter for logger. Unfortunately that isn't what I need. For tracing, there is a TracerProvider := trace.NewTracerProvider(trace.WithSpanProcessor(spanRecorder)) // Compiles OK For logger, there is a I had hoped
LoggerProvider := log.NewLoggerProvider(log.WithProcessor(logRecorder)) // Compile fails
LoggerProvider := log.NewLoggerProvider(log.WithProcessor(log.NewSimpleProcessor(logRecorder))) // Compile fails LoggerProvider := log.NewLoggerProvider(log.WithProcessor(log.NewBatchProcessor(logRecorder))) // Compile fails |
@open-telemetry/go-approvers PTAL |
@jcranfordbeyondtrust
Probably you want https://pkg.go.dev/go.opentelemetry.io/otel/log/logtest#Recorder for testing instrumentation. |
URL
https://opentelemetry.io/docs/specs/otel/logs/sdk_exporters/
Description
Need example of how to create an in-memory log.NewLoggerProvider, for use in unit tests.
Only a stdout exporter is present in the docs.
The text was updated successfully, but these errors were encountered: