core/metrics/null.go
package metrics
import (
"context"
"github.com/gin-gonic/gin"
experimentalLogger "github.com/synapsecns/sanguine/core/metrics/logger"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
"gorm.io/gorm"
"net/http"
)
// nullHandler is a metrics handler that does nothing.
// it is used to allow metrics collection to be skipped.
type nullHandler struct {
tracer trace.Tracer
propagator nullPropogator
meter Meter
}
func (n nullHandler) ExperimentalLogger() experimentalLogger.ExperimentalLogger {
return experimentalLogger.NewNullLogger()
}
func (n nullHandler) Meter(name string, options ...metric.MeterOption) metric.Meter {
return noop.Meter{}
}
func (n nullHandler) Handler() http.Handler {
return noopHandler{}
}
func (n nullHandler) Type() HandlerType {
return Null
}
func (n nullHandler) Propagator() propagation.TextMapPropagator {
return n.propagator
}
func (n nullHandler) GetTracerProvider() trace.TracerProvider {
return trace.NewNoopTracerProvider()
}
func (n nullHandler) Tracer() trace.Tracer {
return n.tracer
}
func (n nullHandler) AddGormCallbacks(db *gorm.DB) {
// Do nothing
}
func (n nullHandler) ConfigureHTTPClient(client *http.Client, opts ...otelhttp.Option) {
// Do nothing
}
func (n nullHandler) Gin() []gin.HandlerFunc {
return []gin.HandlerFunc{}
}
func (n nullHandler) Start(_ context.Context) error {
return nil
}
func (n nullHandler) Metrics() Meter {
return n.meter
}
// NewNullHandler creates a new null transaction handler.
func NewNullHandler() Handler {
return &nullHandler{
tracer: trace.NewNoopTracerProvider().Tracer(""),
propagator: nullPropogator{},
meter: &NullMeterImpl{},
}
}
var _ Handler = &nullHandler{}
// nullPropogator is a metrics propagator that does nothing.
type nullPropogator struct{}
func (n nullPropogator) Inject(ctx context.Context, carrier propagation.TextMapCarrier) {
}
func (n nullPropogator) Extract(ctx context.Context, _ propagation.TextMapCarrier) context.Context {
return ctx
}
func (n nullPropogator) Fields() []string {
return []string{}
}
var _ propagation.TextMapPropagator = &nullPropogator{}
// noopHandler is an http handler that does nothing.
type noopHandler struct{}
func (n noopHandler) ServeHTTP(_ http.ResponseWriter, _ *http.Request) {
// Do nothing
}
var _ http.Handler = noopHandler{}