package layer_attr import ( "git.ma-al.com/maal-libraries/observer/pkg/attr" "git.ma-al.com/maal-libraries/observer/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 Name string 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)) if len(h.Name) > 0 { attrs = append(attrs, attr.ServiceLayerName(h.Name)) } 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 } // Works the same as [Handler.IntoTraceAttributes] func (h Handler) AsAttrs() []attribute.KeyValue { h.extraSkipInStack += 1 return h.IntoTraceAttributes() } 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 Name string extraSkipInStack int } func (s Service) IntoTraceAttributes() []attribute.KeyValue { attrs := make([]attribute.KeyValue, 6+len(s.Attributes)) attrs = append(attrs, attr.SourceCodeLocation(1+s.extraSkipInStack)...) attrs = append(attrs, attr.ServiceLayer(attr.LayerService), attr.SeverityLevel(s.Level)) if len(s.Name) > 0 { attrs = append(attrs, attr.ServiceLayerName(s.Name)) } attrs = append(attrs, s.Attributes...) return attrs } // Works the same as [Service.IntoTraceAttributes] func (s Service) AsAttrs() []attribute.KeyValue { s.extraSkipInStack += 1 return s.IntoTraceAttributes() } 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 Name string extraSkipInStack int } func (r Repo) IntoTraceAttributes() []attribute.KeyValue { attrs := make([]attribute.KeyValue, 6+len(r.Attributes)) attrs = append(attrs, attr.SourceCodeLocation(1+r.extraSkipInStack)...) attrs = append(attrs, attr.ServiceLayer(attr.LayerRepository), attr.SeverityLevel(r.Level)) if len(r.Name) > 0 { attrs = append(attrs, attr.ServiceLayerName(r.Name)) } attrs = append(attrs, r.Attributes...) return attrs } // Works the same as [Repo.IntoTraceAttributes] func (r Repo) AsAttrs() []attribute.KeyValue { r.extraSkipInStack += 1 return r.IntoTraceAttributes() } 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()...) }