1
0
Fork 0
telegraf/plugins/inputs/jolokia2_agent/jolokia2_agent.go

105 lines
2.6 KiB
Go
Raw Normal View History

//go:generate ../../../tools/readme_config_includer/generator
package jolokia2_agent
import (
_ "embed"
"fmt"
"sync"
"time"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
common "github.com/influxdata/telegraf/plugins/common/jolokia2"
"github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/plugins/inputs"
)
//go:embed sample.conf
var sampleConfig string
type JolokiaAgent struct {
DefaultFieldPrefix string `toml:"default_field_prefix"`
DefaultFieldSeparator string `toml:"default_field_separator"`
DefaultTagPrefix string `toml:"default_tag_prefix"`
URLs []string `toml:"urls"`
Username string `toml:"username"`
Password string `toml:"password"`
Origin string `toml:"origin"`
ResponseTimeout config.Duration `toml:"response_timeout"`
tls.ClientConfig
Metrics []common.MetricConfig `toml:"metric"`
gatherer *common.Gatherer
clients []*common.Client
}
func (*JolokiaAgent) SampleConfig() string {
return sampleConfig
}
func (ja *JolokiaAgent) Gather(acc telegraf.Accumulator) error {
if ja.gatherer == nil {
ja.gatherer = common.NewGatherer(ja.createMetrics())
}
// Initialize clients once
if ja.clients == nil {
ja.clients = make([]*common.Client, 0, len(ja.URLs))
for _, url := range ja.URLs {
client, err := ja.createClient(url)
if err != nil {
acc.AddError(fmt.Errorf("unable to create client for %q: %w", url, err))
continue
}
ja.clients = append(ja.clients, client)
}
}
var wg sync.WaitGroup
for _, client := range ja.clients {
wg.Add(1)
go func(client *common.Client) {
defer wg.Done()
err := ja.gatherer.Gather(client, acc)
if err != nil {
acc.AddError(fmt.Errorf("unable to gather metrics for %q: %w", client.URL, err))
}
}(client)
}
wg.Wait()
return nil
}
func (ja *JolokiaAgent) createMetrics() []common.Metric {
metrics := make([]common.Metric, 0, len(ja.Metrics))
for _, metricConfig := range ja.Metrics {
metrics = append(metrics, common.NewMetric(metricConfig, ja.DefaultFieldPrefix, ja.DefaultFieldSeparator, ja.DefaultTagPrefix))
}
return metrics
}
func (ja *JolokiaAgent) createClient(url string) (*common.Client, error) {
return common.NewClient(url, &common.ClientConfig{
Username: ja.Username,
Password: ja.Password,
Origin: ja.Origin,
ResponseTimeout: time.Duration(ja.ResponseTimeout),
ClientConfig: ja.ClientConfig,
})
}
func init() {
inputs.Add("jolokia2_agent", func() telegraf.Input {
return &JolokiaAgent{
DefaultFieldSeparator: ".",
}
})
}