github.com/Jeffail/benthos/v3@v3.65.0/internal/interop/labels.go (about) 1 package interop 2 3 import ( 4 "github.com/Jeffail/benthos/v3/lib/log" 5 "github.com/Jeffail/benthos/v3/lib/metrics" 6 "github.com/Jeffail/benthos/v3/lib/types" 7 "github.com/gofrs/uuid" 8 ) 9 10 func unwrapMetric(t metrics.Type) metrics.Type { 11 u, ok := t.(interface { 12 Unwrap() metrics.Type 13 }) 14 if ok { 15 t = u.Unwrap() 16 } 17 return t 18 } 19 20 // LabelRoot replaces the label of the provided observability components. 21 func LabelRoot(label string, mgr types.Manager, logger log.Modular, stats metrics.Type) (types.Manager, log.Modular, metrics.Type) { 22 if m, ok := mgr.(interface { 23 ForComponent(string) types.Manager 24 }); ok { 25 newMgr := m.ForComponent(label) 26 if m2, ok := newMgr.(interface { 27 Logger() log.Modular 28 Metrics() metrics.Type 29 }); ok { 30 return newMgr, m2.Logger(), m2.Metrics() 31 } 32 } 33 newLog := logger.WithFields(map[string]string{ 34 "component": label, 35 }) 36 newStats := metrics.Namespaced(unwrapMetric(stats), label) 37 return mgr, newLog, newStats 38 } 39 40 // LabelChild expands the label of the provided observability components. 41 func LabelChild(label string, mgr types.Manager, logger log.Modular, stats metrics.Type) (types.Manager, log.Modular, metrics.Type) { 42 if m, ok := mgr.(interface { 43 ForChildComponent(string) types.Manager 44 }); ok { 45 newMgr := m.ForChildComponent(label) 46 if m2, ok := newMgr.(interface { 47 Logger() log.Modular 48 Metrics() metrics.Type 49 }); ok { 50 return newMgr, m2.Logger(), m2.Metrics() 51 } 52 } 53 newLog := logger.NewModule("." + label) 54 newStats := metrics.Namespaced(stats, label) 55 return mgr, newLog, newStats 56 } 57 58 // GetLabel attempts the extract the current label of a component by obtaining 59 // it from a manager. If the manager does not support label methods then it 60 // instead falls back to a UUID, and somehow failing that returns an empty 61 // string. 62 func GetLabel(mgr types.Manager) string { 63 if m, ok := mgr.(interface { 64 Label() string 65 }); ok { 66 return m.Label() 67 } 68 b, err := uuid.NewV4() 69 if err == nil { 70 return b.String() 71 } 72 return "" 73 } 74 75 // LabelStream expands the label of the provided observability components with 76 // a stream identifier. 77 func LabelStream(label string, mgr types.Manager, logger log.Modular, stats metrics.Type) (types.Manager, log.Modular, metrics.Type) { 78 if m, ok := mgr.(interface { 79 ForStream(id string) types.Manager 80 }); ok { 81 newMgr := m.ForStream(label) 82 if m2, ok := newMgr.(interface { 83 Logger() log.Modular 84 Metrics() metrics.Type 85 }); ok { 86 return newMgr, m2.Logger(), m2.Metrics() 87 } 88 } 89 newLog := logger.NewModule("." + label) 90 newStats := metrics.Namespaced(stats, label) 91 return mgr, newLog, newStats 92 }