Compare commits
6 Commits
1.7.0-rc3
...
output-inf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1989287606 | ||
|
|
5f0cbd1255 | ||
|
|
3ef4dff4ec | ||
|
|
dfe7b5eec2 | ||
|
|
92a8f795f5 | ||
|
|
b1d77ade55 |
@@ -1,3 +1,9 @@
|
|||||||
|
## v1.8 [unreleased]
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- [#4236](https://github.com/influxdata/telegraf/pull/4236): Add SSL/TLS support to redis input.
|
||||||
|
|
||||||
## v1.7 [unreleased]
|
## v1.7 [unreleased]
|
||||||
|
|
||||||
### Release Notes
|
### Release Notes
|
||||||
@@ -73,7 +79,6 @@
|
|||||||
- [#2879](https://github.com/influxdata/telegraf/issues/2879): Fix wildcards and multi instance processes in win_perf_counters.
|
- [#2879](https://github.com/influxdata/telegraf/issues/2879): Fix wildcards and multi instance processes in win_perf_counters.
|
||||||
- [#2468](https://github.com/influxdata/telegraf/issues/2468): Fix crash on 32-bit Windows in win_perf_counters.
|
- [#2468](https://github.com/influxdata/telegraf/issues/2468): Fix crash on 32-bit Windows in win_perf_counters.
|
||||||
- [#4198](https://github.com/influxdata/telegraf/issues/4198): Fix win_perf_counters not collecting at every interval.
|
- [#4198](https://github.com/influxdata/telegraf/issues/4198): Fix win_perf_counters not collecting at every interval.
|
||||||
- [#4227](https://github.com/influxdata/telegraf/issues/4227): Use same flags for all BSD family ping variants.
|
|
||||||
|
|
||||||
## v1.6.4 [2018-06-05]
|
## v1.6.4 [2018-06-05]
|
||||||
|
|
||||||
|
|||||||
6
Godeps
6
Godeps
@@ -28,13 +28,13 @@ github.com/golang/snappy 7db9049039a047d955fe8c19b83c8ff5abd765c7
|
|||||||
github.com/go-ole/go-ole be49f7c07711fcb603cff39e1de7c67926dc0ba7
|
github.com/go-ole/go-ole be49f7c07711fcb603cff39e1de7c67926dc0ba7
|
||||||
github.com/google/go-cmp f94e52cad91c65a63acc1e75d4be223ea22e99bc
|
github.com/google/go-cmp f94e52cad91c65a63acc1e75d4be223ea22e99bc
|
||||||
github.com/gorilla/mux 53c1911da2b537f792e7cafcb446b05ffe33b996
|
github.com/gorilla/mux 53c1911da2b537f792e7cafcb446b05ffe33b996
|
||||||
github.com/go-redis/redis 73b70592cdaa9e6abdfcfbf97b4a90d80728c836
|
github.com/go-redis/redis 83fb42932f6145ce52df09860384a4653d2d332a
|
||||||
github.com/go-sql-driver/mysql 2e00b5cd70399450106cec6431c2e2ce3cae5034
|
github.com/go-sql-driver/mysql 2e00b5cd70399450106cec6431c2e2ce3cae5034
|
||||||
github.com/hailocab/go-hostpool e80d13ce29ede4452c43dea11e79b9bc8a15b478
|
github.com/hailocab/go-hostpool e80d13ce29ede4452c43dea11e79b9bc8a15b478
|
||||||
github.com/hashicorp/consul 5174058f0d2bda63fa5198ab96c33d9a909c58ed
|
github.com/hashicorp/consul 5174058f0d2bda63fa5198ab96c33d9a909c58ed
|
||||||
github.com/influxdata/go-syslog eecd51df3ad85464a2bab9b7d3a45bc1e299059e
|
github.com/influxdata/go-syslog 84f3b60009444d298f97454feb1f20cf91d1fa6e
|
||||||
github.com/influxdata/tail c43482518d410361b6c383d7aebce33d0471d7bc
|
github.com/influxdata/tail c43482518d410361b6c383d7aebce33d0471d7bc
|
||||||
github.com/influxdata/toml 2a2e3012f7cfbef64091cc79776311e65dfa211b
|
github.com/influxdata/toml 5d1d907f22ead1cd47adde17ceec5bda9cacaf8f
|
||||||
github.com/influxdata/wlog 7c63b0a71ef8300adc255344d275e10e5c3a71ec
|
github.com/influxdata/wlog 7c63b0a71ef8300adc255344d275e10e5c3a71ec
|
||||||
github.com/fsnotify/fsnotify c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9
|
github.com/fsnotify/fsnotify c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9
|
||||||
github.com/jackc/pgx 63f58fd32edb5684b9e9f4cfaac847c6b42b3917
|
github.com/jackc/pgx 63f58fd32edb5684b9e9f4cfaac847c6b42b3917
|
||||||
|
|||||||
@@ -362,24 +362,6 @@ func (a *Agent) Run(shutdown chan struct{}) error {
|
|||||||
metricC := make(chan telegraf.Metric, 100)
|
metricC := make(chan telegraf.Metric, 100)
|
||||||
aggC := make(chan telegraf.Metric, 100)
|
aggC := make(chan telegraf.Metric, 100)
|
||||||
|
|
||||||
// Start all ServicePlugins
|
|
||||||
for _, input := range a.Config.Inputs {
|
|
||||||
input.SetDefaultTags(a.Config.Tags)
|
|
||||||
switch p := input.Input.(type) {
|
|
||||||
case telegraf.ServiceInput:
|
|
||||||
acc := NewAccumulator(input, metricC)
|
|
||||||
// Service input plugins should set their own precision of their
|
|
||||||
// metrics.
|
|
||||||
acc.SetPrecision(time.Nanosecond, 0)
|
|
||||||
if err := p.Start(acc); err != nil {
|
|
||||||
log.Printf("E! Service for input %s failed to start, exiting\n%s\n",
|
|
||||||
input.Name(), err.Error())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer p.Stop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round collection to nearest interval by sleeping
|
// Round collection to nearest interval by sleeping
|
||||||
if a.Config.Agent.RoundInterval {
|
if a.Config.Agent.RoundInterval {
|
||||||
i := int64(a.Config.Agent.Interval.Duration)
|
i := int64(a.Config.Agent.Interval.Duration)
|
||||||
@@ -419,6 +401,25 @@ func (a *Agent) Run(shutdown chan struct{}) error {
|
|||||||
}(input, interval)
|
}(input, interval)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start all ServicePlugins inputs after all other
|
||||||
|
// plugins are loaded so that no metrics get dropped
|
||||||
|
for _, input := range a.Config.Inputs {
|
||||||
|
input.SetDefaultTags(a.Config.Tags)
|
||||||
|
switch p := input.Input.(type) {
|
||||||
|
case telegraf.ServiceInput:
|
||||||
|
acc := NewAccumulator(input, metricC)
|
||||||
|
// Service input plugins should set their own precision of their
|
||||||
|
// metrics.
|
||||||
|
acc.SetPrecision(time.Nanosecond, 0)
|
||||||
|
if err := p.Start(acc); err != nil {
|
||||||
|
log.Printf("E! Service for input %s failed to start, exiting\n%s\n",
|
||||||
|
input.Name(), err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer p.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
a.Close()
|
a.Close()
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ var fService = flag.String("service", "",
|
|||||||
var fRunAsConsole = flag.Bool("console", false, "run as console application (windows only)")
|
var fRunAsConsole = flag.Bool("console", false, "run as console application (windows only)")
|
||||||
|
|
||||||
var (
|
var (
|
||||||
nextVersion = "1.7.0"
|
nextVersion = "1.8.0"
|
||||||
version string
|
version string
|
||||||
commit string
|
commit string
|
||||||
branch string
|
branch string
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
@@ -153,6 +154,7 @@ func (r *RunningAggregator) Run(
|
|||||||
m.Time().After(r.periodEnd.Add(truncation).Add(r.Config.Delay)) {
|
m.Time().After(r.periodEnd.Add(truncation).Add(r.Config.Delay)) {
|
||||||
// the metric is outside the current aggregation period, so
|
// the metric is outside the current aggregation period, so
|
||||||
// skip it.
|
// skip it.
|
||||||
|
log.Printf("D! aggregator: metric \"%s\" is not in the current timewindow, skipping", m.Name())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
r.add(m)
|
r.add(m)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ type ClientConfig struct {
|
|||||||
// Deprecated in 1.7; use TLS variables above
|
// Deprecated in 1.7; use TLS variables above
|
||||||
SSLCA string `toml:"ssl_ca"`
|
SSLCA string `toml:"ssl_ca"`
|
||||||
SSLCert string `toml:"ssl_cert"`
|
SSLCert string `toml:"ssl_cert"`
|
||||||
SSLKey string `toml:"ssl_key"`
|
SSLKey string `toml:"ssl_ca"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerConfig represents the standard server TLS config.
|
// ServerConfig represents the standard server TLS config.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ To use this plugin you must enable the [monitoring](https://www.openldap.org/dev
|
|||||||
# ldaps, starttls, or no encryption. default is an empty string, disabling all encryption.
|
# ldaps, starttls, or no encryption. default is an empty string, disabling all encryption.
|
||||||
# note that port will likely need to be changed to 636 for ldaps
|
# note that port will likely need to be changed to 636 for ldaps
|
||||||
# valid options: "" | "starttls" | "ldaps"
|
# valid options: "" | "starttls" | "ldaps"
|
||||||
tls = ""
|
ssl = ""
|
||||||
|
|
||||||
# skip peer certificate verification. Default is false.
|
# skip peer certificate verification. Default is false.
|
||||||
insecure_skip_verify = false
|
insecure_skip_verify = false
|
||||||
|
|||||||
@@ -15,11 +15,9 @@ import (
|
|||||||
type Openldap struct {
|
type Openldap struct {
|
||||||
Host string
|
Host string
|
||||||
Port int
|
Port int
|
||||||
SSL string `toml:"ssl"` // Deprecated in 1.7; use TLS
|
Ssl string
|
||||||
TLS string `toml:"tls"`
|
|
||||||
InsecureSkipVerify bool
|
InsecureSkipVerify bool
|
||||||
SSLCA string `toml:"ssl_ca"` // Deprecated in 1.7; use TLSCA
|
SslCa string
|
||||||
TLSCA string `toml:"tls_ca"`
|
|
||||||
BindDn string
|
BindDn string
|
||||||
BindPassword string
|
BindPassword string
|
||||||
ReverseMetricNames bool
|
ReverseMetricNames bool
|
||||||
@@ -32,7 +30,7 @@ const sampleConfig string = `
|
|||||||
# ldaps, starttls, or no encryption. default is an empty string, disabling all encryption.
|
# ldaps, starttls, or no encryption. default is an empty string, disabling all encryption.
|
||||||
# note that port will likely need to be changed to 636 for ldaps
|
# note that port will likely need to be changed to 636 for ldaps
|
||||||
# valid options: "" | "starttls" | "ldaps"
|
# valid options: "" | "starttls" | "ldaps"
|
||||||
tls = ""
|
ssl = ""
|
||||||
|
|
||||||
# skip peer certificate verification. Default is false.
|
# skip peer certificate verification. Default is false.
|
||||||
insecure_skip_verify = false
|
insecure_skip_verify = false
|
||||||
@@ -72,11 +70,9 @@ func NewOpenldap() *Openldap {
|
|||||||
return &Openldap{
|
return &Openldap{
|
||||||
Host: "localhost",
|
Host: "localhost",
|
||||||
Port: 389,
|
Port: 389,
|
||||||
SSL: "",
|
Ssl: "",
|
||||||
TLS: "",
|
|
||||||
InsecureSkipVerify: false,
|
InsecureSkipVerify: false,
|
||||||
SSLCA: "",
|
SslCa: "",
|
||||||
TLSCA: "",
|
|
||||||
BindDn: "",
|
BindDn: "",
|
||||||
BindPassword: "",
|
BindPassword: "",
|
||||||
ReverseMetricNames: false,
|
ReverseMetricNames: false,
|
||||||
@@ -85,19 +81,12 @@ func NewOpenldap() *Openldap {
|
|||||||
|
|
||||||
// gather metrics
|
// gather metrics
|
||||||
func (o *Openldap) Gather(acc telegraf.Accumulator) error {
|
func (o *Openldap) Gather(acc telegraf.Accumulator) error {
|
||||||
if o.TLS == "" {
|
|
||||||
o.TLS = o.SSL
|
|
||||||
}
|
|
||||||
if o.TLSCA == "" {
|
|
||||||
o.TLSCA = o.SSLCA
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var l *ldap.Conn
|
var l *ldap.Conn
|
||||||
if o.TLS != "" {
|
if o.Ssl != "" {
|
||||||
// build tls config
|
// build tls config
|
||||||
clientTLSConfig := tls.ClientConfig{
|
clientTLSConfig := tls.ClientConfig{
|
||||||
TLSCA: o.TLSCA,
|
SSLCA: o.SslCa,
|
||||||
InsecureSkipVerify: o.InsecureSkipVerify,
|
InsecureSkipVerify: o.InsecureSkipVerify,
|
||||||
}
|
}
|
||||||
tlsConfig, err := clientTLSConfig.TLSConfig()
|
tlsConfig, err := clientTLSConfig.TLSConfig()
|
||||||
@@ -105,13 +94,13 @@ func (o *Openldap) Gather(acc telegraf.Accumulator) error {
|
|||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if o.TLS == "ldaps" {
|
if o.Ssl == "ldaps" {
|
||||||
l, err = ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", o.Host, o.Port), tlsConfig)
|
l, err = ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", o.Host, o.Port), tlsConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
} else if o.TLS == "starttls" {
|
} else if o.Ssl == "starttls" {
|
||||||
l, err = ldap.Dial("tcp", fmt.Sprintf("%s:%d", o.Host, o.Port))
|
l, err = ldap.Dial("tcp", fmt.Sprintf("%s:%d", o.Host, o.Port))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
@@ -119,7 +108,7 @@ func (o *Openldap) Gather(acc telegraf.Accumulator) error {
|
|||||||
}
|
}
|
||||||
err = l.StartTLS(tlsConfig)
|
err = l.StartTLS(tlsConfig)
|
||||||
} else {
|
} else {
|
||||||
acc.AddError(fmt.Errorf("Invalid setting for ssl: %s", o.TLS))
|
acc.AddError(fmt.Errorf("Invalid setting for ssl: %s", o.Ssl))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
package openldap
|
package openldap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"gopkg.in/ldap.v2"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gopkg.in/ldap.v2"
|
|
||||||
|
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -75,7 +74,7 @@ func TestOpenldapStartTLS(t *testing.T) {
|
|||||||
o := &Openldap{
|
o := &Openldap{
|
||||||
Host: testutil.GetLocalHost(),
|
Host: testutil.GetLocalHost(),
|
||||||
Port: 389,
|
Port: 389,
|
||||||
SSL: "starttls",
|
Ssl: "starttls",
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +92,7 @@ func TestOpenldapLDAPS(t *testing.T) {
|
|||||||
o := &Openldap{
|
o := &Openldap{
|
||||||
Host: testutil.GetLocalHost(),
|
Host: testutil.GetLocalHost(),
|
||||||
Port: 636,
|
Port: 636,
|
||||||
SSL: "ldaps",
|
Ssl: "ldaps",
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +110,7 @@ func TestOpenldapInvalidSSL(t *testing.T) {
|
|||||||
o := &Openldap{
|
o := &Openldap{
|
||||||
Host: testutil.GetLocalHost(),
|
Host: testutil.GetLocalHost(),
|
||||||
Port: 636,
|
Port: 636,
|
||||||
SSL: "invalid",
|
Ssl: "invalid",
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +129,7 @@ func TestOpenldapBind(t *testing.T) {
|
|||||||
o := &Openldap{
|
o := &Openldap{
|
||||||
Host: testutil.GetLocalHost(),
|
Host: testutil.GetLocalHost(),
|
||||||
Port: 389,
|
Port: 389,
|
||||||
SSL: "",
|
Ssl: "",
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
BindDn: "cn=manager,cn=config",
|
BindDn: "cn=manager,cn=config",
|
||||||
BindPassword: "secret",
|
BindPassword: "secret",
|
||||||
@@ -158,7 +157,7 @@ func TestOpenldapReverseMetrics(t *testing.T) {
|
|||||||
o := &Openldap{
|
o := &Openldap{
|
||||||
Host: testutil.GetLocalHost(),
|
Host: testutil.GetLocalHost(),
|
||||||
Port: 389,
|
Port: 389,
|
||||||
SSL: "",
|
Ssl: "",
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
BindDn: "cn=manager,cn=config",
|
BindDn: "cn=manager,cn=config",
|
||||||
BindPassword: "secret",
|
BindPassword: "secret",
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ func (p *Ping) args(url string) []string {
|
|||||||
}
|
}
|
||||||
if p.Timeout > 0 {
|
if p.Timeout > 0 {
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "darwin", "freebsd", "netbsd", "openbsd":
|
case "darwin":
|
||||||
args = append(args, "-W", strconv.FormatFloat(p.Timeout*1000, 'f', -1, 64))
|
args = append(args, "-W", strconv.FormatFloat(p.Timeout*1000, 'f', -1, 64))
|
||||||
case "linux":
|
case "linux":
|
||||||
args = append(args, "-W", strconv.FormatFloat(p.Timeout, 'f', -1, 64))
|
args = append(args, "-W", strconv.FormatFloat(p.Timeout, 'f', -1, 64))
|
||||||
@@ -186,7 +186,7 @@ func (p *Ping) args(url string) []string {
|
|||||||
}
|
}
|
||||||
if p.Deadline > 0 {
|
if p.Deadline > 0 {
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "darwin", "freebsd", "netbsd", "openbsd":
|
case "darwin":
|
||||||
args = append(args, "-t", strconv.Itoa(p.Deadline))
|
args = append(args, "-t", strconv.Itoa(p.Deadline))
|
||||||
case "linux":
|
case "linux":
|
||||||
args = append(args, "-w", strconv.Itoa(p.Deadline))
|
args = append(args, "-w", strconv.Itoa(p.Deadline))
|
||||||
@@ -197,10 +197,10 @@ func (p *Ping) args(url string) []string {
|
|||||||
}
|
}
|
||||||
if p.Interface != "" {
|
if p.Interface != "" {
|
||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "darwin", "freebsd", "netbsd", "openbsd":
|
|
||||||
args = append(args, "-S", p.Interface)
|
|
||||||
case "linux":
|
case "linux":
|
||||||
args = append(args, "-I", p.Interface)
|
args = append(args, "-I", p.Interface)
|
||||||
|
case "freebsd", "darwin":
|
||||||
|
args = append(args, "-S", p.Interface)
|
||||||
default:
|
default:
|
||||||
// Not sure the best option here, just assume GNU ping?
|
// Not sure the best option here, just assume GNU ping?
|
||||||
args = append(args, "-I", p.Interface)
|
args = append(args, "-I", p.Interface)
|
||||||
|
|||||||
@@ -14,6 +14,13 @@
|
|||||||
## If no servers are specified, then localhost is used as the host.
|
## If no servers are specified, then localhost is used as the host.
|
||||||
## If no port is specified, 6379 is used
|
## If no port is specified, 6379 is used
|
||||||
servers = ["tcp://localhost:6379"]
|
servers = ["tcp://localhost:6379"]
|
||||||
|
|
||||||
|
## 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 = true
|
||||||
```
|
```
|
||||||
|
|
||||||
### Measurements & Fields:
|
### Measurements & Fields:
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ import (
|
|||||||
|
|
||||||
"github.com/go-redis/redis"
|
"github.com/go-redis/redis"
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/internal/tls"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Redis struct {
|
type Redis struct {
|
||||||
Servers []string
|
Servers []string
|
||||||
|
tls.ClientConfig
|
||||||
|
|
||||||
clients []Client
|
clients []Client
|
||||||
initialized bool
|
initialized bool
|
||||||
@@ -56,6 +58,13 @@ var sampleConfig = `
|
|||||||
## If no servers are specified, then localhost is used as the host.
|
## If no servers are specified, then localhost is used as the host.
|
||||||
## If no port is specified, 6379 is used
|
## If no port is specified, 6379 is used
|
||||||
servers = ["tcp://localhost:6379"]
|
servers = ["tcp://localhost:6379"]
|
||||||
|
|
||||||
|
## 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 = true
|
||||||
`
|
`
|
||||||
|
|
||||||
func (r *Redis) SampleConfig() string {
|
func (r *Redis) SampleConfig() string {
|
||||||
@@ -109,12 +118,18 @@ func (r *Redis) init(acc telegraf.Accumulator) error {
|
|||||||
address = u.Host
|
address = u.Host
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tlsConfig, err := r.ClientConfig.TLSConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
client := redis.NewClient(
|
client := redis.NewClient(
|
||||||
&redis.Options{
|
&redis.Options{
|
||||||
Addr: address,
|
Addr: address,
|
||||||
Password: password,
|
Password: password,
|
||||||
Network: u.Scheme,
|
Network: u.Scheme,
|
||||||
PoolSize: 1,
|
PoolSize: 1,
|
||||||
|
TLSConfig: tlsConfig,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ whether the Object, Instance and Counter exist on Telegraf startup.
|
|||||||
Counter paths are refreshed periodically, see [CountersRefreshInterval](#countersrefreshinterval)
|
Counter paths are refreshed periodically, see [CountersRefreshInterval](#countersrefreshinterval)
|
||||||
configuration parameter for more info.
|
configuration parameter for more info.
|
||||||
|
|
||||||
|
Wildcards can be used in instance and counter names. Partial wildcards are supported only
|
||||||
|
in instance names on Windows Vista and newer.
|
||||||
|
|
||||||
In case of query for all instances `["*"]`, the plugin does not return the instance `_Total`
|
In case of query for all instances `["*"]`, the plugin does not return the instance `_Total`
|
||||||
by default. See [IncludeTotal](#includetotal) for more info.
|
by default. See [IncludeTotal](#includetotal) for more info.
|
||||||
|
|
||||||
@@ -31,36 +34,18 @@ Bool, if set to `true` will print out all matching performance objects.
|
|||||||
Example:
|
Example:
|
||||||
`PrintValid=true`
|
`PrintValid=true`
|
||||||
|
|
||||||
#### UseWildcardsExpansion
|
|
||||||
|
|
||||||
If `UseWildcardsExpansion` is set to true, wildcards can be used in the
|
|
||||||
instance name and the counter name. When using localized Windows, counters
|
|
||||||
will be also be localized. Instance indexes will also be returned in the
|
|
||||||
instance name.
|
|
||||||
|
|
||||||
Partial wildcards (e.g. `chrome*`) are supported only in the instance name on Windows Vista and newer.
|
|
||||||
|
|
||||||
If disabled, wildcards (not partial) in instance names can still be used, but
|
|
||||||
instance indexes will not be returned in the instance names.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
`UseWildcardsExpansion=true`
|
|
||||||
|
|
||||||
#### CountersRefreshInterval
|
#### CountersRefreshInterval
|
||||||
|
|
||||||
Configured counters are matched against available counters at the interval
|
Configured counters are matched against available counters at the interval
|
||||||
specified by the `CountersRefreshInterval` parameter. Default value is `1m` (1 minute).
|
specified by the `CountersRefreshInterval` parameter. Default value is `1m` (1 minute).
|
||||||
|
|
||||||
If wildcards are used in instance or counter names, they are expanded at this point, if the `UseWildcardsExpansion` param is set to `true`.
|
If wildcards are used in instance or counter names, they are expanded at this point.
|
||||||
|
|
||||||
Setting `CountersRefreshInterval` too low (order of seconds) can cause Telegraf to create
|
Setting `CountersRefreshInterval` too low (order of seconds) can cause Telegraf to create
|
||||||
a high CPU load.
|
a high CPU load.
|
||||||
|
|
||||||
Set to `0s` to disable periodic refreshing.
|
Set to `0s` to disable periodic refreshing.
|
||||||
|
|
||||||
Example:
|
|
||||||
`CountersRefreshInterval=1m`
|
|
||||||
|
|
||||||
#### PreVistaSupport
|
#### PreVistaSupport
|
||||||
|
|
||||||
_Deprecated. Necessary features on Windows Vista and newer are checked dynamically_
|
_Deprecated. Necessary features on Windows Vista and newer are checked dynamically_
|
||||||
@@ -103,7 +88,7 @@ By default any results containing `_Total` are stripped,
|
|||||||
unless this is specified as the wanted instance.
|
unless this is specified as the wanted instance.
|
||||||
Alternatively see the option `IncludeTotal` below.
|
Alternatively see the option `IncludeTotal` below.
|
||||||
|
|
||||||
It is also possible to set partial wildcards, eg. `["chrome*"]`, if the `UseWildcardsExpansion` param is set to `true`
|
It is also possible to set partial wildcards, eg. `["chrome*"]`
|
||||||
|
|
||||||
Some Objects do not have instances to select from at all.
|
Some Objects do not have instances to select from at all.
|
||||||
Here only one option is valid if you want data back,
|
Here only one option is valid if you want data back,
|
||||||
@@ -116,10 +101,8 @@ Counters key (this is an array) is the counters of the ObjectName
|
|||||||
you would like returned, it can also be one or more values.
|
you would like returned, it can also be one or more values.
|
||||||
|
|
||||||
Example: `Counters = ["% Idle Time", "% Disk Read Time", "% Disk Write Time"]`
|
Example: `Counters = ["% Idle Time", "% Disk Read Time", "% Disk Write Time"]`
|
||||||
|
This must be specified for every counter you want the results of,
|
||||||
This must be specified for every counter you want the results of, or use
|
or use `["*"]` for all the counters for object.
|
||||||
`["*"]` for all the counters for object, if the `UseWildcardsExpansion` param
|
|
||||||
is set to `true`
|
|
||||||
|
|
||||||
#### Measurement
|
#### Measurement
|
||||||
*Optional*
|
*Optional*
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ func PdhGetFormattedCounterValueDouble(hCounter PDH_HCOUNTER, lpdwType *uint32,
|
|||||||
// time.Sleep(2000 * time.Millisecond)
|
// time.Sleep(2000 * time.Millisecond)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
func PdhGetFormattedCounterArrayDouble(hCounter PDH_HCOUNTER, lpdwBufferSize *uint32, lpdwBufferCount *uint32, itemBuffer *byte) uint32 {
|
func PdhGetFormattedCounterArrayDouble(hCounter PDH_HCOUNTER, lpdwBufferSize *uint32, lpdwBufferCount *uint32, itemBuffer *PDH_FMT_COUNTERVALUE_ITEM_DOUBLE) uint32 {
|
||||||
ret, _, _ := pdh_GetFormattedCounterArrayW.Call(
|
ret, _, _ := pdh_GetFormattedCounterArrayW.Call(
|
||||||
uintptr(hCounter),
|
uintptr(hCounter),
|
||||||
uintptr(PDH_FMT_DOUBLE|PDH_FMT_NOCAP100),
|
uintptr(PDH_FMT_DOUBLE|PDH_FMT_NOCAP100),
|
||||||
|
|||||||
@@ -9,12 +9,6 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
//PerformanceQuery is abstraction for PDH_FMT_COUNTERVALUE_ITEM_DOUBLE
|
|
||||||
type CounterValue struct {
|
|
||||||
InstanceName string
|
|
||||||
Value float64
|
|
||||||
}
|
|
||||||
|
|
||||||
//PerformanceQuery provides wrappers around Windows performance counters API for easy usage in GO
|
//PerformanceQuery provides wrappers around Windows performance counters API for easy usage in GO
|
||||||
type PerformanceQuery interface {
|
type PerformanceQuery interface {
|
||||||
Open() error
|
Open() error
|
||||||
@@ -24,7 +18,6 @@ type PerformanceQuery interface {
|
|||||||
GetCounterPath(counterHandle PDH_HCOUNTER) (string, error)
|
GetCounterPath(counterHandle PDH_HCOUNTER) (string, error)
|
||||||
ExpandWildCardPath(counterPath string) ([]string, error)
|
ExpandWildCardPath(counterPath string) ([]string, error)
|
||||||
GetFormattedCounterValueDouble(hCounter PDH_HCOUNTER) (float64, error)
|
GetFormattedCounterValueDouble(hCounter PDH_HCOUNTER) (float64, error)
|
||||||
GetFormattedCounterArrayDouble(hCounter PDH_HCOUNTER) ([]CounterValue, error)
|
|
||||||
CollectData() error
|
CollectData() error
|
||||||
AddEnglishCounterSupported() bool
|
AddEnglishCounterSupported() bool
|
||||||
}
|
}
|
||||||
@@ -158,28 +151,6 @@ func (m *PerformanceQueryImpl) GetFormattedCounterValueDouble(hCounter PDH_HCOUN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PerformanceQueryImpl) GetFormattedCounterArrayDouble(hCounter PDH_HCOUNTER) ([]CounterValue, error) {
|
|
||||||
var buffSize uint32
|
|
||||||
var itemCount uint32
|
|
||||||
ret := PdhGetFormattedCounterArrayDouble(hCounter, &buffSize, &itemCount, nil)
|
|
||||||
if ret == PDH_MORE_DATA {
|
|
||||||
buff := make([]byte, buffSize)
|
|
||||||
ret = PdhGetFormattedCounterArrayDouble(hCounter, &buffSize, &itemCount, &buff[0])
|
|
||||||
if ret == ERROR_SUCCESS {
|
|
||||||
items := (*[1 << 20]PDH_FMT_COUNTERVALUE_ITEM_DOUBLE)(unsafe.Pointer(&buff[0]))[:itemCount]
|
|
||||||
values := make([]CounterValue, 0, itemCount)
|
|
||||||
for _, item := range items {
|
|
||||||
if item.FmtValue.CStatus == PDH_CSTATUS_VALID_DATA || item.FmtValue.CStatus == PDH_CSTATUS_NEW_DATA {
|
|
||||||
val := CounterValue{UTF16PtrToString(item.SzName), item.FmtValue.DoubleValue}
|
|
||||||
values = append(values, val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return values, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, NewPdhError(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *PerformanceQueryImpl) CollectData() error {
|
func (m *PerformanceQueryImpl) CollectData() error {
|
||||||
if m.query == 0 {
|
if m.query == 0 {
|
||||||
return errors.New("uninitialised query")
|
return errors.New("uninitialised query")
|
||||||
@@ -210,7 +181,7 @@ func UTF16ToStringArray(buf []uint16) []string {
|
|||||||
stringLine := UTF16PtrToString(&buf[0])
|
stringLine := UTF16PtrToString(&buf[0])
|
||||||
for stringLine != "" {
|
for stringLine != "" {
|
||||||
strings = append(strings, stringLine)
|
strings = append(strings, stringLine)
|
||||||
nextLineStart += len([]rune(stringLine)) + 1
|
nextLineStart += len(stringLine) + 1
|
||||||
remainingBuf := buf[nextLineStart:]
|
remainingBuf := buf[nextLineStart:]
|
||||||
stringLine = UTF16PtrToString(&remainingBuf[0])
|
stringLine = UTF16PtrToString(&remainingBuf[0])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,10 +22,6 @@ var sampleConfig = `
|
|||||||
## agent, it will not be gathered.
|
## agent, it will not be gathered.
|
||||||
## Settings:
|
## Settings:
|
||||||
# PrintValid = false # Print All matching performance counters
|
# PrintValid = false # Print All matching performance counters
|
||||||
# If UseWildcardsExpansion params is set to true, wildcards (partial wildcards in instance names and wildcards in counters names) in configured counter paths will be expanded
|
|
||||||
# and in case of localized Windows, counter paths will be also localized. It also returns instance indexes in instance names.
|
|
||||||
# If false, wildcards (not partial) in instance names will be still expanded, but instance indexes will not be returned in instance names.
|
|
||||||
#UseWildcardsExpansion = false
|
|
||||||
# Period after which counters will be reread from configuration and wildcards in counter paths expanded
|
# Period after which counters will be reread from configuration and wildcards in counter paths expanded
|
||||||
CountersRefreshInterval="1m"
|
CountersRefreshInterval="1m"
|
||||||
|
|
||||||
@@ -79,7 +75,6 @@ type Win_PerfCounters struct {
|
|||||||
PreVistaSupport bool
|
PreVistaSupport bool
|
||||||
Object []perfobject
|
Object []perfobject
|
||||||
CountersRefreshInterval internal.Duration
|
CountersRefreshInterval internal.Duration
|
||||||
UseWildcardsExpansion bool
|
|
||||||
|
|
||||||
lastRefreshed time.Time
|
lastRefreshed time.Time
|
||||||
counters []*counter
|
counters []*counter
|
||||||
@@ -142,59 +137,45 @@ func (m *Win_PerfCounters) SampleConfig() string {
|
|||||||
return sampleConfig
|
return sampleConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
//objectName string, counter string, instance string, measurement string, include_total bool
|
func (m *Win_PerfCounters) AddItem(counterPath string, instance string, measurement string, includeTotal bool) error {
|
||||||
func (m *Win_PerfCounters) AddItem(counterPath string, objectName string, instance string, counterName string, measurement string, includeTotal bool) error {
|
|
||||||
var err error
|
|
||||||
var counterHandle PDH_HCOUNTER
|
|
||||||
if !m.query.AddEnglishCounterSupported() {
|
if !m.query.AddEnglishCounterSupported() {
|
||||||
counterHandle, err = m.query.AddCounterToQuery(counterPath)
|
_, err := m.query.AddCounterToQuery(counterPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
counterHandle, err = m.query.AddEnglishCounterToQuery(counterPath)
|
counterHandle, err := m.query.AddEnglishCounterToQuery(counterPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.UseWildcardsExpansion {
|
|
||||||
origInstance := instance
|
|
||||||
counterPath, err = m.query.GetCounterPath(counterHandle)
|
counterPath, err = m.query.GetCounterPath(counterHandle)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
counters, err := m.query.ExpandWildCardPath(counterPath)
|
}
|
||||||
|
|
||||||
|
counters, err := m.query.ExpandWildCardPath(counterPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, counterPath := range counters {
|
||||||
|
var err error
|
||||||
|
counterHandle, err := m.query.AddCounterToQuery(counterPath)
|
||||||
|
|
||||||
|
parsedObjectName, parsedInstance, parsedCounter, err := extractObjectInstanceCounterFromQuery(counterPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, counterPath := range counters {
|
if parsedInstance == "_Total" && instance == "*" && !includeTotal {
|
||||||
var err error
|
continue
|
||||||
counterHandle, err := m.query.AddCounterToQuery(counterPath)
|
|
||||||
|
|
||||||
objectName, instance, counterName, err = extractObjectInstanceCounterFromQuery(counterPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if instance == "_Total" && origInstance == "*" && !includeTotal {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
newItem := &counter{counterPath, objectName, counterName, instance, measurement,
|
|
||||||
includeTotal, counterHandle}
|
|
||||||
m.counters = append(m.counters, newItem)
|
|
||||||
|
|
||||||
if m.PrintValid {
|
|
||||||
log.Printf("Valid: %s\n", counterPath)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
newItem := &counter{counterPath, objectName, counterName, instance, measurement,
|
newItem := &counter{counterPath, parsedObjectName, parsedCounter, parsedInstance, measurement,
|
||||||
includeTotal, counterHandle}
|
includeTotal, counterHandle}
|
||||||
m.counters = append(m.counters, newItem)
|
m.counters = append(m.counters, newItem)
|
||||||
|
|
||||||
if m.PrintValid {
|
if m.PrintValid {
|
||||||
log.Printf("Valid: %s\n", counterPath)
|
log.Printf("Valid: %s\n", counterPath)
|
||||||
}
|
}
|
||||||
@@ -218,7 +199,7 @@ func (m *Win_PerfCounters) ParseConfig() error {
|
|||||||
counterPath = "\\" + objectname + "(" + instance + ")\\" + counter
|
counterPath = "\\" + objectname + "(" + instance + ")\\" + counter
|
||||||
}
|
}
|
||||||
|
|
||||||
err := m.AddItem(counterPath, objectname, instance, counter, PerfObject.Measurement, PerfObject.IncludeTotal)
|
err := m.AddItem(counterPath, instance, PerfObject.Measurement, PerfObject.IncludeTotal)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if PerfObject.FailOnMissing || PerfObject.WarnOnMissing {
|
if PerfObject.FailOnMissing || PerfObject.WarnOnMissing {
|
||||||
@@ -244,9 +225,7 @@ func (m *Win_PerfCounters) Gather(acc telegraf.Accumulator) error {
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
if m.lastRefreshed.IsZero() || (m.CountersRefreshInterval.Duration.Nanoseconds() > 0 && m.lastRefreshed.Add(m.CountersRefreshInterval.Duration).Before(time.Now())) {
|
if m.lastRefreshed.IsZero() || (m.CountersRefreshInterval.Duration.Nanoseconds() > 0 && m.lastRefreshed.Add(m.CountersRefreshInterval.Duration).Before(time.Now())) {
|
||||||
if m.counters != nil {
|
m.counters = m.counters[:0]
|
||||||
m.counters = m.counters[:0]
|
|
||||||
}
|
|
||||||
|
|
||||||
err = m.query.Open()
|
err = m.query.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -282,61 +261,22 @@ func (m *Win_PerfCounters) Gather(acc telegraf.Accumulator) error {
|
|||||||
// For iterate over the known metrics and get the samples.
|
// For iterate over the known metrics and get the samples.
|
||||||
for _, metric := range m.counters {
|
for _, metric := range m.counters {
|
||||||
// collect
|
// collect
|
||||||
if m.UseWildcardsExpansion {
|
value, err := m.query.GetFormattedCounterValueDouble(metric.counterHandle)
|
||||||
value, err := m.query.GetFormattedCounterValueDouble(metric.counterHandle)
|
if err == nil {
|
||||||
if err == nil {
|
measurement := sanitizedChars.Replace(metric.measurement)
|
||||||
measurement := sanitizedChars.Replace(metric.measurement)
|
if measurement == "" {
|
||||||
if measurement == "" {
|
measurement = "win_perf_counters"
|
||||||
measurement = "win_perf_counters"
|
|
||||||
}
|
|
||||||
|
|
||||||
var instance = InstanceGrouping{measurement, metric.instance, metric.objectName}
|
|
||||||
if collectFields[instance] == nil {
|
|
||||||
collectFields[instance] = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
collectFields[instance][sanitizedChars.Replace(metric.counter)] = float32(value)
|
|
||||||
} else {
|
|
||||||
//ignore invalid data from as some counters from process instances returns this sometimes
|
|
||||||
if phderr, ok := err.(*PdhError); ok && phderr.ErrorCode != PDH_INVALID_DATA && phderr.ErrorCode != PDH_CALC_NEGATIVE_VALUE {
|
|
||||||
return fmt.Errorf("error while getting value for counter %s: %v", metric.counterPath, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var instance = InstanceGrouping{measurement, metric.instance, metric.objectName}
|
||||||
|
if collectFields[instance] == nil {
|
||||||
|
collectFields[instance] = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
collectFields[instance][sanitizedChars.Replace(metric.counter)] = float32(value)
|
||||||
} else {
|
} else {
|
||||||
counterValues, err := m.query.GetFormattedCounterArrayDouble(metric.counterHandle)
|
//ignore invalid data from as some counters from process instances returns this sometimes
|
||||||
if err == nil {
|
if phderr, ok := err.(*PdhError); ok && phderr.ErrorCode != PDH_INVALID_DATA && phderr.ErrorCode != PDH_CALC_NEGATIVE_VALUE {
|
||||||
for _, cValue := range counterValues {
|
return fmt.Errorf("error while getting value for counter %s: %v", metric.counterPath, err)
|
||||||
var add bool
|
|
||||||
if metric.includeTotal {
|
|
||||||
// If IncludeTotal is set, include all.
|
|
||||||
add = true
|
|
||||||
} else if metric.instance == "*" && !strings.Contains(cValue.InstanceName, "_Total") {
|
|
||||||
// Catch if set to * and that it is not a '*_Total*' instance.
|
|
||||||
add = true
|
|
||||||
} else if metric.instance == cValue.InstanceName {
|
|
||||||
// Catch if we set it to total or some form of it
|
|
||||||
add = true
|
|
||||||
} else if strings.Contains(metric.instance, "#") && strings.HasPrefix(metric.instance, cValue.InstanceName) {
|
|
||||||
// If you are using a multiple instance identifier such as "w3wp#1"
|
|
||||||
// phd.dll returns only the first 2 characters of the identifier.
|
|
||||||
add = true
|
|
||||||
cValue.InstanceName = metric.instance
|
|
||||||
} else if metric.instance == "------" {
|
|
||||||
add = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if add {
|
|
||||||
measurement := sanitizedChars.Replace(metric.measurement)
|
|
||||||
if measurement == "" {
|
|
||||||
measurement = "win_perf_counters"
|
|
||||||
}
|
|
||||||
var instance = InstanceGrouping{measurement, cValue.InstanceName, metric.objectName}
|
|
||||||
|
|
||||||
if collectFields[instance] == nil {
|
|
||||||
collectFields[instance] = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
collectFields[instance][sanitizedChars.Replace(metric.counter)] = float32(cValue.Value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,29 +81,6 @@ func TestWinPerformanceQueryImpl(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, paths)
|
require.NotNil(t, paths)
|
||||||
assert.True(t, len(paths) > 1)
|
assert.True(t, len(paths) > 1)
|
||||||
|
|
||||||
err = query.Open()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
counterPath = "\\Process(*)\\% Processor Time"
|
|
||||||
hCounter, err = query.AddEnglishCounterToQuery(counterPath)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.NotEqual(t, 0, hCounter)
|
|
||||||
|
|
||||||
err = query.CollectData()
|
|
||||||
require.NoError(t, err)
|
|
||||||
time.Sleep(time.Second)
|
|
||||||
|
|
||||||
err = query.CollectData()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
arr, err := query.GetFormattedCounterArrayDouble(hCounter)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.True(t, len(arr) > 0, "Too")
|
|
||||||
|
|
||||||
err = query.Close()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWinPerfcountersConfigGet1(t *testing.T) {
|
func TestWinPerfcountersConfigGet1(t *testing.T) {
|
||||||
@@ -596,7 +573,7 @@ func TestWinPerfcountersCollect2(t *testing.T) {
|
|||||||
|
|
||||||
perfobjects[0] = PerfObject
|
perfobjects[0] = PerfObject
|
||||||
|
|
||||||
m := Win_PerfCounters{PrintValid: false, Object: perfobjects, query: &PerformanceQueryImpl{}, UseWildcardsExpansion: true}
|
m := Win_PerfCounters{PrintValid: false, Object: perfobjects, query: &PerformanceQueryImpl{}}
|
||||||
var acc testutil.Accumulator
|
var acc testutil.Accumulator
|
||||||
err := m.Gather(&acc)
|
err := m.Gather(&acc)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
@@ -25,14 +25,6 @@ type FakePerformanceQuery struct {
|
|||||||
openCalled bool
|
openCalled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testCounter) ToCounterValue() *CounterValue {
|
|
||||||
_, inst, _, _ := extractObjectInstanceCounterFromQuery(m.path)
|
|
||||||
if inst == "" {
|
|
||||||
inst = "--"
|
|
||||||
}
|
|
||||||
return &CounterValue{inst, m.value}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FakePerformanceQuery) Open() error {
|
func (m *FakePerformanceQuery) Open() error {
|
||||||
if m.openCalled {
|
if m.openCalled {
|
||||||
err := m.Close()
|
err := m.Close()
|
||||||
@@ -110,48 +102,6 @@ func (m *FakePerformanceQuery) GetFormattedCounterValueDouble(counterHandle PDH_
|
|||||||
}
|
}
|
||||||
return 0, fmt.Errorf("GetFormattedCounterValueDouble: invalid handle: %d", counterHandle)
|
return 0, fmt.Errorf("GetFormattedCounterValueDouble: invalid handle: %d", counterHandle)
|
||||||
}
|
}
|
||||||
func (m *FakePerformanceQuery) findCounterByPath(counterPath string) *testCounter {
|
|
||||||
for _, c := range m.counters {
|
|
||||||
if c.path == counterPath {
|
|
||||||
return &c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FakePerformanceQuery) findCounterByHandle(counterHandle PDH_HCOUNTER) *testCounter {
|
|
||||||
for _, c := range m.counters {
|
|
||||||
if c.handle == counterHandle {
|
|
||||||
return &c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FakePerformanceQuery) GetFormattedCounterArrayDouble(hCounter PDH_HCOUNTER) ([]CounterValue, error) {
|
|
||||||
if !m.openCalled {
|
|
||||||
return nil, errors.New("GetFormattedCounterArrayDouble: uninitialised query")
|
|
||||||
}
|
|
||||||
for _, c := range m.counters {
|
|
||||||
if c.handle == hCounter {
|
|
||||||
if e, ok := m.expandPaths[c.path]; ok {
|
|
||||||
counters := make([]CounterValue, 0, len(e))
|
|
||||||
for _, p := range e {
|
|
||||||
counter := m.findCounterByPath(p)
|
|
||||||
if counter != nil && counter.value > 0 {
|
|
||||||
counters = append(counters, *counter.ToCounterValue())
|
|
||||||
} else {
|
|
||||||
return nil, fmt.Errorf("GetFormattedCounterArrayDouble: invalid counter : %s", p)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return counters, nil
|
|
||||||
} else {
|
|
||||||
return nil, fmt.Errorf("GetFormattedCounterArrayDouble: invalid counter : %d", hCounter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("GetFormattedCounterArrayDouble: invalid counter : %d, no paths found", hCounter)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FakePerformanceQuery) CollectData() error {
|
func (m *FakePerformanceQuery) CollectData() error {
|
||||||
if !m.openCalled {
|
if !m.openCalled {
|
||||||
@@ -202,7 +152,7 @@ func TestAddItemSimple(t *testing.T) {
|
|||||||
}}
|
}}
|
||||||
err = m.query.Open()
|
err = m.query.Open()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
err = m.AddItem(cps1[0], "O", "I", "c", "test", false)
|
err = m.AddItem(cps1[0], "I", "test", false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -211,7 +161,7 @@ func TestAddItemSimple(t *testing.T) {
|
|||||||
func TestAddItemInvalidCountPath(t *testing.T) {
|
func TestAddItemInvalidCountPath(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
cps1 := []string{"\\O\\C"}
|
cps1 := []string{"\\O\\C"}
|
||||||
m := Win_PerfCounters{PrintValid: false, Object: nil, UseWildcardsExpansion: true, query: &FakePerformanceQuery{
|
m := Win_PerfCounters{PrintValid: false, Object: nil, query: &FakePerformanceQuery{
|
||||||
counters: createCounterMap(cps1, []float64{1.1}),
|
counters: createCounterMap(cps1, []float64{1.1}),
|
||||||
expandPaths: map[string][]string{
|
expandPaths: map[string][]string{
|
||||||
cps1[0]: {"\\O/C"},
|
cps1[0]: {"\\O/C"},
|
||||||
@@ -220,7 +170,7 @@ func TestAddItemInvalidCountPath(t *testing.T) {
|
|||||||
}}
|
}}
|
||||||
err = m.query.Open()
|
err = m.query.Open()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
err = m.AddItem("\\O\\C", "O", "------", "C", "test", false)
|
err = m.AddItem("\\O\\C", "*", "test", false)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -247,24 +197,13 @@ func TestParseConfigBasic(t *testing.T) {
|
|||||||
assert.Len(t, m.counters, 4)
|
assert.Len(t, m.counters, 4)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
|
|
||||||
err = m.query.Open()
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = m.ParseConfig()
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, m.counters, 4)
|
|
||||||
err = m.query.Close()
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseConfigNoInstance(t *testing.T) {
|
func TestParseConfigNoInstance(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
perfObjects := createPerfObject("m", "O", []string{"------"}, []string{"C1", "C2"}, false, false)
|
perfObjects := createPerfObject("m", "O", []string{"------"}, []string{"C1", "C2"}, false, false)
|
||||||
cps1 := []string{"\\O\\C1", "\\O\\C2"}
|
cps1 := []string{"\\O\\C1", "\\O\\C2"}
|
||||||
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, UseWildcardsExpansion: false, query: &FakePerformanceQuery{
|
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, query: &FakePerformanceQuery{
|
||||||
counters: createCounterMap(cps1, []float64{1.1, 1.2}),
|
counters: createCounterMap(cps1, []float64{1.1, 1.2}),
|
||||||
expandPaths: map[string][]string{
|
expandPaths: map[string][]string{
|
||||||
cps1[0]: {cps1[0]},
|
cps1[0]: {cps1[0]},
|
||||||
@@ -279,17 +218,6 @@ func TestParseConfigNoInstance(t *testing.T) {
|
|||||||
assert.Len(t, m.counters, 2)
|
assert.Len(t, m.counters, 2)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
|
|
||||||
err = m.query.Open()
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = m.ParseConfig()
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, m.counters, 2)
|
|
||||||
err = m.query.Close()
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseConfigInvalidCounterError(t *testing.T) {
|
func TestParseConfigInvalidCounterError(t *testing.T) {
|
||||||
@@ -311,16 +239,6 @@ func TestParseConfigInvalidCounterError(t *testing.T) {
|
|||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
|
|
||||||
err = m.query.Open()
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = m.ParseConfig()
|
|
||||||
require.Error(t, err)
|
|
||||||
err = m.query.Close()
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseConfigInvalidCounterNoError(t *testing.T) {
|
func TestParseConfigInvalidCounterNoError(t *testing.T) {
|
||||||
@@ -342,24 +260,13 @@ func TestParseConfigInvalidCounterNoError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
err = m.query.Close()
|
err = m.query.Close()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
|
|
||||||
err = m.query.Open()
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = m.ParseConfig()
|
|
||||||
require.NoError(t, err)
|
|
||||||
err = m.query.Close()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseConfigTotalExpansion(t *testing.T) {
|
func TestParseConfigTotal(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
perfObjects := createPerfObject("m", "O", []string{"*"}, []string{"*"}, true, true)
|
perfObjects := createPerfObject("m", "O", []string{"*"}, []string{"*"}, true, true)
|
||||||
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(_Total)\\C1", "\\O(_Total)\\C2"}
|
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(_Total)\\C1", "\\O(_Total)\\C2"}
|
||||||
m := Win_PerfCounters{PrintValid: false, UseWildcardsExpansion: true, Object: perfObjects, query: &FakePerformanceQuery{
|
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, query: &FakePerformanceQuery{
|
||||||
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
||||||
expandPaths: map[string][]string{
|
expandPaths: map[string][]string{
|
||||||
"\\O(*)\\*": cps1,
|
"\\O(*)\\*": cps1,
|
||||||
@@ -376,7 +283,7 @@ func TestParseConfigTotalExpansion(t *testing.T) {
|
|||||||
|
|
||||||
perfObjects[0].IncludeTotal = false
|
perfObjects[0].IncludeTotal = false
|
||||||
|
|
||||||
m = Win_PerfCounters{PrintValid: false, UseWildcardsExpansion: true, Object: perfObjects, query: &FakePerformanceQuery{
|
m = Win_PerfCounters{PrintValid: false, Object: perfObjects, query: &FakePerformanceQuery{
|
||||||
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
||||||
expandPaths: map[string][]string{
|
expandPaths: map[string][]string{
|
||||||
"\\O(*)\\*": cps1,
|
"\\O(*)\\*": cps1,
|
||||||
@@ -396,7 +303,7 @@ func TestParseConfigExpand(t *testing.T) {
|
|||||||
var err error
|
var err error
|
||||||
perfObjects := createPerfObject("m", "O", []string{"*"}, []string{"*"}, false, false)
|
perfObjects := createPerfObject("m", "O", []string{"*"}, []string{"*"}, false, false)
|
||||||
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2"}
|
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2"}
|
||||||
m := Win_PerfCounters{PrintValid: false, UseWildcardsExpansion: true, Object: perfObjects, query: &FakePerformanceQuery{
|
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, query: &FakePerformanceQuery{
|
||||||
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
||||||
expandPaths: map[string][]string{
|
expandPaths: map[string][]string{
|
||||||
"\\O(*)\\*": cps1,
|
"\\O(*)\\*": cps1,
|
||||||
@@ -439,17 +346,6 @@ func TestSimpleGather(t *testing.T) {
|
|||||||
"objectname": "O",
|
"objectname": "O",
|
||||||
}
|
}
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
m.lastRefreshed = time.Time{}
|
|
||||||
|
|
||||||
var acc2 testutil.Accumulator
|
|
||||||
|
|
||||||
err = m.Gather(&acc2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGatherInvalidDataIgnore(t *testing.T) {
|
func TestGatherInvalidDataIgnore(t *testing.T) {
|
||||||
@@ -481,25 +377,15 @@ func TestGatherInvalidDataIgnore(t *testing.T) {
|
|||||||
"objectname": "O",
|
"objectname": "O",
|
||||||
}
|
}
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
||||||
|
|
||||||
m.UseWildcardsExpansion = true
|
|
||||||
m.counters = nil
|
|
||||||
m.lastRefreshed = time.Time{}
|
|
||||||
|
|
||||||
var acc2 testutil.Accumulator
|
|
||||||
err = m.Gather(&acc2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//tests with expansion
|
func TestGatherRefreshing(t *testing.T) {
|
||||||
func TestGatherRefreshingWithExpansion(t *testing.T) {
|
|
||||||
var err error
|
var err error
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
t.Skip("Skipping long taking test in short mode")
|
t.Skip("Skipping long taking test in short mode")
|
||||||
}
|
}
|
||||||
measurement := "test"
|
measurement := "test"
|
||||||
perfObjects := createPerfObject(measurement, "O", []string{"*"}, []string{"*"}, true, false)
|
perfObjects := createPerfObject(measurement, "O", []string{"*"}, []string{"*"}, false, false)
|
||||||
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2"}
|
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2"}
|
||||||
fpm := &FakePerformanceQuery{
|
fpm := &FakePerformanceQuery{
|
||||||
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
counters: createCounterMap(append(cps1, "\\O(*)\\*"), []float64{1.1, 1.2, 1.3, 1.4, 0}),
|
||||||
@@ -508,7 +394,7 @@ func TestGatherRefreshingWithExpansion(t *testing.T) {
|
|||||||
},
|
},
|
||||||
addEnglishSupported: true,
|
addEnglishSupported: true,
|
||||||
}
|
}
|
||||||
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, UseWildcardsExpansion: true, query: fpm, CountersRefreshInterval: internal.Duration{Duration: time.Second * 10}}
|
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, query: fpm, CountersRefreshInterval: internal.Duration{Duration: time.Second * 10}}
|
||||||
var acc1 testutil.Accumulator
|
var acc1 testutil.Accumulator
|
||||||
err = m.Gather(&acc1)
|
err = m.Gather(&acc1)
|
||||||
assert.Len(t, m.counters, 4)
|
assert.Len(t, m.counters, 4)
|
||||||
@@ -577,211 +463,3 @@ func TestGatherRefreshingWithExpansion(t *testing.T) {
|
|||||||
acc3.AssertContainsTaggedFields(t, measurement, fields3, tags3)
|
acc3.AssertContainsTaggedFields(t, measurement, fields3, tags3)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGatherRefreshingWithoutExpansion(t *testing.T) {
|
|
||||||
var err error
|
|
||||||
if testing.Short() {
|
|
||||||
t.Skip("Skipping long taking test in short mode")
|
|
||||||
}
|
|
||||||
measurement := "test"
|
|
||||||
perfObjects := createPerfObject(measurement, "O", []string{"*"}, []string{"C1", "C2"}, true, false)
|
|
||||||
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2"}
|
|
||||||
fpm := &FakePerformanceQuery{
|
|
||||||
counters: createCounterMap(append([]string{"\\O(*)\\C1", "\\O(*)\\C2"}, cps1...), []float64{0, 0, 1.1, 1.2, 1.3, 1.4}),
|
|
||||||
expandPaths: map[string][]string{
|
|
||||||
"\\O(*)\\C1": {cps1[0], cps1[2]},
|
|
||||||
"\\O(*)\\C2": {cps1[1], cps1[3]},
|
|
||||||
},
|
|
||||||
addEnglishSupported: true,
|
|
||||||
}
|
|
||||||
m := Win_PerfCounters{PrintValid: false, Object: perfObjects, UseWildcardsExpansion: false, query: fpm, CountersRefreshInterval: internal.Duration{Duration: time.Second * 10}}
|
|
||||||
var acc1 testutil.Accumulator
|
|
||||||
err = m.Gather(&acc1)
|
|
||||||
assert.Len(t, m.counters, 2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, acc1.Metrics, 2)
|
|
||||||
|
|
||||||
fields1 := map[string]interface{}{
|
|
||||||
"C1": float32(1.1),
|
|
||||||
"C2": float32(1.2),
|
|
||||||
}
|
|
||||||
tags1 := map[string]string{
|
|
||||||
"instance": "I1",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
|
|
||||||
fields2 := map[string]interface{}{
|
|
||||||
"C1": float32(1.3),
|
|
||||||
"C2": float32(1.4),
|
|
||||||
}
|
|
||||||
tags2 := map[string]string{
|
|
||||||
"instance": "I2",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields2, tags2)
|
|
||||||
//test finding new instance
|
|
||||||
cps2 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I2)\\C1", "\\O(I2)\\C2", "\\O(I3)\\C1", "\\O(I3)\\C2"}
|
|
||||||
fpm = &FakePerformanceQuery{
|
|
||||||
counters: createCounterMap(append([]string{"\\O(*)\\C1", "\\O(*)\\C2"}, cps2...), []float64{0, 0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6}),
|
|
||||||
expandPaths: map[string][]string{
|
|
||||||
"\\O(*)\\C1": {cps2[0], cps2[2], cps2[4]},
|
|
||||||
"\\O(*)\\C2": {cps2[1], cps2[3], cps2[5]},
|
|
||||||
},
|
|
||||||
addEnglishSupported: true,
|
|
||||||
}
|
|
||||||
m.query = fpm
|
|
||||||
fpm.Open()
|
|
||||||
var acc2 testutil.Accumulator
|
|
||||||
|
|
||||||
fields3 := map[string]interface{}{
|
|
||||||
"C1": float32(1.5),
|
|
||||||
"C2": float32(1.6),
|
|
||||||
}
|
|
||||||
tags3 := map[string]string{
|
|
||||||
"instance": "I3",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
|
|
||||||
//test before elapsing CounterRefreshRate counters are not refreshed
|
|
||||||
err = m.Gather(&acc2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, m.counters, 2)
|
|
||||||
assert.Len(t, acc2.Metrics, 3)
|
|
||||||
|
|
||||||
acc2.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
acc2.AssertContainsTaggedFields(t, measurement, fields2, tags2)
|
|
||||||
acc2.AssertContainsTaggedFields(t, measurement, fields3, tags3)
|
|
||||||
//test changed configuration
|
|
||||||
perfObjects = createPerfObject(measurement, "O", []string{"*"}, []string{"C1", "C2", "C3"}, true, false)
|
|
||||||
cps3 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(I1)\\C3", "\\O(I2)\\C1", "\\O(I2)\\C2", "\\O(I2)\\C3"}
|
|
||||||
fpm = &FakePerformanceQuery{
|
|
||||||
counters: createCounterMap(append([]string{"\\O(*)\\C1", "\\O(*)\\C2", "\\O(*)\\C3"}, cps3...), []float64{0, 0, 0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6}),
|
|
||||||
expandPaths: map[string][]string{
|
|
||||||
"\\O(*)\\C1": {cps3[0], cps3[3]},
|
|
||||||
"\\O(*)\\C2": {cps3[1], cps3[4]},
|
|
||||||
"\\O(*)\\C3": {cps3[2], cps3[5]},
|
|
||||||
},
|
|
||||||
addEnglishSupported: true,
|
|
||||||
}
|
|
||||||
m.query = fpm
|
|
||||||
m.Object = perfObjects
|
|
||||||
|
|
||||||
fpm.Open()
|
|
||||||
|
|
||||||
time.Sleep(m.CountersRefreshInterval.Duration)
|
|
||||||
|
|
||||||
var acc3 testutil.Accumulator
|
|
||||||
err = m.Gather(&acc3)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, acc3.Metrics, 2)
|
|
||||||
fields4 := map[string]interface{}{
|
|
||||||
"C1": float32(1.1),
|
|
||||||
"C2": float32(1.2),
|
|
||||||
"C3": float32(1.3),
|
|
||||||
}
|
|
||||||
tags4 := map[string]string{
|
|
||||||
"instance": "I1",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
fields5 := map[string]interface{}{
|
|
||||||
"C1": float32(1.4),
|
|
||||||
"C2": float32(1.5),
|
|
||||||
"C3": float32(1.6),
|
|
||||||
}
|
|
||||||
tags5 := map[string]string{
|
|
||||||
"instance": "I2",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
|
|
||||||
acc3.AssertContainsTaggedFields(t, measurement, fields4, tags4)
|
|
||||||
acc3.AssertContainsTaggedFields(t, measurement, fields5, tags5)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGatherTotalNoExpansion(t *testing.T) {
|
|
||||||
var err error
|
|
||||||
measurement := "m"
|
|
||||||
perfObjects := createPerfObject(measurement, "O", []string{"*"}, []string{"C1", "C2"}, true, true)
|
|
||||||
cps1 := []string{"\\O(I1)\\C1", "\\O(I1)\\C2", "\\O(_Total)\\C1", "\\O(_Total)\\C2"}
|
|
||||||
m := Win_PerfCounters{PrintValid: false, UseWildcardsExpansion: false, Object: perfObjects, query: &FakePerformanceQuery{
|
|
||||||
counters: createCounterMap(append([]string{"\\O(*)\\C1", "\\O(*)\\C2"}, cps1...), []float64{0, 0, 1.1, 1.2, 1.3, 1.4}),
|
|
||||||
expandPaths: map[string][]string{
|
|
||||||
"\\O(*)\\C1": {cps1[0], cps1[2]},
|
|
||||||
"\\O(*)\\C2": {cps1[1], cps1[3]},
|
|
||||||
},
|
|
||||||
addEnglishSupported: true,
|
|
||||||
}}
|
|
||||||
var acc1 testutil.Accumulator
|
|
||||||
err = m.Gather(&acc1)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, m.counters, 2)
|
|
||||||
assert.Len(t, acc1.Metrics, 2)
|
|
||||||
fields1 := map[string]interface{}{
|
|
||||||
"C1": float32(1.1),
|
|
||||||
"C2": float32(1.2),
|
|
||||||
}
|
|
||||||
tags1 := map[string]string{
|
|
||||||
"instance": "I1",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
|
|
||||||
fields2 := map[string]interface{}{
|
|
||||||
"C1": float32(1.3),
|
|
||||||
"C2": float32(1.4),
|
|
||||||
}
|
|
||||||
tags2 := map[string]string{
|
|
||||||
"instance": "_Total",
|
|
||||||
"objectname": "O",
|
|
||||||
}
|
|
||||||
acc1.AssertContainsTaggedFields(t, measurement, fields2, tags2)
|
|
||||||
|
|
||||||
perfObjects[0].IncludeTotal = false
|
|
||||||
|
|
||||||
m.counters = nil
|
|
||||||
m.lastRefreshed = time.Time{}
|
|
||||||
|
|
||||||
var acc2 testutil.Accumulator
|
|
||||||
err = m.Gather(&acc2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Len(t, m.counters, 2)
|
|
||||||
assert.Len(t, acc2.Metrics, 1)
|
|
||||||
|
|
||||||
acc2.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
||||||
|
|
||||||
acc2.AssertDoesNotContainsTaggedFields(t, measurement, fields2, tags2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// list of nul terminated strings from WinAPI
|
|
||||||
var unicodeStringListWithEnglishChars = []uint16{0x5c, 0x5c, 0x54, 0x34, 0x38, 0x30, 0x5c, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x6b, 0x28, 0x30, 0x20, 0x43, 0x3a, 0x29, 0x5c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x69, 0x73, 0x6b, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x20, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0, 0x5c, 0x5c, 0x54, 0x34, 0x38, 0x30, 0x5c, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x6b, 0x28, 0x5f, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x29, 0x5c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x69, 0x73, 0x6b, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x20, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0, 0x0}
|
|
||||||
var unicodeStringListWithCzechChars = []uint16{0x5c, 0x5c, 0x54, 0x34, 0x38, 0x30, 0x5c, 0x46, 0x79, 0x7a, 0x69, 0x63, 0x6b, 0xfd, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x28, 0x30, 0x20, 0x43, 0x3a, 0x29, 0x5c, 0x41, 0x6b, 0x74, 0x75, 0xe1, 0x6c, 0x6e, 0xed, 0x20, 0x64, 0xe9, 0x6c, 0x6b, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x79, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x75, 0x0, 0x5c, 0x5c, 0x54, 0x34, 0x38, 0x30, 0x5c, 0x46, 0x79, 0x7a, 0x69, 0x63, 0x6b, 0xfd, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x28, 0x5f, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x29, 0x5c, 0x41, 0x6b, 0x74, 0x75, 0xe1, 0x6c, 0x6e, 0xed, 0x20, 0x64, 0xe9, 0x6c, 0x6b, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x79, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x75, 0x0, 0x0}
|
|
||||||
var unicodeStringListSingleItem = []uint16{0x5c, 0x5c, 0x54, 0x34, 0x38, 0x30, 0x5c, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x6b, 0x28, 0x30, 0x20, 0x43, 0x3a, 0x29, 0x5c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x44, 0x69, 0x73, 0x6b, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x20, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0, 0x0}
|
|
||||||
var unicodeStringListNoItem = []uint16{0x0}
|
|
||||||
|
|
||||||
var stringArrayWithEnglishChars = []string{
|
|
||||||
"\\\\T480\\PhysicalDisk(0 C:)\\Current Disk Queue Length",
|
|
||||||
"\\\\T480\\PhysicalDisk(_Total)\\Current Disk Queue Length",
|
|
||||||
}
|
|
||||||
var stringArrayWithCzechChars = []string{
|
|
||||||
"\\\\T480\\Fyzick\u00fd disk(0 C:)\\Aktu\u00e1ln\u00ed d\u00e9lka fronty disku",
|
|
||||||
"\\\\T480\\Fyzick\u00fd disk(_Total)\\Aktu\u00e1ln\u00ed d\u00e9lka fronty disku",
|
|
||||||
}
|
|
||||||
|
|
||||||
var stringArraySingleItem = []string{
|
|
||||||
"\\\\T480\\PhysicalDisk(0 C:)\\Current Disk Queue Length",
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUTF16ToStringArray(t *testing.T) {
|
|
||||||
singleItem := UTF16ToStringArray(unicodeStringListSingleItem)
|
|
||||||
assert.True(t, assert.ObjectsAreEqual(singleItem, stringArraySingleItem), "Not equal single arrays")
|
|
||||||
|
|
||||||
noItem := UTF16ToStringArray(unicodeStringListNoItem)
|
|
||||||
assert.Nil(t, noItem)
|
|
||||||
|
|
||||||
engStrings := UTF16ToStringArray(unicodeStringListWithEnglishChars)
|
|
||||||
assert.True(t, assert.ObjectsAreEqual(engStrings, stringArrayWithEnglishChars), "Not equal eng arrays")
|
|
||||||
|
|
||||||
czechStrings := UTF16ToStringArray(unicodeStringListWithCzechChars)
|
|
||||||
assert.True(t, assert.ObjectsAreEqual(czechStrings, stringArrayWithCzechChars), "Not equal czech arrays")
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -140,17 +140,17 @@ func (i *InfluxDB) Connect() error {
|
|||||||
i.serializer.SetFieldTypeSupport(influx.UintSupport)
|
i.serializer.SetFieldTypeSupport(influx.UintSupport)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, u := range urls {
|
for _, loc := range urls {
|
||||||
u, err := url.Parse(u)
|
u, err := url.Parse(loc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error parsing url [%s]: %v", u, err)
|
return fmt.Errorf("error parsing url [%q]: %v", loc, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var proxy *url.URL
|
var proxy *url.URL
|
||||||
if len(i.HTTPProxy) > 0 {
|
if len(i.HTTPProxy) > 0 {
|
||||||
proxy, err = url.Parse(i.HTTPProxy)
|
proxy, err = url.Parse(i.HTTPProxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error parsing proxy_url [%s]: %v", proxy, err)
|
return fmt.Errorf("error parsing proxy_url [%q]: %v", proxy, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ func (i *InfluxDB) Connect() error {
|
|||||||
|
|
||||||
i.clients = append(i.clients, c)
|
i.clients = append(i.clients, c)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unsupported scheme [%s]: %q", u, u.Scheme)
|
return fmt.Errorf("unsupported scheme [%q]: %q", u, u.Scheme)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,14 +209,14 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error {
|
|||||||
if apiError.Type == DatabaseNotFound {
|
if apiError.Type == DatabaseNotFound {
|
||||||
err := client.CreateDatabase(ctx)
|
err := client.CreateDatabase(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("E! [outputs.influxdb] when writing to [%s]: database %q not found and failed to recreate",
|
log.Printf("E! [outputs.influxdb] when writing to [%q]: database %q not found and failed to recreate",
|
||||||
client.URL(), client.Database())
|
client.URL(), client.Database())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("E! [outputs.influxdb]: when writing to [%s]: %v", client.URL(), err)
|
log.Printf("E! [outputs.influxdb]: when writing to [%q]: %v", client.URL(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return errors.New("could not write any address")
|
return errors.New("could not write any address")
|
||||||
@@ -231,7 +231,7 @@ func (i *InfluxDB) udpClient(url *url.URL) (Client, error) {
|
|||||||
|
|
||||||
c, err := i.CreateUDPClientF(config)
|
c, err := i.CreateUDPClientF(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error creating UDP client [%s]: %v", url, err)
|
return nil, fmt.Errorf("error creating UDP client [%q]: %v", url, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
@@ -261,13 +261,13 @@ func (i *InfluxDB) httpClient(ctx context.Context, url *url.URL, proxy *url.URL)
|
|||||||
|
|
||||||
c, err := i.CreateHTTPClientF(config)
|
c, err := i.CreateHTTPClientF(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error creating HTTP client [%s]: %v", url, err)
|
return nil, fmt.Errorf("error creating HTTP client [%q]: %v", url, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !i.SkipDatabaseCreation {
|
if !i.SkipDatabaseCreation {
|
||||||
err = c.CreateDatabase(ctx)
|
err = c.CreateDatabase(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("W! [outputs.influxdb] when writing to [%s]: database %q creation failed: %v",
|
log.Printf("W! [outputs.influxdb] when writing to [%q]: database %q creation failed: %v",
|
||||||
c.URL(), c.Database(), err)
|
c.URL(), c.Database(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ supported_packages = {
|
|||||||
"freebsd": [ "tar" ]
|
"freebsd": [ "tar" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
next_version = '1.7.0'
|
next_version = '1.8.0'
|
||||||
|
|
||||||
################
|
################
|
||||||
#### Telegraf Functions
|
#### Telegraf Functions
|
||||||
|
|||||||
Reference in New Issue
Block a user