SignalFx Output (#6714)
* [outputs.signalfx] Add output plugin for SignalFX This output plugin converts the `telegraf.Metrics` into signalfx `datapoint`s and then transmits them to the ingest servers using signalfx golang client lib. As of this commit, the client lib is allowed to pick sane defaults and none of its fields are overridable via telegraf config. This can be changed in the future if needed. The unit tests only test for conversion of `telegraf.Metric`s to the `datapoint` structs. All code that executes after that is assumed to be tested in the signalfx client lib itself (and not worth writing end-to-end tests for). Further enhancements: - Custom ingest urls - Better batching - More extensive tests - Support for events, sent by whitelist only Co-authored-by: Ben Keith <benkeith@splunk.com> Co-authored-by: Akshay <akshay.moghe@gmail.com> Co-authored-by: Jay Camp <jcamp@splunk.com>
This commit is contained in:
parent
47e12d1981
commit
2cf4b751be
|
|
@ -442,6 +442,7 @@ For documentation on the latest development code see the [documentation index][d
|
|||
* [prometheus](./plugins/outputs/prometheus_client)
|
||||
* [riemann](./plugins/outputs/riemann)
|
||||
* [riemann_legacy](./plugins/outputs/riemann_legacy)
|
||||
* [signalfx](./plugins/outputs/signalfx)
|
||||
* [socket_writer](./plugins/outputs/socket_writer)
|
||||
* [stackdriver](./plugins/outputs/stackdriver) (Google Cloud Monitoring)
|
||||
* [syslog](./plugins/outputs/syslog)
|
||||
|
|
|
|||
|
|
@ -66,10 +66,12 @@ following works:
|
|||
- github.com/go-ping/ping [MIT License](https://github.com/go-ping/ping/blob/master/LICENSE)
|
||||
- github.com/go-redis/redis [BSD 2-Clause "Simplified" License](https://github.com/go-redis/redis/blob/master/LICENSE)
|
||||
- github.com/go-sql-driver/mysql [Mozilla Public License 2.0](https://github.com/go-sql-driver/mysql/blob/master/LICENSE)
|
||||
- github.com/go-stack/stack [MIT License](https://github.com/go-stack/stack/blob/master/LICENSE.md)
|
||||
- github.com/goburrow/modbus [BSD 3-Clause "New" or "Revised" License](https://github.com/goburrow/modbus/blob/master/LICENSE)
|
||||
- github.com/goburrow/serial [MIT License](https://github.com/goburrow/serial/LICENSE)
|
||||
- github.com/gobwas/glob [MIT License](https://github.com/gobwas/glob/blob/master/LICENSE)
|
||||
- github.com/gofrs/uuid [MIT License](https://github.com/gofrs/uuid/blob/master/LICENSE)
|
||||
- github.com/gogo/googleapis [Apache License 2.0](https://github.com/gogo/googleapis/blob/master/LICENSE)
|
||||
- github.com/gogo/protobuf [BSD 3-Clause Clear License](https://github.com/gogo/protobuf/blob/master/LICENSE)
|
||||
- github.com/golang/geo [Apache License 2.0](https://github.com/golang/geo/blob/master/LICENSE)
|
||||
- github.com/golang/groupcache [Apache License 2.0](https://github.com/golang/groupcache/blob/master/LICENSE)
|
||||
|
|
@ -96,6 +98,7 @@ following works:
|
|||
- github.com/influxdata/toml [MIT License](https://github.com/influxdata/toml/blob/master/LICENSE)
|
||||
- github.com/influxdata/wlog [MIT License](https://github.com/influxdata/wlog/blob/master/LICENSE)
|
||||
- github.com/jackc/pgx [MIT License](https://github.com/jackc/pgx/blob/master/LICENSE)
|
||||
- github.com/jaegertracing/jaeger [Apache License 2.0](https://github.com/jaegertracing/jaeger/blob/master/LICENSE)
|
||||
- github.com/jcmturner/gofork [BSD 3-Clause "New" or "Revised" License](https://github.com/jcmturner/gofork/blob/master/LICENSE)
|
||||
- github.com/jmespath/go-jmespath [Apache License 2.0](https://github.com/jmespath/go-jmespath/blob/master/LICENSE)
|
||||
- github.com/jpillora/backoff [MIT License](https://github.com/jpillora/backoff/blob/master/LICENSE)
|
||||
|
|
@ -127,6 +130,7 @@ following works:
|
|||
- github.com/openconfig/gnmi [Apache License 2.0](https://github.com/openconfig/gnmi/blob/master/LICENSE)
|
||||
- github.com/opencontainers/go-digest [Apache License 2.0](https://github.com/opencontainers/go-digest/blob/master/LICENSE)
|
||||
- github.com/opencontainers/image-spec [Apache License 2.0](https://github.com/opencontainers/image-spec/blob/master/LICENSE)
|
||||
- github.com/opentracing/opentracing-go [Apache License 2.0](https://github.com/opentracing/opentracing-go/blob/master/LICENSE)
|
||||
- github.com/openzipkin/zipkin-go-opentracing [MIT License](https://github.com/openzipkin/zipkin-go-opentracing/blob/master/LICENSE)
|
||||
- github.com/pierrec/lz4 [BSD 3-Clause "New" or "Revised" License](https://github.com/pierrec/lz4/blob/master/LICENSE)
|
||||
- github.com/pkg/errors [BSD 2-Clause "Simplified" License](https://github.com/pkg/errors/blob/master/LICENSE)
|
||||
|
|
@ -141,6 +145,10 @@ following works:
|
|||
- github.com/safchain/ethtool [Apache License 2.0](https://github.com/safchain/ethtool/blob/master/LICENSE)
|
||||
- github.com/samuel/go-zookeeper [BSD 3-Clause Clear License](https://github.com/samuel/go-zookeeper/blob/master/LICENSE)
|
||||
- github.com/shirou/gopsutil [BSD 3-Clause Clear License](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
- github.com/signalfx/com_signalfx_metrics_protobuf [Apache License 2.0](https://github.com/signalfx/com_signalfx_metrics_protobuf/blob/master/LICENSE)
|
||||
- github.com/signalfx/gohistogram [MIT License](https://github.com/signalfx/gohistogram/blob/master/LICENSE)
|
||||
- github.com/signalfx/golib [Apache License 2.0](https://github.com/signalfx/golib/blob/master/LICENSE)
|
||||
- github.com/signalfx/sapm-proto [Apache License 2.0](https://github.com/signalfx/sapm-proto/blob/master/LICENSE)
|
||||
- github.com/sirupsen/logrus [MIT License](https://github.com/sirupsen/logrus/blob/master/LICENSE)
|
||||
- github.com/soniah/gosnmp [BSD 2-Clause "Simplified" License](https://github.com/soniah/gosnmp/blob/master/LICENSE)
|
||||
- github.com/streadway/amqp [BSD 2-Clause "Simplified" License](https://github.com/streadway/amqp/blob/master/LICENSE)
|
||||
|
|
|
|||
10
go.mod
10
go.mod
|
|
@ -18,7 +18,6 @@ require (
|
|||
github.com/Microsoft/ApplicationInsights-Go v0.4.2
|
||||
github.com/Microsoft/go-winio v0.4.9 // indirect
|
||||
github.com/Shopify/sarama v1.27.2
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
|
||||
github.com/aerospike/aerospike-client-go v1.27.0
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4
|
||||
github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9
|
||||
|
|
@ -56,7 +55,6 @@ require (
|
|||
github.com/ericchiang/k8s v1.2.0
|
||||
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
|
||||
github.com/go-logfmt/logfmt v0.4.0
|
||||
github.com/go-ole/go-ole v1.2.1 // indirect
|
||||
github.com/go-ping/ping v0.0.0-20210201095549-52eed920f98c
|
||||
github.com/go-redis/redis v6.15.9+incompatible
|
||||
github.com/go-sql-driver/mysql v1.5.0
|
||||
|
|
@ -64,7 +62,7 @@ require (
|
|||
github.com/goburrow/serial v0.1.0 // indirect
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/gofrs/uuid v2.1.0+incompatible
|
||||
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d
|
||||
github.com/gogo/protobuf v1.3.1
|
||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec
|
||||
github.com/golang/protobuf v1.3.5
|
||||
github.com/golang/snappy v0.0.1
|
||||
|
|
@ -93,7 +91,6 @@ require (
|
|||
github.com/kubernetes/apimachinery v0.0.0-20190119020841-d41becfba9ee
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
github.com/lib/pq v1.3.0 // indirect
|
||||
github.com/mailru/easyjson v0.0.0-20180717111219-efc7eb8984d6 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1
|
||||
github.com/mdlayher/apcupsd v0.0.0-20200608131503-2bf01da7bf1b
|
||||
github.com/miekg/dns v1.0.14
|
||||
|
|
@ -109,7 +106,6 @@ require (
|
|||
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.1 // indirect
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 // indirect
|
||||
github.com/opentracing/opentracing-go v1.0.2 // indirect
|
||||
github.com/openzipkin/zipkin-go-opentracing v0.3.4
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/prometheus/client_golang v1.5.1
|
||||
|
|
@ -119,10 +115,10 @@ require (
|
|||
github.com/prometheus/prometheus v2.5.0+incompatible
|
||||
github.com/riemann/riemann-go-client v0.5.0
|
||||
github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664
|
||||
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec // indirect
|
||||
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect
|
||||
github.com/shirou/gopsutil v2.20.9+incompatible
|
||||
github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114 // indirect
|
||||
github.com/signalfx/golib/v3 v3.3.0
|
||||
github.com/sirupsen/logrus v1.4.2
|
||||
github.com/soniah/gosnmp v1.25.0
|
||||
github.com/streadway/amqp v0.0.0-20180528204448-e5adc2ada8b8
|
||||
|
|
@ -155,7 +151,7 @@ require (
|
|||
gopkg.in/fatih/pool.v2 v2.0.0 // indirect
|
||||
gopkg.in/gorethink/gorethink.v3 v3.0.5
|
||||
gopkg.in/ldap.v3 v3.1.0
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||
gopkg.in/olivere/elastic.v5 v5.0.70
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
gotest.tools v2.2.0+incompatible
|
||||
|
|
|
|||
92
go.sum
92
go.sum
|
|
@ -90,8 +90,8 @@ github.com/Shopify/sarama v1.27.2 h1:1EyY1dsxNDUQEv0O/4TsjosHI2CgB1uo9H/v56xzTxc
|
|||
github.com/Shopify/sarama v1.27.2/go.mod h1:g5s5osgELxgM+Md9Qni9rzo7Rbt+vvFQI4bt/Mc93II=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/aerospike/aerospike-client-go v1.27.0 h1:VC6/Wqqm3Qlp4/utM7Zts3cv4A2HPn8rVFp/XZKTWgE=
|
||||
github.com/aerospike/aerospike-client-go v1.27.0/go.mod h1:zj8LBEnWBDOVEIJt8LvaRvDG5ARAoa5dBeHaB472NRc=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
|
|
@ -146,6 +146,7 @@ github.com/bmatcuk/doublestar/v3 v3.0.0 h1:TQtVPlDnAYwcrVNB2JiGuMc++H5qzWZd9PhkN
|
|||
github.com/bmatcuk/doublestar/v3 v3.0.0/go.mod h1:6PcTVMw80pCY1RVuoqu3V++99uQB3vsSYKPTd8AWA0k=
|
||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
||||
github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds=
|
||||
github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI=
|
||||
github.com/cenkalti/backoff v2.0.0+incompatible h1:5IIPUHhlnUZbcHQsQou5k1Tn58nJkeJL9U+ig5CHJbY=
|
||||
|
|
@ -198,6 +199,8 @@ github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
|
|||
github.com/docker/libnetwork v0.8.0-dev.2.0.20181012153825-d7b61745d166 h1:KgEcrKF0NWi9GT/OvDp9ioXZIrHRbP8S5o+sot9gznQ=
|
||||
github.com/docker/libnetwork v0.8.0-dev.2.0.20181012153825-d7b61745d166/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8=
|
||||
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
|
||||
github.com/dropbox/godropbox v0.0.0-20180512210157-31879d3884b9 h1:NAvZb7gqQfLSNBPzVsvI7eZMosXtg2g2kxXrei90CtU=
|
||||
github.com/dropbox/godropbox v0.0.0-20180512210157-31879d3884b9/go.mod h1:glr97hP/JuXb+WMYCizc4PIFuzw1lCR97mwbe1VVXhQ=
|
||||
github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU=
|
||||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
||||
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
|
||||
|
|
@ -217,6 +220,10 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
|
|||
github.com/ericchiang/k8s v1.2.0 h1:vxrMwEzY43oxu8aZyD/7b1s8tsBM+xoUoxjWECWFbPI=
|
||||
github.com/ericchiang/k8s v1.2.0/go.mod h1:/OmBgSq2cd9IANnsGHGlEz27nwMZV2YxlpXuQtU3Bz4=
|
||||
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
|
||||
github.com/facebookgo/stackerr v0.0.0-20150612192056-c2fcf88613f4 h1:fP04zlkPjAGpsduG7xN3rRkxjAqkJaIQnnkNYYw/pAk=
|
||||
github.com/facebookgo/stackerr v0.0.0-20150612192056-c2fcf88613f4/go.mod h1:SBHk9aNQtiw4R4bEuzHjVmZikkUKCnO1v3lPQ21HZGk=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
|
||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||
|
|
@ -232,13 +239,15 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
|
|||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
|
||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
||||
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
|
||||
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
||||
|
|
@ -249,6 +258,7 @@ github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGK
|
|||
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/goburrow/modbus v0.1.0 h1:DejRZY73nEM6+bt5JSP6IsFolJ9dVcqxsYbpLbeW/ro=
|
||||
github.com/goburrow/modbus v0.1.0/go.mod h1:Kx552D5rLIS8E7TyUwQ/UdHEqvX5T8tyiGBTlzMcZBg=
|
||||
|
|
@ -260,16 +270,23 @@ github.com/gofrs/uuid v2.1.0+incompatible h1:8oEj3gioPmmDAOLQUZdnW+h4FZu9aSE/SQI
|
|||
github.com/gofrs/uuid v2.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gogo/googleapis v1.3.1 h1:CzMaKrvF6Qa7XtRii064vKBQiyvmY8H8vG1xa1/W1JA=
|
||||
github.com/gogo/googleapis v1.3.1/go.mod h1:d+q1s/xVJxZGKWwC/6UfPIF33J+G1Tq4GYv9Y+Tg/EU=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I=
|
||||
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw=
|
||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||
|
|
@ -291,6 +308,7 @@ github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgj
|
|||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/addlicense v0.0.0-20190510175307-22550fa7c1b0/go.mod h1:QtPG26W17m+OIQgE6gQ24gC1M6pUaMBAbFrTIDtwG/E=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
|
|
@ -298,6 +316,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
|
|||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
||||
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
|
|
@ -323,6 +343,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
|
|||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||
|
|
@ -334,6 +355,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
|
|||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/gopcua/opcua v0.1.13 h1:UP746MKRFNbv+CQGfrPwgH7rGxOlSGzVu9ieZdcox4E=
|
||||
github.com/gopcua/opcua v0.1.13/go.mod h1:a6QH4F9XeODklCmWuvaOdL8v9H0d73CEKUHWVZLQyE8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
||||
|
|
@ -391,6 +414,8 @@ github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGU
|
|||
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
|
||||
github.com/jackc/pgx v3.6.0+incompatible h1:bJeo4JdVbDAW8KB2m8XkFeo8CPipREoG37BwEoKGz+Q=
|
||||
github.com/jackc/pgx v3.6.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
|
||||
github.com/jaegertracing/jaeger v1.15.1 h1:7QzNAXq+4ko9GtCjozDNAp2uonoABu+B2Rk94hjQcp4=
|
||||
github.com/jaegertracing/jaeger v1.15.1/go.mod h1:LUWPSnzNPGRubM8pk0inANGitpiMOOxihXx0+53llXI=
|
||||
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
|
||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
|
|
@ -411,6 +436,14 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
|
|||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea h1:g2k+8WR7cHch4g0tBDhfiEvAp7fXxTNBiD1oC1Oxj3E=
|
||||
github.com/juju/errors v0.0.0-20181012004132-a4583d0a56ea/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
|
||||
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI=
|
||||
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||
github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b h1:Rrp0ByJXEjhREMPGTt3aWYjoIsUGCbt21ekbeJcTWv0=
|
||||
github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/kardianos/service v1.0.0 h1:HgQS3mFfOlyntWX8Oke98JcJLqt1DBcHR4kxShpYef0=
|
||||
|
|
@ -447,8 +480,8 @@ github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165/go.mod h1:
|
|||
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.0.0-20180717111219-efc7eb8984d6 h1:8/+Y8SKf0xCZ8cCTfnrMdY7HNzlEjPAt3bPjalNb6CA=
|
||||
github.com/mailru/easyjson v0.0.0-20180717111219-efc7eb8984d6/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
|
||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
|
|
@ -520,14 +553,15 @@ github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVo
|
|||
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openzipkin/zipkin-go-opentracing v0.3.4 h1:x/pBv/5VJNWkcHF1G9xqhug8Iw7X1y1zOMzDmyuvP2g=
|
||||
github.com/openzipkin/zipkin-go-opentracing v0.3.4/go.mod h1:js2AbwmHW0YD9DwIw2JhQWmbfFi/UnWyYwdVhqbCDOE=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pavius/impi v0.0.0-20180302134524-c1cbdcb8df2b/go.mod h1:x/hU0bfdWIhuOT1SKwiJg++yvkk6EuOtJk8WtDZqgr8=
|
||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
|
||||
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
|
|
@ -581,18 +615,33 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
|
|||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664 h1:gvolwzuDhul9qK6/oHqxCHD5TEYfsWNBGidOeG6kvpk=
|
||||
github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec h1:6ncX5ko6B9LntYM0YBRXkiSaZMmLYeZ/NWcmeB43mMY=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 h1:cA+Ubq9qEVIQhIWvP2kNuSZ2CmnfBJFSRq+kO1pu2cc=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shirou/gopsutil v2.20.9+incompatible h1:msXs2frUV+O/JLva9EDLpuJ84PrFsdCTCQex8PUdtkQ=
|
||||
github.com/shirou/gopsutil v2.20.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||
github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114 h1:Pm6R878vxWWWR+Sa3ppsLce/Zq+JNTs6aVvRu13jv9A=
|
||||
github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/signalfx/com_signalfx_metrics_protobuf v0.0.0-20190222193949-1fb69526e884 h1:KgLGEw137KEUtQnWBGzneCetphBj4+kKHRnhpAkXJC0=
|
||||
github.com/signalfx/com_signalfx_metrics_protobuf v0.0.0-20190222193949-1fb69526e884/go.mod h1:muYA2clvwCdj7nzAJ5vJIXYpJsUumhAl4Uu1wUNpWzA=
|
||||
github.com/signalfx/gohistogram v0.0.0-20160107210732-1ccfd2ff5083 h1:WsShHmu12ZztYPfh9b+I+VjYD1o8iOHhB67WZCMEEE8=
|
||||
github.com/signalfx/gohistogram v0.0.0-20160107210732-1ccfd2ff5083/go.mod h1:adPDS6s7WaajdFBV9mQ7i0dKfQ8xiDnF9ZNETVPpp7c=
|
||||
github.com/signalfx/golib/v3 v3.3.0 h1:vSXsAb73bdrlnjk5rnZ7y3t09Qzu9qfBEbXdcyBHsmE=
|
||||
github.com/signalfx/golib/v3 v3.3.0/go.mod h1:GzjWpV0skAXZn7+u9LnkOkiXAx9KKd5XZcd5r+RoF5o=
|
||||
github.com/signalfx/gomemcache v0.0.0-20180823214636-4f7ef64c72a9/go.mod h1:Ytb8KfCSyuwy/VILnROdgCvbQLA5ch0nkbG7lKT0BXw=
|
||||
github.com/signalfx/sapm-proto v0.4.0 h1:5lQX++6FeIjUZEIcnSgBqhOpmSjMkRBW3y/4ZiKMo5E=
|
||||
github.com/signalfx/sapm-proto v0.4.0/go.mod h1:x3gtwJ1GRejtkghB4nYpwixh2zqJrLbPU959ZNhM0Fk=
|
||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v1.6.4-0.20190306220146-200a235640ff h1:JcVn27VGCEwd33jyNj+3IqEbOmzAX9f9LILt3SoGPHU=
|
||||
github.com/smartystreets/goconvey v1.6.4-0.20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
||||
github.com/soniah/gosnmp v1.25.0 h1:0y8vpjD07NPmnT+wojnUrKkYLX9Fxw1jI4cGTumWugQ=
|
||||
github.com/soniah/gosnmp v1.25.0/go.mod h1:8YvfZxH388NIIw2A+X5z2Oh97VcNhtmxDLt5QeUzVuQ=
|
||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
|
|
@ -621,6 +670,7 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0
|
|||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
|
||||
github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e h1:f1yevOHP+Suqk0rVc13fIkzcLULJbyQcXDba2klljD0=
|
||||
github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc h1:R83G5ikgLMxrBvLh22JhdfI8K6YXEPHx5P03Uu3DRs4=
|
||||
|
|
@ -646,6 +696,8 @@ go.opencensus.io v0.20.1 h1:pMEjRZ1M4ebWGikflH7nQpV6+Zr88KBMA2XJD3sbijw=
|
|||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
|
|
@ -656,6 +708,7 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf
|
|||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
|
|
@ -690,6 +743,8 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
|
|||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
|
|
@ -700,6 +755,7 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI
|
|||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
|
|
@ -723,6 +779,7 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
|
|
@ -768,6 +825,7 @@ golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
|
@ -814,6 +872,7 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm
|
|||
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
|
|
@ -821,8 +880,11 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn
|
|||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190906203814-12febf440ab1 h1:w4Q0TX3lC1NfGcWkzt5wG4ee4E5fUAPqh5myV0efeHI=
|
||||
golang.org/x/tools v0.0.0-20190906203814-12febf440ab1/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
|
|
@ -841,6 +903,7 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK
|
|||
golang.org/x/tools v0.0.0-20200317043434-63da46f3035e h1:8ogAbHWoJTPepnVbNRqXLOpzMkl0rtRsM7crbflc4XM=
|
||||
golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
|
@ -881,6 +944,8 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn
|
|||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
|
||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
|
|
@ -899,6 +964,8 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG
|
|||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
|
|
@ -941,8 +1008,8 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
|
|||
gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
|
||||
gopkg.in/ldap.v3 v3.1.0 h1:DIDWEjI7vQWREh0S8X5/NFPCZ3MCVd55LmXKPW4XLGE=
|
||||
gopkg.in/ldap.v3 v3.1.0/go.mod h1:dQjCc0R0kfyFjIlWNMH1DORwUASZyDxo2Ry1B51dXaQ=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/olivere/elastic.v5 v5.0.70 h1:DqFG2Odzs74JCz6SssgJjd6qpGnsOAzNc7+l5EnvsnE=
|
||||
gopkg.in/olivere/elastic.v5 v5.0.70/go.mod h1:FylZT6jQWtfHsicejzOm3jIMVPOAksa80i3o+6qtQRk=
|
||||
gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
|
|
@ -973,6 +1040,7 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
|
|||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
k8s.io/apimachinery v0.17.1 h1:zUjS3szTxoUjTDYNvdFkYt2uMEXLcthcbp+7uZvWhYM=
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ import (
|
|||
_ "github.com/influxdata/telegraf/plugins/outputs/prometheus_client"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/riemann"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/riemann_legacy"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/signalfx"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/socket_writer"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/stackdriver"
|
||||
_ "github.com/influxdata/telegraf/plugins/outputs/sumologic"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
# SignalFx Output Plugin
|
||||
|
||||
```toml
|
||||
[[outputs.signalfx]]
|
||||
## SignalFx Org Access Token
|
||||
access_token = "my-secret-token"
|
||||
|
||||
## The SignalFx realm that your organization resides in
|
||||
signalfx_realm = "us9" # Required if ingest_url is not set
|
||||
|
||||
## You can optionally provide a custom ingest url instead of the
|
||||
## signalfx_realm option above if you are using a gateway or proxy
|
||||
## instance. This option takes precident over signalfx_realm.
|
||||
ingest_url = "https://my-custom-ingest/"
|
||||
|
||||
## Event typed metrics are omitted by default,
|
||||
## If you require an event typed metric you must specify the
|
||||
## metric name in the following list.
|
||||
included_event_names = ["plugin.metric_name"]
|
||||
```
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
package signalfx
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"sync"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/plugins/outputs"
|
||||
"github.com/signalfx/golib/v3/datapoint"
|
||||
"github.com/signalfx/golib/v3/datapoint/dpsink"
|
||||
"github.com/signalfx/golib/v3/event"
|
||||
"github.com/signalfx/golib/v3/sfxclient"
|
||||
)
|
||||
|
||||
//init initializes the plugin context
|
||||
func init() {
|
||||
outputs.Add("signalfx", func() telegraf.Output {
|
||||
return NewSignalFx()
|
||||
})
|
||||
}
|
||||
|
||||
// SignalFx plugin context
|
||||
type SignalFx struct {
|
||||
AccessToken string `toml:"access_token"`
|
||||
SignalFxRealm string `toml:"signalfx_realm"`
|
||||
IngestURL string `toml:"ingest_url"`
|
||||
IncludedEventNames []string `toml:"included_event_names"`
|
||||
|
||||
Log telegraf.Logger `toml:"-"`
|
||||
|
||||
includedEventSet map[string]bool
|
||||
client dpsink.Sink
|
||||
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
wg sync.WaitGroup
|
||||
}
|
||||
|
||||
var sampleConfig = `
|
||||
## SignalFx Org Access Token
|
||||
access_token = "my-secret-token"
|
||||
|
||||
## The SignalFx realm that your organization resides in
|
||||
signalfx_realm = "us9" # Required if ingest_url is not set
|
||||
|
||||
## You can optionally provide a custom ingest url instead of the
|
||||
## signalfx_realm option above if you are using a gateway or proxy
|
||||
## instance. This option takes precident over signalfx_realm.
|
||||
ingest_url = "https://my-custom-ingest/"
|
||||
|
||||
## Event typed metrics are omitted by default,
|
||||
## If you require an event typed metric you must specify the
|
||||
## metric name in the following list.
|
||||
included_event_names = ["plugin.metric_name"]
|
||||
`
|
||||
|
||||
// GetMetricType returns the equivalent telegraf ValueType for a signalfx metric type
|
||||
func GetMetricType(mtype telegraf.ValueType) (metricType datapoint.MetricType) {
|
||||
switch mtype {
|
||||
case telegraf.Counter:
|
||||
metricType = datapoint.Counter
|
||||
case telegraf.Gauge:
|
||||
metricType = datapoint.Gauge
|
||||
case telegraf.Summary:
|
||||
metricType = datapoint.Gauge
|
||||
case telegraf.Histogram:
|
||||
metricType = datapoint.Gauge
|
||||
case telegraf.Untyped:
|
||||
metricType = datapoint.Gauge
|
||||
default:
|
||||
metricType = datapoint.Gauge
|
||||
}
|
||||
return metricType
|
||||
}
|
||||
|
||||
// NewSignalFx - returns a new context for the SignalFx output plugin
|
||||
func NewSignalFx() *SignalFx {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
return &SignalFx{
|
||||
AccessToken: "",
|
||||
SignalFxRealm: "",
|
||||
IngestURL: "",
|
||||
IncludedEventNames: []string{""},
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
client: sfxclient.NewHTTPSink(),
|
||||
}
|
||||
}
|
||||
|
||||
// Description returns a description for the plugin
|
||||
func (s *SignalFx) Description() string {
|
||||
return "Send metrics and events to SignalFx"
|
||||
}
|
||||
|
||||
// SampleConfig returns the sample configuration for the plugin
|
||||
func (s *SignalFx) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
// Connect establishes a connection to SignalFx
|
||||
func (s *SignalFx) Connect() error {
|
||||
client := s.client.(*sfxclient.HTTPSink)
|
||||
client.AuthToken = s.AccessToken
|
||||
|
||||
if s.IngestURL != "" {
|
||||
client.DatapointEndpoint = datapointEndpointForIngestURL(s.IngestURL)
|
||||
client.EventEndpoint = eventEndpointForIngestURL(s.IngestURL)
|
||||
} else if s.SignalFxRealm != "" {
|
||||
client.DatapointEndpoint = datapointEndpointForRealm(s.SignalFxRealm)
|
||||
client.EventEndpoint = eventEndpointForRealm(s.SignalFxRealm)
|
||||
} else {
|
||||
return errors.New("signalfx_realm or ingest_url must be configured")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close closes any connections to SignalFx
|
||||
func (s *SignalFx) Close() error {
|
||||
s.cancel()
|
||||
s.client.(*sfxclient.HTTPSink).Client.CloseIdleConnections()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SignalFx) ConvertToSignalFx(metrics []telegraf.Metric) ([]*datapoint.Datapoint, []*event.Event) {
|
||||
var dps []*datapoint.Datapoint
|
||||
var events []*event.Event
|
||||
|
||||
for _, metric := range metrics {
|
||||
s.Log.Debugf("Processing the following measurement: %v", metric)
|
||||
var timestamp = metric.Time()
|
||||
var metricType datapoint.MetricType
|
||||
|
||||
metricType = GetMetricType(metric.Type())
|
||||
|
||||
for field, val := range metric.Fields() {
|
||||
// Copy the metric tags because they are meant to be treated as
|
||||
// immutable
|
||||
var metricDims = metric.Tags()
|
||||
|
||||
// Generate the metric name
|
||||
metricName := getMetricName(metric.Name(), field)
|
||||
|
||||
// Get the metric value as a datapoint value
|
||||
if metricValue, err := datapoint.CastMetricValueWithBool(val); err == nil {
|
||||
var dp = datapoint.New(metricName,
|
||||
metricDims,
|
||||
metricValue.(datapoint.Value),
|
||||
metricType,
|
||||
timestamp)
|
||||
|
||||
s.Log.Debugf("Datapoint: %v", dp.String())
|
||||
|
||||
dps = append(dps, dp)
|
||||
} else {
|
||||
// Skip if it's not an explicitly included event
|
||||
if !s.isEventIncluded(metricName) {
|
||||
continue
|
||||
}
|
||||
|
||||
// We've already type checked field, so set property with value
|
||||
metricProps := map[string]interface{}{"message": val}
|
||||
var ev = event.NewWithProperties(metricName,
|
||||
event.AGENT,
|
||||
metricDims,
|
||||
metricProps,
|
||||
timestamp)
|
||||
|
||||
s.Log.Debugf("Event: %v", ev.String())
|
||||
|
||||
events = append(events, ev)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dps, events
|
||||
}
|
||||
|
||||
// Write call back for writing metrics
|
||||
func (s *SignalFx) Write(metrics []telegraf.Metric) error {
|
||||
dps, events := s.ConvertToSignalFx(metrics)
|
||||
|
||||
if len(dps) > 0 {
|
||||
err := s.client.AddDatapoints(s.ctx, dps)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if len(events) > 0 {
|
||||
if err := s.client.AddEvents(s.ctx, events); err != nil {
|
||||
// If events error out but we successfully sent some datapoints,
|
||||
// don't return an error so that it won't ever retry -- that way we
|
||||
// don't send the same datapoints twice.
|
||||
if len(dps) == 0 {
|
||||
return err
|
||||
}
|
||||
s.Log.Errorf("Failed to send SignalFx event: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// isEventIncluded - checks whether a metric name for an event was put on the whitelist
|
||||
func (s *SignalFx) isEventIncluded(name string) bool {
|
||||
if s.includedEventSet == nil {
|
||||
s.includedEventSet = make(map[string]bool, len(s.includedEventSet))
|
||||
for _, include := range s.IncludedEventNames {
|
||||
s.includedEventSet[include] = true
|
||||
}
|
||||
}
|
||||
return s.includedEventSet[name]
|
||||
}
|
||||
|
||||
// getMetricName combines telegraf fields and tags into a full metric name
|
||||
func getMetricName(metric string, field string) string {
|
||||
name := metric
|
||||
|
||||
// Include field in metric name when it adds to the metric name
|
||||
if field != "value" {
|
||||
name = fmt.Sprintf("%s.%s", name, field)
|
||||
}
|
||||
|
||||
return name
|
||||
}
|
||||
|
||||
// ingestURLForRealm returns the base ingest URL for a particular SignalFx
|
||||
// realm
|
||||
func ingestURLForRealm(realm string) string {
|
||||
return fmt.Sprintf("https://ingest.%s.signalfx.com", realm)
|
||||
}
|
||||
|
||||
// datapointEndpointForRealm returns the endpoint to which datapoints should be
|
||||
// POSTed for a particular realm.
|
||||
func datapointEndpointForRealm(realm string) string {
|
||||
return datapointEndpointForIngestURL(ingestURLForRealm(realm))
|
||||
}
|
||||
|
||||
// datapointEndpointForRealm returns the endpoint to which datapoints should be
|
||||
// POSTed for a particular ingest base URL.
|
||||
func datapointEndpointForIngestURL(ingestURL string) string {
|
||||
return strings.TrimRight(ingestURL, "/") + "/v2/datapoint"
|
||||
}
|
||||
|
||||
// eventEndpointForRealm returns the endpoint to which events should be
|
||||
// POSTed for a particular realm.
|
||||
func eventEndpointForRealm(realm string) string {
|
||||
return eventEndpointForIngestURL(ingestURLForRealm(realm))
|
||||
}
|
||||
|
||||
// eventEndpointForRealm returns the endpoint to which events should be
|
||||
// POSTed for a particular ingest base URL.
|
||||
func eventEndpointForIngestURL(ingestURL string) string {
|
||||
return strings.TrimRight(ingestURL, "/") + "/v2/event"
|
||||
}
|
||||
|
|
@ -0,0 +1,703 @@
|
|||
package signalfx
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/plugins/outputs"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
"github.com/signalfx/golib/v3/datapoint"
|
||||
"github.com/signalfx/golib/v3/event"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type sink struct {
|
||||
dps []*datapoint.Datapoint
|
||||
evs []*event.Event
|
||||
}
|
||||
|
||||
func (s *sink) AddDatapoints(ctx context.Context, points []*datapoint.Datapoint) error {
|
||||
s.dps = append(s.dps, points...)
|
||||
return nil
|
||||
}
|
||||
func (s *sink) AddEvents(ctx context.Context, events []*event.Event) error {
|
||||
s.evs = append(s.evs, events...)
|
||||
return nil
|
||||
}
|
||||
|
||||
type errorsink struct {
|
||||
dps []*datapoint.Datapoint
|
||||
evs []*event.Event
|
||||
}
|
||||
|
||||
func (e *errorsink) AddDatapoints(ctx context.Context, points []*datapoint.Datapoint) error {
|
||||
return errors.New("not sending datapoints")
|
||||
}
|
||||
func (e *errorsink) AddEvents(ctx context.Context, events []*event.Event) error {
|
||||
return errors.New("not sending events")
|
||||
}
|
||||
func TestSignalFx_SignalFx(t *testing.T) {
|
||||
type measurement struct {
|
||||
name string
|
||||
tags map[string]string
|
||||
fields map[string]interface{}
|
||||
time time.Time
|
||||
tp telegraf.ValueType
|
||||
}
|
||||
type fields struct {
|
||||
IncludedEvents []string
|
||||
}
|
||||
type want struct {
|
||||
datapoints []*datapoint.Datapoint
|
||||
events []*event.Event
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
measurements []*measurement
|
||||
want want
|
||||
}{
|
||||
{
|
||||
name: "add datapoints of all types",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Counter,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Summary,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Histogram,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Untyped,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"myboolmeasurement": true},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"myboolmeasurement": false},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Counter,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.mymeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.myboolmeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewIntValue(int64(1)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
datapoint.New(
|
||||
"datapoint.myboolmeasurement",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewIntValue(int64(0)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "add events of all types",
|
||||
fields: fields{
|
||||
IncludedEvents: []string{"event.mymeasurement"},
|
||||
},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Counter,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Summary,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Histogram,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Untyped,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "exclude events by default",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"value": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "add datapoint with field named value",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"value": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{
|
||||
datapoint.New(
|
||||
"datapoint",
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
datapoint.NewFloatValue(float64(3.14)),
|
||||
datapoint.Gauge,
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "add event",
|
||||
fields: fields{
|
||||
IncludedEvents: []string{"event.mymeasurement"},
|
||||
},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Untyped,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{
|
||||
event.NewWithProperties(
|
||||
"event.mymeasurement",
|
||||
event.AGENT,
|
||||
map[string]string{
|
||||
"host": "192.168.0.1",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"message": "hello world",
|
||||
},
|
||||
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC)),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "exclude events that are not explicitly included",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"value": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "malformed metadata event",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1", "sf_metric": "objects.host-meta-data"},
|
||||
fields: map[string]interface{}{"value": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := outputs.Outputs["signalfx"]().(*SignalFx)
|
||||
s.IncludedEventNames = tt.fields.IncludedEvents
|
||||
s.SignalFxRealm = "test"
|
||||
s.Log = testutil.Logger{}
|
||||
|
||||
require.Nil(t, s.Connect())
|
||||
|
||||
s.client = &sink{
|
||||
dps: []*datapoint.Datapoint{},
|
||||
evs: []*event.Event{},
|
||||
}
|
||||
|
||||
measurements := []telegraf.Metric{}
|
||||
|
||||
for _, measurement := range tt.measurements {
|
||||
m, err := metric.New(
|
||||
measurement.name, measurement.tags, measurement.fields, measurement.time, measurement.tp,
|
||||
)
|
||||
if err != nil {
|
||||
t.Errorf("Error creating measurement %v", measurement)
|
||||
}
|
||||
measurements = append(measurements, m)
|
||||
}
|
||||
|
||||
s.Write(measurements)
|
||||
require.Eventually(t, func() bool { return len(s.client.(*sink).dps) == len(tt.want.datapoints) }, 5*time.Second, 100*time.Millisecond)
|
||||
require.Eventually(t, func() bool { return len(s.client.(*sink).evs) == len(tt.want.events) }, 5*time.Second, 100*time.Millisecond)
|
||||
|
||||
if !reflect.DeepEqual(s.client.(*sink).dps, tt.want.datapoints) {
|
||||
t.Errorf("Collected datapoints do not match desired. Collected: %v Desired: %v", s.client.(*sink).dps, tt.want.datapoints)
|
||||
}
|
||||
if !reflect.DeepEqual(s.client.(*sink).evs, tt.want.events) {
|
||||
t.Errorf("Collected events do not match desired. Collected: %v Desired: %v", s.client.(*sink).evs, tt.want.events)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestSignalFx_Errors(t *testing.T) {
|
||||
type measurement struct {
|
||||
name string
|
||||
tags map[string]string
|
||||
fields map[string]interface{}
|
||||
time time.Time
|
||||
tp telegraf.ValueType
|
||||
}
|
||||
type fields struct {
|
||||
IncludedEvents []string
|
||||
}
|
||||
type want struct {
|
||||
datapoints []*datapoint.Datapoint
|
||||
events []*event.Event
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
measurements []*measurement
|
||||
want want
|
||||
}{
|
||||
{
|
||||
name: "add datapoints of all types",
|
||||
fields: fields{},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Counter,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Summary,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Histogram,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Untyped,
|
||||
},
|
||||
{
|
||||
name: "datapoint",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": float64(3.14)},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "add events of all types",
|
||||
fields: fields{
|
||||
IncludedEvents: []string{"event.mymeasurement"},
|
||||
},
|
||||
measurements: []*measurement{
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Counter,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Gauge,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Summary,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Histogram,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
tp: telegraf.Untyped,
|
||||
},
|
||||
{
|
||||
name: "event",
|
||||
tags: map[string]string{"host": "192.168.0.1"},
|
||||
fields: map[string]interface{}{"mymeasurement": "hello world"},
|
||||
time: time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
want: want{
|
||||
datapoints: []*datapoint.Datapoint{},
|
||||
events: []*event.Event{},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := outputs.Outputs["signalfx"]().(*SignalFx)
|
||||
// constrain the buffer to cover code that emits when batch size is met
|
||||
s.IncludedEventNames = tt.fields.IncludedEvents
|
||||
s.SignalFxRealm = "test"
|
||||
s.Log = testutil.Logger{}
|
||||
|
||||
require.Nil(t, s.Connect())
|
||||
|
||||
s.client = &errorsink{
|
||||
dps: []*datapoint.Datapoint{},
|
||||
evs: []*event.Event{},
|
||||
}
|
||||
|
||||
for _, measurement := range tt.measurements {
|
||||
m, err := metric.New(
|
||||
measurement.name, measurement.tags, measurement.fields, measurement.time, measurement.tp,
|
||||
)
|
||||
if err != nil {
|
||||
t.Errorf("Error creating measurement %v", measurement)
|
||||
}
|
||||
s.Write([]telegraf.Metric{m})
|
||||
}
|
||||
for !(len(s.client.(*errorsink).dps) == len(tt.want.datapoints) && len(s.client.(*errorsink).evs) == len(tt.want.events)) {
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
if !reflect.DeepEqual(s.client.(*errorsink).dps, tt.want.datapoints) {
|
||||
t.Errorf("Collected datapoints do not match desired. Collected: %v Desired: %v", s.client.(*errorsink).dps, tt.want.datapoints)
|
||||
}
|
||||
if !reflect.DeepEqual(s.client.(*errorsink).evs, tt.want.events) {
|
||||
t.Errorf("Collected events do not match desired. Collected: %v Desired: %v", s.client.(*errorsink).evs, tt.want.events)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// this is really just for complete code coverage
|
||||
func TestSignalFx_Description(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "verify description is correct",
|
||||
want: "Send metrics and events to SignalFx",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := &SignalFx{}
|
||||
if got := s.Description(); got != tt.want {
|
||||
t.Errorf("SignalFx.Description() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// this is also just for complete code coverage
|
||||
func TestSignalFx_SampleConfig(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "verify sample config is returned",
|
||||
want: sampleConfig,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := &SignalFx{}
|
||||
if got := s.SampleConfig(); got != tt.want {
|
||||
t.Errorf("SignalFx.SampleConfig() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMetricName(t *testing.T) {
|
||||
type args struct {
|
||||
metric string
|
||||
field string
|
||||
dims map[string]string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want string
|
||||
wantsfx bool
|
||||
}{
|
||||
{
|
||||
name: "fields that equal value should not be append to metricname",
|
||||
args: args{
|
||||
metric: "datapoint",
|
||||
field: "value",
|
||||
dims: map[string]string{
|
||||
"testDimKey": "testDimVal",
|
||||
},
|
||||
},
|
||||
want: "datapoint",
|
||||
},
|
||||
{
|
||||
name: "fields other than 'value' with out sf_metric dim should return measurement.fieldname as metric name",
|
||||
args: args{
|
||||
metric: "datapoint",
|
||||
field: "test",
|
||||
dims: map[string]string{
|
||||
"testDimKey": "testDimVal",
|
||||
},
|
||||
},
|
||||
want: "datapoint.test",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := getMetricName(tt.args.metric, tt.args.field)
|
||||
if got != tt.want {
|
||||
t.Errorf("getMetricName() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue