package layer_attr import ( "git.ma-al.com/gora_filip/pkg/attr" "git.ma-al.com/gora_filip/pkg/level" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) type Handler struct { // Extra attributes to be attached. Can be also added with [Handler.CustomAttrs] method. Attributes []attribute.KeyValue Level level.SeverityLevel extraSkipInStack int } func (h Handler) IntoTraceAttributes() []attribute.KeyValue { attrs := make([]attribute.KeyValue, 5+len(h.Attributes)) attrs = append(attrs, attr.SourceCodeLocation(1+h.extraSkipInStack)...) // 3 attrs added here attrs = append(attrs, attr.ServiceLayer(attr.LayerHandler), attr.SeverityLevel(h.Level)) attrs = append(attrs, h.Attributes...) return attrs } func (h Handler) CustomAttrs(attrs ...interface{}) Handler { h.Attributes = append(h.Attributes, attr.CollectAttributes(attrs...)...) return h } func (h *Handler) SkipMoreInCallStack(skip int) { h.extraSkipInStack += skip } func (h Handler) AsOpts() trace.SpanStartEventOption { h.extraSkipInStack += 1 return trace.WithAttributes(h.IntoTraceAttributes()...) } type Service struct { // Extra attributes to be attached. Can be also added with [Service.CustomAttrs] method. Attributes []attribute.KeyValue Level level.SeverityLevel extraSkipInStack int } func (s Service) IntoTraceAttributes() []attribute.KeyValue { attrs := make([]attribute.KeyValue, 5+len(s.Attributes)) attrs = append(attrs, attr.SourceCodeLocation(1+s.extraSkipInStack)...) attrs = append(attrs, attr.ServiceLayer(attr.LayerService), attr.SeverityLevel(s.Level)) attrs = append(attrs, s.Attributes...) return attrs } func (s Service) CustomAttrs(attrs ...interface{}) Service { s.Attributes = append(s.Attributes, attr.CollectAttributes(attrs...)...) return s } func (s *Service) SkipMoreInCallStack(skip int) { s.extraSkipInStack += skip } func (s Service) AsOpts() trace.SpanStartEventOption { s.extraSkipInStack += 1 return trace.WithAttributes(s.IntoTraceAttributes()...) } type Repo struct { // Extra attributes to be attached. Can be also added with [Repo.CustomAttrs] method Attributes []attribute.KeyValue Level level.SeverityLevel extraSkipInStack int } func (r Repo) IntoTraceAttributes() []attribute.KeyValue { attrs := make([]attribute.KeyValue, 5+len(r.Attributes)) attrs = append(attrs, attr.SourceCodeLocation(1+r.extraSkipInStack)...) attrs = append(attrs, attr.ServiceLayer(attr.LayerRepository), attr.SeverityLevel(r.Level)) attrs = append(attrs, r.Attributes...) return attrs } func (r Repo) CustomAttrs(attrs ...interface{}) Repo { r.Attributes = append(r.Attributes, attr.CollectAttributes(attrs...)...) return r } func (r *Repo) SkipMoreInCallStack(skip int) { r.extraSkipInStack += skip } func (r Repo) AsOpts() trace.SpanStartEventOption { r.extraSkipInStack += 1 return trace.WithAttributes(r.IntoTraceAttributes()...) }