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 renamed to `sqlserver_azure_db_resource_stats` due to an issue where numeric
metrics were previously being reported incorrectly as strings. metrics were previously being reported incorrectly as strings.
#### New Outputs
- [warp10](/plugins/outputs/warp10/README.md) - Contributed by @aurrelhebert
#### Features #### Features
- [#6730](https://github.com/influxdata/telegraf/pull/6730): Add page_faults for mongodb wired tiger. - [#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 ```toml
### Config ###
Add following instruction in the config file (Output part)
```
[[outputs.warp10]] [[outputs.warp10]]
warpUrl = "http://localhost:4242" # Prefix to add to the measurement.
token = "token" prefix = "telegraf."
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
``` Metrics are converted and sent using the [Geo Time Series][] (GTS) input 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.
```
### 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" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"math"
"net/http" "net/http"
"sort" "sort"
"strconv" "strconv"
@ -23,34 +24,41 @@ const (
// Warp10 output plugin // Warp10 output plugin
type Warp10 struct { type Warp10 struct {
Prefix string Prefix string `toml:"prefix"`
WarpURL string WarpURL string `toml:"warp_url"`
Token string Token string `toml:"token"`
Timeout internal.Duration `toml:"timeout"` Timeout internal.Duration `toml:"timeout"`
PrintErrorBody bool PrintErrorBody bool `toml:"print_error_body"`
MaxStringErrorSize int MaxStringErrorSize int `toml:"max_string_error_size"`
client *http.Client client *http.Client
tls.ClientConfig tls.ClientConfig
} }
var sampleConfig = ` var sampleConfig = `
# prefix for metrics class Name # Prefix to add to the measurement.
prefix = "telegraf." prefix = "telegraf."
## POST HTTP(or HTTPS) ##
# Url name of the Warp 10 server # URL of the Warp 10 server
warp_url = "http://localhost:8080" warp_url = "http://localhost:8080"
# Token to access your app on warp 10
# Write token to access your app on warp 10
token = "Token" token = "Token"
# Warp 10 query timeout, by default 15s
timeout = "15s" # Warp 10 query timeout
## Optional Print Warp 10 error body # timeout = "15s"
## Print Warp 10 error body
# print_error_body = false # print_error_body = false
## Optional Max string error Size
## Max string error size
# max_string_error_size = 511 # max_string_error_size = 511
## Optional TLS Config ## Optional TLS Config
# tls_ca = "/etc/telegraf/ca.pem" # tls_ca = "/etc/telegraf/ca.pem"
# tls_cert = "/etc/telegraf/cert.pem" # tls_cert = "/etc/telegraf/cert.pem"
# tls_key = "/etc/telegraf/key.pem" # tls_key = "/etc/telegraf/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = false
` `
// MetricLine Warp 10 metrics // MetricLine Warp 10 metrics
@ -94,7 +102,7 @@ func (w *Warp10) Connect() error {
} }
// GenWarp10Payload compute Warp 10 metrics payload // 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) collectString := make([]string, 0)
for _, mm := range metrics { for _, mm := range metrics {
@ -102,7 +110,7 @@ func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric, now time.Time) stri
metric := &MetricLine{ metric := &MetricLine{
Metric: fmt.Sprintf("%s%s", w.Prefix, mm.Name()+"."+field.Key), 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) metricValue, err := buildValue(field.Value)
@ -125,10 +133,7 @@ func (w *Warp10) GenWarp10Payload(metrics []telegraf.Metric, now time.Time) stri
// Write metrics to Warp10 // Write metrics to Warp10
func (w *Warp10) Write(metrics []telegraf.Metric) error { func (w *Warp10) Write(metrics []telegraf.Metric) error {
payload := w.GenWarp10Payload(metrics)
var now = time.Now()
payload := w.GenWarp10Payload(metrics, now)
if payload == "" { if payload == "" {
return nil return nil
} }
@ -177,17 +182,21 @@ func buildValue(v interface{}) (string, error) {
var retv string var retv string
switch p := v.(type) { switch p := v.(type) {
case int64: case int64:
retv = intToString(int64(p)) retv = intToString(p)
case string: case string:
retv = fmt.Sprintf("'%s'", strings.Replace(p, "'", "\\'", -1)) retv = fmt.Sprintf("'%s'", strings.Replace(p, "'", "\\'", -1))
case bool: case bool:
retv = boolToString(bool(p)) retv = boolToString(p)
case uint64: 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: case float64:
retv = floatToString(float64(p)) retv = floatToString(float64(p))
default: default:
retv = "'" + strings.Replace(fmt.Sprintf("%s", p), "'", "\\'", -1) + "'" return "", fmt.Errorf("unsupported type: %T", v)
} }
return retv, nil return retv, nil
} }
@ -215,7 +224,7 @@ func (w *Warp10) SampleConfig() string {
// Description get description // Description get description
func (w *Warp10) Description() string { func (w *Warp10) Description() string {
return "Configuration for Warp server to send metrics to" return "Write metrics to Warp 10"
} }
// Close close // Close close

View File

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