mirror of
https://github.com/mainflux/mainflux.git
synced 2025-05-04 22:17:59 +08:00

* Upgrade InfluxDB from 1.x to 2.x Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influx DB configuration updated Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connection to InfluxDBv2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Token cannot be created Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB v2 Consumer Implementation Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * quickfix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb-Writer Unit Tests Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Writer Tests Implemented Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Connection Check Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolving Remarks Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved consumer-test remark Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer-test slow working version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * reader changes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer tests time issue fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Eof warning fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Makefile Fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Readers Initial Setup Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer json fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Bugfix and resolves comments. Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * one test fails Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * solved last page read Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * writers future time problem fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Tests Passes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolve Semaphore Issues Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * UUID comment on consumer tests resolved Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed json time Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed CI error Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved requests Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * removed blank line Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved comment Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * deleted unnecessary string builder Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * initial commit Signed-off-by: aryan <aryangodara03@gmail.com> * change influxdb docker image version. Signed-off-by: aryan <aryangodara03@gmail.com> * go mod and vendor fixing Signed-off-by: aryan <aryangodara03@gmail.com> * Upgrade InfluxDB from 1.x to 2.x Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influx DB configuration updated Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connection to InfluxDBv2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Token cannot be created Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Connected to InfluxDB2 Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB v2 Consumer Implementation Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * quickfix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb-Writer Unit Tests Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer Update Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Writer Tests Implemented Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * InfluxDB Connection Check Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolving Remarks Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved consumer-test remark Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer-test slow working version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * reader changes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Consumer tests time issue fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolved Reviews Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Readers Initial Setup Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * consumer json fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * readers simple version fix Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Influxdb Reader Parsers Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Bugfix and resolves comments. Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * one test fails Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * solved last page read Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * writers future time problem fixed Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * weird Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Tests Passes Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Resolve Semaphore Issues Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * UUID comment on consumer tests resolved Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * Inclusive from and Exclusive to Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * 1 second limits Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved review Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed json time Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * fixed CI error Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved request Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved requests Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * removed blank line Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * resolved comment Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * deleted unnecessary string builder Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> * initial commit Signed-off-by: aryan <aryangodara03@gmail.com> * change influxdb docker image version. Signed-off-by: aryan <aryangodara03@gmail.com> * go mod and vendor fixing Signed-off-by: aryan <aryangodara03@gmail.com> * go mod fixing Signed-off-by: aryan <aryangodara03@gmail.com> * make tests pass locally, fix errors Signed-off-by: aryan <aryangodara03@gmail.com> * rem unsused variables/consts Signed-off-by: aryan <aryangodara03@gmail.com> * go mod tidy vendor Signed-off-by: aryan <aryangodara03@gmail.com> * add env var and data types Signed-off-by: aryan <aryangodara03@gmail.com> * update influxdb version to latest (2.3 to 2.12) Signed-off-by: aryan <aryangodara03@gmail.com> * change time precision for message tests Signed-off-by: aryan <aryangodara03@gmail.com> * renamed influxdb2 to influxdata Signed-off-by: aryan <aryangodara03@gmail.com> * address remarks on PR Signed-off-by: aryan <aryangodara03@gmail.com> * update influxbd according to latest mf commit Signed-off-by: aryan <aryangodara03@gmail.com> * temp commit, rem before pushing Signed-off-by: aryan <aryangodara03@gmail.com> * update main files and cassandra-reader messages_tests Signed-off-by: aryan <aryangodara03@gmail.com> * fix name of logger while importing Signed-off-by: aryan <aryangodara03@gmail.com> * remove unnecessary print lines Signed-off-by: aryan <aryangodara03@gmail.com> * correct env var name Signed-off-by: aryan <aryangodara03@gmail.com> * change to async consume Signed-off-by: aryan <aryangodara03@gmail.com> * add option to switch bw sync and async Signed-off-by: aryan <aryangodara03@gmail.com> * test for both async and sync Signed-off-by: aryan <aryangodara03@gmail.com> * update consumer and add writeAPIs to config Signed-off-by: aryan <aryangodara03@gmail.com> * revert back to sync consuming Signed-off-by: aryan <aryangodara03@gmail.com> * temp fix for default timeout value Signed-off-by: aryan <aryangodara03@gmail.com> * set default timeout in config. Signed-off-by: aryan <aryangodara03@gmail.com> * remove unwanted env vars, add required ones. Signed-off-by: aryan <aryangodara03@gmail.com> * rem unused username password from config Signed-off-by: aryan <aryangodara03@gmail.com> * update readme, env vars, and remove grafana Signed-off-by: aryan <aryangodara03@gmail.com> * update readme Signed-off-by: aryan <aryangodara03@gmail.com> * fix typo Signed-off-by: aryan <aryangodara03@gmail.com> * update readme description. Signed-off-by: aryan <aryangodara03@gmail.com> * fix more typos. Signed-off-by: aryan <aryangodara03@gmail.com> * add link to official docs to readme. Signed-off-by: aryan <aryangodara03@gmail.com> --------- Signed-off-by: fatih <fatihdurmaz@sabanciuniv.edu> Signed-off-by: aryan <aryangodara03@gmail.com> Co-authored-by: fatih <fatihdurmaz@sabanciuniv.edu> Co-authored-by: Dušan Borovčanin <dusan.borovcanin@mainflux.com>
300 lines
7.1 KiB
Go
300 lines
7.1 KiB
Go
package protocol
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"math"
|
|
"sort"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// ErrIsNaN is a field error for when a float field is NaN.
|
|
var ErrIsNaN = &FieldError{"is NaN"}
|
|
|
|
// ErrIsInf is a field error for when a float field is Inf.
|
|
var ErrIsInf = &FieldError{"is Inf"}
|
|
|
|
// Encoder marshals Metrics into influxdb line protocol.
|
|
// It is not safe for concurrent use, make a new one!
|
|
// The default behavior when encountering a field error is to ignore the field and move on.
|
|
// If you wish it to error out on field errors, use Encoder.FailOnFieldErr(true)
|
|
type Encoder struct {
|
|
w io.Writer
|
|
fieldSortOrder FieldSortOrder
|
|
fieldTypeSupport FieldTypeSupport
|
|
failOnFieldError bool
|
|
maxLineBytes int
|
|
fieldList []*Field
|
|
header []byte
|
|
footer []byte
|
|
pair []byte
|
|
precision time.Duration
|
|
}
|
|
|
|
// SetMaxLineBytes sets a maximum length for a line, Encode will error if the generated line is longer
|
|
func (e *Encoder) SetMaxLineBytes(i int) {
|
|
e.maxLineBytes = i
|
|
}
|
|
|
|
// SetFieldSortOrder sets a sort order for the data.
|
|
// The options are:
|
|
// NoSortFields (doesn't sort the fields)
|
|
// SortFields (sorts the keys in alphabetical order)
|
|
func (e *Encoder) SetFieldSortOrder(s FieldSortOrder) {
|
|
e.fieldSortOrder = s
|
|
}
|
|
|
|
// SetFieldTypeSupport sets flags for if the encoder supports certain optional field types such as uint64
|
|
func (e *Encoder) SetFieldTypeSupport(s FieldTypeSupport) {
|
|
e.fieldTypeSupport = s
|
|
}
|
|
|
|
// FailOnFieldErr whether or not to fail on a field error or just move on.
|
|
// The default behavior to move on
|
|
func (e *Encoder) FailOnFieldErr(s bool) {
|
|
e.failOnFieldError = s
|
|
}
|
|
|
|
// SetPrecision sets time precision for writes
|
|
// Default is nanoseconds precision
|
|
func (e *Encoder) SetPrecision(p time.Duration) {
|
|
e.precision = p
|
|
}
|
|
|
|
// NewEncoder gives us an encoder that marshals to a writer in influxdb line protocol
|
|
// as defined by:
|
|
// https://docs.influxdata.com/influxdb/v1.5/write_protocols/line_protocol_reference/
|
|
func NewEncoder(w io.Writer) *Encoder {
|
|
return &Encoder{
|
|
w: w,
|
|
header: make([]byte, 0, 128),
|
|
footer: make([]byte, 0, 128),
|
|
pair: make([]byte, 0, 128),
|
|
fieldList: make([]*Field, 0, 16),
|
|
precision: time.Nanosecond,
|
|
}
|
|
}
|
|
|
|
// This is here to significantly reduce allocations, wish that we had constant/immutable keyword that applied to
|
|
// more complex objects
|
|
var comma = []byte(",")
|
|
|
|
// Encode marshals a Metric to the io.Writer in the Encoder
|
|
func (e *Encoder) Encode(m Metric) (int, error) {
|
|
err := e.buildHeader(m)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
e.buildFooter(m.Time())
|
|
|
|
// here we make a copy of the *fields so we can do an in-place sort
|
|
e.fieldList = append(e.fieldList[:0], m.FieldList()...)
|
|
|
|
if e.fieldSortOrder == SortFields {
|
|
sort.Slice(e.fieldList, func(i, j int) bool {
|
|
return e.fieldList[i].Key < e.fieldList[j].Key
|
|
})
|
|
}
|
|
i := 0
|
|
totalWritten := 0
|
|
pairsLen := 0
|
|
firstField := true
|
|
for _, field := range e.fieldList {
|
|
err = e.buildFieldPair(field.Key, field.Value)
|
|
if err != nil {
|
|
if e.failOnFieldError {
|
|
return 0, err
|
|
}
|
|
continue
|
|
}
|
|
|
|
bytesNeeded := len(e.header) + pairsLen + len(e.pair) + len(e.footer)
|
|
|
|
// Additional length needed for field separator `,`
|
|
if !firstField {
|
|
bytesNeeded++
|
|
}
|
|
|
|
if e.maxLineBytes > 0 && bytesNeeded > e.maxLineBytes {
|
|
// Need at least one field per line
|
|
if firstField {
|
|
return 0, ErrNeedMoreSpace
|
|
}
|
|
|
|
i, err = e.w.Write(e.footer)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
pairsLen = 0
|
|
totalWritten += i
|
|
|
|
bytesNeeded = len(e.header) + len(e.pair) + len(e.footer)
|
|
|
|
if e.maxLineBytes > 0 && bytesNeeded > e.maxLineBytes {
|
|
return 0, ErrNeedMoreSpace
|
|
}
|
|
|
|
i, err = e.w.Write(e.header)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalWritten += i
|
|
|
|
i, err = e.w.Write(e.pair)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalWritten += i
|
|
|
|
pairsLen += len(e.pair)
|
|
firstField = false
|
|
continue
|
|
}
|
|
|
|
if firstField {
|
|
i, err = e.w.Write(e.header)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalWritten += i
|
|
|
|
} else {
|
|
i, err = e.w.Write(comma)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalWritten += i
|
|
|
|
}
|
|
|
|
e.w.Write(e.pair)
|
|
|
|
pairsLen += len(e.pair)
|
|
firstField = false
|
|
}
|
|
|
|
if firstField {
|
|
return 0, ErrNoFields
|
|
}
|
|
i, err = e.w.Write(e.footer)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalWritten += i
|
|
return totalWritten, nil
|
|
|
|
}
|
|
|
|
func (e *Encoder) buildHeader(m Metric) error {
|
|
e.header = e.header[:0]
|
|
name := nameEscape(m.Name())
|
|
if name == "" {
|
|
return ErrInvalidName
|
|
}
|
|
e.header = append(e.header, name...)
|
|
|
|
for _, tag := range m.TagList() {
|
|
key := escape(tag.Key)
|
|
value := escape(tag.Value)
|
|
|
|
// Some keys and values are not encodeable as line protocol, such as
|
|
// those with a trailing '\' or empty strings.
|
|
if key == "" || value == "" {
|
|
continue
|
|
}
|
|
|
|
e.header = append(e.header, ',')
|
|
e.header = append(e.header, key...)
|
|
e.header = append(e.header, '=')
|
|
e.header = append(e.header, value...)
|
|
}
|
|
|
|
e.header = append(e.header, ' ')
|
|
return nil
|
|
}
|
|
|
|
func (e *Encoder) buildFieldVal(value interface{}) error {
|
|
switch v := value.(type) {
|
|
case uint64:
|
|
if e.fieldTypeSupport&UintSupport != 0 {
|
|
e.pair = append(strconv.AppendUint(e.pair, v, 10), 'u')
|
|
} else if v <= uint64(math.MaxInt64) {
|
|
e.pair = append(strconv.AppendInt(e.pair, int64(v), 10), 'i')
|
|
} else {
|
|
e.pair = append(strconv.AppendInt(e.pair, math.MaxInt64, 10), 'i')
|
|
}
|
|
case int64:
|
|
e.pair = append(strconv.AppendInt(e.pair, v, 10), 'i')
|
|
case int:
|
|
e.pair = append(strconv.AppendInt(e.pair, int64(v), 10), 'i')
|
|
case float64:
|
|
if math.IsNaN(v) {
|
|
return ErrIsNaN
|
|
}
|
|
|
|
if math.IsInf(v, 0) {
|
|
return ErrIsInf
|
|
}
|
|
|
|
e.pair = strconv.AppendFloat(e.pair, v, 'f', -1, 64)
|
|
case float32:
|
|
v32 := float64(v)
|
|
if math.IsNaN(v32) {
|
|
return ErrIsNaN
|
|
}
|
|
|
|
if math.IsInf(v32, 0) {
|
|
return ErrIsInf
|
|
}
|
|
|
|
e.pair = strconv.AppendFloat(e.pair, v32, 'f', -1, 64)
|
|
|
|
case string:
|
|
e.pair = append(e.pair, '"')
|
|
e.pair = append(e.pair, stringFieldEscape(v)...)
|
|
e.pair = append(e.pair, '"')
|
|
case []byte:
|
|
e.pair = append(e.pair, '"')
|
|
stringFieldEscapeBytes(&e.pair, v)
|
|
e.pair = append(e.pair, '"')
|
|
case bool:
|
|
e.pair = strconv.AppendBool(e.pair, v)
|
|
default:
|
|
return &FieldError{fmt.Sprintf("invalid value type: %T", v)}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *Encoder) buildFieldPair(key string, value interface{}) error {
|
|
e.pair = e.pair[:0]
|
|
key = escape(key)
|
|
// Some keys are not encodeable as line protocol, such as those with a
|
|
// trailing '\' or empty strings.
|
|
if key == "" || key[:len(key)-1] == "\\" {
|
|
return &FieldError{"invalid field key"}
|
|
}
|
|
e.pair = append(e.pair, key...)
|
|
e.pair = append(e.pair, '=')
|
|
return e.buildFieldVal(value)
|
|
}
|
|
|
|
func (e *Encoder) buildFooter(t time.Time) {
|
|
e.footer = e.footer[:0]
|
|
if !t.IsZero() {
|
|
e.footer = append(e.footer, ' ')
|
|
switch e.precision {
|
|
case time.Microsecond:
|
|
e.footer = strconv.AppendInt(e.footer, t.UnixNano()/1000, 10)
|
|
case time.Millisecond:
|
|
e.footer = strconv.AppendInt(e.footer, t.UnixNano()/1000000, 10)
|
|
case time.Second:
|
|
e.footer = strconv.AppendInt(e.footer, t.Unix(), 10)
|
|
default:
|
|
e.footer = strconv.AppendInt(e.footer, t.UnixNano(), 10)
|
|
}
|
|
}
|
|
e.footer = append(e.footer, '\n')
|
|
}
|