76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| package value
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/metric"
 | |
| )
 | |
| 
 | |
| type ValueParser struct {
 | |
| 	MetricName  string
 | |
| 	DataType    string
 | |
| 	DefaultTags map[string]string
 | |
| }
 | |
| 
 | |
| func (v *ValueParser) Parse(buf []byte) ([]telegraf.Metric, error) {
 | |
| 	vStr := string(bytes.TrimSpace(bytes.Trim(buf, "\x00")))
 | |
| 
 | |
| 	// unless it's a string, separate out any fields in the buffer,
 | |
| 	// ignore anything but the last.
 | |
| 	if v.DataType != "string" {
 | |
| 		values := strings.Fields(vStr)
 | |
| 		if len(values) < 1 {
 | |
| 			return []telegraf.Metric{}, nil
 | |
| 		}
 | |
| 		vStr = string(values[len(values)-1])
 | |
| 	}
 | |
| 
 | |
| 	var value interface{}
 | |
| 	var err error
 | |
| 	switch v.DataType {
 | |
| 	case "", "int", "integer":
 | |
| 		value, err = strconv.Atoi(vStr)
 | |
| 	case "float", "long":
 | |
| 		value, err = strconv.ParseFloat(vStr, 64)
 | |
| 	case "str", "string":
 | |
| 		value = vStr
 | |
| 	case "bool", "boolean":
 | |
| 		value, err = strconv.ParseBool(vStr)
 | |
| 	}
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	fields := map[string]interface{}{"value": value}
 | |
| 	metric, err := metric.New(v.MetricName, v.DefaultTags,
 | |
| 		fields, time.Now().UTC())
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return []telegraf.Metric{metric}, nil
 | |
| }
 | |
| 
 | |
| func (v *ValueParser) ParseLine(line string) (telegraf.Metric, error) {
 | |
| 	metrics, err := v.Parse([]byte(line))
 | |
| 
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	if len(metrics) < 1 {
 | |
| 		return nil, fmt.Errorf("Can not parse the line: %s, for data format: value", line)
 | |
| 	}
 | |
| 
 | |
| 	return metrics[0], nil
 | |
| }
 | |
| 
 | |
| func (v *ValueParser) SetDefaultTags(tags map[string]string) {
 | |
| 	v.DefaultTags = tags
 | |
| }
 |