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  }