github.com/avenga/couper@v1.12.2/logging/hooks/error.go (about) 1 package hooks 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/sirupsen/logrus" 8 "go.opentelemetry.io/otel/attribute" 9 "go.opentelemetry.io/otel/metric/instrument" 10 "go.opentelemetry.io/otel/metric/unit" 11 12 "github.com/avenga/couper/errors" 13 "github.com/avenga/couper/telemetry/instrumentation" 14 "github.com/avenga/couper/telemetry/provider" 15 ) 16 17 var _ logrus.Hook = &Error{} 18 19 type Error struct{} 20 21 func (l *Error) Levels() []logrus.Level { 22 return []logrus.Level{logrus.ErrorLevel, logrus.WarnLevel} 23 } 24 25 func (l *Error) Fire(entry *logrus.Entry) error { 26 err, exist := entry.Data[logrus.ErrorKey] 27 if !exist { 28 return nil 29 } 30 31 delete(entry.Data, logrus.ErrorKey) 32 33 gerr, ok := err.(*errors.Error) 34 if !ok { 35 entry.Message = errors.AppendMsg(entry.Message, fmt.Sprintf("%v", err)) 36 return nil 37 } 38 39 kind := strings.Replace(gerr.Error(), " ", "_", -1) 40 if kinds := gerr.Kinds(); len(kinds) > 0 { 41 entry.Data["error_type"] = kinds[0] 42 kind = kinds[0] 43 } 44 entry.Message = errors.AppendMsg(entry.Message, gerr.LogError()) 45 46 if entry.Data["type"] != acTypeField { 47 return nil 48 } 49 50 meter := provider.Meter("couper/errors") 51 52 counter, _ := meter.SyncInt64(). 53 Counter( 54 instrumentation.Prefix+"client_request_error_types", 55 instrument.WithDescription(string(unit.Dimensionless)), 56 ) 57 58 counter.Add(entry.Context, 1, attribute.String("error", kind)) 59 60 return nil 61 }