mirror of
https://github.com/redis/go-redis.git
synced 2025-12-05 06:22:07 +03:00
First draft. One metric - command duration.
Signed-off-by: Elena Kolevska <elena@kolevska.com>
This commit is contained in:
committed by
ofekshenawa
parent
dc053a42c6
commit
d588c3ca71
88
example/otel_metrics.go
Normal file
88
example/otel_metrics.go
Normal file
@@ -0,0 +1,88 @@
|
||||
// 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user