mirror of
https://github.com/redis/go-redis.git
synced 2025-12-05 06:22:07 +03:00
89 lines
2.3 KiB
Go
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
|
|
}
|
|
|