1
0
mirror of https://github.com/redis/go-redis.git synced 2025-12-05 06:22:07 +03:00
Files
go-redis/example/otel_metrics.go
Elena Kolevska d588c3ca71 First draft. One metric - command duration.
Signed-off-by: Elena Kolevska <elena@kolevska.com>
2025-12-03 10:00:09 +02:00

89 lines
2.3 KiB
Go

// EXAMPLE: otel_metrics
// HIDE_START
package main
import (
"context"
"log"
"strconv"
"time"
redisotel "github.com/redis/go-redis/extra/redisotel-native/v9"
"github.com/redis/go-redis/v9"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
"go.opentelemetry.io/otel/sdk/metric"
)
// ExampleClient_otel_metrics demonstrates how to enable OpenTelemetry metrics
// for Redis operations and export them to an OTLP collector.
func main() {
ctx := context.Background()
// HIDE_END
// STEP_START otel_exporter_setup
// Create OTLP exporter that sends metrics to the collector
// Default endpoint is localhost:4317 (gRPC)
exporter, err := otlpmetricgrpc.New(ctx,
otlpmetricgrpc.WithInsecure(), // Use insecure for local development
// For production, configure TLS and authentication:
// otlpmetricgrpc.WithEndpoint("your-collector:4317"),
// otlpmetricgrpc.WithTLSCredentials(...),
)
if err != nil {
log.Fatalf("Failed to create OTLP exporter: %v", err)
}
// STEP_END
// STEP_START otel_meter_provider
// Create meter provider with periodic reader
// Metrics are exported every 10 seconds
meterProvider := metric.NewMeterProvider(
metric.WithReader(
metric.NewPeriodicReader(exporter,
metric.WithInterval(10*time.Second),
),
),
)
defer func() {
if err := meterProvider.Shutdown(ctx); err != nil {
log.Printf("Error shutting down meter provider: %v", err)
}
}()
// Set the global meter provider
otel.SetMeterProvider(meterProvider)
// STEP_END
// STEP_START redis_client_setup
// Create Redis client
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
defer rdb.Close()
// Initialize OTel instrumentation (uses global meter provider)
if err := redisotel.Init(rdb); err != nil {
log.Fatalf("Failed to initialize OTel: %v", err)
}
defer redisotel.Shutdown()
// STEP_END
// STEP_START redis_operations
// Execute Redis operations - metrics are automatically collected
log.Println("Executing Redis operations...")
for i := range 100 {
if err := rdb.Set(ctx, "key"+strconv.Itoa(i), "value", 0).Err(); err != nil {
log.Printf("Error setting key: %v", err)
}
time.Sleep(time.Millisecond * 100)
}
log.Println("Operations complete. Waiting for metrics to be exported...")
// Wait for metrics to be exported
time.Sleep(15 * time.Second)
// STEP_END
}