github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/operator/helper/severity.go (about)

     1  package helper
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/observiq/carbon/entry"
    10  	"github.com/observiq/carbon/errors"
    11  )
    12  
    13  // SeverityParser is a helper that parses severity onto an entry.
    14  type SeverityParser struct {
    15  	ParseFrom entry.Field
    16  	Preserve  bool
    17  	Mapping   severityMap
    18  }
    19  
    20  // Parse will parse severity from a field and attach it to the entry
    21  func (p *SeverityParser) Parse(ctx context.Context, ent *entry.Entry) error {
    22  	value, ok := ent.Get(p.ParseFrom)
    23  	if !ok {
    24  		return errors.NewError(
    25  			"log entry does not have the expected parse_from field",
    26  			"ensure that all entries forwarded to this parser contain the parse_from field",
    27  			"parse_from", p.ParseFrom.String(),
    28  		)
    29  	}
    30  
    31  	severity, err := p.Mapping.find(value)
    32  	if err != nil {
    33  		return errors.Wrap(err, "parse")
    34  	}
    35  	if severity == entry.Nil {
    36  		severity = entry.Default
    37  	}
    38  	ent.Severity = severity
    39  
    40  	if !p.Preserve {
    41  		ent.Delete(p.ParseFrom)
    42  	}
    43  
    44  	return nil
    45  }
    46  
    47  type severityMap map[string]entry.Severity
    48  
    49  func (m severityMap) find(value interface{}) (entry.Severity, error) {
    50  	switch v := value.(type) {
    51  	case int:
    52  		if severity, ok := m[strconv.Itoa(v)]; ok {
    53  			return severity, nil
    54  		}
    55  		return entry.Nil, nil
    56  	case string:
    57  		if severity, ok := m[strings.ToLower(v)]; ok {
    58  			return severity, nil
    59  		}
    60  		return entry.Nil, nil
    61  	case []byte:
    62  		if severity, ok := m[strings.ToLower(string(v))]; ok {
    63  			return severity, nil
    64  		}
    65  		return entry.Nil, nil
    66  	default:
    67  		return entry.Nil, fmt.Errorf("type %T cannot be a severity", v)
    68  	}
    69  }