github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/operator/builtin/transformer/metadata.go (about)

     1  package transformer
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/observiq/carbon/entry"
     7  	"github.com/observiq/carbon/errors"
     8  	"github.com/observiq/carbon/operator"
     9  	"github.com/observiq/carbon/operator/helper"
    10  )
    11  
    12  func init() {
    13  	operator.Register("metadata", func() operator.Builder { return NewMetadataOperatorConfig("") })
    14  }
    15  
    16  // NewMetadataOperatorConfig creates a new metadata config with default values
    17  func NewMetadataOperatorConfig(operatorID string) *MetadataOperatorConfig {
    18  	return &MetadataOperatorConfig{
    19  		TransformerConfig: helper.NewTransformerConfig(operatorID, "metadata"),
    20  		LabelerConfig:     helper.NewLabelerConfig(),
    21  		IdentifierConfig:  helper.NewIdentifierConfig(),
    22  	}
    23  }
    24  
    25  // MetadataOperatorConfig is the configuration of a metadata operator
    26  type MetadataOperatorConfig struct {
    27  	helper.TransformerConfig `yaml:",inline"`
    28  	helper.LabelerConfig     `yaml:",inline"`
    29  	helper.IdentifierConfig  `yaml:",inline"`
    30  }
    31  
    32  // Build will build a metadata operator from the supplied configuration
    33  func (c MetadataOperatorConfig) Build(context operator.BuildContext) (operator.Operator, error) {
    34  	transformerOperator, err := c.TransformerConfig.Build(context)
    35  	if err != nil {
    36  		return nil, errors.Wrap(err, "failed to build transformer")
    37  	}
    38  
    39  	labeler, err := c.LabelerConfig.Build()
    40  	if err != nil {
    41  		return nil, errors.Wrap(err, "failed to build labeler")
    42  	}
    43  
    44  	identifier, err := c.IdentifierConfig.Build()
    45  	if err != nil {
    46  		return nil, errors.Wrap(err, "failed to build identifier")
    47  	}
    48  
    49  	metadataOperator := &MetadataOperator{
    50  		TransformerOperator: transformerOperator,
    51  		Labeler:             labeler,
    52  		Identifier:          identifier,
    53  	}
    54  
    55  	return metadataOperator, nil
    56  }
    57  
    58  // MetadataOperator is an operator that can add metadata to incoming entries
    59  type MetadataOperator struct {
    60  	helper.TransformerOperator
    61  	helper.Labeler
    62  	helper.Identifier
    63  }
    64  
    65  // Process will process an incoming entry using the metadata transform.
    66  func (p *MetadataOperator) Process(ctx context.Context, entry *entry.Entry) error {
    67  	return p.ProcessWith(ctx, entry, p.Transform)
    68  }
    69  
    70  // Transform will transform an entry using the labeler and tagger.
    71  func (p *MetadataOperator) Transform(entry *entry.Entry) (*entry.Entry, error) {
    72  	if err := p.Label(entry); err != nil {
    73  		return entry, errors.Wrap(err, "failed to add labels to entry")
    74  	}
    75  
    76  	if err := p.Identify(entry); err != nil {
    77  		return entry, errors.Wrap(err, "failed to add resource keys to entry")
    78  	}
    79  
    80  	return entry, nil
    81  }