1
0
Fork 0
telegraf/migrations/inputs_httpjson/migration.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

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)
}