115 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package influx
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"sync"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	maxErrorBufferSize = 1024
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	ErrNoMetric = errors.New("no metric in line")
 | |
| )
 | |
| 
 | |
| type ParseError struct {
 | |
| 	Offset int
 | |
| 	msg    string
 | |
| 	buf    string
 | |
| }
 | |
| 
 | |
| func (e *ParseError) Error() string {
 | |
| 	buffer := e.buf
 | |
| 	if len(buffer) > maxErrorBufferSize {
 | |
| 		buffer = buffer[:maxErrorBufferSize] + "..."
 | |
| 	}
 | |
| 	return fmt.Sprintf("metric parse error: %s at offset %d: %q", e.msg, e.Offset, buffer)
 | |
| }
 | |
| 
 | |
| type Parser struct {
 | |
| 	DefaultTags map[string]string
 | |
| 
 | |
| 	sync.Mutex
 | |
| 	*machine
 | |
| 	handler *MetricHandler
 | |
| }
 | |
| 
 | |
| // NewParser returns a Parser than accepts line protocol
 | |
| func NewParser(handler *MetricHandler) *Parser {
 | |
| 	return &Parser{
 | |
| 		machine: NewMachine(handler),
 | |
| 		handler: handler,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // NewSeriesParser returns a Parser than accepts a measurement and tagset
 | |
| func NewSeriesParser(handler *MetricHandler) *Parser {
 | |
| 	return &Parser{
 | |
| 		machine: NewSeriesMachine(handler),
 | |
| 		handler: handler,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (p *Parser) Parse(input []byte) ([]telegraf.Metric, error) {
 | |
| 	p.Lock()
 | |
| 	defer p.Unlock()
 | |
| 	metrics := make([]telegraf.Metric, 0)
 | |
| 	p.machine.SetData(input)
 | |
| 
 | |
| 	for p.machine.ParseLine() {
 | |
| 		err := p.machine.Err()
 | |
| 		if err != nil {
 | |
| 			return nil, &ParseError{
 | |
| 				Offset: p.machine.Position(),
 | |
| 				msg:    err.Error(),
 | |
| 				buf:    string(input),
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		metric, err := p.handler.Metric()
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		p.handler.Reset()
 | |
| 		metrics = append(metrics, metric)
 | |
| 	}
 | |
| 
 | |
| 	p.applyDefaultTags(metrics)
 | |
| 	return metrics, nil
 | |
| }
 | |
| 
 | |
| func (p *Parser) ParseLine(line string) (telegraf.Metric, error) {
 | |
| 	metrics, err := p.Parse([]byte(line + "\n"))
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	if len(metrics) < 1 {
 | |
| 		return nil, ErrNoMetric
 | |
| 	}
 | |
| 
 | |
| 	return metrics[0], nil
 | |
| }
 | |
| 
 | |
| func (p *Parser) SetDefaultTags(tags map[string]string) {
 | |
| 	p.DefaultTags = tags
 | |
| }
 | |
| 
 | |
| func (p *Parser) applyDefaultTags(metrics []telegraf.Metric) {
 | |
| 	if len(p.DefaultTags) == 0 {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	for _, m := range metrics {
 | |
| 		for k, v := range p.DefaultTags {
 | |
| 			if !m.HasTag(k) {
 | |
| 				m.AddTag(k, v)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |