Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
e393c3af3f
commit
4978089aab
4963 changed files with 677545 additions and 0 deletions
240
plugins/inputs/kapacitor/kapacitor.go
Normal file
240
plugins/inputs/kapacitor/kapacitor.go
Normal file
|
@ -0,0 +1,240 @@
|
|||
//go:generate ../../../tools/readme_config_includer/generator
|
||||
package kapacitor
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/config"
|
||||
"github.com/influxdata/telegraf/plugins/common/tls"
|
||||
"github.com/influxdata/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
//go:embed sample.conf
|
||||
var sampleConfig string
|
||||
|
||||
const (
|
||||
defaultURL = "http://localhost:9092/kapacitor/v1/debug/vars"
|
||||
)
|
||||
|
||||
type Kapacitor struct {
|
||||
URLs []string `toml:"urls"`
|
||||
Timeout config.Duration `toml:"timeout"`
|
||||
tls.ClientConfig
|
||||
|
||||
client *http.Client
|
||||
}
|
||||
|
||||
func (*Kapacitor) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
func (k *Kapacitor) Gather(acc telegraf.Accumulator) error {
|
||||
if k.client == nil {
|
||||
client, err := k.createHTTPClient()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
k.client = client
|
||||
}
|
||||
|
||||
var wg sync.WaitGroup
|
||||
for _, u := range k.URLs {
|
||||
wg.Add(1)
|
||||
go func(url string) {
|
||||
defer wg.Done()
|
||||
if err := k.gatherURL(acc, url); err != nil {
|
||||
acc.AddError(fmt.Errorf("[url=%s]: %w", url, err))
|
||||
}
|
||||
}(u)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Kapacitor) createHTTPClient() (*http.Client, error) {
|
||||
tlsCfg, err := k.ClientConfig.TLSConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
client := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
TLSClientConfig: tlsCfg,
|
||||
},
|
||||
Timeout: time.Duration(k.Timeout),
|
||||
}
|
||||
|
||||
return client, nil
|
||||
}
|
||||
|
||||
type object struct {
|
||||
Name string `json:"name"`
|
||||
Values map[string]interface{} `json:"values"`
|
||||
Tags map[string]string `json:"tags"`
|
||||
}
|
||||
|
||||
type memstats struct {
|
||||
Alloc int64 `json:"Alloc"`
|
||||
TotalAlloc int64 `json:"TotalAlloc"`
|
||||
Sys int64 `json:"Sys"`
|
||||
Lookups int64 `json:"Lookups"`
|
||||
Mallocs int64 `json:"Mallocs"`
|
||||
Frees int64 `json:"Frees"`
|
||||
HeapAlloc int64 `json:"HeapAlloc"`
|
||||
HeapSys int64 `json:"HeapSys"`
|
||||
HeapIdle int64 `json:"HeapIdle"`
|
||||
HeapInuse int64 `json:"HeapInuse"`
|
||||
HeapReleased int64 `json:"HeapReleased"`
|
||||
HeapObjects int64 `json:"HeapObjects"`
|
||||
StackInuse int64 `json:"StackInuse"`
|
||||
StackSys int64 `json:"StackSys"`
|
||||
MSpanInuse int64 `json:"MSpanInuse"`
|
||||
MSpanSys int64 `json:"MSpanSys"`
|
||||
MCacheInuse int64 `json:"MCacheInuse"`
|
||||
MCacheSys int64 `json:"MCacheSys"`
|
||||
BuckHashSys int64 `json:"BuckHashSys"`
|
||||
GCSys int64 `json:"GCSys"`
|
||||
OtherSys int64 `json:"OtherSys"`
|
||||
NextGC int64 `json:"NextGC"`
|
||||
LastGC int64 `json:"LastGC"`
|
||||
PauseTotalNs int64 `json:"PauseTotalNs"`
|
||||
NumGC int64 `json:"NumGC"`
|
||||
GCCPUFraction float64 `json:"GCCPUFraction"`
|
||||
}
|
||||
|
||||
type stats struct {
|
||||
CmdLine []string `json:"cmdline"`
|
||||
ClusterID string `json:"cluster_id"`
|
||||
Host string `json:"host"`
|
||||
Kapacitor *map[string]object `json:"kapacitor"`
|
||||
MemStats *memstats `json:"memstats"`
|
||||
NumEnabledTasks int `json:"num_enabled_tasks"`
|
||||
NumSubscriptions int `json:"num_subscriptions"`
|
||||
NumTasks int `json:"num_tasks"`
|
||||
Product string `json:"product"`
|
||||
ServerID string `json:"server_id"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
// Gathers data from a particular URL
|
||||
// Parameters:
|
||||
//
|
||||
// acc : The telegraf Accumulator to use
|
||||
// url : endpoint to send request to
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// error: Any error that may have occurred
|
||||
func (k *Kapacitor) gatherURL(
|
||||
acc telegraf.Accumulator,
|
||||
url string,
|
||||
) error {
|
||||
now := time.Now()
|
||||
|
||||
resp, err := k.client.Get(url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
|
||||
var s stats
|
||||
err = dec.Decode(&s)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if s.MemStats != nil {
|
||||
acc.AddFields("kapacitor_memstats",
|
||||
map[string]interface{}{
|
||||
"alloc_bytes": s.MemStats.Alloc,
|
||||
"buck_hash_sys_bytes": s.MemStats.BuckHashSys,
|
||||
"frees": s.MemStats.Frees,
|
||||
"gc_cpu_fraction": s.MemStats.GCCPUFraction,
|
||||
"gc_sys_bytes": s.MemStats.GCSys,
|
||||
"heap_alloc_bytes": s.MemStats.HeapAlloc,
|
||||
"heap_idle_bytes": s.MemStats.HeapIdle,
|
||||
"heap_in_use_bytes": s.MemStats.HeapInuse,
|
||||
"heap_objects": s.MemStats.HeapObjects,
|
||||
"heap_released_bytes": s.MemStats.HeapReleased,
|
||||
"heap_sys_bytes": s.MemStats.HeapSys,
|
||||
"last_gc_ns": s.MemStats.LastGC,
|
||||
"lookups": s.MemStats.Lookups,
|
||||
"mallocs": s.MemStats.Mallocs,
|
||||
"mcache_in_use_bytes": s.MemStats.MCacheInuse,
|
||||
"mcache_sys_bytes": s.MemStats.MCacheSys,
|
||||
"mspan_in_use_bytes": s.MemStats.MSpanInuse,
|
||||
"mspan_sys_bytes": s.MemStats.MSpanSys,
|
||||
"next_gc_ns": s.MemStats.NextGC,
|
||||
"num_gc": s.MemStats.NumGC,
|
||||
"other_sys_bytes": s.MemStats.OtherSys,
|
||||
"pause_total_ns": s.MemStats.PauseTotalNs,
|
||||
"stack_in_use_bytes": s.MemStats.StackInuse,
|
||||
"stack_sys_bytes": s.MemStats.StackSys,
|
||||
"sys_bytes": s.MemStats.Sys,
|
||||
"total_alloc_bytes": s.MemStats.TotalAlloc,
|
||||
},
|
||||
map[string]string{
|
||||
"kap_version": s.Version,
|
||||
"url": url,
|
||||
},
|
||||
now)
|
||||
}
|
||||
|
||||
acc.AddFields("kapacitor",
|
||||
map[string]interface{}{
|
||||
"num_enabled_tasks": s.NumEnabledTasks,
|
||||
"num_subscriptions": s.NumSubscriptions,
|
||||
"num_tasks": s.NumTasks,
|
||||
},
|
||||
map[string]string{
|
||||
"kap_version": s.Version,
|
||||
"url": url,
|
||||
},
|
||||
now)
|
||||
|
||||
if s.Kapacitor != nil {
|
||||
for _, obj := range *s.Kapacitor {
|
||||
// Strip out high-cardinality or duplicative tags
|
||||
excludeTags := []string{"host", "cluster_id", "server_id"}
|
||||
for _, key := range excludeTags {
|
||||
delete(obj.Tags, key)
|
||||
}
|
||||
|
||||
// Convert time-related string field to int
|
||||
if _, ok := obj.Values["avg_exec_time_ns"]; ok {
|
||||
d, err := time.ParseDuration(obj.Values["avg_exec_time_ns"].(string))
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
obj.Values["avg_exec_time_ns"] = d.Nanoseconds()
|
||||
}
|
||||
|
||||
acc.AddFields(
|
||||
"kapacitor_"+obj.Name,
|
||||
obj.Values,
|
||||
obj.Tags,
|
||||
now,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
inputs.Add("kapacitor", func() telegraf.Input {
|
||||
return &Kapacitor{
|
||||
URLs: []string{defaultURL},
|
||||
Timeout: config.Duration(time.Second * 5),
|
||||
}
|
||||
})
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue