Update Warp10 docs and uint64 and timestamp handling (#6885)

This commit is contained in:
Daniel Nelson 2020-01-09 13:57:14 -08:00 committed by GitHub
parent ce02bebf30
commit 7faf05023d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 51 deletions

View File

@ -6,6 +6,10 @@
renamed to `sqlserver_azure_db_resource_stats` due to an issue where numeric
metrics were previously being reported incorrectly as strings.
#### New Outputs
- [warp10](/plugins/outputs/warp10/README.md) - Contributed by @aurrelhebert
#### Features
- [#6730](https://github.com/influxdata/telegraf/pull/6730): Add page_faults for mongodb wired tiger.

View File

@ -1,30 +1,50 @@
# README #
# Warp10 Output Plugin
Telegraph plugin to push metrics on Warp10
The `warp10` output plugin writes metrics to [Warp 10][].
### Telegraph output for Warp10 ###
### Configuration
Execute a post http on Warp10 at every flush time configured in telegraph in order to push the metrics collected
### Config ###
Add following instruction in the config file (Output part)
```
```toml
[[outputs.warp10]]
warpUrl = "http://localhost:4242"
token = "token"
# Prefix to add to the measurement.
prefix = "telegraf."
timeout = "15s"
# URL of the Warp 10 server
warp_url = "http://localhost:8080"
# Write token to access your app on warp 10
token = "Token"
# Warp 10 query timeout
# timeout = "15s"
## Print Warp 10 error body
# print_error_body = false
## Max string error size
# max_string_error_size = 511
## Optional TLS Config
# tls_ca = "/etc/telegraf/ca.pem"
# tls_cert = "/etc/telegraf/cert.pem"
# tls_key = "/etc/telegraf/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = false
```
To get more details on Warp 10 errors occuring when pushing data with Telegraf, you can optionaly set:
### Output Format
```
printErrorBody = true ## To print the full body of the HTTP Post instead of the request status
maxStringErrorSize = 700  ## To update the maximal string size of the Warp 10 error body. By default it's set to 512.
```
Metrics are converted and sent using the [Geo Time Series][] (GTS) input format.
### Values format
The class name of the reading is produced by combining the value of the
`prefix` option, the measurement name, and the field key. A dot (`.`)
character is used as the joining character.
The Warp 10 output support natively number, float and boolean values. String are send as URL encoded values as well as all Influx objects.
The GTS form provides support for the Telegraf integer, float, boolean, and
string types directly. Unsigned integer fields will be capped to the largest
64-bit integer (2^63-1) in case of overflow.
Timestamps are sent in microsecond precision.
[Warp 10]: https://www.warp10.io
[Geo Time Series]: https://www.warp10.io/content/03_Documentation/03_Interacting_with_Warp_10/03_Ingesting_data/02_GTS_input_format

View File

@ -5,6 +5,7 @@ import (
"fmt"
"io/ioutil"
"log"
"math"
"net/http"
"sort"
"strconv"
@ -23,34 +24,41 @@ const (
// Warp10 output plugin
type Warp10 struct {
Prefix string
WarpURL string
Token string
Prefix string `toml:"prefix"`
WarpURL string `toml:"warp_url"`
Token string `toml:"token"`
Timeout internal.Duration `toml:"timeout"`
PrintErrorBody bool
MaxStringErrorSize int
PrintErrorBody bool `toml:"print_error_body"`
MaxStringErrorSize int `toml:"max_string_error_size"`
client *http.Client
tls.ClientConfig
}
var sampleConfig = `
# prefix for metrics class Name
# Prefix to add to the measurement.
prefix = "telegraf."
## POST HTTP(or HTTPS) ##
# Url name of the Warp 10 server
# URL of the Warp 10 server
warp_url = "http://localhost:8080"
# Token to access your app on warp 10
# Write token to access your app on warp 10
token = "Token"
# Warp 10 query timeout, by default 15s
timeout = "15s"
## Optional Print Warp 10 error body
# Warp 10 query timeout
# timeout = "15s"
## Print Warp 10 error body
# print_error_body = false
## Optional Max string error Size
## Max string error size
# max_string_error_size = 511
## Optional TLS Config
# tls_ca = "/etc/telegraf/ca.pem"
# tls_cert = "/etc/telegraf/cert.pem"
# tls_key = "/etc/telegraf/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = false
`
// MetricLine Warp 10 metrics
@ -94,7 +102,7 @@ func (w *Warp10) Connect() error {
}
// GenWarp10Payload compute Warp 10 metrics payload
func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric, now time.Time) string {
func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric) string {
collectString := make([]string, 0)
for _, mm := range metrics {
@ -102,7 +110,7 @@ func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric, now time.Time) stri
metric := &MetricLine{
Metric: fmt.Sprintf("%s%s", w.Prefix, mm.Name()+"."+field.Key),
Timestamp: now.UnixNano() / 1000,
Timestamp: mm.Time().UnixNano() / 1000,
}
metricValue, err := buildValue(field.Value)
@ -125,10 +133,7 @@ func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric, now time.Time) stri
// Write metrics to Warp10
func (w *Warp10) Write(metrics []telegraf.Metric) error {
var now = time.Now()
payload := w.GenWarp10Payload(metrics, now)
payload := w.GenWarp10Payload(metrics)
if payload == "" {
return nil
}
@ -177,17 +182,21 @@ func buildValue(v interface{}) (string, error) {
var retv string
switch p := v.(type) {
case int64:
retv = intToString(int64(p))
retv = intToString(p)
case string:
retv = fmt.Sprintf("'%s'", strings.Replace(p, "'", "\\'", -1))
case bool:
retv = boolToString(bool(p))
retv = boolToString(p)
case uint64:
retv = uIntToString(uint64(p))
if p <= uint64(math.MaxInt64) {
retv = strconv.FormatInt(int64(p), 10)
} else {
retv = strconv.FormatInt(math.MaxInt64, 10)
}
case float64:
retv = floatToString(float64(p))
default:
retv = "'" + strings.Replace(fmt.Sprintf("%s", p), "'", "\\'", -1) + "'"
return "", fmt.Errorf("unsupported type: %T", v)
}
return retv, nil
}
@ -215,7 +224,7 @@ func (w *Warp10) SampleConfig() string {
// Description get description
func (w *Warp10) Description() string {
return "Configuration for Warp server to send metrics to"
return "Write metrics to Warp 10"
}
// Close close

View File

@ -3,11 +3,9 @@ package warp10
import (
"fmt"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require"
)
type ErrorTest struct {
@ -22,9 +20,8 @@ func TestWriteWarp10(t *testing.T) {
Token: "WRITE",
}
var now = time.Now()
payload := w.GenWarp10Payload(testutil.MockMetrics(), now)
require.Exactly(t, fmt.Sprintf("%d// unit.testtest1.value{source=telegraf,tag1=value1} 1.000000\n", now.UnixNano()/1000), payload)
payload := w.GenWarp10Payload(testutil.MockMetrics())
require.Exactly(t, "1257894000000000// unit.testtest1.value{source=telegraf,tag1=value1} 1.000000\n", payload)
}
func TestHandleWarp10Error(t *testing.T) {