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 }