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  }