An OpenTelemetry logger implementation for Casbin, providing event-driven metrics collection for authorization events.
- Event-Driven Logging: Implements the Casbin Logger interface with support for event-driven logging
- OpenTelemetry Metrics: Exports comprehensive metrics using the OpenTelemetry standard
- Customizable Event Types: Filter which event types to log
- Custom Callbacks: Add custom processing for log entries
- Context Support: Support for custom contexts for propagation and cancellation
casbin.enforce.total- Total number of enforce requests (labeled byallowed,domain)casbin.enforce.duration- Duration of enforce requests in seconds (labeled byallowed,domain)
casbin.policy.operations.total- Total number of policy operations (labeled byoperation,success)casbin.policy.operations.duration- Duration of policy operations in seconds (labeled byoperation)casbin.policy.rules.count- Number of policy rules affected by operations (labeled byoperation)
go get github.com/casbin/casbin-opentelemetry-loggerpackage main
import (
"context"
opentelemetrylogger "github.com/casbin/casbin-opentelemetry-logger"
"go.opentelemetry.io/otel"
)
func main() {
// Get a meter from your OpenTelemetry provider
meter := otel.Meter("casbin")
// Create logger
logger, err := opentelemetrylogger.NewOpenTelemetryLogger(meter)
if err != nil {
panic(err)
}
// Use with Casbin
// enforcer.SetLogger(logger)
}ctx := context.Background()
logger, err := opentelemetrylogger.NewOpenTelemetryLoggerWithContext(ctx, meter)
if err != nil {
panic(err)
}// Only log specific event types
logger.SetEventTypes([]opentelemetrylogger.EventType{
opentelemetrylogger.EventEnforce,
opentelemetrylogger.EventAddPolicy,
})// Add custom processing for log entries
logger.SetLogCallback(func(entry *opentelemetrylogger.LogEntry) error {
fmt.Printf("Event: %s, Duration: %v\n", entry.EventType, entry.Duration)
return nil
})The logger supports the following event types:
EventEnforce- Authorization enforcement requestsEventAddPolicy- Policy addition operationsEventRemovePolicy- Policy removal operationsEventLoadPolicy- Policy loading operationsEventSavePolicy- Policy saving operations
package main
import (
"context"
"log"
"time"
opentelemetrylogger "github.com/casbin/casbin-opentelemetry-logger"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
)
func main() {
ctx := context.Background()
// Create OTLP exporter
exporter, err := otlpmetricgrpc.New(ctx,
otlpmetricgrpc.WithEndpoint("localhost:4317"),
otlpmetricgrpc.WithInsecure(),
)
if err != nil {
log.Fatal(err)
}
// Create resource
res, err := resource.New(ctx,
resource.WithAttributes(
semconv.ServiceName("casbin-app"),
),
)
if err != nil {
log.Fatal(err)
}
// Create meter provider
provider := metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(exporter)),
metric.WithResource(res),
)
otel.SetMeterProvider(provider)
// Create logger
meter := otel.Meter("casbin")
logger, err := opentelemetrylogger.NewOpenTelemetryLogger(meter)
if err != nil {
log.Fatal(err)
}
// Use with Casbin enforcer
// enforcer.SetLogger(logger)
// Shutdown
defer func() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := provider.Shutdown(ctx); err != nil {
log.Printf("Error shutting down meter provider: %v", err)
}
}()
}To collect metrics from your application, configure the OpenTelemetry Collector:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
exporters:
prometheus:
endpoint: "0.0.0.0:8889"
logging:
loglevel: debug
service:
pipelines:
metrics:
receivers: [otlp]
exporters: [prometheus, logging]- Configure OpenTelemetry Collector to export metrics to Prometheus (see above)
- Configure Prometheus to scrape the OpenTelemetry Collector endpoint
- Import Grafana Dashboard using similar panels as the Prometheus logger project
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Casbin - An authorization library that supports access control models
- OpenTelemetry - Observability framework for cloud-native software
- casbin-prometheus-logger - Prometheus logger for Casbin