143 lines
3.6 KiB
Go
143 lines
3.6 KiB
Go
package inputs_httpjson
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
|
|
"github.com/influxdata/toml"
|
|
"github.com/influxdata/toml/ast"
|
|
|
|
"github.com/influxdata/telegraf/migrations"
|
|
"github.com/influxdata/telegraf/migrations/common"
|
|
"github.com/influxdata/telegraf/plugins/common/tls"
|
|
)
|
|
|
|
const msg = `
|
|
Replacement 'inputs.http' will not report the 'response_time' field and the
|
|
'server' tag is replaced by the 'url' tag. Please adapt your queries!
|
|
`
|
|
|
|
// Define "old" data structure
|
|
type httpJSON struct {
|
|
Name string `toml:"name"`
|
|
Servers []string
|
|
Method string
|
|
TagKeys []string
|
|
ResponseTimeout string
|
|
Parameters map[string]string
|
|
Headers map[string]string
|
|
tls.ClientConfig
|
|
common.InputOptions
|
|
}
|
|
|
|
// Migration function
|
|
func migrate(tbl *ast.Table) ([]byte, string, error) {
|
|
// Decode the old data structure
|
|
var old httpJSON
|
|
if err := toml.UnmarshalTable(tbl, &old); err != nil {
|
|
return nil, "", err
|
|
}
|
|
|
|
// Fill common options
|
|
plugin := make(map[string]interface{})
|
|
old.InputOptions.Migrate()
|
|
general, err := toml.Marshal(old.InputOptions)
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("marshalling general options failed: %w", err)
|
|
}
|
|
if err := toml.Unmarshal(general, &plugin); err != nil {
|
|
return nil, "", fmt.Errorf("re-unmarshalling general options failed: %w", err)
|
|
}
|
|
|
|
// Use a map for the new plugin and fill in the data
|
|
plugin["urls"] = old.Servers
|
|
if old.Name != "" {
|
|
if x, found := plugin["name_override"]; found && x != old.Name {
|
|
return nil, "", fmt.Errorf("conflicting 'name' (%s) and 'name_override' (%s) setting", old.Name, old.NameOverride)
|
|
}
|
|
plugin["name_override"] = old.Name
|
|
}
|
|
if _, found := plugin["name_override"]; !found {
|
|
plugin["name_override"] = "httpjson"
|
|
}
|
|
if old.Method != "" && old.Method != "GET" {
|
|
plugin["method"] = old.Method
|
|
}
|
|
if len(old.TagKeys) > 0 {
|
|
plugin["tag_keys"] = old.TagKeys
|
|
}
|
|
if old.ResponseTimeout != "" {
|
|
plugin["timeout"] = old.ResponseTimeout
|
|
}
|
|
if len(old.Headers) > 0 {
|
|
plugin["headers"] = old.Headers
|
|
}
|
|
if len(old.Parameters) > 0 {
|
|
urls := make([]string, 0, len(old.Servers))
|
|
for _, s := range old.Servers {
|
|
u, err := url.Parse(s)
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("parsing server %q failed: %w", s, err)
|
|
}
|
|
q := u.Query()
|
|
for k, v := range old.Parameters {
|
|
q.Add(k, v)
|
|
}
|
|
u.RawQuery = q.Encode()
|
|
urls = append(urls, u.String())
|
|
}
|
|
plugin["urls"] = urls
|
|
}
|
|
|
|
// Convert TLS parameters
|
|
if old.TLSCA != "" {
|
|
plugin["tls_ca"] = old.TLSCA
|
|
}
|
|
if old.TLSCert != "" {
|
|
plugin["tls_cert"] = old.TLSCert
|
|
}
|
|
|
|
if old.TLSKey != "" {
|
|
plugin["tls_key"] = old.TLSKey
|
|
}
|
|
if old.TLSKeyPwd != "" {
|
|
plugin["tls_key_pwd"] = old.TLSKeyPwd
|
|
}
|
|
if old.TLSMinVersion != "" {
|
|
plugin["tls_min_version"] = old.TLSMinVersion
|
|
}
|
|
if old.InsecureSkipVerify {
|
|
plugin["insecure_skip_verify"] = true
|
|
}
|
|
if old.ServerName != "" {
|
|
plugin["tls_server_name"] = old.ServerName
|
|
}
|
|
if old.RenegotiationMethod != "" {
|
|
plugin["tls_renegotiation_method"] = old.RenegotiationMethod
|
|
}
|
|
if old.Enable != nil {
|
|
plugin["tls_enable"] = *old.Enable
|
|
}
|
|
|
|
// Parser settings
|
|
plugin["data_format"] = "json"
|
|
|
|
// Create the corresponding metric configurations
|
|
cfg := migrations.CreateTOMLStruct("inputs", "http")
|
|
cfg.Add("inputs", "http", plugin)
|
|
|
|
// Marshal the new configuration
|
|
buf, err := toml.Marshal(cfg)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
buf = append(buf, []byte("\n")...)
|
|
|
|
// Create the new content to output
|
|
return buf, msg, nil
|
|
}
|
|
|
|
// Register the migration function for the plugin type
|
|
func init() {
|
|
migrations.AddPluginMigration("inputs.httpjson", migrate)
|
|
}
|