diff --git a/admin/commands/config.go b/admin/commands/config.go index 26309fa038d..665ff3c8c10 100644 --- a/admin/commands/config.go +++ b/admin/commands/config.go @@ -91,8 +91,8 @@ func (cmd *ConfigCommand) args(globals *flags.GlobalFlags) ([]string, bool) { res = append(res, "--server-insecure-tls") } - if cmd.LogLevelFatalFlags.LogLevel != "" { - res = append(res, fmt.Sprintf("--log-level=%s", cmd.LogLevelFatalFlags.LogLevel)) + if cmd.LogLevel != "" { + res = append(res, fmt.Sprintf("--log-level=%s", cmd.LogLevel)) } if globals.EnableDebug { res = append(res, "--debug") diff --git a/admin/commands/helpers.go b/admin/commands/helpers.go new file mode 100644 index 00000000000..41d84a1f486 --- /dev/null +++ b/admin/commands/helpers.go @@ -0,0 +1,29 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package commands + +import ( + "strconv" + "time" +) + +// DurationString returns the string representation of a duration flag. +func DurationString(value *time.Duration) string { + if value == nil { + return "" + } + + return strconv.FormatFloat(value.Seconds(), 'f', -1, 64) + "s" +} diff --git a/admin/commands/helpers_test.go b/admin/commands/helpers_test.go new file mode 100644 index 00000000000..4009485ebc2 --- /dev/null +++ b/admin/commands/helpers_test.go @@ -0,0 +1,60 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package commands + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDurationString(t *testing.T) { + t.Parallel() + + t.Run("nil", func(t *testing.T) { + t.Parallel() + + require.Empty(t, DurationString(nil)) + }) + + for _, testCase := range []struct { + name string + value time.Duration + expected string + }{ + { + name: "sub-second", + value: 500 * time.Millisecond, + expected: "0.5s", + }, + { + name: "multi-minute", + value: 90 * time.Second, + expected: "90s", + }, + { + name: "hour", + value: time.Hour, + expected: "3600s", + }, + } { + t.Run(testCase.name, func(t *testing.T) { + t.Parallel() + + require.Equal(t, testCase.expected, DurationString(&testCase.value)) + }) + } +} diff --git a/admin/commands/inventory/add_agent_mongodb_exporter.go b/admin/commands/inventory/add_agent_mongodb_exporter.go index 920ffb30b5a..c5120f2d934 100644 --- a/admin/commands/inventory/add_agent_mongodb_exporter.go +++ b/admin/commands/inventory/add_agent_mongodb_exporter.go @@ -15,6 +15,8 @@ package inventory import ( + "time" + "github.com/AlekSi/pointer" "github.com/percona/pmm/admin/commands" @@ -67,6 +69,7 @@ type AddAgentMongodbExporterCommand struct { DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` StatsCollections []string `help:"Collections for collstats & indexstats"` CollectionsLimit int32 `name:"max-collections-limit" placeholder:"number" help:"Disable collstats & indexstats if there are more than collections"` //nolint:lll + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` flags.LogLevelFatalFlags } @@ -104,7 +107,8 @@ func (cmd *AddAgentMongodbExporterCommand) RunCmd() (commands.Result, error) { DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), StatsCollections: commands.ParseDisableCollectors(cmd.StatsCollections), CollectionsLimit: cmd.CollectionsLimit, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_mysqld_exporter.go b/admin/commands/inventory/add_agent_mysqld_exporter.go index 6e6445c7422..398d845724a 100644 --- a/admin/commands/inventory/add_agent_mysqld_exporter.go +++ b/admin/commands/inventory/add_agent_mysqld_exporter.go @@ -17,6 +17,7 @@ package inventory import ( "fmt" "strconv" + "time" "github.com/AlekSi/pointer" @@ -103,6 +104,7 @@ type AddAgentMysqldExporterCommand struct { PushMetrics bool `help:"Enables push metrics model flow, it will be sent to the server by an agent"` ExposeExporter bool `help:"Expose the address of the exporter publicly on 0.0.0.0"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` flags.LogLevelNoFatalFlags } @@ -152,7 +154,8 @@ func (cmd *AddAgentMysqldExporterCommand) RunCmd() (commands.Result, error) { PushMetrics: cmd.PushMetrics, ExposeExporter: cmd.ExposeExporter, DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_postgres_exporter.go b/admin/commands/inventory/add_agent_postgres_exporter.go index c7ca5b9d97f..b3db9e25ed2 100644 --- a/admin/commands/inventory/add_agent_postgres_exporter.go +++ b/admin/commands/inventory/add_agent_postgres_exporter.go @@ -15,6 +15,8 @@ package inventory import ( + "time" + "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" "github.com/percona/pmm/api/inventory/v1/json/client" @@ -67,6 +69,7 @@ type AddAgentPostgresExporterCommand struct { TLSKeyFile string `help:"TLS certificate key file"` AutoDiscoveryLimit int32 `default:"0" placeholder:"NUMBER" help:"Auto-discovery will be disabled if there are more than that number of databases (default: server-defined, -1: always disabled)"` MaxExporterConnections int32 `default:"0" placeholder:"NUMBER" help:"Maximum number of connections that exporter can make to PostgreSQL instance (default: server-defined)"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` flags.LogLevelNoFatalFlags } @@ -112,12 +115,13 @@ func (cmd *AddAgentPostgresExporterCommand) RunCmd() (commands.Result, error) { AutoDiscoveryLimit: cmd.AutoDiscoveryLimit, MaxExporterConnections: cmd.MaxExporterConnections, - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - TLSCa: tlsCa, - TLSCert: tlsCert, - TLSKey: tlsKey, - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + TLSCa: tlsCa, + TLSCert: tlsCert, + TLSKey: tlsKey, + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_proxysql_exporter.go b/admin/commands/inventory/add_agent_proxysql_exporter.go index b2be4b3a853..b8c6ce6aca0 100644 --- a/admin/commands/inventory/add_agent_proxysql_exporter.go +++ b/admin/commands/inventory/add_agent_proxysql_exporter.go @@ -15,6 +15,8 @@ package inventory import ( + "time" + "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" "github.com/percona/pmm/api/inventory/v1/json/client" @@ -60,6 +62,7 @@ type AddAgentProxysqlExporterCommand struct { PushMetrics bool `help:"Enables push metrics model flow, it will be sent to the server by an agent"` ExposeExporter bool `help:"Expose the address of the exporter publicly on 0.0.0.0"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` flags.LogLevelFatalFlags } @@ -82,7 +85,8 @@ func (cmd *AddAgentProxysqlExporterCommand) RunCmd() (commands.Result, error) { PushMetrics: cmd.PushMetrics, ExposeExporter: cmd.ExposeExporter, DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/add_agent_valkey_exporter.go b/admin/commands/inventory/add_agent_valkey_exporter.go index bfcbc2b0101..8b9a7fb5fd2 100644 --- a/admin/commands/inventory/add_agent_valkey_exporter.go +++ b/admin/commands/inventory/add_agent_valkey_exporter.go @@ -15,6 +15,8 @@ package inventory import ( + "time" + "github.com/AlekSi/pointer" "github.com/percona/pmm/admin/commands" @@ -68,6 +70,7 @@ type AddAgentValkeyExporterCommand struct { PushMetrics bool `help:"Enables push metrics model flow, it will be sent to the server by an agent"` ExposeExporter bool `help:"Expose the address of the exporter publicly on 0.0.0.0"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` flags.LogLevelNoFatalFlags } @@ -116,6 +119,7 @@ func (cmd *AddAgentValkeyExporterCommand) RunCmd() (commands.Result, error) { ExposeExporter: cmd.ExposeExporter, DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), LogLevel: convertLogLevelPtr(&cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/inventory/change_agent_mongodb_exporter.go b/admin/commands/inventory/change_agent_mongodb_exporter.go index b6bf3d413d3..7258fc5566d 100644 --- a/admin/commands/inventory/change_agent_mongodb_exporter.go +++ b/admin/commands/inventory/change_agent_mongodb_exporter.go @@ -17,6 +17,7 @@ package inventory import ( "fmt" "strings" + "time" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" @@ -89,9 +90,10 @@ type ChangeAgentMongodbExporterCommand struct { CollectionsLimit *int32 `help:"Collections limit"` // Exporter options - DisableCollectors []string `help:"List of collector names to disable"` - ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` - PushMetrics *bool `help:"Enable push metrics with vmagent"` + DisableCollectors []string `help:"List of collector names to disable"` + ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` + PushMetrics *bool `help:"Enable push metrics with vmagent"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` @@ -152,6 +154,7 @@ func (cmd *ChangeAgentMongodbExporterCommand) RunCmd() (commands.Result, error) ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_mysqld_exporter.go b/admin/commands/inventory/change_agent_mysqld_exporter.go index a57ec6edc96..e9ce71aecae 100644 --- a/admin/commands/inventory/change_agent_mysqld_exporter.go +++ b/admin/commands/inventory/change_agent_mysqld_exporter.go @@ -16,6 +16,7 @@ package inventory import ( "fmt" + "time" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" @@ -82,10 +83,11 @@ type ChangeAgentMysqldExporterCommand struct { TLSKeyFile *string `help:"TLS certificate key file"` // Exporter options - TablestatsGroupTableLimit *int32 `help:"Tablestats group collectors by table limit"` - DisableCollectors []string `help:"List of collector names to disable"` - ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` - PushMetrics *bool `help:"Enable push metrics with vmagent"` + TablestatsGroupTableLimit *int32 `help:"Tablestats group collectors by table limit"` + DisableCollectors []string `help:"List of collector names to disable"` + ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` + PushMetrics *bool `help:"Enable push metrics with vmagent"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` @@ -143,6 +145,7 @@ func (cmd *ChangeAgentMysqldExporterCommand) RunCmd() (commands.Result, error) { ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_postgres_exporter.go b/admin/commands/inventory/change_agent_postgres_exporter.go index 322d0de1c41..91f56f986a0 100644 --- a/admin/commands/inventory/change_agent_postgres_exporter.go +++ b/admin/commands/inventory/change_agent_postgres_exporter.go @@ -16,6 +16,7 @@ package inventory import ( "fmt" + "time" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" @@ -82,11 +83,12 @@ type ChangeAgentPostgresExporterCommand struct { TLSKeyFile *string `help:"TLS certificate key file"` // Exporter options - DisableCollectors []string `help:"List of collector names to disable"` - ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` - PushMetrics *bool `help:"Enable push metrics with vmagent"` - AutoDiscoveryLimit *int32 `help:"Auto-discovery limit"` - MaxExporterConnections *int32 `help:"Maximum number of connections that exporter can make to PostgreSQL instance"` + DisableCollectors []string `help:"List of collector names to disable"` + ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` + PushMetrics *bool `help:"Enable push metrics with vmagent"` + AutoDiscoveryLimit *int32 `help:"Auto-discovery limit"` + MaxExporterConnections *int32 `help:"Maximum number of connections that exporter can make to PostgreSQL instance"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` @@ -145,6 +147,7 @@ func (cmd *ChangeAgentPostgresExporterCommand) RunCmd() (commands.Result, error) AutoDiscoveryLimit: cmd.AutoDiscoveryLimit, MaxExporterConnections: cmd.MaxExporterConnections, LogLevel: convertLogLevelPtr(cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_proxysql_exporter.go b/admin/commands/inventory/change_agent_proxysql_exporter.go index fe635ede538..18000fee4bb 100644 --- a/admin/commands/inventory/change_agent_proxysql_exporter.go +++ b/admin/commands/inventory/change_agent_proxysql_exporter.go @@ -16,6 +16,7 @@ package inventory import ( "fmt" + "time" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" @@ -79,9 +80,10 @@ type ChangeAgentProxysqlExporterCommand struct { TLSSkipVerify *bool `help:"Skip TLS certificate and hostname validation"` // Exporter options - DisableCollectors []string `help:"List of collector names to disable"` - ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` - PushMetrics *bool `help:"Enable push metrics with vmagent"` + DisableCollectors []string `help:"List of collector names to disable"` + ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` + PushMetrics *bool `help:"Enable push metrics with vmagent"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` @@ -105,6 +107,7 @@ func (cmd *ChangeAgentProxysqlExporterCommand) RunCmd() (commands.Result, error) ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_valkey_exporter.go b/admin/commands/inventory/change_agent_valkey_exporter.go index 8e1aea7d577..528983aaf20 100644 --- a/admin/commands/inventory/change_agent_valkey_exporter.go +++ b/admin/commands/inventory/change_agent_valkey_exporter.go @@ -16,6 +16,7 @@ package inventory import ( "fmt" + "time" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/pkg/flags" @@ -81,9 +82,10 @@ type ChangeAgentValkeyExporterCommand struct { TLSKeyFile *string `help:"TLS certificate key file"` // Exporter options - DisableCollectors []string `help:"List of collector names to disable"` - ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` - PushMetrics *bool `help:"Enable push metrics with vmagent"` + DisableCollectors []string `help:"List of collector names to disable"` + ExposeExporter *bool `help:"Expose the exporter process on all public interfaces"` + PushMetrics *bool `help:"Enable push metrics with vmagent"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` @@ -137,6 +139,7 @@ func (cmd *ChangeAgentValkeyExporterCommand) RunCmd() (commands.Result, error) { ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), } if customLabels != nil { diff --git a/admin/commands/management/add_mongodb.go b/admin/commands/management/add_mongodb.go index 65e0d5d2dbc..526f0c5180b 100644 --- a/admin/commands/management/add_mongodb.go +++ b/admin/commands/management/add_mongodb.go @@ -16,6 +16,7 @@ package management import ( "fmt" + "time" "github.com/percona/pmm/admin/agentlocal" "github.com/percona/pmm/admin/commands" @@ -83,6 +84,7 @@ type AddMongoDBCommand struct { CollectionsLimit int32 `name:"max-collections-limit" default:"-1" help:"Disable collstats, dbstats, topmetrics and indexstats if there are more than collections. 0: No limit. Default is -1, which let PMM automatically set this value"` ExposeExporter bool `name:"expose-exporter" help:"Optionally expose the address of the exporter publicly on 0.0.0.0"` AgentEnvVars []string `name:"agent-env-vars" help:"Comma-separated list of environment variable names to pass to the exporter (values are read from the current environment), e.g. 'VAR1,VAR2'"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` AddCommonFlags flags.MetricsModeFlags @@ -202,7 +204,8 @@ func (cmd *AddMongoDBCommand) RunCmd() (commands.Result, error) { DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), StatsCollections: commands.ParseDisableCollectors(cmd.StatsCollections), CollectionsLimit: cmd.CollectionsLimit, - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/management/add_mysql.go b/admin/commands/management/add_mysql.go index 20a71531320..e820464f5ec 100644 --- a/admin/commands/management/add_mysql.go +++ b/admin/commands/management/add_mysql.go @@ -17,6 +17,7 @@ package management import ( "fmt" "strconv" + "time" "github.com/AlekSi/pointer" "github.com/alecthomas/units" @@ -120,6 +121,7 @@ type AddMySQLCommand struct { CreateUser bool `hidden:"" help:"Create pmm user"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` ExposeExporter bool `name:"expose-exporter" help:"Optionally expose the address of the exporter publicly on 0.0.0.0"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` AddCommonFlags flags.MetricsModeFlags @@ -241,7 +243,8 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { TablestatsGroupTableLimit: tablestatsGroupTableLimit, MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/management/add_postgresql.go b/admin/commands/management/add_postgresql.go index 8ea4b763e18..a4333d0b00d 100644 --- a/admin/commands/management/add_postgresql.go +++ b/admin/commands/management/add_postgresql.go @@ -16,6 +16,7 @@ package management import ( "fmt" + "time" "github.com/percona/pmm/admin/agentlocal" "github.com/percona/pmm/admin/commands" @@ -76,6 +77,7 @@ type AddPostgreSQLCommand struct { ExposeExporter bool `name:"expose-exporter" help:"Optionally expose the address of the exporter publicly on 0.0.0.0"` AutoDiscoveryLimit int32 `placeholder:"NUMBER" help:"Auto-discovery will be disabled if there are more than that number of databases (default: server-defined, -1: always disabled)"` MaxExporterConnections int32 `placeholder:"NUMBER" help:"Maximum number of connections to PostgreSQL instance that exporter can use (default: server-defined)"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` AddCommonFlags flags.MetricsModeFlags @@ -212,7 +214,8 @@ func (cmd *AddPostgreSQLCommand) RunCmd() (commands.Result, error) { DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), AutoDiscoveryLimit: cmd.AutoDiscoveryLimit, MaxExporterConnections: cmd.MaxExporterConnections, - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/management/add_proxysql.go b/admin/commands/management/add_proxysql.go index 4401f47345d..318edc07ade 100644 --- a/admin/commands/management/add_proxysql.go +++ b/admin/commands/management/add_proxysql.go @@ -16,6 +16,7 @@ package management import ( "fmt" + "time" "github.com/percona/pmm/admin/agentlocal" "github.com/percona/pmm/admin/commands" @@ -60,6 +61,7 @@ type AddProxySQLCommand struct { TLSSkipVerify bool `help:"Skip TLS certificate verification"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` ExposeExporter bool `name:"expose-exporter" help:"Optionally expose the address of the exporter publicly on 0.0.0.0"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` AddCommonFlags flags.MetricsModeFlags @@ -151,7 +153,8 @@ func (cmd *AddProxySQLCommand) RunCmd() (commands.Result, error) { TLSSkipVerify: cmd.TLSSkipVerify, MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), DisableCollectors: commands.ParseDisableCollectors(cmd.DisableCollectors), - LogLevel: cmd.LogLevelFatalFlags.LogLevel.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/admin/commands/management/add_valkey.go b/admin/commands/management/add_valkey.go index 43e8df4b8bd..7243ca3c2a2 100644 --- a/admin/commands/management/add_valkey.go +++ b/admin/commands/management/add_valkey.go @@ -15,6 +15,8 @@ package management import ( + "time" + "github.com/AlekSi/pointer" "github.com/percona/pmm/admin/agentlocal" @@ -63,6 +65,7 @@ type AddValkeyCommand struct { TLSKeyFile string `name:"tls-key" help:"Path to client key file"` DisableCollectors []string `help:"Comma-separated list of collector names to exclude from exporter"` ExposeExporter bool `name:"expose-exporter" help:"Optionally expose the address of the exporter publicly on 0.0.0.0"` + ConnectionTimeout *time.Duration `placeholder:"DURATION" help:"Connection timeout to use for exporter (e.g. 1s, 1.5s)"` AddCommonFlags flags.MetricsModeFlags @@ -152,13 +155,14 @@ func (cmd *AddValkeyCommand) RunCmd() (commands.Result, error) { SkipConnectionCheck: cmd.SkipConnectionCheck, - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - TLSCa: tlsCa, - TLSCert: tlsCert, - TLSKey: tlsKey, - MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), - LogLevel: cmd.LogLevelNoFatalFlags.LogLevel.EnumValue(), + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + TLSCa: tlsCa, + TLSCert: tlsCert, + TLSKey: tlsKey, + MetricsMode: cmd.MetricsModeFlags.MetricsMode.EnumValue(), + LogLevel: cmd.LogLevel.EnumValue(), + ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), }, }, Context: commands.Ctx, diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index 169358ec7d5..3f9118e5dae 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -582,8 +582,10 @@ type MySQLdExporter struct { MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,26,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `protobuf:"bytes,27,rep,name=extra_dsn_params,json=extraDsnParams,proto3" json:"extra_dsn_params,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,28,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MySQLdExporter) Reset() { @@ -777,6 +779,13 @@ func (x *MySQLdExporter) GetExtraDsnParams() map[string]string { return nil } +func (x *MySQLdExporter) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + // MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. type MongoDBExporter struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -821,8 +830,10 @@ type MongoDBExporter struct { MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,28,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` // Environment variable names passed to the exporter. EnvironmentVariableNames []string `protobuf:"bytes,29,rep,name=environment_variable_names,json=environmentVariableNames,proto3" json:"environment_variable_names,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,30,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MongoDBExporter) Reset() { @@ -995,6 +1006,13 @@ func (x *MongoDBExporter) GetEnvironmentVariableNames() []string { return nil } +func (x *MongoDBExporter) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + // PostgresExporter runs on Generic or Container Node and exposes PostgreSQL Service metrics. type PostgresExporter struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1034,8 +1052,10 @@ type PostgresExporter struct { MaxExporterConnections int32 `protobuf:"varint,26,opt,name=max_exporter_connections,json=maxExporterConnections,proto3" json:"max_exporter_connections,omitempty"` // Metrics resolution for this agent. MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,27,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,28,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PostgresExporter) Reset() { @@ -1194,6 +1214,13 @@ func (x *PostgresExporter) GetMetricsResolutions() *common.MetricsResolutions { return nil } +func (x *PostgresExporter) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + // ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. type ProxySQLExporter struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1229,8 +1256,10 @@ type ProxySQLExporter struct { ExposeExporter bool `protobuf:"varint,24,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Metrics resolution for this agent. MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,25,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,26,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ProxySQLExporter) Reset() { @@ -1375,6 +1404,13 @@ func (x *ProxySQLExporter) GetMetricsResolutions() *common.MetricsResolutions { return nil } +func (x *ProxySQLExporter) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + // ValkeyExporter runs on Generic or Container Node and exposes Valkey Service metrics. type ValkeyExporter struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1408,8 +1444,10 @@ type ValkeyExporter struct { ExposeExporter bool `protobuf:"varint,23,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Metrics resolution for this agent. MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,24,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,25,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ValkeyExporter) Reset() { @@ -1547,6 +1585,13 @@ func (x *ValkeyExporter) GetMetricsResolutions() *common.MetricsResolutions { return nil } +func (x *ValkeyExporter) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + // QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. type QANMySQLPerfSchemaAgent struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -5652,8 +5697,10 @@ type AddMySQLdExporterParams struct { ExposeExporter bool `protobuf:"varint,17,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `protobuf:"bytes,18,rep,name=extra_dsn_params,json=extraDsnParams,proto3" json:"extra_dsn_params,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,19,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddMySQLdExporterParams) Reset() { @@ -5812,6 +5859,13 @@ func (x *AddMySQLdExporterParams) GetExtraDsnParams() map[string]string { return nil } +func (x *AddMySQLdExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ChangeMySQLdExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. @@ -5848,8 +5902,10 @@ type ChangeMySQLdExporterParams struct { LogLevel *LogLevel `protobuf:"varint,16,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `protobuf:"varint,17,opt,name=expose_exporter,json=exposeExporter,proto3,oneof" json:"expose_exporter,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,18,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeMySQLdExporterParams) Reset() { @@ -6001,6 +6057,13 @@ func (x *ChangeMySQLdExporterParams) GetExposeExporter() bool { return false } +func (x *ChangeMySQLdExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddMongoDBExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -6051,8 +6114,10 @@ type AddMongoDBExporterParams struct { EnvironmentVariableNames []string `protobuf:"bytes,21,rep,name=environment_variable_names,json=environmentVariableNames,proto3" json:"environment_variable_names,omitempty"` // Enable all collectors. EnableAllCollectors bool `protobuf:"varint,22,opt,name=enable_all_collectors,json=enableAllCollectors,proto3" json:"enable_all_collectors,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,23,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddMongoDBExporterParams) Reset() { @@ -6239,6 +6304,13 @@ func (x *AddMongoDBExporterParams) GetEnableAllCollectors() bool { return false } +func (x *AddMongoDBExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ChangeMongoDBExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. @@ -6283,8 +6355,10 @@ type ChangeMongoDBExporterParams struct { LogLevel *LogLevel `protobuf:"varint,20,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `protobuf:"varint,21,opt,name=expose_exporter,json=exposeExporter,proto3,oneof" json:"expose_exporter,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,22,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeMongoDBExporterParams) Reset() { @@ -6464,6 +6538,13 @@ func (x *ChangeMongoDBExporterParams) GetExposeExporter() bool { return false } +func (x *ChangeMongoDBExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddPostgresExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -6502,8 +6583,10 @@ type AddPostgresExporterParams struct { ExposeExporter bool `protobuf:"varint,17,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `protobuf:"varint,18,opt,name=max_exporter_connections,json=maxExporterConnections,proto3" json:"max_exporter_connections,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,19,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddPostgresExporterParams) Reset() { @@ -6662,6 +6745,13 @@ func (x *AddPostgresExporterParams) GetMaxExporterConnections() int32 { return 0 } +func (x *AddPostgresExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ChangePostgresExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. @@ -6700,8 +6790,10 @@ type ChangePostgresExporterParams struct { ExposeExporter *bool `protobuf:"varint,17,opt,name=expose_exporter,json=exposeExporter,proto3,oneof" json:"expose_exporter,omitempty"` // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections *int32 `protobuf:"varint,18,opt,name=max_exporter_connections,json=maxExporterConnections,proto3,oneof" json:"max_exporter_connections,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,19,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangePostgresExporterParams) Reset() { @@ -6860,6 +6952,13 @@ func (x *ChangePostgresExporterParams) GetMaxExporterConnections() int32 { return 0 } +func (x *ChangePostgresExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddProxySQLExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -6888,8 +6987,10 @@ type AddProxySQLExporterParams struct { LogLevel LogLevel `protobuf:"varint,12,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,13,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,14,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddProxySQLExporterParams) Reset() { @@ -7013,6 +7114,13 @@ func (x *AddProxySQLExporterParams) GetExposeExporter() bool { return false } +func (x *AddProxySQLExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ChangeProxySQLExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. @@ -7039,8 +7147,10 @@ type ChangeProxySQLExporterParams struct { LogLevel *LogLevel `protobuf:"varint,11,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `protobuf:"varint,12,opt,name=expose_exporter,json=exposeExporter,proto3,oneof" json:"expose_exporter,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,13,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeProxySQLExporterParams) Reset() { @@ -7157,6 +7267,13 @@ func (x *ChangeProxySQLExporterParams) GetExposeExporter() bool { return false } +func (x *ChangeProxySQLExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddQANMySQLPerfSchemaAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -10075,9 +10192,11 @@ type AddValkeyExporterParams struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,15,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Log level for exporter. - LogLevel LogLevel `protobuf:"varint,16,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + LogLevel LogLevel `protobuf:"varint,16,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,17,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddValkeyExporterParams) Reset() { @@ -10222,6 +10341,13 @@ func (x *AddValkeyExporterParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *AddValkeyExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ChangeValkeyExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // Enable this Agent. Agents are enabled by default when they get added. @@ -10253,9 +10379,11 @@ type ChangeValkeyExporterParams struct { // Optionally expose the exporter process on all public interfaces ExposeExporter *bool `protobuf:"varint,14,opt,name=expose_exporter,json=exposeExporter,proto3,oneof" json:"expose_exporter,omitempty"` // Log level for exporter. - LogLevel *LogLevel `protobuf:"varint,15,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + LogLevel *LogLevel `protobuf:"varint,15,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,16,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeValkeyExporterParams) Reset() { @@ -10393,6 +10521,13 @@ func (x *ChangeValkeyExporterParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeValkeyExporterParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddRTAMongoDBAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -10844,7 +10979,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x13metrics_resolutions\x18\x0f \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x8a\t\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd4\t\n" + "\x0eMySQLdExporter\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x12 \n" + "\fpmm_agent_id\x18\x02 \x01(\tR\n" + @@ -10873,13 +11008,14 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x18 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\x19 \x01(\bR\x0eexposeExporter\x12K\n" + "\x13metrics_resolutions\x18\x1a \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x12Z\n" + - "\x10extra_dsn_params\x18\x1b \x03(\v20.inventory.v1.MySQLdExporter.ExtraDsnParamsEntryR\x0eextraDsnParams\x1a?\n" + + "\x10extra_dsn_params\x18\x1b \x03(\v20.inventory.v1.MySQLdExporter.ExtraDsnParamsEntryR\x0eextraDsnParams\x12H\n" + + "\x12connection_timeout\x18\x1c \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + "\x13ExtraDsnParamsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd0\a\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9a\b\n" + "\x0fMongoDBExporter\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x12 \n" + "\fpmm_agent_id\x18\x02 \x01(\tR\n" + @@ -10904,10 +11040,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x1a \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\x1b \x01(\bR\x0eexposeExporter\x12K\n" + "\x13metrics_resolutions\x18\x1c \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x12<\n" + - "\x1aenvironment_variable_names\x18\x1d \x03(\tR\x18environmentVariableNames\x1a?\n" + + "\x1aenvironment_variable_names\x18\x1d \x03(\tR\x18environmentVariableNames\x12H\n" + + "\x12connection_timeout\x18\x1e \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf2\x06\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xbc\a\n" + "\x10PostgresExporter\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x12 \n" + "\fpmm_agent_id\x18\x02 \x01(\tR\n" + @@ -10930,10 +11067,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x14auto_discovery_limit\x18\x18 \x01(\x05R\x12autoDiscoveryLimit\x12'\n" + "\x0fexpose_exporter\x18\x19 \x01(\bR\x0eexposeExporter\x128\n" + "\x18max_exporter_connections\x18\x1a \x01(\x05R\x16maxExporterConnections\x12K\n" + - "\x13metrics_resolutions\x18\x1b \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x1a?\n" + + "\x13metrics_resolutions\x18\x1b \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x12H\n" + + "\x12connection_timeout\x18\x1c \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x86\x06\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd0\x06\n" + "\x10ProxySQLExporter\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x12 \n" + "\fpmm_agent_id\x18\x02 \x01(\tR\n" + @@ -10954,10 +11092,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x11process_exec_path\x18\x16 \x01(\tR\x0fprocessExecPath\x123\n" + "\tlog_level\x18\x17 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\x18 \x01(\bR\x0eexposeExporter\x12K\n" + - "\x13metrics_resolutions\x18\x19 \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x1a?\n" + + "\x13metrics_resolutions\x18\x19 \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x12H\n" + + "\x12connection_timeout\x18\x1a \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xcd\x05\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x97\x06\n" + "\x0eValkeyExporter\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x12 \n" + "\fpmm_agent_id\x18\x02 \x01(\tR\n" + @@ -10977,7 +11116,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "listenPort\x12*\n" + "\x11process_exec_path\x18\x16 \x01(\tR\x0fprocessExecPath\x12'\n" + "\x0fexpose_exporter\x18\x17 \x01(\bR\x0eexposeExporter\x12K\n" + - "\x13metrics_resolutions\x18\x18 \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x1a?\n" + + "\x13metrics_resolutions\x18\x18 \x01(\v2\x1a.common.MetricsResolutionsR\x12metricsResolutions\x12H\n" + + "\x12connection_timeout\x18\x19 \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xa9\a\n" + @@ -11385,7 +11525,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x14_enable_push_metricsB\f\n" + "\n" + "_log_levelB\x12\n" + - "\x10_expose_exporter\"\xd5\a\n" + + "\x10_expose_exporter\"\xa9\b\n" + "\x17AddMySQLdExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11407,13 +11547,14 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0eagent_password\x18\x0f \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x123\n" + "\tlog_level\x18\x10 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\x11 \x01(\bR\x0eexposeExporter\x12c\n" + - "\x10extra_dsn_params\x18\x12 \x03(\v29.inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntryR\x0eextraDsnParams\x1a?\n" + + "\x10extra_dsn_params\x18\x12 \x03(\v29.inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntryR\x0eextraDsnParams\x12R\n" + + "\x12connection_timeout\x18\x13 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + "\x13ExtraDsnParamsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xab\b\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xff\b\n" + "\x1aChangeMySQLdExporterParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01\x12;\n" + "\rcustom_labels\x18\x02 \x01(\v2\x11.common.StringMapH\x01R\fcustomLabels\x88\x01\x01\x123\n" + @@ -11433,7 +11574,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x12disable_collectors\x18\x0e \x03(\tR\x11disableCollectors\x120\n" + "\x0eagent_password\x18\x0f \x01(\tB\x04\x88\xb5\x18\x01H\fR\ragentPassword\x88\x01\x01\x128\n" + "\tlog_level\x18\x10 \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01\x12,\n" + - "\x0fexpose_exporter\x18\x11 \x01(\bH\x0eR\x0eexposeExporter\x88\x01\x01B\t\n" + + "\x0fexpose_exporter\x18\x11 \x01(\bH\x0eR\x0eexposeExporter\x88\x01\x01\x12R\n" + + "\x12connection_timeout\x18\x12 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeoutB\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11450,7 +11592,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0f_agent_passwordB\f\n" + "\n" + "_log_levelB\x12\n" + - "\x10_expose_exporter\"\xf3\b\n" + + "\x10_expose_exporter\"\xc7\t\n" + "\x18AddMongoDBExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11476,10 +11618,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x13 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\x14 \x01(\bR\x0eexposeExporter\x12<\n" + "\x1aenvironment_variable_names\x18\x15 \x03(\tR\x18environmentVariableNames\x122\n" + - "\x15enable_all_collectors\x18\x16 \x01(\bR\x13enableAllCollectors\x1a?\n" + + "\x15enable_all_collectors\x18\x16 \x01(\bR\x13enableAllCollectors\x12R\n" + + "\x12connection_timeout\x18\x17 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb5\v\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x89\f\n" + "\x1bChangeMongoDBExporterParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01\x12;\n" + "\rcustom_labels\x18\x02 \x01(\v2\x11.common.StringMapH\x01R\fcustomLabels\x88\x01\x01\x123\n" + @@ -11503,7 +11646,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x11collections_limit\x18\x12 \x01(\x05H\x0eR\x10collectionsLimit\x88\x01\x01\x127\n" + "\x15enable_all_collectors\x18\x13 \x01(\bH\x0fR\x13enableAllCollectors\x88\x01\x01\x128\n" + "\tlog_level\x18\x14 \x01(\x0e2\x16.inventory.v1.LogLevelH\x10R\blogLevel\x88\x01\x01\x12,\n" + - "\x0fexpose_exporter\x18\x15 \x01(\bH\x11R\x0eexposeExporter\x88\x01\x01B\t\n" + + "\x0fexpose_exporter\x18\x15 \x01(\bH\x11R\x0eexposeExporter\x88\x01\x01\x12R\n" + + "\x12connection_timeout\x18\x16 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeoutB\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11522,7 +11666,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x16_enable_all_collectorsB\f\n" + "\n" + "_log_levelB\x12\n" + - "\x10_expose_exporter\"\xdc\x06\n" + + "\x10_expose_exporter\"\xb0\a\n" + "\x19AddPostgresExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11544,10 +11688,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x120\n" + "\x14auto_discovery_limit\x18\x10 \x01(\x05R\x12autoDiscoveryLimit\x12'\n" + "\x0fexpose_exporter\x18\x11 \x01(\bR\x0eexposeExporter\x128\n" + - "\x18max_exporter_connections\x18\x12 \x01(\x05R\x16maxExporterConnections\x1a?\n" + + "\x18max_exporter_connections\x18\x12 \x01(\x05R\x16maxExporterConnections\x12R\n" + + "\x12connection_timeout\x18\x13 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf2\b\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc6\t\n" + "\x1cChangePostgresExporterParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01\x12;\n" + "\rcustom_labels\x18\x02 \x01(\v2\x11.common.StringMapH\x01R\fcustomLabels\x88\x01\x01\x123\n" + @@ -11568,7 +11713,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\fR\blogLevel\x88\x01\x01\x125\n" + "\x14auto_discovery_limit\x18\x10 \x01(\x05H\rR\x12autoDiscoveryLimit\x88\x01\x01\x12,\n" + "\x0fexpose_exporter\x18\x11 \x01(\bH\x0eR\x0eexposeExporter\x88\x01\x01\x12=\n" + - "\x18max_exporter_connections\x18\x12 \x01(\x05H\x0fR\x16maxExporterConnections\x88\x01\x01B\t\n" + + "\x18max_exporter_connections\x18\x12 \x01(\x05H\x0fR\x16maxExporterConnections\x88\x01\x01\x12R\n" + + "\x12connection_timeout\x18\x13 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeoutB\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11586,7 +11732,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "_log_levelB\x17\n" + "\x15_auto_discovery_limitB\x12\n" + "\x10_expose_exporterB\x1b\n" + - "\x19_max_exporter_connections\"\xa5\x05\n" + + "\x19_max_exporter_connections\"\xf9\x05\n" + "\x19AddProxySQLExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11603,10 +11749,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + " \x03(\tR\x11disableCollectors\x12+\n" + "\x0eagent_password\x18\v \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x123\n" + "\tlog_level\x18\f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + - "\x0fexpose_exporter\x18\r \x01(\bR\x0eexposeExporter\x1a?\n" + + "\x0fexpose_exporter\x18\r \x01(\bR\x0eexposeExporter\x12R\n" + + "\x12connection_timeout\x18\x0e \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf5\x05\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc9\x06\n" + "\x1cChangeProxySQLExporterParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01\x12;\n" + "\rcustom_labels\x18\x02 \x01(\v2\x11.common.StringMapH\x01R\fcustomLabels\x88\x01\x01\x123\n" + @@ -11620,7 +11767,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0eagent_password\x18\n" + " \x01(\tB\x04\x88\xb5\x18\x01H\aR\ragentPassword\x88\x01\x01\x128\n" + "\tlog_level\x18\v \x01(\x0e2\x16.inventory.v1.LogLevelH\bR\blogLevel\x88\x01\x01\x12,\n" + - "\x0fexpose_exporter\x18\f \x01(\bH\tR\x0eexposeExporter\x88\x01\x01B\t\n" + + "\x0fexpose_exporter\x18\f \x01(\bH\tR\x0eexposeExporter\x88\x01\x01\x12R\n" + + "\x12connection_timeout\x18\r \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeoutB\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -12088,7 +12236,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "_log_level\"@\n" + "\x16ChangeNomadAgentParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01B\t\n" + - "\a_enable\"\xed\x05\n" + + "\a_enable\"\xc1\x06\n" + "\x17AddValkeyExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12'\n" + @@ -12108,10 +12256,11 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\atls_key\x18\r \x01(\tR\x06tlsKey\x12+\n" + "\x0eagent_password\x18\x0e \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x12'\n" + "\x0fexpose_exporter\x18\x0f \x01(\bR\x0eexposeExporter\x123\n" + - "\tlog_level\x18\x10 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x1a?\n" + + "\tlog_level\x18\x10 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12R\n" + + "\x12connection_timeout\x18\x11 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf8\x06\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xcc\a\n" + "\x1aChangeValkeyExporterParams\x12\x1b\n" + "\x06enable\x18\x01 \x01(\bH\x00R\x06enable\x88\x01\x01\x12;\n" + "\rcustom_labels\x18\x02 \x01(\v2\x11.common.StringMapH\x01R\fcustomLabels\x88\x01\x01\x123\n" + @@ -12129,7 +12278,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0eagent_password\x18\r \x01(\tB\x04\x88\xb5\x18\x01H\n" + "R\ragentPassword\x88\x01\x01\x12,\n" + "\x0fexpose_exporter\x18\x0e \x01(\bH\vR\x0eexposeExporter\x88\x01\x01\x128\n" + - "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\fR\blogLevel\x88\x01\x01B\t\n" + + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\fR\blogLevel\x88\x01\x01\x12R\n" + + "\x12connection_timeout\x18\x10 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeoutB\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -12377,266 +12527,281 @@ var file_inventory_v1_agents_proto_depIdxs = []int32{ 109, // 9: inventory.v1.MySQLdExporter.log_level:type_name -> inventory.v1.LogLevel 110, // 10: inventory.v1.MySQLdExporter.metrics_resolutions:type_name -> common.MetricsResolutions 71, // 11: inventory.v1.MySQLdExporter.extra_dsn_params:type_name -> inventory.v1.MySQLdExporter.ExtraDsnParamsEntry - 72, // 12: inventory.v1.MongoDBExporter.custom_labels:type_name -> inventory.v1.MongoDBExporter.CustomLabelsEntry - 108, // 13: inventory.v1.MongoDBExporter.status:type_name -> inventory.v1.AgentStatus - 109, // 14: inventory.v1.MongoDBExporter.log_level:type_name -> inventory.v1.LogLevel - 110, // 15: inventory.v1.MongoDBExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 73, // 16: inventory.v1.PostgresExporter.custom_labels:type_name -> inventory.v1.PostgresExporter.CustomLabelsEntry - 108, // 17: inventory.v1.PostgresExporter.status:type_name -> inventory.v1.AgentStatus - 109, // 18: inventory.v1.PostgresExporter.log_level:type_name -> inventory.v1.LogLevel - 110, // 19: inventory.v1.PostgresExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 74, // 20: inventory.v1.ProxySQLExporter.custom_labels:type_name -> inventory.v1.ProxySQLExporter.CustomLabelsEntry - 108, // 21: inventory.v1.ProxySQLExporter.status:type_name -> inventory.v1.AgentStatus - 109, // 22: inventory.v1.ProxySQLExporter.log_level:type_name -> inventory.v1.LogLevel - 110, // 23: inventory.v1.ProxySQLExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 75, // 24: inventory.v1.ValkeyExporter.custom_labels:type_name -> inventory.v1.ValkeyExporter.CustomLabelsEntry - 108, // 25: inventory.v1.ValkeyExporter.status:type_name -> inventory.v1.AgentStatus - 110, // 26: inventory.v1.ValkeyExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 76, // 27: inventory.v1.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry - 108, // 28: inventory.v1.QANMySQLPerfSchemaAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 29: inventory.v1.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.v1.LogLevel - 77, // 30: inventory.v1.QANMySQLPerfSchemaAgent.extra_dsn_params:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.ExtraDsnParamsEntry - 78, // 31: inventory.v1.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry - 108, // 32: inventory.v1.QANMySQLSlowlogAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 33: inventory.v1.QANMySQLSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel - 79, // 34: inventory.v1.QANMySQLSlowlogAgent.extra_dsn_params:type_name -> inventory.v1.QANMySQLSlowlogAgent.ExtraDsnParamsEntry - 80, // 35: inventory.v1.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry - 108, // 36: inventory.v1.QANMongoDBProfilerAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 37: inventory.v1.QANMongoDBProfilerAgent.log_level:type_name -> inventory.v1.LogLevel - 81, // 38: inventory.v1.QANMongoDBMongologAgent.custom_labels:type_name -> inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry - 108, // 39: inventory.v1.QANMongoDBMongologAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 40: inventory.v1.QANMongoDBMongologAgent.log_level:type_name -> inventory.v1.LogLevel - 111, // 41: inventory.v1.RTAOptions.collect_interval:type_name -> google.protobuf.Duration - 82, // 42: inventory.v1.RTAMongoDBAgent.custom_labels:type_name -> inventory.v1.RTAMongoDBAgent.CustomLabelsEntry - 14, // 43: inventory.v1.RTAMongoDBAgent.rta_options:type_name -> inventory.v1.RTAOptions - 108, // 44: inventory.v1.RTAMongoDBAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 45: inventory.v1.RTAMongoDBAgent.log_level:type_name -> inventory.v1.LogLevel - 83, // 46: inventory.v1.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry - 108, // 47: inventory.v1.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 48: inventory.v1.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.v1.LogLevel - 84, // 49: inventory.v1.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry - 108, // 50: inventory.v1.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.v1.AgentStatus - 109, // 51: inventory.v1.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.v1.LogLevel - 85, // 52: inventory.v1.RDSExporter.custom_labels:type_name -> inventory.v1.RDSExporter.CustomLabelsEntry - 108, // 53: inventory.v1.RDSExporter.status:type_name -> inventory.v1.AgentStatus - 109, // 54: inventory.v1.RDSExporter.log_level:type_name -> inventory.v1.LogLevel - 110, // 55: inventory.v1.RDSExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 86, // 56: inventory.v1.ExternalExporter.custom_labels:type_name -> inventory.v1.ExternalExporter.CustomLabelsEntry - 110, // 57: inventory.v1.ExternalExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 108, // 58: inventory.v1.ExternalExporter.status:type_name -> inventory.v1.AgentStatus - 87, // 59: inventory.v1.AzureDatabaseExporter.custom_labels:type_name -> inventory.v1.AzureDatabaseExporter.CustomLabelsEntry - 108, // 60: inventory.v1.AzureDatabaseExporter.status:type_name -> inventory.v1.AgentStatus - 109, // 61: inventory.v1.AzureDatabaseExporter.log_level:type_name -> inventory.v1.LogLevel - 110, // 62: inventory.v1.AzureDatabaseExporter.metrics_resolutions:type_name -> common.MetricsResolutions - 112, // 63: inventory.v1.ChangeCommonAgentParams.custom_labels:type_name -> common.StringMap - 110, // 64: inventory.v1.ChangeCommonAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 0, // 65: inventory.v1.ListAgentsRequest.agent_type:type_name -> inventory.v1.AgentType - 1, // 66: inventory.v1.ListAgentsResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 2, // 67: inventory.v1.ListAgentsResponse.vm_agent:type_name -> inventory.v1.VMAgent - 4, // 68: inventory.v1.ListAgentsResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 5, // 69: inventory.v1.ListAgentsResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 6, // 70: inventory.v1.ListAgentsResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 7, // 71: inventory.v1.ListAgentsResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 8, // 72: inventory.v1.ListAgentsResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 10, // 73: inventory.v1.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 11, // 74: inventory.v1.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 12, // 75: inventory.v1.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 13, // 76: inventory.v1.ListAgentsResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent - 16, // 77: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 17, // 78: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 19, // 79: inventory.v1.ListAgentsResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 18, // 80: inventory.v1.ListAgentsResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 20, // 81: inventory.v1.ListAgentsResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 3, // 82: inventory.v1.ListAgentsResponse.nomad_agent:type_name -> inventory.v1.NomadAgent - 9, // 83: inventory.v1.ListAgentsResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter - 15, // 84: inventory.v1.ListAgentsResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent - 1, // 85: inventory.v1.GetAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 2, // 86: inventory.v1.GetAgentResponse.vmagent:type_name -> inventory.v1.VMAgent - 4, // 87: inventory.v1.GetAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 5, // 88: inventory.v1.GetAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 6, // 89: inventory.v1.GetAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 7, // 90: inventory.v1.GetAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 8, // 91: inventory.v1.GetAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 10, // 92: inventory.v1.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 11, // 93: inventory.v1.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 12, // 94: inventory.v1.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 13, // 95: inventory.v1.GetAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent - 16, // 96: inventory.v1.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 17, // 97: inventory.v1.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 19, // 98: inventory.v1.GetAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 18, // 99: inventory.v1.GetAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 20, // 100: inventory.v1.GetAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 3, // 101: inventory.v1.GetAgentResponse.nomad_agent:type_name -> inventory.v1.NomadAgent - 9, // 102: inventory.v1.GetAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter - 15, // 103: inventory.v1.GetAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent - 32, // 104: inventory.v1.AddAgentRequest.pmm_agent:type_name -> inventory.v1.AddPMMAgentParams - 33, // 105: inventory.v1.AddAgentRequest.node_exporter:type_name -> inventory.v1.AddNodeExporterParams - 35, // 106: inventory.v1.AddAgentRequest.mysqld_exporter:type_name -> inventory.v1.AddMySQLdExporterParams - 37, // 107: inventory.v1.AddAgentRequest.mongodb_exporter:type_name -> inventory.v1.AddMongoDBExporterParams - 39, // 108: inventory.v1.AddAgentRequest.postgres_exporter:type_name -> inventory.v1.AddPostgresExporterParams - 41, // 109: inventory.v1.AddAgentRequest.proxysql_exporter:type_name -> inventory.v1.AddProxySQLExporterParams - 57, // 110: inventory.v1.AddAgentRequest.external_exporter:type_name -> inventory.v1.AddExternalExporterParams - 55, // 111: inventory.v1.AddAgentRequest.rds_exporter:type_name -> inventory.v1.AddRDSExporterParams - 59, // 112: inventory.v1.AddAgentRequest.azure_database_exporter:type_name -> inventory.v1.AddAzureDatabaseExporterParams - 43, // 113: inventory.v1.AddAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams - 45, // 114: inventory.v1.AddAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams - 47, // 115: inventory.v1.AddAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams - 49, // 116: inventory.v1.AddAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams - 51, // 117: inventory.v1.AddAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams - 53, // 118: inventory.v1.AddAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams - 62, // 119: inventory.v1.AddAgentRequest.valkey_exporter:type_name -> inventory.v1.AddValkeyExporterParams - 64, // 120: inventory.v1.AddAgentRequest.rta_mongodb_agent:type_name -> inventory.v1.AddRTAMongoDBAgentParams - 1, // 121: inventory.v1.AddAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent - 4, // 122: inventory.v1.AddAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 5, // 123: inventory.v1.AddAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 6, // 124: inventory.v1.AddAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 7, // 125: inventory.v1.AddAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 8, // 126: inventory.v1.AddAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 19, // 127: inventory.v1.AddAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 18, // 128: inventory.v1.AddAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 20, // 129: inventory.v1.AddAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 10, // 130: inventory.v1.AddAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 11, // 131: inventory.v1.AddAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 12, // 132: inventory.v1.AddAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 13, // 133: inventory.v1.AddAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent - 16, // 134: inventory.v1.AddAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 17, // 135: inventory.v1.AddAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 9, // 136: inventory.v1.AddAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter - 15, // 137: inventory.v1.AddAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent - 34, // 138: inventory.v1.ChangeAgentRequest.node_exporter:type_name -> inventory.v1.ChangeNodeExporterParams - 36, // 139: inventory.v1.ChangeAgentRequest.mysqld_exporter:type_name -> inventory.v1.ChangeMySQLdExporterParams - 38, // 140: inventory.v1.ChangeAgentRequest.mongodb_exporter:type_name -> inventory.v1.ChangeMongoDBExporterParams - 40, // 141: inventory.v1.ChangeAgentRequest.postgres_exporter:type_name -> inventory.v1.ChangePostgresExporterParams - 42, // 142: inventory.v1.ChangeAgentRequest.proxysql_exporter:type_name -> inventory.v1.ChangeProxySQLExporterParams - 58, // 143: inventory.v1.ChangeAgentRequest.external_exporter:type_name -> inventory.v1.ChangeExternalExporterParams - 56, // 144: inventory.v1.ChangeAgentRequest.rds_exporter:type_name -> inventory.v1.ChangeRDSExporterParams - 60, // 145: inventory.v1.ChangeAgentRequest.azure_database_exporter:type_name -> inventory.v1.ChangeAzureDatabaseExporterParams - 44, // 146: inventory.v1.ChangeAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.ChangeQANMySQLPerfSchemaAgentParams - 46, // 147: inventory.v1.ChangeAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.ChangeQANMySQLSlowlogAgentParams - 48, // 148: inventory.v1.ChangeAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.ChangeQANMongoDBProfilerAgentParams - 50, // 149: inventory.v1.ChangeAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.ChangeQANMongoDBMongologAgentParams - 52, // 150: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams - 54, // 151: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams - 61, // 152: inventory.v1.ChangeAgentRequest.nomad_agent:type_name -> inventory.v1.ChangeNomadAgentParams - 63, // 153: inventory.v1.ChangeAgentRequest.valkey_exporter:type_name -> inventory.v1.ChangeValkeyExporterParams - 65, // 154: inventory.v1.ChangeAgentRequest.rta_mongodb_agent:type_name -> inventory.v1.ChangeRTAMongoDBAgentParams - 4, // 155: inventory.v1.ChangeAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter - 5, // 156: inventory.v1.ChangeAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 6, // 157: inventory.v1.ChangeAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 7, // 158: inventory.v1.ChangeAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 8, // 159: inventory.v1.ChangeAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 19, // 160: inventory.v1.ChangeAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter - 18, // 161: inventory.v1.ChangeAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter - 20, // 162: inventory.v1.ChangeAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter - 10, // 163: inventory.v1.ChangeAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 11, // 164: inventory.v1.ChangeAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent - 12, // 165: inventory.v1.ChangeAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent - 13, // 166: inventory.v1.ChangeAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent - 16, // 167: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 17, // 168: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 3, // 169: inventory.v1.ChangeAgentResponse.nomad_agent:type_name -> inventory.v1.NomadAgent - 9, // 170: inventory.v1.ChangeAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter - 15, // 171: inventory.v1.ChangeAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent - 88, // 172: inventory.v1.AddPMMAgentParams.custom_labels:type_name -> inventory.v1.AddPMMAgentParams.CustomLabelsEntry - 89, // 173: inventory.v1.AddNodeExporterParams.custom_labels:type_name -> inventory.v1.AddNodeExporterParams.CustomLabelsEntry - 109, // 174: inventory.v1.AddNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 175: inventory.v1.ChangeNodeExporterParams.custom_labels:type_name -> common.StringMap - 110, // 176: inventory.v1.ChangeNodeExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 177: inventory.v1.ChangeNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel - 90, // 178: inventory.v1.AddMySQLdExporterParams.custom_labels:type_name -> inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry - 109, // 179: inventory.v1.AddMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel - 91, // 180: inventory.v1.AddMySQLdExporterParams.extra_dsn_params:type_name -> inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntry - 112, // 181: inventory.v1.ChangeMySQLdExporterParams.custom_labels:type_name -> common.StringMap - 110, // 182: inventory.v1.ChangeMySQLdExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 183: inventory.v1.ChangeMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel - 92, // 184: inventory.v1.AddMongoDBExporterParams.custom_labels:type_name -> inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry - 109, // 185: inventory.v1.AddMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 186: inventory.v1.ChangeMongoDBExporterParams.custom_labels:type_name -> common.StringMap - 110, // 187: inventory.v1.ChangeMongoDBExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 188: inventory.v1.ChangeMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel - 93, // 189: inventory.v1.AddPostgresExporterParams.custom_labels:type_name -> inventory.v1.AddPostgresExporterParams.CustomLabelsEntry - 109, // 190: inventory.v1.AddPostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 191: inventory.v1.ChangePostgresExporterParams.custom_labels:type_name -> common.StringMap - 110, // 192: inventory.v1.ChangePostgresExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 193: inventory.v1.ChangePostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel - 94, // 194: inventory.v1.AddProxySQLExporterParams.custom_labels:type_name -> inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry - 109, // 195: inventory.v1.AddProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 196: inventory.v1.ChangeProxySQLExporterParams.custom_labels:type_name -> common.StringMap - 110, // 197: inventory.v1.ChangeProxySQLExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 198: inventory.v1.ChangeProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel - 95, // 199: inventory.v1.AddQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry - 109, // 200: inventory.v1.AddQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel - 96, // 201: inventory.v1.AddQANMySQLPerfSchemaAgentParams.extra_dsn_params:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.ExtraDsnParamsEntry - 112, // 202: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> common.StringMap - 110, // 203: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 204: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel - 97, // 205: inventory.v1.AddQANMySQLSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry - 109, // 206: inventory.v1.AddQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel - 98, // 207: inventory.v1.AddQANMySQLSlowlogAgentParams.extra_dsn_params:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.ExtraDsnParamsEntry - 112, // 208: inventory.v1.ChangeQANMySQLSlowlogAgentParams.custom_labels:type_name -> common.StringMap - 110, // 209: inventory.v1.ChangeQANMySQLSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 210: inventory.v1.ChangeQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel - 99, // 211: inventory.v1.AddQANMongoDBProfilerAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry - 109, // 212: inventory.v1.AddQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 213: inventory.v1.ChangeQANMongoDBProfilerAgentParams.custom_labels:type_name -> common.StringMap - 110, // 214: inventory.v1.ChangeQANMongoDBProfilerAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 215: inventory.v1.ChangeQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel - 100, // 216: inventory.v1.AddQANMongoDBMongologAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry - 109, // 217: inventory.v1.AddQANMongoDBMongologAgentParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 218: inventory.v1.ChangeQANMongoDBMongologAgentParams.custom_labels:type_name -> common.StringMap - 110, // 219: inventory.v1.ChangeQANMongoDBMongologAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 220: inventory.v1.ChangeQANMongoDBMongologAgentParams.log_level:type_name -> inventory.v1.LogLevel - 101, // 221: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry - 109, // 222: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 223: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> common.StringMap - 110, // 224: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 225: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel - 102, // 226: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry - 109, // 227: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 228: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> common.StringMap - 110, // 229: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 230: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel - 103, // 231: inventory.v1.AddRDSExporterParams.custom_labels:type_name -> inventory.v1.AddRDSExporterParams.CustomLabelsEntry - 109, // 232: inventory.v1.AddRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 233: inventory.v1.ChangeRDSExporterParams.custom_labels:type_name -> common.StringMap - 110, // 234: inventory.v1.ChangeRDSExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 235: inventory.v1.ChangeRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel - 104, // 236: inventory.v1.AddExternalExporterParams.custom_labels:type_name -> inventory.v1.AddExternalExporterParams.CustomLabelsEntry - 112, // 237: inventory.v1.ChangeExternalExporterParams.custom_labels:type_name -> common.StringMap - 110, // 238: inventory.v1.ChangeExternalExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 105, // 239: inventory.v1.AddAzureDatabaseExporterParams.custom_labels:type_name -> inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry - 109, // 240: inventory.v1.AddAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 241: inventory.v1.ChangeAzureDatabaseExporterParams.custom_labels:type_name -> common.StringMap - 110, // 242: inventory.v1.ChangeAzureDatabaseExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 243: inventory.v1.ChangeAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel - 106, // 244: inventory.v1.AddValkeyExporterParams.custom_labels:type_name -> inventory.v1.AddValkeyExporterParams.CustomLabelsEntry - 109, // 245: inventory.v1.AddValkeyExporterParams.log_level:type_name -> inventory.v1.LogLevel - 112, // 246: inventory.v1.ChangeValkeyExporterParams.custom_labels:type_name -> common.StringMap - 110, // 247: inventory.v1.ChangeValkeyExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions - 109, // 248: inventory.v1.ChangeValkeyExporterParams.log_level:type_name -> inventory.v1.LogLevel - 107, // 249: inventory.v1.AddRTAMongoDBAgentParams.custom_labels:type_name -> inventory.v1.AddRTAMongoDBAgentParams.CustomLabelsEntry - 109, // 250: inventory.v1.AddRTAMongoDBAgentParams.log_level:type_name -> inventory.v1.LogLevel - 14, // 251: inventory.v1.AddRTAMongoDBAgentParams.rta_options:type_name -> inventory.v1.RTAOptions - 112, // 252: inventory.v1.ChangeRTAMongoDBAgentParams.custom_labels:type_name -> common.StringMap - 109, // 253: inventory.v1.ChangeRTAMongoDBAgentParams.log_level:type_name -> inventory.v1.LogLevel - 14, // 254: inventory.v1.ChangeRTAMongoDBAgentParams.rta_options:type_name -> inventory.v1.RTAOptions - 22, // 255: inventory.v1.AgentsService.ListAgents:input_type -> inventory.v1.ListAgentsRequest - 24, // 256: inventory.v1.AgentsService.GetAgent:input_type -> inventory.v1.GetAgentRequest - 26, // 257: inventory.v1.AgentsService.GetAgentLogs:input_type -> inventory.v1.GetAgentLogsRequest - 28, // 258: inventory.v1.AgentsService.AddAgent:input_type -> inventory.v1.AddAgentRequest - 30, // 259: inventory.v1.AgentsService.ChangeAgent:input_type -> inventory.v1.ChangeAgentRequest - 66, // 260: inventory.v1.AgentsService.RemoveAgent:input_type -> inventory.v1.RemoveAgentRequest - 23, // 261: inventory.v1.AgentsService.ListAgents:output_type -> inventory.v1.ListAgentsResponse - 25, // 262: inventory.v1.AgentsService.GetAgent:output_type -> inventory.v1.GetAgentResponse - 27, // 263: inventory.v1.AgentsService.GetAgentLogs:output_type -> inventory.v1.GetAgentLogsResponse - 29, // 264: inventory.v1.AgentsService.AddAgent:output_type -> inventory.v1.AddAgentResponse - 31, // 265: inventory.v1.AgentsService.ChangeAgent:output_type -> inventory.v1.ChangeAgentResponse - 67, // 266: inventory.v1.AgentsService.RemoveAgent:output_type -> inventory.v1.RemoveAgentResponse - 261, // [261:267] is the sub-list for method output_type - 255, // [255:261] is the sub-list for method input_type - 255, // [255:255] is the sub-list for extension type_name - 255, // [255:255] is the sub-list for extension extendee - 0, // [0:255] is the sub-list for field type_name + 111, // 12: inventory.v1.MySQLdExporter.connection_timeout:type_name -> google.protobuf.Duration + 72, // 13: inventory.v1.MongoDBExporter.custom_labels:type_name -> inventory.v1.MongoDBExporter.CustomLabelsEntry + 108, // 14: inventory.v1.MongoDBExporter.status:type_name -> inventory.v1.AgentStatus + 109, // 15: inventory.v1.MongoDBExporter.log_level:type_name -> inventory.v1.LogLevel + 110, // 16: inventory.v1.MongoDBExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 111, // 17: inventory.v1.MongoDBExporter.connection_timeout:type_name -> google.protobuf.Duration + 73, // 18: inventory.v1.PostgresExporter.custom_labels:type_name -> inventory.v1.PostgresExporter.CustomLabelsEntry + 108, // 19: inventory.v1.PostgresExporter.status:type_name -> inventory.v1.AgentStatus + 109, // 20: inventory.v1.PostgresExporter.log_level:type_name -> inventory.v1.LogLevel + 110, // 21: inventory.v1.PostgresExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 111, // 22: inventory.v1.PostgresExporter.connection_timeout:type_name -> google.protobuf.Duration + 74, // 23: inventory.v1.ProxySQLExporter.custom_labels:type_name -> inventory.v1.ProxySQLExporter.CustomLabelsEntry + 108, // 24: inventory.v1.ProxySQLExporter.status:type_name -> inventory.v1.AgentStatus + 109, // 25: inventory.v1.ProxySQLExporter.log_level:type_name -> inventory.v1.LogLevel + 110, // 26: inventory.v1.ProxySQLExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 111, // 27: inventory.v1.ProxySQLExporter.connection_timeout:type_name -> google.protobuf.Duration + 75, // 28: inventory.v1.ValkeyExporter.custom_labels:type_name -> inventory.v1.ValkeyExporter.CustomLabelsEntry + 108, // 29: inventory.v1.ValkeyExporter.status:type_name -> inventory.v1.AgentStatus + 110, // 30: inventory.v1.ValkeyExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 111, // 31: inventory.v1.ValkeyExporter.connection_timeout:type_name -> google.protobuf.Duration + 76, // 32: inventory.v1.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry + 108, // 33: inventory.v1.QANMySQLPerfSchemaAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 34: inventory.v1.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.v1.LogLevel + 77, // 35: inventory.v1.QANMySQLPerfSchemaAgent.extra_dsn_params:type_name -> inventory.v1.QANMySQLPerfSchemaAgent.ExtraDsnParamsEntry + 78, // 36: inventory.v1.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry + 108, // 37: inventory.v1.QANMySQLSlowlogAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 38: inventory.v1.QANMySQLSlowlogAgent.log_level:type_name -> inventory.v1.LogLevel + 79, // 39: inventory.v1.QANMySQLSlowlogAgent.extra_dsn_params:type_name -> inventory.v1.QANMySQLSlowlogAgent.ExtraDsnParamsEntry + 80, // 40: inventory.v1.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry + 108, // 41: inventory.v1.QANMongoDBProfilerAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 42: inventory.v1.QANMongoDBProfilerAgent.log_level:type_name -> inventory.v1.LogLevel + 81, // 43: inventory.v1.QANMongoDBMongologAgent.custom_labels:type_name -> inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry + 108, // 44: inventory.v1.QANMongoDBMongologAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 45: inventory.v1.QANMongoDBMongologAgent.log_level:type_name -> inventory.v1.LogLevel + 111, // 46: inventory.v1.RTAOptions.collect_interval:type_name -> google.protobuf.Duration + 82, // 47: inventory.v1.RTAMongoDBAgent.custom_labels:type_name -> inventory.v1.RTAMongoDBAgent.CustomLabelsEntry + 14, // 48: inventory.v1.RTAMongoDBAgent.rta_options:type_name -> inventory.v1.RTAOptions + 108, // 49: inventory.v1.RTAMongoDBAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 50: inventory.v1.RTAMongoDBAgent.log_level:type_name -> inventory.v1.LogLevel + 83, // 51: inventory.v1.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry + 108, // 52: inventory.v1.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 53: inventory.v1.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.v1.LogLevel + 84, // 54: inventory.v1.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry + 108, // 55: inventory.v1.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.v1.AgentStatus + 109, // 56: inventory.v1.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.v1.LogLevel + 85, // 57: inventory.v1.RDSExporter.custom_labels:type_name -> inventory.v1.RDSExporter.CustomLabelsEntry + 108, // 58: inventory.v1.RDSExporter.status:type_name -> inventory.v1.AgentStatus + 109, // 59: inventory.v1.RDSExporter.log_level:type_name -> inventory.v1.LogLevel + 110, // 60: inventory.v1.RDSExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 86, // 61: inventory.v1.ExternalExporter.custom_labels:type_name -> inventory.v1.ExternalExporter.CustomLabelsEntry + 110, // 62: inventory.v1.ExternalExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 108, // 63: inventory.v1.ExternalExporter.status:type_name -> inventory.v1.AgentStatus + 87, // 64: inventory.v1.AzureDatabaseExporter.custom_labels:type_name -> inventory.v1.AzureDatabaseExporter.CustomLabelsEntry + 108, // 65: inventory.v1.AzureDatabaseExporter.status:type_name -> inventory.v1.AgentStatus + 109, // 66: inventory.v1.AzureDatabaseExporter.log_level:type_name -> inventory.v1.LogLevel + 110, // 67: inventory.v1.AzureDatabaseExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 112, // 68: inventory.v1.ChangeCommonAgentParams.custom_labels:type_name -> common.StringMap + 110, // 69: inventory.v1.ChangeCommonAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 0, // 70: inventory.v1.ListAgentsRequest.agent_type:type_name -> inventory.v1.AgentType + 1, // 71: inventory.v1.ListAgentsResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 2, // 72: inventory.v1.ListAgentsResponse.vm_agent:type_name -> inventory.v1.VMAgent + 4, // 73: inventory.v1.ListAgentsResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 5, // 74: inventory.v1.ListAgentsResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 6, // 75: inventory.v1.ListAgentsResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 7, // 76: inventory.v1.ListAgentsResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 8, // 77: inventory.v1.ListAgentsResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 10, // 78: inventory.v1.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 11, // 79: inventory.v1.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 12, // 80: inventory.v1.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 13, // 81: inventory.v1.ListAgentsResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent + 16, // 82: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 17, // 83: inventory.v1.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 19, // 84: inventory.v1.ListAgentsResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 18, // 85: inventory.v1.ListAgentsResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 20, // 86: inventory.v1.ListAgentsResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 3, // 87: inventory.v1.ListAgentsResponse.nomad_agent:type_name -> inventory.v1.NomadAgent + 9, // 88: inventory.v1.ListAgentsResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter + 15, // 89: inventory.v1.ListAgentsResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent + 1, // 90: inventory.v1.GetAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 2, // 91: inventory.v1.GetAgentResponse.vmagent:type_name -> inventory.v1.VMAgent + 4, // 92: inventory.v1.GetAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 5, // 93: inventory.v1.GetAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 6, // 94: inventory.v1.GetAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 7, // 95: inventory.v1.GetAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 8, // 96: inventory.v1.GetAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 10, // 97: inventory.v1.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 11, // 98: inventory.v1.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 12, // 99: inventory.v1.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 13, // 100: inventory.v1.GetAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent + 16, // 101: inventory.v1.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 17, // 102: inventory.v1.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 19, // 103: inventory.v1.GetAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 18, // 104: inventory.v1.GetAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 20, // 105: inventory.v1.GetAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 3, // 106: inventory.v1.GetAgentResponse.nomad_agent:type_name -> inventory.v1.NomadAgent + 9, // 107: inventory.v1.GetAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter + 15, // 108: inventory.v1.GetAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent + 32, // 109: inventory.v1.AddAgentRequest.pmm_agent:type_name -> inventory.v1.AddPMMAgentParams + 33, // 110: inventory.v1.AddAgentRequest.node_exporter:type_name -> inventory.v1.AddNodeExporterParams + 35, // 111: inventory.v1.AddAgentRequest.mysqld_exporter:type_name -> inventory.v1.AddMySQLdExporterParams + 37, // 112: inventory.v1.AddAgentRequest.mongodb_exporter:type_name -> inventory.v1.AddMongoDBExporterParams + 39, // 113: inventory.v1.AddAgentRequest.postgres_exporter:type_name -> inventory.v1.AddPostgresExporterParams + 41, // 114: inventory.v1.AddAgentRequest.proxysql_exporter:type_name -> inventory.v1.AddProxySQLExporterParams + 57, // 115: inventory.v1.AddAgentRequest.external_exporter:type_name -> inventory.v1.AddExternalExporterParams + 55, // 116: inventory.v1.AddAgentRequest.rds_exporter:type_name -> inventory.v1.AddRDSExporterParams + 59, // 117: inventory.v1.AddAgentRequest.azure_database_exporter:type_name -> inventory.v1.AddAzureDatabaseExporterParams + 43, // 118: inventory.v1.AddAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams + 45, // 119: inventory.v1.AddAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams + 47, // 120: inventory.v1.AddAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams + 49, // 121: inventory.v1.AddAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams + 51, // 122: inventory.v1.AddAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams + 53, // 123: inventory.v1.AddAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams + 62, // 124: inventory.v1.AddAgentRequest.valkey_exporter:type_name -> inventory.v1.AddValkeyExporterParams + 64, // 125: inventory.v1.AddAgentRequest.rta_mongodb_agent:type_name -> inventory.v1.AddRTAMongoDBAgentParams + 1, // 126: inventory.v1.AddAgentResponse.pmm_agent:type_name -> inventory.v1.PMMAgent + 4, // 127: inventory.v1.AddAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 5, // 128: inventory.v1.AddAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 6, // 129: inventory.v1.AddAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 7, // 130: inventory.v1.AddAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 8, // 131: inventory.v1.AddAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 19, // 132: inventory.v1.AddAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 18, // 133: inventory.v1.AddAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 20, // 134: inventory.v1.AddAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 10, // 135: inventory.v1.AddAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 11, // 136: inventory.v1.AddAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 12, // 137: inventory.v1.AddAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 13, // 138: inventory.v1.AddAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent + 16, // 139: inventory.v1.AddAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 17, // 140: inventory.v1.AddAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 9, // 141: inventory.v1.AddAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter + 15, // 142: inventory.v1.AddAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent + 34, // 143: inventory.v1.ChangeAgentRequest.node_exporter:type_name -> inventory.v1.ChangeNodeExporterParams + 36, // 144: inventory.v1.ChangeAgentRequest.mysqld_exporter:type_name -> inventory.v1.ChangeMySQLdExporterParams + 38, // 145: inventory.v1.ChangeAgentRequest.mongodb_exporter:type_name -> inventory.v1.ChangeMongoDBExporterParams + 40, // 146: inventory.v1.ChangeAgentRequest.postgres_exporter:type_name -> inventory.v1.ChangePostgresExporterParams + 42, // 147: inventory.v1.ChangeAgentRequest.proxysql_exporter:type_name -> inventory.v1.ChangeProxySQLExporterParams + 58, // 148: inventory.v1.ChangeAgentRequest.external_exporter:type_name -> inventory.v1.ChangeExternalExporterParams + 56, // 149: inventory.v1.ChangeAgentRequest.rds_exporter:type_name -> inventory.v1.ChangeRDSExporterParams + 60, // 150: inventory.v1.ChangeAgentRequest.azure_database_exporter:type_name -> inventory.v1.ChangeAzureDatabaseExporterParams + 44, // 151: inventory.v1.ChangeAgentRequest.qan_mysql_perfschema_agent:type_name -> inventory.v1.ChangeQANMySQLPerfSchemaAgentParams + 46, // 152: inventory.v1.ChangeAgentRequest.qan_mysql_slowlog_agent:type_name -> inventory.v1.ChangeQANMySQLSlowlogAgentParams + 48, // 153: inventory.v1.ChangeAgentRequest.qan_mongodb_profiler_agent:type_name -> inventory.v1.ChangeQANMongoDBProfilerAgentParams + 50, // 154: inventory.v1.ChangeAgentRequest.qan_mongodb_mongolog_agent:type_name -> inventory.v1.ChangeQANMongoDBMongologAgentParams + 52, // 155: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams + 54, // 156: inventory.v1.ChangeAgentRequest.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams + 61, // 157: inventory.v1.ChangeAgentRequest.nomad_agent:type_name -> inventory.v1.ChangeNomadAgentParams + 63, // 158: inventory.v1.ChangeAgentRequest.valkey_exporter:type_name -> inventory.v1.ChangeValkeyExporterParams + 65, // 159: inventory.v1.ChangeAgentRequest.rta_mongodb_agent:type_name -> inventory.v1.ChangeRTAMongoDBAgentParams + 4, // 160: inventory.v1.ChangeAgentResponse.node_exporter:type_name -> inventory.v1.NodeExporter + 5, // 161: inventory.v1.ChangeAgentResponse.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 6, // 162: inventory.v1.ChangeAgentResponse.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 7, // 163: inventory.v1.ChangeAgentResponse.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 8, // 164: inventory.v1.ChangeAgentResponse.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 19, // 165: inventory.v1.ChangeAgentResponse.external_exporter:type_name -> inventory.v1.ExternalExporter + 18, // 166: inventory.v1.ChangeAgentResponse.rds_exporter:type_name -> inventory.v1.RDSExporter + 20, // 167: inventory.v1.ChangeAgentResponse.azure_database_exporter:type_name -> inventory.v1.AzureDatabaseExporter + 10, // 168: inventory.v1.ChangeAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 11, // 169: inventory.v1.ChangeAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.v1.QANMySQLSlowlogAgent + 12, // 170: inventory.v1.ChangeAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.v1.QANMongoDBProfilerAgent + 13, // 171: inventory.v1.ChangeAgentResponse.qan_mongodb_mongolog_agent:type_name -> inventory.v1.QANMongoDBMongologAgent + 16, // 172: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 17, // 173: inventory.v1.ChangeAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 3, // 174: inventory.v1.ChangeAgentResponse.nomad_agent:type_name -> inventory.v1.NomadAgent + 9, // 175: inventory.v1.ChangeAgentResponse.valkey_exporter:type_name -> inventory.v1.ValkeyExporter + 15, // 176: inventory.v1.ChangeAgentResponse.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent + 88, // 177: inventory.v1.AddPMMAgentParams.custom_labels:type_name -> inventory.v1.AddPMMAgentParams.CustomLabelsEntry + 89, // 178: inventory.v1.AddNodeExporterParams.custom_labels:type_name -> inventory.v1.AddNodeExporterParams.CustomLabelsEntry + 109, // 179: inventory.v1.AddNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 180: inventory.v1.ChangeNodeExporterParams.custom_labels:type_name -> common.StringMap + 110, // 181: inventory.v1.ChangeNodeExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 182: inventory.v1.ChangeNodeExporterParams.log_level:type_name -> inventory.v1.LogLevel + 90, // 183: inventory.v1.AddMySQLdExporterParams.custom_labels:type_name -> inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry + 109, // 184: inventory.v1.AddMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel + 91, // 185: inventory.v1.AddMySQLdExporterParams.extra_dsn_params:type_name -> inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntry + 111, // 186: inventory.v1.AddMySQLdExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 112, // 187: inventory.v1.ChangeMySQLdExporterParams.custom_labels:type_name -> common.StringMap + 110, // 188: inventory.v1.ChangeMySQLdExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 189: inventory.v1.ChangeMySQLdExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 190: inventory.v1.ChangeMySQLdExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 92, // 191: inventory.v1.AddMongoDBExporterParams.custom_labels:type_name -> inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry + 109, // 192: inventory.v1.AddMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 193: inventory.v1.AddMongoDBExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 112, // 194: inventory.v1.ChangeMongoDBExporterParams.custom_labels:type_name -> common.StringMap + 110, // 195: inventory.v1.ChangeMongoDBExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 196: inventory.v1.ChangeMongoDBExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 197: inventory.v1.ChangeMongoDBExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 93, // 198: inventory.v1.AddPostgresExporterParams.custom_labels:type_name -> inventory.v1.AddPostgresExporterParams.CustomLabelsEntry + 109, // 199: inventory.v1.AddPostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 200: inventory.v1.AddPostgresExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 112, // 201: inventory.v1.ChangePostgresExporterParams.custom_labels:type_name -> common.StringMap + 110, // 202: inventory.v1.ChangePostgresExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 203: inventory.v1.ChangePostgresExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 204: inventory.v1.ChangePostgresExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 94, // 205: inventory.v1.AddProxySQLExporterParams.custom_labels:type_name -> inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry + 109, // 206: inventory.v1.AddProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 207: inventory.v1.AddProxySQLExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 112, // 208: inventory.v1.ChangeProxySQLExporterParams.custom_labels:type_name -> common.StringMap + 110, // 209: inventory.v1.ChangeProxySQLExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 210: inventory.v1.ChangeProxySQLExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 211: inventory.v1.ChangeProxySQLExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 95, // 212: inventory.v1.AddQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry + 109, // 213: inventory.v1.AddQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel + 96, // 214: inventory.v1.AddQANMySQLPerfSchemaAgentParams.extra_dsn_params:type_name -> inventory.v1.AddQANMySQLPerfSchemaAgentParams.ExtraDsnParamsEntry + 112, // 215: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.custom_labels:type_name -> common.StringMap + 110, // 216: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 217: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams.log_level:type_name -> inventory.v1.LogLevel + 97, // 218: inventory.v1.AddQANMySQLSlowlogAgentParams.custom_labels:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry + 109, // 219: inventory.v1.AddQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel + 98, // 220: inventory.v1.AddQANMySQLSlowlogAgentParams.extra_dsn_params:type_name -> inventory.v1.AddQANMySQLSlowlogAgentParams.ExtraDsnParamsEntry + 112, // 221: inventory.v1.ChangeQANMySQLSlowlogAgentParams.custom_labels:type_name -> common.StringMap + 110, // 222: inventory.v1.ChangeQANMySQLSlowlogAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 223: inventory.v1.ChangeQANMySQLSlowlogAgentParams.log_level:type_name -> inventory.v1.LogLevel + 99, // 224: inventory.v1.AddQANMongoDBProfilerAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry + 109, // 225: inventory.v1.AddQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 226: inventory.v1.ChangeQANMongoDBProfilerAgentParams.custom_labels:type_name -> common.StringMap + 110, // 227: inventory.v1.ChangeQANMongoDBProfilerAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 228: inventory.v1.ChangeQANMongoDBProfilerAgentParams.log_level:type_name -> inventory.v1.LogLevel + 100, // 229: inventory.v1.AddQANMongoDBMongologAgentParams.custom_labels:type_name -> inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry + 109, // 230: inventory.v1.AddQANMongoDBMongologAgentParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 231: inventory.v1.ChangeQANMongoDBMongologAgentParams.custom_labels:type_name -> common.StringMap + 110, // 232: inventory.v1.ChangeQANMongoDBMongologAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 233: inventory.v1.ChangeQANMongoDBMongologAgentParams.log_level:type_name -> inventory.v1.LogLevel + 101, // 234: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry + 109, // 235: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 236: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.custom_labels:type_name -> common.StringMap + 110, // 237: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 238: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams.log_level:type_name -> inventory.v1.LogLevel + 102, // 239: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry + 109, // 240: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 241: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.custom_labels:type_name -> common.StringMap + 110, // 242: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 243: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams.log_level:type_name -> inventory.v1.LogLevel + 103, // 244: inventory.v1.AddRDSExporterParams.custom_labels:type_name -> inventory.v1.AddRDSExporterParams.CustomLabelsEntry + 109, // 245: inventory.v1.AddRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 246: inventory.v1.ChangeRDSExporterParams.custom_labels:type_name -> common.StringMap + 110, // 247: inventory.v1.ChangeRDSExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 248: inventory.v1.ChangeRDSExporterParams.log_level:type_name -> inventory.v1.LogLevel + 104, // 249: inventory.v1.AddExternalExporterParams.custom_labels:type_name -> inventory.v1.AddExternalExporterParams.CustomLabelsEntry + 112, // 250: inventory.v1.ChangeExternalExporterParams.custom_labels:type_name -> common.StringMap + 110, // 251: inventory.v1.ChangeExternalExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 105, // 252: inventory.v1.AddAzureDatabaseExporterParams.custom_labels:type_name -> inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry + 109, // 253: inventory.v1.AddAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel + 112, // 254: inventory.v1.ChangeAzureDatabaseExporterParams.custom_labels:type_name -> common.StringMap + 110, // 255: inventory.v1.ChangeAzureDatabaseExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 256: inventory.v1.ChangeAzureDatabaseExporterParams.log_level:type_name -> inventory.v1.LogLevel + 106, // 257: inventory.v1.AddValkeyExporterParams.custom_labels:type_name -> inventory.v1.AddValkeyExporterParams.CustomLabelsEntry + 109, // 258: inventory.v1.AddValkeyExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 259: inventory.v1.AddValkeyExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 112, // 260: inventory.v1.ChangeValkeyExporterParams.custom_labels:type_name -> common.StringMap + 110, // 261: inventory.v1.ChangeValkeyExporterParams.metrics_resolutions:type_name -> common.MetricsResolutions + 109, // 262: inventory.v1.ChangeValkeyExporterParams.log_level:type_name -> inventory.v1.LogLevel + 111, // 263: inventory.v1.ChangeValkeyExporterParams.connection_timeout:type_name -> google.protobuf.Duration + 107, // 264: inventory.v1.AddRTAMongoDBAgentParams.custom_labels:type_name -> inventory.v1.AddRTAMongoDBAgentParams.CustomLabelsEntry + 109, // 265: inventory.v1.AddRTAMongoDBAgentParams.log_level:type_name -> inventory.v1.LogLevel + 14, // 266: inventory.v1.AddRTAMongoDBAgentParams.rta_options:type_name -> inventory.v1.RTAOptions + 112, // 267: inventory.v1.ChangeRTAMongoDBAgentParams.custom_labels:type_name -> common.StringMap + 109, // 268: inventory.v1.ChangeRTAMongoDBAgentParams.log_level:type_name -> inventory.v1.LogLevel + 14, // 269: inventory.v1.ChangeRTAMongoDBAgentParams.rta_options:type_name -> inventory.v1.RTAOptions + 22, // 270: inventory.v1.AgentsService.ListAgents:input_type -> inventory.v1.ListAgentsRequest + 24, // 271: inventory.v1.AgentsService.GetAgent:input_type -> inventory.v1.GetAgentRequest + 26, // 272: inventory.v1.AgentsService.GetAgentLogs:input_type -> inventory.v1.GetAgentLogsRequest + 28, // 273: inventory.v1.AgentsService.AddAgent:input_type -> inventory.v1.AddAgentRequest + 30, // 274: inventory.v1.AgentsService.ChangeAgent:input_type -> inventory.v1.ChangeAgentRequest + 66, // 275: inventory.v1.AgentsService.RemoveAgent:input_type -> inventory.v1.RemoveAgentRequest + 23, // 276: inventory.v1.AgentsService.ListAgents:output_type -> inventory.v1.ListAgentsResponse + 25, // 277: inventory.v1.AgentsService.GetAgent:output_type -> inventory.v1.GetAgentResponse + 27, // 278: inventory.v1.AgentsService.GetAgentLogs:output_type -> inventory.v1.GetAgentLogsResponse + 29, // 279: inventory.v1.AgentsService.AddAgent:output_type -> inventory.v1.AddAgentResponse + 31, // 280: inventory.v1.AgentsService.ChangeAgent:output_type -> inventory.v1.ChangeAgentResponse + 67, // 281: inventory.v1.AgentsService.RemoveAgent:output_type -> inventory.v1.RemoveAgentResponse + 276, // [276:282] is the sub-list for method output_type + 270, // [270:276] is the sub-list for method input_type + 270, // [270:270] is the sub-list for extension type_name + 270, // [270:270] is the sub-list for extension extendee + 0, // [0:270] is the sub-list for field type_name } func init() { file_inventory_v1_agents_proto_init() } diff --git a/api/inventory/v1/agents.pb.validate.go b/api/inventory/v1/agents.pb.validate.go index 7e45f186227..533385485fb 100644 --- a/api/inventory/v1/agents.pb.validate.go +++ b/api/inventory/v1/agents.pb.validate.go @@ -607,6 +607,35 @@ func (m *MySQLdExporter) validate(all bool) error { // no validation rules for ExtraDsnParams + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MySQLdExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MySQLdExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MySQLdExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MySQLdExporterMultiError(errors) } @@ -768,6 +797,35 @@ func (m *MongoDBExporter) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MongoDBExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MongoDBExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MongoDBExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MongoDBExporterMultiError(errors) } @@ -929,6 +987,35 @@ func (m *PostgresExporter) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PostgresExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PostgresExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PostgresExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return PostgresExporterMultiError(errors) } @@ -1086,6 +1173,35 @@ func (m *ProxySQLExporter) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ProxySQLExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ProxySQLExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ProxySQLExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ProxySQLExporterMultiError(errors) } @@ -1241,6 +1357,35 @@ func (m *ValkeyExporter) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ValkeyExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ValkeyExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ValkeyExporterValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ValkeyExporterMultiError(errors) } @@ -8815,6 +8960,36 @@ func (m *AddMySQLdExporterParams) validate(all bool) error { // no validation rules for ExtraDsnParams + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddMySQLdExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddMySQLdExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddMySQLdExporterParamsMultiError(errors) } @@ -8946,6 +9121,36 @@ func (m *ChangeMySQLdExporterParams) validate(all bool) error { } } + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ChangeMySQLdExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ChangeMySQLdExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if m.Enable != nil { // no validation rules for Enable } @@ -9191,6 +9396,36 @@ func (m *AddMongoDBExporterParams) validate(all bool) error { // no validation rules for EnableAllCollectors + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddMongoDBExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddMongoDBExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddMongoDBExporterParamsMultiError(errors) } @@ -9322,6 +9557,36 @@ func (m *ChangeMongoDBExporterParams) validate(all bool) error { } } + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ChangeMongoDBExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ChangeMongoDBExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if m.Enable != nil { // no validation rules for Enable } @@ -9585,6 +9850,36 @@ func (m *AddPostgresExporterParams) validate(all bool) error { // no validation rules for MaxExporterConnections + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddPostgresExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddPostgresExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddPostgresExporterParamsMultiError(errors) } @@ -9716,6 +10011,36 @@ func (m *ChangePostgresExporterParams) validate(all bool) error { } } + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ChangePostgresExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ChangePostgresExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if m.Enable != nil { // no validation rules for Enable } @@ -9961,6 +10286,36 @@ func (m *AddProxySQLExporterParams) validate(all bool) error { // no validation rules for ExposeExporter + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddProxySQLExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddProxySQLExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddProxySQLExporterParamsMultiError(errors) } @@ -10092,6 +10447,36 @@ func (m *ChangeProxySQLExporterParams) validate(all bool) error { } } + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ChangeProxySQLExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ChangeProxySQLExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if m.Enable != nil { // no validation rules for Enable } @@ -13704,6 +14089,36 @@ func (m *AddValkeyExporterParams) validate(all bool) error { // no validation rules for LogLevel + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddValkeyExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddValkeyExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddValkeyExporterParamsMultiError(errors) } @@ -13843,6 +14258,36 @@ func (m *ChangeValkeyExporterParams) validate(all bool) error { } } + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ChangeValkeyExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ChangeValkeyExporterParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if m.Enable != nil { // no validation rules for Enable } diff --git a/api/inventory/v1/agents.proto b/api/inventory/v1/agents.proto index ad32b488c83..9b93ba43a1a 100644 --- a/api/inventory/v1/agents.proto +++ b/api/inventory/v1/agents.proto @@ -187,6 +187,8 @@ message MySQLdExporter { common.MetricsResolutions metrics_resolutions = 26; // Extra DSN parameters for MySQL connection. map extra_dsn_params = 27; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 28; } // MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. @@ -237,6 +239,8 @@ message MongoDBExporter { common.MetricsResolutions metrics_resolutions = 28; // Environment variable names passed to the exporter. repeated string environment_variable_names = 29; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 30; } // PostgresExporter runs on Generic or Container Node and exposes PostgreSQL Service metrics. @@ -282,6 +286,8 @@ message PostgresExporter { int32 max_exporter_connections = 26; // Metrics resolution for this agent. common.MetricsResolutions metrics_resolutions = 27; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 28; } // ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. @@ -323,6 +329,8 @@ message ProxySQLExporter { bool expose_exporter = 24; // Metrics resolution for this agent. common.MetricsResolutions metrics_resolutions = 25; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 26; } // ValkeyExporter runs on Generic or Container Node and exposes Valkey Service metrics. @@ -362,6 +370,8 @@ message ValkeyExporter { bool expose_exporter = 23; // Metrics resolution for this agent. common.MetricsResolutions metrics_resolutions = 24; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 25; } // QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. @@ -1027,6 +1037,10 @@ message AddMySQLdExporterParams { bool expose_exporter = 17; // Extra DSN parameters for MySQL connection. map extra_dsn_params = 18; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 19 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ChangeMySQLdExporterParams { @@ -1064,6 +1078,10 @@ message ChangeMySQLdExporterParams { optional LogLevel log_level = 16; // Optionally expose the exporter process on all public interfaces. optional bool expose_exporter = 17; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 18 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } // Add/Change MongoDBExporter @@ -1117,6 +1135,10 @@ message AddMongoDBExporterParams { repeated string environment_variable_names = 21; // Enable all collectors. bool enable_all_collectors = 22; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 23 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ChangeMongoDBExporterParams { @@ -1162,6 +1184,10 @@ message ChangeMongoDBExporterParams { optional LogLevel log_level = 20; // Optionally expose the exporter process on all public interfaces. optional bool expose_exporter = 21; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 22 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } // Add/Change PostgresExporter @@ -1206,6 +1232,10 @@ message AddPostgresExporterParams { bool expose_exporter = 17; // Maximum number of connections that exporter can open to the database instance. int32 max_exporter_connections = 18; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 19 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ChangePostgresExporterParams { @@ -1245,6 +1275,10 @@ message ChangePostgresExporterParams { optional bool expose_exporter = 17; // Maximum number of connections that exporter can open to the database instance. optional int32 max_exporter_connections = 18; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 19 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } // Add/Change ProxySQLExporter @@ -1279,6 +1313,10 @@ message AddProxySQLExporterParams { LogLevel log_level = 12; // Optionally expose the exporter process on all public interfaces bool expose_exporter = 13; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 14 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ChangeProxySQLExporterParams { @@ -1306,6 +1344,10 @@ message ChangeProxySQLExporterParams { optional LogLevel log_level = 11; // Optionally expose the exporter process on all public interfaces. optional bool expose_exporter = 12; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 13 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } // Add/Change QANMySQLPerfSchemaAgent @@ -1929,6 +1971,10 @@ message AddValkeyExporterParams { bool expose_exporter = 15; // Log level for exporter. LogLevel log_level = 16; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 17 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ChangeValkeyExporterParams { @@ -1965,6 +2011,10 @@ message ChangeValkeyExporterParams { optional bool expose_exporter = 14; // Log level for exporter. optional LogLevel log_level = 15; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 16 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } // Add/Change RTAMongoDBAgent diff --git a/api/inventory/v1/json/client/agents_service/add_agent_responses.go b/api/inventory/v1/json/client/agents_service/add_agent_responses.go index b11c2f86fc3..6a401a73398 100644 --- a/api/inventory/v1/json/client/agents_service/add_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/add_agent_responses.go @@ -3123,6 +3123,9 @@ type AddAgentOKBodyMongodbExporter struct { // Environment variable names passed to the exporter. EnvironmentVariableNames []string `json:"environment_variable_names"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddAgentOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3470,6 +3473,9 @@ type AddAgentOKBodyMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddAgentOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -4161,6 +4167,9 @@ type AddAgentOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddAgentOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -4485,6 +4494,9 @@ type AddAgentOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddAgentOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -6729,6 +6741,9 @@ type AddAgentOKBodyValkeyExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddAgentOKBodyValkeyExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -7210,6 +7225,9 @@ type AddAgentParamsBodyMongodbExporter struct { // Enable all collectors. EnableAllCollectors bool `json:"enable_all_collectors,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add agent params body mongodb exporter @@ -7366,6 +7384,9 @@ type AddAgentParamsBodyMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add agent params body mysqld exporter @@ -7678,6 +7699,9 @@ type AddAgentParamsBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add agent params body postgres exporter @@ -7817,6 +7841,9 @@ type AddAgentParamsBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add agent params body proxysql exporter @@ -9218,6 +9245,9 @@ type AddAgentParamsBodyValkeyExporter struct { // - LOG_LEVEL_UNSPECIFIED: Auto // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] LogLevel *string `json:"log_level,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add agent params body valkey exporter diff --git a/api/inventory/v1/json/client/agents_service/change_agent_responses.go b/api/inventory/v1/json/client/agents_service/change_agent_responses.go index efd1d7e7a74..7a04e267fb4 100644 --- a/api/inventory/v1/json/client/agents_service/change_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/change_agent_responses.go @@ -3123,6 +3123,9 @@ type ChangeAgentOKBodyMongodbExporter struct { // Environment variable names passed to the exporter. EnvironmentVariableNames []string `json:"environment_variable_names"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ChangeAgentOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3470,6 +3473,9 @@ type ChangeAgentOKBodyMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ChangeAgentOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -4242,6 +4248,9 @@ type ChangeAgentOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ChangeAgentOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -4566,6 +4575,9 @@ type ChangeAgentOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ChangeAgentOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -6810,6 +6822,9 @@ type ChangeAgentOKBodyValkeyExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ChangeAgentOKBodyValkeyExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -7662,6 +7677,9 @@ type ChangeAgentParamsBodyMongodbExporter struct { // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyMongodbExporterCustomLabels `json:"custom_labels,omitempty"` @@ -8008,6 +8026,9 @@ type ChangeAgentParamsBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyMysqldExporterCustomLabels `json:"custom_labels,omitempty"` @@ -8710,6 +8731,9 @@ type ChangeAgentParamsBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections *int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyPostgresExporterCustomLabels `json:"custom_labels,omitempty"` @@ -9041,6 +9065,9 @@ type ChangeAgentParamsBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyProxysqlExporterCustomLabels `json:"custom_labels,omitempty"` @@ -12074,6 +12101,9 @@ type ChangeAgentParamsBodyValkeyExporter struct { // Enum: ["LOG_LEVEL_UNSPECIFIED","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARN","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG"] LogLevel *string `json:"log_level,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyValkeyExporterCustomLabels `json:"custom_labels,omitempty"` diff --git a/api/inventory/v1/json/client/agents_service/get_agent_responses.go b/api/inventory/v1/json/client/agents_service/get_agent_responses.go index f0befcd1b48..13269939737 100644 --- a/api/inventory/v1/json/client/agents_service/get_agent_responses.go +++ b/api/inventory/v1/json/client/agents_service/get_agent_responses.go @@ -2209,6 +2209,9 @@ type GetAgentOKBodyMongodbExporter struct { // Environment variable names passed to the exporter. EnvironmentVariableNames []string `json:"environment_variable_names"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *GetAgentOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -2556,6 +2559,9 @@ type GetAgentOKBodyMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *GetAgentOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3377,6 +3383,9 @@ type GetAgentOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *GetAgentOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3701,6 +3710,9 @@ type GetAgentOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *GetAgentOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -5945,6 +5957,9 @@ type GetAgentOKBodyValkeyExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *GetAgentOKBodyValkeyExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } diff --git a/api/inventory/v1/json/client/agents_service/list_agents_responses.go b/api/inventory/v1/json/client/agents_service/list_agents_responses.go index 33502ed0d27..52b12e76585 100644 --- a/api/inventory/v1/json/client/agents_service/list_agents_responses.go +++ b/api/inventory/v1/json/client/agents_service/list_agents_responses.go @@ -2380,6 +2380,9 @@ type ListAgentsOKBodyMongodbExporterItems0 struct { // Environment variable names passed to the exporter. EnvironmentVariableNames []string `json:"environment_variable_names"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -2727,6 +2730,9 @@ type ListAgentsOKBodyMysqldExporterItems0 struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3548,6 +3554,9 @@ type ListAgentsOKBodyPostgresExporterItems0 struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -3872,6 +3881,9 @@ type ListAgentsOKBodyProxysqlExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -6245,6 +6257,9 @@ type ListAgentsOKBodyValkeyExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *ListAgentsOKBodyValkeyExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } diff --git a/api/inventory/v1/json/v1.json b/api/inventory/v1/json/v1.json index 18b9a0b485c..1b0a2395e83 100644 --- a/api/inventory/v1/json/v1.json +++ b/api/inventory/v1/json/v1.json @@ -448,6 +448,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } } }, @@ -610,6 +615,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } } }, @@ -757,6 +767,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } } }, @@ -892,6 +907,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } } }, @@ -2077,6 +2097,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } } }, @@ -2412,6 +2437,11 @@ "type": "string" }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 2 @@ -2551,6 +2581,11 @@ "description": "Enable all collectors.", "type": "boolean", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -2665,6 +2700,11 @@ "type": "integer", "format": "int32", "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -2752,6 +2792,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 12 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 13 } }, "x-order": 5 @@ -3649,6 +3694,11 @@ "LOG_LEVEL_DEBUG" ], "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 15 @@ -4074,6 +4124,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 2 @@ -4233,6 +4288,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 3 @@ -4377,6 +4437,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -4509,6 +4574,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 5 @@ -5613,6 +5683,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -6129,6 +6204,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -6288,6 +6368,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 4 @@ -6432,6 +6517,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 5 @@ -6564,6 +6654,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 6 @@ -7716,6 +7811,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 17 @@ -8097,6 +8197,11 @@ "type": "boolean", "x-nullable": true, "x-order": 16 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 17 } }, "x-order": 1 @@ -8269,6 +8374,11 @@ "type": "boolean", "x-nullable": true, "x-order": 20 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 21 } }, "x-order": 2 @@ -8422,6 +8532,11 @@ "format": "int32", "x-nullable": true, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -8537,6 +8652,11 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 12 } }, "x-order": 4 @@ -9763,6 +9883,11 @@ ], "x-nullable": true, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -10161,6 +10286,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -10320,6 +10450,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 2 @@ -10464,6 +10599,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -10596,6 +10736,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 4 @@ -11748,6 +11893,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 diff --git a/api/management/v1/agent.pb.go b/api/management/v1/agent.pb.go index e63ced85bd1..2c64d9835a6 100644 --- a/api/management/v1/agent.pb.go +++ b/api/management/v1/agent.pb.go @@ -13,6 +13,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" _ "github.com/percona/pmm/api/extensions/v1" @@ -172,9 +173,11 @@ type UniversalAgent struct { // Options for connecting to Valkey. ValkeyOptions *UniversalAgent_ValkeyOptions `protobuf:"bytes,41,opt,name=valkey_options,json=valkeyOptions,proto3" json:"valkey_options,omitempty"` // Real-Time Analytics options. - RtaOptions *v1.RTAOptions `protobuf:"bytes,42,opt,name=rta_options,json=rtaOptions,proto3" json:"rta_options,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RtaOptions *v1.RTAOptions `protobuf:"bytes,42,opt,name=rta_options,json=rtaOptions,proto3" json:"rta_options,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,43,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UniversalAgent) Reset() { @@ -501,6 +504,13 @@ func (x *UniversalAgent) GetRtaOptions() *v1.RTAOptions { return nil } +func (x *UniversalAgent) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ListAgentsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Return only Agents that relate to a specific ServiceID. @@ -1090,7 +1100,7 @@ var File_management_v1_agent_proto protoreflect.FileDescriptor const file_management_v1_agent_proto_rawDesc = "" + "\n" + - "\x19management/v1/agent.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\"\xd0\x18\n" + + "\x19management/v1/agent.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\"\x9a\x19\n" + "\x0eUniversalAgent\x12\x19\n" + "\bagent_id\x18\x01 \x01(\tR\aagentId\x121\n" + "\x15is_agent_password_set\x18\x02 \x01(\bR\x12isAgentPasswordSet\x12\x1d\n" + @@ -1142,7 +1152,8 @@ const file_management_v1_agent_proto_rawDesc = "" + "\x0fexpose_exporter\x18( \x01(\bR\x0eexposeExporter\x12R\n" + "\x0evalkey_options\x18) \x01(\v2+.management.v1.UniversalAgent.ValkeyOptionsR\rvalkeyOptions\x129\n" + "\vrta_options\x18* \x01(\v2\x18.inventory.v1.RTAOptionsR\n" + - "rtaOptions\x1a\xe0\x01\n" + + "rtaOptions\x12H\n" + + "\x12connection_timeout\x18+ \x01(\v2\x19.google.protobuf.DurationR\x11connectionTimeout\x1a\xe0\x01\n" + "\fMySQLOptions\x12#\n" + "\x0eis_tls_key_set\x18\x01 \x01(\bR\visTlsKeySet\x12h\n" + "\x10extra_dsn_params\x18\x02 \x03(\v2>.management.v1.UniversalAgent.MySQLOptions.ExtraDsnParamsEntryR\x0eextraDsnParams\x1aA\n" + @@ -1227,6 +1238,7 @@ var ( (*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp (v1.LogLevel)(0), // 15: inventory.v1.LogLevel (*v1.RTAOptions)(nil), // 16: inventory.v1.RTAOptions + (*durationpb.Duration)(nil), // 17: google.protobuf.Duration } ) @@ -1241,15 +1253,16 @@ var file_management_v1_agent_proto_depIdxs = []int32{ 14, // 7: management.v1.UniversalAgent.updated_at:type_name -> google.protobuf.Timestamp 11, // 8: management.v1.UniversalAgent.valkey_options:type_name -> management.v1.UniversalAgent.ValkeyOptions 16, // 9: management.v1.UniversalAgent.rta_options:type_name -> inventory.v1.RTAOptions - 1, // 10: management.v1.ListAgentsResponse.agents:type_name -> management.v1.UniversalAgent - 0, // 11: management.v1.AgentVersions.severity:type_name -> management.v1.UpdateSeverity - 4, // 12: management.v1.ListAgentVersionsResponse.agent_versions:type_name -> management.v1.AgentVersions - 13, // 13: management.v1.UniversalAgent.MySQLOptions.extra_dsn_params:type_name -> management.v1.UniversalAgent.MySQLOptions.ExtraDsnParamsEntry - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 17, // 10: management.v1.UniversalAgent.connection_timeout:type_name -> google.protobuf.Duration + 1, // 11: management.v1.ListAgentsResponse.agents:type_name -> management.v1.UniversalAgent + 0, // 12: management.v1.AgentVersions.severity:type_name -> management.v1.UpdateSeverity + 4, // 13: management.v1.ListAgentVersionsResponse.agent_versions:type_name -> management.v1.AgentVersions + 13, // 14: management.v1.UniversalAgent.MySQLOptions.extra_dsn_params:type_name -> management.v1.UniversalAgent.MySQLOptions.ExtraDsnParamsEntry + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_management_v1_agent_proto_init() } diff --git a/api/management/v1/agent.pb.validate.go b/api/management/v1/agent.pb.validate.go index a278a0a189b..47de65d289c 100644 --- a/api/management/v1/agent.pb.validate.go +++ b/api/management/v1/agent.pb.validate.go @@ -359,6 +359,35 @@ func (m *UniversalAgent) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetConnectionTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UniversalAgentValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UniversalAgentValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConnectionTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UniversalAgentValidationError{ + field: "ConnectionTimeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return UniversalAgentMultiError(errors) } diff --git a/api/management/v1/agent.proto b/api/management/v1/agent.proto index 490cec65ceb..20213b24e9e 100644 --- a/api/management/v1/agent.proto +++ b/api/management/v1/agent.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; @@ -143,6 +144,8 @@ message UniversalAgent { ValkeyOptions valkey_options = 41; // Real-Time Analytics options. inventory.v1.RTAOptions rta_options = 42; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 43; } message ListAgentsRequest { diff --git a/api/management/v1/azure.pb.go b/api/management/v1/azure.pb.go index e3e37aca4ce..11933db57d2 100644 --- a/api/management/v1/azure.pb.go +++ b/api/management/v1/azure.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" ) @@ -377,9 +378,11 @@ type AddAzureDatabaseRequest struct { // Use negative value to disable them. TablestatsGroupTableLimit int32 `protobuf:"varint,24,opt,name=tablestats_group_table_limit,json=tablestatsGroupTableLimit,proto3" json:"tablestats_group_table_limit,omitempty"` // Azure database resource type (mysql, maria, postgres) - Type DiscoverAzureDatabaseType `protobuf:"varint,25,opt,name=type,proto3,enum=management.v1.DiscoverAzureDatabaseType" json:"type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Type DiscoverAzureDatabaseType `protobuf:"varint,25,opt,name=type,proto3,enum=management.v1.DiscoverAzureDatabaseType" json:"type,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,26,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddAzureDatabaseRequest) Reset() { @@ -587,6 +590,13 @@ func (x *AddAzureDatabaseRequest) GetType() DiscoverAzureDatabaseType { return DiscoverAzureDatabaseType_DISCOVER_AZURE_DATABASE_TYPE_UNSPECIFIED } +func (x *AddAzureDatabaseRequest) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type AddAzureDatabaseResponse struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -627,7 +637,7 @@ var File_management_v1_azure_proto protoreflect.FileDescriptor const file_management_v1_azure_proto_rawDesc = "" + "\n" + - "\x19management/v1/azure.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x17validate/validate.proto\"\xfe\x01\n" + + "\x19management/v1/azure.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x17validate/validate.proto\"\xfe\x01\n" + "\x1cDiscoverAzureDatabaseRequest\x123\n" + "\x0fazure_client_id\x18\x01 \x01(\tB\v\xfaB\x04r\x02\x10\x01\x88\xb5\x18\x01R\razureClientId\x12;\n" + "\x13azure_client_secret\x18\x02 \x01(\tB\v\xfaB\x04r\x02\x10\x01\x88\xb5\x18\x01R\x11azureClientSecret\x12/\n" + @@ -648,7 +658,7 @@ const file_management_v1_azure_proto_rawDesc = "" + "node_model\x18\n" + " \x01(\tR\tnodeModel\"\x85\x01\n" + "\x1dDiscoverAzureDatabaseResponse\x12d\n" + - "\x17azure_database_instance\x18\x01 \x03(\v2,.management.v1.DiscoverAzureDatabaseInstanceR\x15azureDatabaseInstance\"\xa8\t\n" + + "\x17azure_database_instance\x18\x01 \x03(\v2,.management.v1.DiscoverAzureDatabaseInstanceR\x15azureDatabaseInstance\"\xfc\t\n" + "\x17AddAzureDatabaseRequest\x12\x1f\n" + "\x06region\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\x06region\x12\x0e\n" + "\x02az\x18\x02 \x01(\tR\x02az\x12(\n" + @@ -677,7 +687,8 @@ const file_management_v1_azure_proto_rawDesc = "" + "\x0ftls_skip_verify\x18\x16 \x01(\bR\rtlsSkipVerify\x124\n" + "\x16disable_query_examples\x18\x17 \x01(\bR\x14disableQueryExamples\x12?\n" + "\x1ctablestats_group_table_limit\x18\x18 \x01(\x05R\x19tablestatsGroupTableLimit\x12<\n" + - "\x04type\x18\x19 \x01(\x0e2(.management.v1.DiscoverAzureDatabaseTypeR\x04type\x1a?\n" + + "\x04type\x18\x19 \x01(\x0e2(.management.v1.DiscoverAzureDatabaseTypeR\x04type\x12R\n" + + "\x12connection_timeout\x18\x1a \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x1a\n" + @@ -712,6 +723,7 @@ var ( (*AddAzureDatabaseRequest)(nil), // 4: management.v1.AddAzureDatabaseRequest (*AddAzureDatabaseResponse)(nil), // 5: management.v1.AddAzureDatabaseResponse nil, // 6: management.v1.AddAzureDatabaseRequest.CustomLabelsEntry + (*durationpb.Duration)(nil), // 7: google.protobuf.Duration } ) @@ -720,11 +732,12 @@ var file_management_v1_azure_proto_depIdxs = []int32{ 2, // 1: management.v1.DiscoverAzureDatabaseResponse.azure_database_instance:type_name -> management.v1.DiscoverAzureDatabaseInstance 6, // 2: management.v1.AddAzureDatabaseRequest.custom_labels:type_name -> management.v1.AddAzureDatabaseRequest.CustomLabelsEntry 0, // 3: management.v1.AddAzureDatabaseRequest.type:type_name -> management.v1.DiscoverAzureDatabaseType - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 7, // 4: management.v1.AddAzureDatabaseRequest.connection_timeout:type_name -> google.protobuf.Duration + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_management_v1_azure_proto_init() } diff --git a/api/management/v1/azure.pb.validate.go b/api/management/v1/azure.pb.validate.go index 6d5787b2687..77c7d042509 100644 --- a/api/management/v1/azure.pb.validate.go +++ b/api/management/v1/azure.pb.validate.go @@ -604,6 +604,36 @@ func (m *AddAzureDatabaseRequest) validate(all bool) error { // no validation rules for Type + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddAzureDatabaseRequestValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddAzureDatabaseRequestValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddAzureDatabaseRequestMultiError(errors) } diff --git a/api/management/v1/azure.proto b/api/management/v1/azure.proto index a49d2f8615f..3aa0c139e49 100644 --- a/api/management/v1/azure.proto +++ b/api/management/v1/azure.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "validate/validate.proto"; // DiscoverAzureDatabaseRequest discover azure databases request. @@ -125,6 +126,10 @@ message AddAzureDatabaseRequest { int32 tablestats_group_table_limit = 24; // Azure database resource type (mysql, maria, postgres) DiscoverAzureDatabaseType type = 25; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 26 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message AddAzureDatabaseResponse {} diff --git a/api/management/v1/json/client/management_service/add_azure_database_responses.go b/api/management/v1/json/client/management_service/add_azure_database_responses.go index 947f66d7e84..146d4ebb4f9 100644 --- a/api/management/v1/json/client/management_service/add_azure_database_responses.go +++ b/api/management/v1/json/client/management_service/add_azure_database_responses.go @@ -272,6 +272,9 @@ type AddAzureDatabaseBody struct { // - DISCOVER_AZURE_DATABASE_TYPE_POSTGRESQL: PostgreSQL type: microsoft.dbformysql // Enum: ["DISCOVER_AZURE_DATABASE_TYPE_UNSPECIFIED","DISCOVER_AZURE_DATABASE_TYPE_MYSQL","DISCOVER_AZURE_DATABASE_TYPE_POSTGRESQL"] Type *string `json:"type,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add azure database body diff --git a/api/management/v1/json/client/management_service/add_service_responses.go b/api/management/v1/json/client/management_service/add_service_responses.go index 40d004ff770..14d6b0c504e 100644 --- a/api/management/v1/json/client/management_service/add_service_responses.go +++ b/api/management/v1/json/client/management_service/add_service_responses.go @@ -2794,6 +2794,9 @@ type AddServiceOKBodyMongodbMongodbExporter struct { // Environment variable names passed to the exporter. EnvironmentVariableNames []string `json:"environment_variable_names"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyMongodbMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -4211,6 +4214,9 @@ type AddServiceOKBodyMysqlMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyMysqlMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -5350,6 +5356,9 @@ type AddServiceOKBodyPostgresqlPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyPostgresqlPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -6337,6 +6346,9 @@ type AddServiceOKBodyProxysqlProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyProxysqlProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -7335,6 +7347,9 @@ type AddServiceOKBodyRDSMysqldExporter struct { // Extra DSN parameters for MySQL connection. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyRDSMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -7799,6 +7814,9 @@ type AddServiceOKBodyRDSPostgresqlExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyRDSPostgresqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -9107,6 +9125,9 @@ type AddServiceOKBodyValkeyValkeyExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // metrics resolutions MetricsResolutions *AddServiceOKBodyValkeyValkeyExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } @@ -10110,6 +10131,9 @@ type AddServiceParamsBodyMongodb struct { // If true, adds Real-Time Analytics agent for the provided service. RtaMongodbAgent bool `json:"rta_mongodb_agent,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // add node AddNode *AddServiceParamsBodyMongodbAddNode `json:"add_node,omitempty"` } @@ -10559,6 +10583,9 @@ type AddServiceParamsBodyMysql struct { // extra DSN parameters to be used for connecting to MySQL. ExtraDsnParams map[string]string `json:"extra_dsn_params,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // add node AddNode *AddServiceParamsBodyMysqlAddNode `json:"add_node,omitempty"` } @@ -11004,6 +11031,9 @@ type AddServiceParamsBodyPostgresql struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // add node AddNode *AddServiceParamsBodyPostgresqlAddNode `json:"add_node,omitempty"` } @@ -11416,6 +11446,9 @@ type AddServiceParamsBodyProxysql struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // add node AddNode *AddServiceParamsBodyProxysqlAddNode `json:"add_node,omitempty"` } @@ -11861,6 +11894,9 @@ type AddServiceParamsBodyRDS struct { // Maximum number of exporter connections to PostgreSQL instance. MaxPostgresqlExporterConnections int32 `json:"max_postgresql_exporter_connections,omitempty"` + + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` } // Validate validates this add service params body RDS @@ -12080,6 +12116,9 @@ type AddServiceParamsBodyValkey struct { // Custom password for exporter endpoint /metrics. AgentPassword string `json:"agent_password,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // add node AddNode *AddServiceParamsBodyValkeyAddNode `json:"add_node,omitempty"` } diff --git a/api/management/v1/json/client/management_service/list_agents_responses.go b/api/management/v1/json/client/management_service/list_agents_responses.go index 2da78ec1324..d2fa4d5f15a 100644 --- a/api/management/v1/json/client/management_service/list_agents_responses.go +++ b/api/management/v1/json/client/management_service/list_agents_responses.go @@ -650,6 +650,9 @@ type ListAgentsOKBodyAgentsItems0 struct { // valkey options ValkeyOptions any `json:"valkey_options,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // azure options AzureOptions *ListAgentsOKBodyAgentsItems0AzureOptions `json:"azure_options,omitempty"` diff --git a/api/management/v1/json/client/management_service/list_services_responses.go b/api/management/v1/json/client/management_service/list_services_responses.go index d9fcccd96b2..eda5dcfb6a3 100644 --- a/api/management/v1/json/client/management_service/list_services_responses.go +++ b/api/management/v1/json/client/management_service/list_services_responses.go @@ -910,6 +910,9 @@ type ListServicesOKBodyServicesItems0AgentsItems0 struct { // valkey options ValkeyOptions any `json:"valkey_options,omitempty"` + // Connection timeout for exporter (if set). + ConnectionTimeout string `json:"connection_timeout,omitempty"` + // azure options AzureOptions *ListServicesOKBodyServicesItems0AgentsItems0AzureOptions `json:"azure_options,omitempty"` diff --git a/api/management/v1/json/v1.json b/api/management/v1/json/v1.json index 77060c656b4..98e5b993d75 100644 --- a/api/management/v1/json/v1.json +++ b/api/management/v1/json/v1.json @@ -385,6 +385,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -1939,6 +1944,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -2276,6 +2286,11 @@ "type": "string" }, "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 0 @@ -2552,6 +2567,11 @@ "description": "If true, adds Real-Time Analytics agent for the provided service.", "type": "boolean", "x-order": 34 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 35 } }, "x-order": 1 @@ -2813,6 +2833,11 @@ "type": "integer", "format": "int32", "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 2 @@ -3016,6 +3041,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -3551,6 +3581,11 @@ "type": "integer", "format": "int32", "x-order": 33 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 34 } }, "x-order": 6 @@ -3761,6 +3796,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 23 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 24 } }, "x-order": 7 @@ -4020,6 +4060,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -4513,6 +4558,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 1 @@ -5017,6 +5067,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 1 @@ -5425,6 +5480,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 1 @@ -6188,6 +6248,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -6534,6 +6599,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 6 @@ -6820,6 +6890,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 1 @@ -7015,6 +7090,11 @@ "DISCOVER_AZURE_DATABASE_TYPE_POSTGRESQL" ], "x-order": 24 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 25 } } } diff --git a/api/management/v1/mongodb.pb.go b/api/management/v1/mongodb.pb.go index c3fa68b39f4..b24e9707277 100644 --- a/api/management/v1/mongodb.pb.go +++ b/api/management/v1/mongodb.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -110,8 +111,10 @@ type AddMongoDBServiceParams struct { EnvironmentVariableNames []string `protobuf:"bytes,36,rep,name=environment_variable_names,json=environmentVariableNames,proto3" json:"environment_variable_names,omitempty"` // If true, adds Real-Time Analytics agent for the provided service. RtaMongodbAgent bool `protobuf:"varint,37,opt,name=rta_mongodb_agent,json=rtaMongodbAgent,proto3" json:"rta_mongodb_agent,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,38,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddMongoDBServiceParams) Reset() { @@ -389,6 +392,13 @@ func (x *AddMongoDBServiceParams) GetRtaMongodbAgent() bool { return false } +func (x *AddMongoDBServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type MongoDBServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Service *v1.MongoDBService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` @@ -469,7 +479,7 @@ var File_management_v1_mongodb_proto protoreflect.FileDescriptor const file_management_v1_mongodb_proto_rawDesc = "" + "\n" + - "\x1bmanagement/v1/mongodb.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\x85\r\n" + + "\x1bmanagement/v1/mongodb.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xd9\r\n" + "\x17AddMongoDBServiceParams\x12\x17\n" + "\anode_id\x18\x01 \x01(\tR\x06nodeId\x12\x1b\n" + "\tnode_name\x18\x02 \x01(\tR\bnodeName\x127\n" + @@ -507,7 +517,8 @@ const file_management_v1_mongodb_proto_rawDesc = "" + "\tlog_level\x18! \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18\" \x01(\bR\x0eexposeExporter\x12<\n" + "\x1aenvironment_variable_names\x18$ \x03(\tR\x18environmentVariableNames\x12*\n" + - "\x11rta_mongodb_agent\x18% \x01(\bR\x0frtaMongodbAgent\x1a?\n" + + "\x11rta_mongodb_agent\x18% \x01(\bR\x0frtaMongodbAgent\x12R\n" + + "\x12connection_timeout\x18& \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01J\x04\b\b\x10\tR\x17query_examples_disabled\"\x95\x03\n" + @@ -540,11 +551,12 @@ var ( (*AddNodeParams)(nil), // 3: management.v1.AddNodeParams (MetricsMode)(0), // 4: management.v1.MetricsMode (v1.LogLevel)(0), // 5: inventory.v1.LogLevel - (*v1.MongoDBService)(nil), // 6: inventory.v1.MongoDBService - (*v1.MongoDBExporter)(nil), // 7: inventory.v1.MongoDBExporter - (*v1.QANMongoDBProfilerAgent)(nil), // 8: inventory.v1.QANMongoDBProfilerAgent - (*v1.QANMongoDBMongologAgent)(nil), // 9: inventory.v1.QANMongoDBMongologAgent - (*v1.RTAMongoDBAgent)(nil), // 10: inventory.v1.RTAMongoDBAgent + (*durationpb.Duration)(nil), // 6: google.protobuf.Duration + (*v1.MongoDBService)(nil), // 7: inventory.v1.MongoDBService + (*v1.MongoDBExporter)(nil), // 8: inventory.v1.MongoDBExporter + (*v1.QANMongoDBProfilerAgent)(nil), // 9: inventory.v1.QANMongoDBProfilerAgent + (*v1.QANMongoDBMongologAgent)(nil), // 10: inventory.v1.QANMongoDBMongologAgent + (*v1.RTAMongoDBAgent)(nil), // 11: inventory.v1.RTAMongoDBAgent } ) @@ -553,16 +565,17 @@ var file_management_v1_mongodb_proto_depIdxs = []int32{ 2, // 1: management.v1.AddMongoDBServiceParams.custom_labels:type_name -> management.v1.AddMongoDBServiceParams.CustomLabelsEntry 4, // 2: management.v1.AddMongoDBServiceParams.metrics_mode:type_name -> management.v1.MetricsMode 5, // 3: management.v1.AddMongoDBServiceParams.log_level:type_name -> inventory.v1.LogLevel - 6, // 4: management.v1.MongoDBServiceResult.service:type_name -> inventory.v1.MongoDBService - 7, // 5: management.v1.MongoDBServiceResult.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter - 8, // 6: management.v1.MongoDBServiceResult.qan_mongodb_profiler:type_name -> inventory.v1.QANMongoDBProfilerAgent - 9, // 7: management.v1.MongoDBServiceResult.qan_mongodb_mongolog:type_name -> inventory.v1.QANMongoDBMongologAgent - 10, // 8: management.v1.MongoDBServiceResult.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 6, // 4: management.v1.AddMongoDBServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 7, // 5: management.v1.MongoDBServiceResult.service:type_name -> inventory.v1.MongoDBService + 8, // 6: management.v1.MongoDBServiceResult.mongodb_exporter:type_name -> inventory.v1.MongoDBExporter + 9, // 7: management.v1.MongoDBServiceResult.qan_mongodb_profiler:type_name -> inventory.v1.QANMongoDBProfilerAgent + 10, // 8: management.v1.MongoDBServiceResult.qan_mongodb_mongolog:type_name -> inventory.v1.QANMongoDBMongologAgent + 11, // 9: management.v1.MongoDBServiceResult.rta_mongodb_agent:type_name -> inventory.v1.RTAMongoDBAgent + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_management_v1_mongodb_proto_init() } diff --git a/api/management/v1/mongodb.pb.validate.go b/api/management/v1/mongodb.pb.validate.go index 3a2ef1fc711..7059a5d79b4 100644 --- a/api/management/v1/mongodb.pb.validate.go +++ b/api/management/v1/mongodb.pb.validate.go @@ -170,6 +170,36 @@ func (m *AddMongoDBServiceParams) validate(all bool) error { // no validation rules for RtaMongodbAgent + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddMongoDBServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddMongoDBServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddMongoDBServiceParamsMultiError(errors) } diff --git a/api/management/v1/mongodb.proto b/api/management/v1/mongodb.proto index a79a1f8dced..b085b3fbf0a 100644 --- a/api/management/v1/mongodb.proto +++ b/api/management/v1/mongodb.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; import "inventory/v1/services.proto"; @@ -98,6 +99,10 @@ message AddMongoDBServiceParams { repeated string environment_variable_names = 36; // If true, adds Real-Time Analytics agent for the provided service. bool rta_mongodb_agent = 37; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 38 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message MongoDBServiceResult { diff --git a/api/management/v1/mysql.pb.go b/api/management/v1/mysql.pb.go index 21ef04e2f23..a2c184a89f1 100644 --- a/api/management/v1/mysql.pb.go +++ b/api/management/v1/mysql.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -106,8 +107,10 @@ type AddMySQLServiceParams struct { ExposeExporter bool `protobuf:"varint,32,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // extra DSN parameters to be used for connecting to MySQL. ExtraDsnParams map[string]string `protobuf:"bytes,33,rep,name=extra_dsn_params,json=extraDsnParams,proto3" json:"extra_dsn_params,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,34,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddMySQLServiceParams) Reset() { @@ -371,6 +374,13 @@ func (x *AddMySQLServiceParams) GetExtraDsnParams() map[string]string { return nil } +func (x *AddMySQLServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type MySQLServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Service *v1.MySQLService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` @@ -452,7 +462,7 @@ var File_management_v1_mysql_proto protoreflect.FileDescriptor const file_management_v1_mysql_proto_rawDesc = "" + "\n" + - "\x19management/v1/mysql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xb6\f\n" + + "\x19management/v1/mysql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\x8a\r\n" + "\x15AddMySQLServiceParams\x12\x17\n" + "\anode_id\x18\x01 \x01(\tR\x06nodeId\x12\x1b\n" + "\tnode_name\x18\x02 \x01(\tR\bnodeName\x127\n" + @@ -488,7 +498,8 @@ const file_management_v1_mysql_proto_rawDesc = "" + "\x0eagent_password\x18\x1e \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x123\n" + "\tlog_level\x18\x1f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + "\x0fexpose_exporter\x18 \x01(\bR\x0eexposeExporter\x12b\n" + - "\x10extra_dsn_params\x18! \x03(\v28.management.v1.AddMySQLServiceParams.ExtraDsnParamsEntryR\x0eextraDsnParams\x1a?\n" + + "\x10extra_dsn_params\x18! \x03(\v28.management.v1.AddMySQLServiceParams.ExtraDsnParamsEntryR\x0eextraDsnParams\x12R\n" + + "\x12connection_timeout\x18\" \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aA\n" + @@ -527,10 +538,11 @@ var ( (*AddNodeParams)(nil), // 4: management.v1.AddNodeParams (MetricsMode)(0), // 5: management.v1.MetricsMode (v1.LogLevel)(0), // 6: inventory.v1.LogLevel - (*v1.MySQLService)(nil), // 7: inventory.v1.MySQLService - (*v1.MySQLdExporter)(nil), // 8: inventory.v1.MySQLdExporter - (*v1.QANMySQLPerfSchemaAgent)(nil), // 9: inventory.v1.QANMySQLPerfSchemaAgent - (*v1.QANMySQLSlowlogAgent)(nil), // 10: inventory.v1.QANMySQLSlowlogAgent + (*durationpb.Duration)(nil), // 7: google.protobuf.Duration + (*v1.MySQLService)(nil), // 8: inventory.v1.MySQLService + (*v1.MySQLdExporter)(nil), // 9: inventory.v1.MySQLdExporter + (*v1.QANMySQLPerfSchemaAgent)(nil), // 10: inventory.v1.QANMySQLPerfSchemaAgent + (*v1.QANMySQLSlowlogAgent)(nil), // 11: inventory.v1.QANMySQLSlowlogAgent } ) @@ -540,15 +552,16 @@ var file_management_v1_mysql_proto_depIdxs = []int32{ 5, // 2: management.v1.AddMySQLServiceParams.metrics_mode:type_name -> management.v1.MetricsMode 6, // 3: management.v1.AddMySQLServiceParams.log_level:type_name -> inventory.v1.LogLevel 3, // 4: management.v1.AddMySQLServiceParams.extra_dsn_params:type_name -> management.v1.AddMySQLServiceParams.ExtraDsnParamsEntry - 7, // 5: management.v1.MySQLServiceResult.service:type_name -> inventory.v1.MySQLService - 8, // 6: management.v1.MySQLServiceResult.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 9, // 7: management.v1.MySQLServiceResult.qan_mysql_perfschema:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 10, // 8: management.v1.MySQLServiceResult.qan_mysql_slowlog:type_name -> inventory.v1.QANMySQLSlowlogAgent - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 7, // 5: management.v1.AddMySQLServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 8, // 6: management.v1.MySQLServiceResult.service:type_name -> inventory.v1.MySQLService + 9, // 7: management.v1.MySQLServiceResult.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 10, // 8: management.v1.MySQLServiceResult.qan_mysql_perfschema:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 11, // 9: management.v1.MySQLServiceResult.qan_mysql_slowlog:type_name -> inventory.v1.QANMySQLSlowlogAgent + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_management_v1_mysql_proto_init() } diff --git a/api/management/v1/mysql.pb.validate.go b/api/management/v1/mysql.pb.validate.go index da50d9a1db8..76aa04485db 100644 --- a/api/management/v1/mysql.pb.validate.go +++ b/api/management/v1/mysql.pb.validate.go @@ -179,6 +179,36 @@ func (m *AddMySQLServiceParams) validate(all bool) error { // no validation rules for ExtraDsnParams + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddMySQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddMySQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddMySQLServiceParamsMultiError(errors) } diff --git a/api/management/v1/mysql.proto b/api/management/v1/mysql.proto index cb8010b44cf..668fe4e970a 100644 --- a/api/management/v1/mysql.proto +++ b/api/management/v1/mysql.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; import "inventory/v1/services.proto"; @@ -94,6 +95,10 @@ message AddMySQLServiceParams { bool expose_exporter = 32; // extra DSN parameters to be used for connecting to MySQL. map extra_dsn_params = 33; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 34 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message MySQLServiceResult { diff --git a/api/management/v1/postgresql.pb.go b/api/management/v1/postgresql.pb.go index e1d675bd070..9c86074932f 100644 --- a/api/management/v1/postgresql.pb.go +++ b/api/management/v1/postgresql.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -102,8 +103,10 @@ type AddPostgreSQLServiceParams struct { ExposeExporter bool `protobuf:"varint,32,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `protobuf:"varint,33,opt,name=max_exporter_connections,json=maxExporterConnections,proto3" json:"max_exporter_connections,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,34,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddPostgreSQLServiceParams) Reset() { @@ -367,6 +370,13 @@ func (x *AddPostgreSQLServiceParams) GetMaxExporterConnections() int32 { return 0 } +func (x *AddPostgreSQLServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type PostgreSQLServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Service *v1.PostgreSQLService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` @@ -448,7 +458,7 @@ var File_management_v1_postgresql_proto protoreflect.FileDescriptor const file_management_v1_postgresql_proto_rawDesc = "" + "\n" + - "\x1emanagement/v1/postgresql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xe7\v\n" + + "\x1emanagement/v1/postgresql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xbb\f\n" + "\x1aAddPostgreSQLServiceParams\x12\x17\n" + "\anode_id\x18\x01 \x01(\tR\x06nodeId\x12\x1b\n" + "\tnode_name\x18\x02 \x01(\tR\bnodeName\x127\n" + @@ -484,7 +494,8 @@ const file_management_v1_postgresql_proto_rawDesc = "" + "\tlog_level\x18\x1e \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x120\n" + "\x14auto_discovery_limit\x18\x1f \x01(\x05R\x12autoDiscoveryLimit\x12'\n" + "\x0fexpose_exporter\x18 \x01(\bR\x0eexposeExporter\x128\n" + - "\x18max_exporter_connections\x18! \x01(\x05R\x16maxExporterConnections\x1a?\n" + + "\x18max_exporter_connections\x18! \x01(\x05R\x16maxExporterConnections\x12R\n" + + "\x12connection_timeout\x18\" \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb0\x03\n" + @@ -517,27 +528,29 @@ var ( (*AddNodeParams)(nil), // 3: management.v1.AddNodeParams (MetricsMode)(0), // 4: management.v1.MetricsMode (v1.LogLevel)(0), // 5: inventory.v1.LogLevel - (*v1.PostgreSQLService)(nil), // 6: inventory.v1.PostgreSQLService - (*v1.PostgresExporter)(nil), // 7: inventory.v1.PostgresExporter - (*v1.QANPostgreSQLPgStatementsAgent)(nil), // 8: inventory.v1.QANPostgreSQLPgStatementsAgent - (*v1.QANPostgreSQLPgStatMonitorAgent)(nil), // 9: inventory.v1.QANPostgreSQLPgStatMonitorAgent + (*durationpb.Duration)(nil), // 6: google.protobuf.Duration + (*v1.PostgreSQLService)(nil), // 7: inventory.v1.PostgreSQLService + (*v1.PostgresExporter)(nil), // 8: inventory.v1.PostgresExporter + (*v1.QANPostgreSQLPgStatementsAgent)(nil), // 9: inventory.v1.QANPostgreSQLPgStatementsAgent + (*v1.QANPostgreSQLPgStatMonitorAgent)(nil), // 10: inventory.v1.QANPostgreSQLPgStatMonitorAgent } ) var file_management_v1_postgresql_proto_depIdxs = []int32{ - 3, // 0: management.v1.AddPostgreSQLServiceParams.add_node:type_name -> management.v1.AddNodeParams - 2, // 1: management.v1.AddPostgreSQLServiceParams.custom_labels:type_name -> management.v1.AddPostgreSQLServiceParams.CustomLabelsEntry - 4, // 2: management.v1.AddPostgreSQLServiceParams.metrics_mode:type_name -> management.v1.MetricsMode - 5, // 3: management.v1.AddPostgreSQLServiceParams.log_level:type_name -> inventory.v1.LogLevel - 6, // 4: management.v1.PostgreSQLServiceResult.service:type_name -> inventory.v1.PostgreSQLService - 7, // 5: management.v1.PostgreSQLServiceResult.postgres_exporter:type_name -> inventory.v1.PostgresExporter - 8, // 6: management.v1.PostgreSQLServiceResult.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 9, // 7: management.v1.PostgreSQLServiceResult.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 3, // 0: management.v1.AddPostgreSQLServiceParams.add_node:type_name -> management.v1.AddNodeParams + 2, // 1: management.v1.AddPostgreSQLServiceParams.custom_labels:type_name -> management.v1.AddPostgreSQLServiceParams.CustomLabelsEntry + 4, // 2: management.v1.AddPostgreSQLServiceParams.metrics_mode:type_name -> management.v1.MetricsMode + 5, // 3: management.v1.AddPostgreSQLServiceParams.log_level:type_name -> inventory.v1.LogLevel + 6, // 4: management.v1.AddPostgreSQLServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 7, // 5: management.v1.PostgreSQLServiceResult.service:type_name -> inventory.v1.PostgreSQLService + 8, // 6: management.v1.PostgreSQLServiceResult.postgres_exporter:type_name -> inventory.v1.PostgresExporter + 9, // 7: management.v1.PostgreSQLServiceResult.qan_postgresql_pgstatements_agent:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 10, // 8: management.v1.PostgreSQLServiceResult.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.v1.QANPostgreSQLPgStatMonitorAgent + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_management_v1_postgresql_proto_init() } diff --git a/api/management/v1/postgresql.pb.validate.go b/api/management/v1/postgresql.pb.validate.go index bb9a930bb42..45a90559cab 100644 --- a/api/management/v1/postgresql.pb.validate.go +++ b/api/management/v1/postgresql.pb.validate.go @@ -179,6 +179,36 @@ func (m *AddPostgreSQLServiceParams) validate(all bool) error { // no validation rules for MaxExporterConnections + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddPostgreSQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddPostgreSQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddPostgreSQLServiceParamsMultiError(errors) } diff --git a/api/management/v1/postgresql.proto b/api/management/v1/postgresql.proto index 27b532f8a0e..6f9c47770f4 100644 --- a/api/management/v1/postgresql.proto +++ b/api/management/v1/postgresql.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; import "inventory/v1/services.proto"; @@ -90,6 +91,10 @@ message AddPostgreSQLServiceParams { bool expose_exporter = 32; // Maximum number of connections that exporter can open to the database instance. int32 max_exporter_connections = 33; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 34 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message PostgreSQLServiceResult { diff --git a/api/management/v1/proxysql.pb.go b/api/management/v1/proxysql.pb.go index 4fb7c555edd..8fe9e495fe4 100644 --- a/api/management/v1/proxysql.pb.go +++ b/api/management/v1/proxysql.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -80,8 +81,10 @@ type AddProxySQLServiceParams struct { LogLevel v1.LogLevel `protobuf:"varint,22,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,23,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,24,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddProxySQLServiceParams) Reset() { @@ -268,6 +271,13 @@ func (x *AddProxySQLServiceParams) GetExposeExporter() bool { return false } +func (x *AddProxySQLServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ProxySQLServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Service *v1.ProxySQLService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` @@ -324,7 +334,7 @@ var File_management_v1_proxysql_proto protoreflect.FileDescriptor const file_management_v1_proxysql_proto_rawDesc = "" + "\n" + - "\x1cmanagement/v1/proxysql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xde\a\n" + + "\x1cmanagement/v1/proxysql.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xb2\b\n" + "\x18AddProxySQLServiceParams\x12\x17\n" + "\anode_id\x18\x01 \x01(\tR\x06nodeId\x12\x1b\n" + "\tnode_name\x18\x02 \x01(\tR\bnodeName\x127\n" + @@ -349,7 +359,8 @@ const file_management_v1_proxysql_proto_rawDesc = "" + "\x12disable_collectors\x18\x14 \x03(\tR\x11disableCollectors\x12+\n" + "\x0eagent_password\x18\x15 \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x123\n" + "\tlog_level\x18\x16 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x12'\n" + - "\x0fexpose_exporter\x18\x17 \x01(\bR\x0eexposeExporter\x1a?\n" + + "\x0fexpose_exporter\x18\x17 \x01(\bR\x0eexposeExporter\x12R\n" + + "\x12connection_timeout\x18\x18 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x9d\x01\n" + @@ -379,8 +390,9 @@ var ( (*AddNodeParams)(nil), // 3: management.v1.AddNodeParams (MetricsMode)(0), // 4: management.v1.MetricsMode (v1.LogLevel)(0), // 5: inventory.v1.LogLevel - (*v1.ProxySQLService)(nil), // 6: inventory.v1.ProxySQLService - (*v1.ProxySQLExporter)(nil), // 7: inventory.v1.ProxySQLExporter + (*durationpb.Duration)(nil), // 6: google.protobuf.Duration + (*v1.ProxySQLService)(nil), // 7: inventory.v1.ProxySQLService + (*v1.ProxySQLExporter)(nil), // 8: inventory.v1.ProxySQLExporter } ) @@ -389,13 +401,14 @@ var file_management_v1_proxysql_proto_depIdxs = []int32{ 2, // 1: management.v1.AddProxySQLServiceParams.custom_labels:type_name -> management.v1.AddProxySQLServiceParams.CustomLabelsEntry 4, // 2: management.v1.AddProxySQLServiceParams.metrics_mode:type_name -> management.v1.MetricsMode 5, // 3: management.v1.AddProxySQLServiceParams.log_level:type_name -> inventory.v1.LogLevel - 6, // 4: management.v1.ProxySQLServiceResult.service:type_name -> inventory.v1.ProxySQLService - 7, // 5: management.v1.ProxySQLServiceResult.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 6, // 4: management.v1.AddProxySQLServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 7, // 5: management.v1.ProxySQLServiceResult.service:type_name -> inventory.v1.ProxySQLService + 8, // 6: management.v1.ProxySQLServiceResult.proxysql_exporter:type_name -> inventory.v1.ProxySQLExporter + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_management_v1_proxysql_proto_init() } diff --git a/api/management/v1/proxysql.pb.validate.go b/api/management/v1/proxysql.pb.validate.go index d9fea3aff85..431520f5b56 100644 --- a/api/management/v1/proxysql.pb.validate.go +++ b/api/management/v1/proxysql.pb.validate.go @@ -157,6 +157,36 @@ func (m *AddProxySQLServiceParams) validate(all bool) error { // no validation rules for ExposeExporter + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddProxySQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddProxySQLServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddProxySQLServiceParamsMultiError(errors) } diff --git a/api/management/v1/proxysql.proto b/api/management/v1/proxysql.proto index 0f809825c58..2cd72672e0f 100644 --- a/api/management/v1/proxysql.proto +++ b/api/management/v1/proxysql.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; import "inventory/v1/services.proto"; @@ -68,6 +69,10 @@ message AddProxySQLServiceParams { inventory.v1.LogLevel log_level = 22; // Optionally expose the exporter process on all public interfaces bool expose_exporter = 23; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 24 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ProxySQLServiceResult { diff --git a/api/management/v1/rds.pb.go b/api/management/v1/rds.pb.go index a1b60d935a5..ba9b65897d7 100644 --- a/api/management/v1/rds.pb.go +++ b/api/management/v1/rds.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -356,8 +357,10 @@ type AddRDSServiceParams struct { DisableCommentsParsing bool `protobuf:"varint,32,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Maximum number of exporter connections to PostgreSQL instance. MaxPostgresqlExporterConnections int32 `protobuf:"varint,33,opt,name=max_postgresql_exporter_connections,json=maxPostgresqlExporterConnections,proto3" json:"max_postgresql_exporter_connections,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,35,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddRDSServiceParams) Reset() { @@ -628,6 +631,13 @@ func (x *AddRDSServiceParams) GetMaxPostgresqlExporterConnections() int32 { return 0 } +func (x *AddRDSServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type RDSServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Node *v1.RemoteRDSNode `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` @@ -732,7 +742,7 @@ var File_management_v1_rds_proto protoreflect.FileDescriptor const file_management_v1_rds_proto_rawDesc = "" + "\n" + - "\x17management/v1/rds.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x18inventory/v1/nodes.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x17validate/validate.proto\"\x8c\x02\n" + + "\x17management/v1/rds.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x18inventory/v1/nodes.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x17validate/validate.proto\"\x8c\x02\n" + "\x13DiscoverRDSInstance\x12\x16\n" + "\x06region\x18\x01 \x01(\tR\x06region\x12\x0e\n" + "\x02az\x18\x02 \x01(\tR\x02az\x12\x1f\n" + @@ -748,7 +758,7 @@ const file_management_v1_rds_proto_rawDesc = "" + "\x0eaws_access_key\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01R\fawsAccessKey\x12*\n" + "\x0eaws_secret_key\x18\x02 \x01(\tB\x04\x88\xb5\x18\x01R\fawsSecretKey\"^\n" + "\x13DiscoverRDSResponse\x12G\n" + - "\rrds_instances\x18\x01 \x03(\v2\".management.v1.DiscoverRDSInstanceR\frdsInstances\"\xb6\f\n" + + "\rrds_instances\x18\x01 \x03(\v2\".management.v1.DiscoverRDSInstanceR\frdsInstances\"\x8a\r\n" + "\x13AddRDSServiceParams\x12\x1f\n" + "\x06region\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\x06region\x12\x0e\n" + "\x02az\x18\x02 \x01(\tR\x02az\x12(\n" + @@ -787,7 +797,8 @@ const file_management_v1_rds_proto_rawDesc = "" + "\bdatabase\x18\x1e \x01(\tR\bdatabase\x120\n" + "\x14auto_discovery_limit\x18\x1f \x01(\x05R\x12autoDiscoveryLimit\x128\n" + "\x18disable_comments_parsing\x18 \x01(\bR\x16disableCommentsParsing\x12M\n" + - "#max_postgresql_exporter_connections\x18! \x01(\x05R maxPostgresqlExporterConnections\x1a?\n" + + "#max_postgresql_exporter_connections\x18! \x01(\x05R maxPostgresqlExporterConnections\x12R\n" + + "\x12connection_timeout\x18# \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd3\x04\n" + @@ -832,14 +843,15 @@ var ( (*RDSServiceResult)(nil), // 5: management.v1.RDSServiceResult nil, // 6: management.v1.AddRDSServiceParams.CustomLabelsEntry (MetricsMode)(0), // 7: management.v1.MetricsMode - (*v1.RemoteRDSNode)(nil), // 8: inventory.v1.RemoteRDSNode - (*v1.RDSExporter)(nil), // 9: inventory.v1.RDSExporter - (*v1.MySQLService)(nil), // 10: inventory.v1.MySQLService - (*v1.MySQLdExporter)(nil), // 11: inventory.v1.MySQLdExporter - (*v1.QANMySQLPerfSchemaAgent)(nil), // 12: inventory.v1.QANMySQLPerfSchemaAgent - (*v1.PostgreSQLService)(nil), // 13: inventory.v1.PostgreSQLService - (*v1.PostgresExporter)(nil), // 14: inventory.v1.PostgresExporter - (*v1.QANPostgreSQLPgStatementsAgent)(nil), // 15: inventory.v1.QANPostgreSQLPgStatementsAgent + (*durationpb.Duration)(nil), // 8: google.protobuf.Duration + (*v1.RemoteRDSNode)(nil), // 9: inventory.v1.RemoteRDSNode + (*v1.RDSExporter)(nil), // 10: inventory.v1.RDSExporter + (*v1.MySQLService)(nil), // 11: inventory.v1.MySQLService + (*v1.MySQLdExporter)(nil), // 12: inventory.v1.MySQLdExporter + (*v1.QANMySQLPerfSchemaAgent)(nil), // 13: inventory.v1.QANMySQLPerfSchemaAgent + (*v1.PostgreSQLService)(nil), // 14: inventory.v1.PostgreSQLService + (*v1.PostgresExporter)(nil), // 15: inventory.v1.PostgresExporter + (*v1.QANPostgreSQLPgStatementsAgent)(nil), // 16: inventory.v1.QANPostgreSQLPgStatementsAgent } ) @@ -849,19 +861,20 @@ var file_management_v1_rds_proto_depIdxs = []int32{ 0, // 2: management.v1.AddRDSServiceParams.engine:type_name -> management.v1.DiscoverRDSEngine 6, // 3: management.v1.AddRDSServiceParams.custom_labels:type_name -> management.v1.AddRDSServiceParams.CustomLabelsEntry 7, // 4: management.v1.AddRDSServiceParams.metrics_mode:type_name -> management.v1.MetricsMode - 8, // 5: management.v1.RDSServiceResult.node:type_name -> inventory.v1.RemoteRDSNode - 9, // 6: management.v1.RDSServiceResult.rds_exporter:type_name -> inventory.v1.RDSExporter - 10, // 7: management.v1.RDSServiceResult.mysql:type_name -> inventory.v1.MySQLService - 11, // 8: management.v1.RDSServiceResult.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter - 12, // 9: management.v1.RDSServiceResult.qan_mysql_perfschema:type_name -> inventory.v1.QANMySQLPerfSchemaAgent - 13, // 10: management.v1.RDSServiceResult.postgresql:type_name -> inventory.v1.PostgreSQLService - 14, // 11: management.v1.RDSServiceResult.postgresql_exporter:type_name -> inventory.v1.PostgresExporter - 15, // 12: management.v1.RDSServiceResult.qan_postgresql_pgstatements:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 8, // 5: management.v1.AddRDSServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 9, // 6: management.v1.RDSServiceResult.node:type_name -> inventory.v1.RemoteRDSNode + 10, // 7: management.v1.RDSServiceResult.rds_exporter:type_name -> inventory.v1.RDSExporter + 11, // 8: management.v1.RDSServiceResult.mysql:type_name -> inventory.v1.MySQLService + 12, // 9: management.v1.RDSServiceResult.mysqld_exporter:type_name -> inventory.v1.MySQLdExporter + 13, // 10: management.v1.RDSServiceResult.qan_mysql_perfschema:type_name -> inventory.v1.QANMySQLPerfSchemaAgent + 14, // 11: management.v1.RDSServiceResult.postgresql:type_name -> inventory.v1.PostgreSQLService + 15, // 12: management.v1.RDSServiceResult.postgresql_exporter:type_name -> inventory.v1.PostgresExporter + 16, // 13: management.v1.RDSServiceResult.qan_postgresql_pgstatements:type_name -> inventory.v1.QANPostgreSQLPgStatementsAgent + 14, // [14:14] is the sub-list for method output_type + 14, // [14:14] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_management_v1_rds_proto_init() } diff --git a/api/management/v1/rds.pb.validate.go b/api/management/v1/rds.pb.validate.go index 920bb97dbf1..08d58fbca96 100644 --- a/api/management/v1/rds.pb.validate.go +++ b/api/management/v1/rds.pb.validate.go @@ -530,6 +530,36 @@ func (m *AddRDSServiceParams) validate(all bool) error { // no validation rules for MaxPostgresqlExporterConnections + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddRDSServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddRDSServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddRDSServiceParamsMultiError(errors) } diff --git a/api/management/v1/rds.proto b/api/management/v1/rds.proto index 5629a53528e..e8ab702e6de 100644 --- a/api/management/v1/rds.proto +++ b/api/management/v1/rds.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/nodes.proto"; import "inventory/v1/services.proto"; @@ -119,6 +120,10 @@ message AddRDSServiceParams { bool disable_comments_parsing = 32; // Maximum number of exporter connections to PostgreSQL instance. int32 max_postgresql_exporter_connections = 33; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 35 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message RDSServiceResult { diff --git a/api/management/v1/valkey.pb.go b/api/management/v1/valkey.pb.go index c958071fa68..b6eaef2be51 100644 --- a/api/management/v1/valkey.pb.go +++ b/api/management/v1/valkey.pb.go @@ -14,6 +14,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" _ "github.com/percona/pmm/api/extensions/v1" v1 "github.com/percona/pmm/api/inventory/v1" @@ -84,8 +85,10 @@ type AddValkeyServiceParams struct { TlsKey string `protobuf:"bytes,23,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` // Custom password for exporter endpoint /metrics. AgentPassword string `protobuf:"bytes,24,opt,name=agent_password,json=agentPassword,proto3" json:"agent_password,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Connection timeout for exporter (if set). + ConnectionTimeout *durationpb.Duration `protobuf:"bytes,25,opt,name=connection_timeout,json=connectionTimeout,proto3" json:"connection_timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddValkeyServiceParams) Reset() { @@ -286,6 +289,13 @@ func (x *AddValkeyServiceParams) GetAgentPassword() string { return "" } +func (x *AddValkeyServiceParams) GetConnectionTimeout() *durationpb.Duration { + if x != nil { + return x.ConnectionTimeout + } + return nil +} + type ValkeyServiceResult struct { state protoimpl.MessageState `protogen:"open.v1"` Service *v1.ValkeyService `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` @@ -342,7 +352,7 @@ var File_management_v1_valkey_proto protoreflect.FileDescriptor const file_management_v1_valkey_proto_rawDesc = "" + "\n" + - "\x1amanagement/v1/valkey.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\x87\b\n" + + "\x1amanagement/v1/valkey.proto\x12\rmanagement.v1\x1a\x1aextensions/v1/redact.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x19inventory/v1/agents.proto\x1a\x1cinventory/v1/log_level.proto\x1a\x1binventory/v1/services.proto\x1a\x1bmanagement/v1/metrics.proto\x1a\x18management/v1/node.proto\x1a\x17validate/validate.proto\"\xdb\b\n" + "\x16AddValkeyServiceParams\x12#\n" + "\anode_id\x18\x01 \x01(\tB\n" + "\xfaB\ar\x05\x10\x01\xd0\x01\x01R\x06nodeId\x12'\n" + @@ -371,7 +381,8 @@ const file_management_v1_valkey_proto_rawDesc = "" + "\x06tls_ca\x18\x15 \x01(\tR\x05tlsCa\x12\x19\n" + "\btls_cert\x18\x16 \x01(\tR\atlsCert\x12\x17\n" + "\atls_key\x18\x17 \x01(\tR\x06tlsKey\x12+\n" + - "\x0eagent_password\x18\x18 \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x1a?\n" + + "\x0eagent_password\x18\x18 \x01(\tB\x04\x88\xb5\x18\x01R\ragentPassword\x12R\n" + + "\x12connection_timeout\x18\x19 \x01(\v2\x19.google.protobuf.DurationB\b\xfaB\x05\xaa\x01\x022\x00R\x11connectionTimeout\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x93\x01\n" + @@ -401,8 +412,9 @@ var ( (*AddNodeParams)(nil), // 3: management.v1.AddNodeParams (MetricsMode)(0), // 4: management.v1.MetricsMode (v1.LogLevel)(0), // 5: inventory.v1.LogLevel - (*v1.ValkeyService)(nil), // 6: inventory.v1.ValkeyService - (*v1.ValkeyExporter)(nil), // 7: inventory.v1.ValkeyExporter + (*durationpb.Duration)(nil), // 6: google.protobuf.Duration + (*v1.ValkeyService)(nil), // 7: inventory.v1.ValkeyService + (*v1.ValkeyExporter)(nil), // 8: inventory.v1.ValkeyExporter } ) @@ -411,13 +423,14 @@ var file_management_v1_valkey_proto_depIdxs = []int32{ 2, // 1: management.v1.AddValkeyServiceParams.custom_labels:type_name -> management.v1.AddValkeyServiceParams.CustomLabelsEntry 4, // 2: management.v1.AddValkeyServiceParams.metrics_mode:type_name -> management.v1.MetricsMode 5, // 3: management.v1.AddValkeyServiceParams.log_level:type_name -> inventory.v1.LogLevel - 6, // 4: management.v1.ValkeyServiceResult.service:type_name -> inventory.v1.ValkeyService - 7, // 5: management.v1.ValkeyServiceResult.valkey_exporter:type_name -> inventory.v1.ValkeyExporter - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 6, // 4: management.v1.AddValkeyServiceParams.connection_timeout:type_name -> google.protobuf.Duration + 7, // 5: management.v1.ValkeyServiceResult.service:type_name -> inventory.v1.ValkeyService + 8, // 6: management.v1.ValkeyServiceResult.valkey_exporter:type_name -> inventory.v1.ValkeyExporter + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_management_v1_valkey_proto_init() } diff --git a/api/management/v1/valkey.pb.validate.go b/api/management/v1/valkey.pb.validate.go index 55268da8d34..ba03132cd36 100644 --- a/api/management/v1/valkey.pb.validate.go +++ b/api/management/v1/valkey.pb.validate.go @@ -176,6 +176,36 @@ func (m *AddValkeyServiceParams) validate(all bool) error { // no validation rules for AgentPassword + if d := m.GetConnectionTimeout(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = AddValkeyServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := AddValkeyServiceParamsValidationError{ + field: "ConnectionTimeout", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if len(errors) > 0 { return AddValkeyServiceParamsMultiError(errors) } diff --git a/api/management/v1/valkey.proto b/api/management/v1/valkey.proto index 3c09824dd96..9176bdac9ff 100644 --- a/api/management/v1/valkey.proto +++ b/api/management/v1/valkey.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package management.v1; import "extensions/v1/redact.proto"; +import "google/protobuf/duration.proto"; import "inventory/v1/agents.proto"; import "inventory/v1/log_level.proto"; import "inventory/v1/services.proto"; @@ -73,6 +74,10 @@ message AddValkeyServiceParams { string tls_key = 23; // Custom password for exporter endpoint /metrics. string agent_password = 24 [(extensions.v1.sensitive) = REDACT_TYPE_FULL]; + // Connection timeout for exporter (if set). + google.protobuf.Duration connection_timeout = 25 [(validate.rules).duration = { + gte: {seconds: 0} + }]; } message ValkeyServiceResult { diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 1ca1471e02b..0bc31d31651 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -5721,6 +5721,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } } }, @@ -5883,6 +5888,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } } }, @@ -6030,6 +6040,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } } }, @@ -6165,6 +6180,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } } }, @@ -7350,6 +7370,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } } }, @@ -7685,6 +7710,11 @@ "type": "string" }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 2 @@ -7824,6 +7854,11 @@ "description": "Enable all collectors.", "type": "boolean", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -7938,6 +7973,11 @@ "type": "integer", "format": "int32", "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -8025,6 +8065,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 12 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 13 } }, "x-order": 5 @@ -8922,6 +8967,11 @@ "LOG_LEVEL_DEBUG" ], "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 15 @@ -9347,6 +9397,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 2 @@ -9506,6 +9561,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 3 @@ -9650,6 +9710,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -9782,6 +9847,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 5 @@ -10886,6 +10956,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -11402,6 +11477,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -11561,6 +11641,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 4 @@ -11705,6 +11790,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 5 @@ -11837,6 +11927,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 6 @@ -12989,6 +13084,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 17 @@ -13370,6 +13470,11 @@ "type": "boolean", "x-nullable": true, "x-order": 16 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 17 } }, "x-order": 1 @@ -13542,6 +13647,11 @@ "type": "boolean", "x-nullable": true, "x-order": 20 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 21 } }, "x-order": 2 @@ -13695,6 +13805,11 @@ "format": "int32", "x-nullable": true, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -13810,6 +13925,11 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 12 } }, "x-order": 4 @@ -15036,6 +15156,11 @@ ], "x-nullable": true, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -15434,6 +15559,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -15593,6 +15723,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 2 @@ -15737,6 +15872,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -15869,6 +16009,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 4 @@ -17021,6 +17166,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -21606,6 +21756,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -23160,6 +23315,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -23497,6 +23657,11 @@ "type": "string" }, "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 0 @@ -23773,6 +23938,11 @@ "description": "If true, adds Real-Time Analytics agent for the provided service.", "type": "boolean", "x-order": 34 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 35 } }, "x-order": 1 @@ -24034,6 +24204,11 @@ "type": "integer", "format": "int32", "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 2 @@ -24237,6 +24412,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -24772,6 +24952,11 @@ "type": "integer", "format": "int32", "x-order": 33 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 34 } }, "x-order": 6 @@ -24982,6 +25167,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 23 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 24 } }, "x-order": 7 @@ -25241,6 +25431,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -25734,6 +25929,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 1 @@ -26238,6 +26438,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 1 @@ -26646,6 +26851,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 1 @@ -27409,6 +27619,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -27755,6 +27970,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 6 @@ -28041,6 +28261,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 1 @@ -28236,6 +28461,11 @@ "DISCOVER_AZURE_DATABASE_TYPE_POSTGRESQL" ], "x-order": 24 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 25 } } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 6650f3b8266..ae34b9296a5 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -4763,6 +4763,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } } }, @@ -4925,6 +4930,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } } }, @@ -5072,6 +5082,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } } }, @@ -5207,6 +5222,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } } }, @@ -6392,6 +6412,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } } }, @@ -6727,6 +6752,11 @@ "type": "string" }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 2 @@ -6866,6 +6896,11 @@ "description": "Enable all collectors.", "type": "boolean", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -6980,6 +7015,11 @@ "type": "integer", "format": "int32", "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -7067,6 +7107,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 12 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 13 } }, "x-order": 5 @@ -7964,6 +8009,11 @@ "LOG_LEVEL_DEBUG" ], "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 15 @@ -8389,6 +8439,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 2 @@ -8548,6 +8603,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 3 @@ -8692,6 +8752,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 4 @@ -8824,6 +8889,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 5 @@ -9928,6 +9998,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -10444,6 +10519,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -10603,6 +10683,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 4 @@ -10747,6 +10832,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 5 @@ -10879,6 +10969,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 6 @@ -12031,6 +12126,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 17 @@ -12412,6 +12512,11 @@ "type": "boolean", "x-nullable": true, "x-order": 16 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 17 } }, "x-order": 1 @@ -12584,6 +12689,11 @@ "type": "boolean", "x-nullable": true, "x-order": 20 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 21 } }, "x-order": 2 @@ -12737,6 +12847,11 @@ "format": "int32", "x-nullable": true, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -12852,6 +12967,11 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 12 } }, "x-order": 4 @@ -14078,6 +14198,11 @@ ], "x-nullable": true, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -14476,6 +14601,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -14635,6 +14765,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 2 @@ -14779,6 +14914,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 3 @@ -14911,6 +15051,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 4 @@ -16063,6 +16208,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 15 @@ -20648,6 +20798,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -22202,6 +22357,11 @@ } }, "x-order": 41 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 42 } } }, @@ -22539,6 +22699,11 @@ "type": "string" }, "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 0 @@ -22815,6 +22980,11 @@ "description": "If true, adds Real-Time Analytics agent for the provided service.", "type": "boolean", "x-order": 34 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 35 } }, "x-order": 1 @@ -23076,6 +23246,11 @@ "type": "integer", "format": "int32", "x-order": 32 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 33 } }, "x-order": 2 @@ -23279,6 +23454,11 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 21 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 22 } }, "x-order": 3 @@ -23814,6 +23994,11 @@ "type": "integer", "format": "int32", "x-order": 33 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 34 } }, "x-order": 6 @@ -24024,6 +24209,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 23 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 24 } }, "x-order": 7 @@ -24283,6 +24473,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 1 @@ -24776,6 +24971,11 @@ "type": "string" }, "x-order": 19 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 20 } }, "x-order": 1 @@ -25280,6 +25480,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 1 @@ -25688,6 +25893,11 @@ } }, "x-order": 15 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 16 } }, "x-order": 1 @@ -26451,6 +26661,11 @@ "type": "string" }, "x-order": 22 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 23 } }, "x-order": 3 @@ -26797,6 +27012,11 @@ } }, "x-order": 17 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 18 } }, "x-order": 6 @@ -27083,6 +27303,11 @@ } }, "x-order": 14 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 15 } }, "x-order": 1 @@ -27278,6 +27503,11 @@ "DISCOVER_AZURE_DATABASE_TYPE_POSTGRESQL" ], "x-order": 24 + }, + "connection_timeout": { + "description": "Connection timeout for exporter (if set).", + "type": "string", + "x-order": 25 } } } diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 8796bfa0b34..9294eb7bf5d 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -940,6 +940,11 @@ func CreateAgent(q *reform.Querier, agentType AgentType, params *CreateAgentPara } } + exporterOptions := params.ExporterOptions + if pointer.Get(exporterOptions.ConnectionTimeout) == 0 { + exporterOptions.ConnectionTimeout = nil + } + row := &Agent{ AgentID: id, AgentType: agentType, @@ -951,7 +956,7 @@ func CreateAgent(q *reform.Querier, agentType AgentType, params *CreateAgentPara AgentPassword: pointer.ToStringOrNil(params.AgentPassword), TLS: params.TLS, TLSSkipVerify: params.TLSSkipVerify, - ExporterOptions: params.ExporterOptions, + ExporterOptions: exporterOptions, QANOptions: params.QANOptions, AWSOptions: params.AWSOptions, AzureOptions: params.AzureOptions, @@ -1025,6 +1030,7 @@ type ChangeExporterOptions struct { MetricsScheme *string MetricsPath *string MetricsResolutions *ChangeMetricsResolutionsParams + ConnectionTimeout *time.Duration } // ChangeQANOptions contains QANOptions fields that can be changed. @@ -1185,6 +1191,12 @@ func ChangeAgent(q *reform.Querier, agentID string, params *ChangeAgentParams) ( if params.ExporterOptions.MetricsPath != nil { row.ExporterOptions.MetricsPath = *params.ExporterOptions.MetricsPath } + + if pointer.Get(params.ExporterOptions.ConnectionTimeout) == 0 { + row.ExporterOptions.ConnectionTimeout = nil + } else { + row.ExporterOptions.ConnectionTimeout = params.ExporterOptions.ConnectionTimeout + } } // Update database connection fields diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index 75840e8e8de..5a4cc7b28e6 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -51,11 +51,13 @@ const ( // AgentStatusUnknown indicates we know nothing about agent because it is not connected. AgentStatusUnknown = "AGENT_STATUS_UNKNOWN" // AgentStatusDone indicates thay the agent has either been stopped or disabled. - agentStatusDone = "AGENT_STATUS_DONE" - tcp = "tcp" - trueStr = "true" - unix = "unix" - skipVerify = "skip-verify" + agentStatusDone = "AGENT_STATUS_DONE" + tcp = "tcp" + trueStr = "true" + unix = "unix" + skipVerify = "skip-verify" + defaultDialTimeout = 2 * time.Second + valkeyDialTimeout = 3 * time.Second ) // Agent types (in the same order as in agents.proto). @@ -107,6 +109,8 @@ type ExporterOptions struct { MetricsResolutions *MetricsResolutions `json:"metrics_resolutions"` MetricsPath string `json:"metrics_path"` MetricsScheme string `json:"metrics_scheme"` + // Connection timeout for exporter. Optional. + ConnectionTimeout *time.Duration `json:"connection_timeout"` } // Value implements database/sql/driver.Valuer interface. Should be defined on the value. @@ -122,7 +126,8 @@ func (c ExporterOptions) IsEmpty() bool { len(c.DisabledCollectors) == 0 && c.MetricsResolutions == nil && c.MetricsPath == "" && - c.MetricsScheme == "" + c.MetricsScheme == "" && + pointer.Get(c.ConnectionTimeout) == 0 } // QANOptions represents structure for special QAN options. @@ -378,80 +383,80 @@ type Agent struct { } // BeforeInsert implements reform.BeforeInserter interface. -func (s *Agent) BeforeInsert() error { +func (a *Agent) BeforeInsert() error { now := Now() - s.CreatedAt = now - s.UpdatedAt = now - if len(s.CustomLabels) == 0 { - s.CustomLabels = nil + a.CreatedAt = now + a.UpdatedAt = now + if len(a.CustomLabels) == 0 { + a.CustomLabels = nil } - if len(s.EnvironmentVariables) == 0 { - s.EnvironmentVariables = nil + if len(a.EnvironmentVariables) == 0 { + a.EnvironmentVariables = nil } - if s.Status == "" && s.AgentType != PMMAgentType { - s.Status = AgentStatusUnknown + if a.Status == "" && a.AgentType != PMMAgentType { + a.Status = AgentStatusUnknown } - if s.Disabled { - s.Status = agentStatusDone + if a.Disabled { + a.Status = agentStatusDone } return nil } // BeforeUpdate implements reform.BeforeUpdater interface. -func (s *Agent) BeforeUpdate() error { - s.UpdatedAt = Now() - if len(s.CustomLabels) == 0 { - s.CustomLabels = nil +func (a *Agent) BeforeUpdate() error { + a.UpdatedAt = Now() + if len(a.CustomLabels) == 0 { + a.CustomLabels = nil } - if len(s.EnvironmentVariables) == 0 { - s.EnvironmentVariables = nil + if len(a.EnvironmentVariables) == 0 { + a.EnvironmentVariables = nil } - if s.Disabled { - s.Status = agentStatusDone + if a.Disabled { + a.Status = agentStatusDone } return nil } // AfterFind implements reform.AfterFinder interface. -func (s *Agent) AfterFind() error { - s.CreatedAt = s.CreatedAt.UTC() - s.UpdatedAt = s.UpdatedAt.UTC() - if len(s.CustomLabels) == 0 { - s.CustomLabels = nil +func (a *Agent) AfterFind() error { + a.CreatedAt = a.CreatedAt.UTC() + a.UpdatedAt = a.UpdatedAt.UTC() + if len(a.CustomLabels) == 0 { + a.CustomLabels = nil } - if len(s.EnvironmentVariables) == 0 { - s.EnvironmentVariables = nil + if len(a.EnvironmentVariables) == 0 { + a.EnvironmentVariables = nil } return nil } // GetCustomLabels decodes custom labels. -func (s *Agent) GetCustomLabels() (map[string]string, error) { - return getLabels(s.CustomLabels) +func (a *Agent) GetCustomLabels() (map[string]string, error) { + return getLabels(a.CustomLabels) } // SetCustomLabels encodes custom labels. -func (s *Agent) SetCustomLabels(m map[string]string) error { - return setLabels(m, &s.CustomLabels) +func (a *Agent) SetCustomLabels(m map[string]string) error { + return setLabels(m, &a.CustomLabels) } // GetEnvironmentVariableNames decodes shared environment variable names. -func (s *Agent) GetEnvironmentVariableNames() ([]string, error) { - if s.EnvironmentVariables == nil { +func (a *Agent) GetEnvironmentVariableNames() ([]string, error) { + if a.EnvironmentVariables == nil { return nil, nil } var names []string - if err := json.Unmarshal(s.EnvironmentVariables, &names); err != nil { + if err := json.Unmarshal(a.EnvironmentVariables, &names); err != nil { return nil, errors.Wrap(err, "failed to unmarshal shared environment variable names") } return names, nil } // SetEnvironmentVariableNames encodes shared environment variable names. -func (s *Agent) SetEnvironmentVariableNames(names []string) error { +func (a *Agent) SetEnvironmentVariableNames(names []string) error { if len(names) == 0 { - s.EnvironmentVariables = nil + a.EnvironmentVariables = nil return nil } @@ -459,30 +464,30 @@ func (s *Agent) SetEnvironmentVariableNames(names []string) error { if err != nil { return errors.Wrap(err, "failed to marshal shared environment variable names") } - s.EnvironmentVariables = b + a.EnvironmentVariables = b return nil } // GetAgentPassword returns agent password, if it is empty then agent ID. -func (s *Agent) GetAgentPassword() string { - password := s.AgentID - if pointer.GetString(s.AgentPassword) != "" { - password = *s.AgentPassword +func (a *Agent) GetAgentPassword() string { + password := a.AgentID + if pointer.GetString(a.AgentPassword) != "" { + password = *a.AgentPassword } return password } // UnifiedLabels returns combined standard and custom labels with empty labels removed. -func (s *Agent) UnifiedLabels() (map[string]string, error) { - custom, err := s.GetCustomLabels() +func (a *Agent) UnifiedLabels() (map[string]string, error) { + custom, err := a.GetCustomLabels() if err != nil { return nil, err } res := map[string]string{ - "agent_id": s.AgentID, - "agent_type": string(s.AgentType), + "agent_id": a.AgentID, + "agent_type": string(a.AgentType), } maps.Copy(res, custom) @@ -507,10 +512,10 @@ func (c *DBConfig) Valid() bool { } // DBConfig returns DBConfig for given Service with this agent. -func (s *Agent) DBConfig(service *Service) *DBConfig { +func (a *Agent) DBConfig(service *Service) *DBConfig { return &DBConfig{ - User: pointer.GetString(s.Username), - Password: pointer.GetString(s.Password), + User: pointer.GetString(a.Username), + Password: pointer.GetString(a.Password), Address: pointer.GetString(service.Address), Port: int(pointer.GetUint16(service.Port)), Socket: pointer.GetString(service.Socket), @@ -526,18 +531,18 @@ type DSNParams struct { } // DSN returns a DSN string for accessing a given Service with this Agent (and an implicit driver). -func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, pmmAgentVersion *version.Parsed) string { //nolint:cyclop,maintidx +func (a *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, pmmAgentVersion *version.Parsed) string { //nolint:cyclop,maintidx host := pointer.GetString(service.Address) port := pointer.GetUint16(service.Port) socket := pointer.GetString(service.Socket) - username := pointer.GetString(s.Username) - password := pointer.GetString(s.Password) + username := pointer.GetString(a.Username) + password := pointer.GetString(a.Password) if tdp == nil { - tdp = s.TemplateDelimiters(service) + tdp = a.TemplateDelimiters(service) } - switch s.AgentType { + switch a.AgentType { case MySQLdExporterType: cfg := mysql.NewConfig() cfg.User = username @@ -551,26 +556,26 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p cfg.Timeout = dsnParams.DialTimeout cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) - if s.TLS { + if a.TLS { // It is mandatory to have "custom" as the first case. // Except case for backward compatibility. // Skip verify for "custom" is handled on pmm-agent side. switch { // Backward compatibility - case s.TLSSkipVerify && (pmmAgentVersion == nil || pmmAgentVersion.Less(v2_42)): + case a.TLSSkipVerify && (pmmAgentVersion == nil || pmmAgentVersion.Less(v2_42)): cfg.Params["tls"] = skipVerify - case len(s.Files()) != 0: + case len(a.Files()) != 0: cfg.Params["tls"] = "custom" - case s.TLSSkipVerify: + case a.TLSSkipVerify: cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } } - if s.MySQLOptions.ExtraDSNParams != nil { + if a.MySQLOptions.ExtraDSNParams != nil { // Add extra DSN parameters if they are set. - for k, v := range s.MySQLOptions.ExtraDSNParams { + for k, v := range a.MySQLOptions.ExtraDSNParams { cfg.Params[k] = v } } @@ -593,26 +598,26 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p cfg.Timeout = dsnParams.DialTimeout cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) - if s.TLS { + if a.TLS { // It is mandatory to have "custom" as the first case. // Except case for backward compatibility. // Skip verify for "custom" is handled on pmm-agent side. switch { // Backward compatibility - case pmmAgentVersion != nil && s.TLSSkipVerify && pmmAgentVersion.Less(v2_42): + case pmmAgentVersion != nil && a.TLSSkipVerify && pmmAgentVersion.Less(v2_42): cfg.Params["tls"] = skipVerify - case len(s.Files()) != 0: + case len(a.Files()) != 0: cfg.Params["tls"] = "custom" - case s.TLSSkipVerify: + case a.TLSSkipVerify: cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } } - if s.MySQLOptions.ExtraDSNParams != nil { + if a.MySQLOptions.ExtraDSNParams != nil { // Add extra DSN parameters if they are set. - for k, v := range s.MySQLOptions.ExtraDSNParams { + for k, v := range a.MySQLOptions.ExtraDSNParams { cfg.Params[k] = v } } @@ -639,8 +644,8 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p cfg.Timeout = dsnParams.DialTimeout cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) - if s.TLS { - if s.TLSSkipVerify { + if a.TLS { + if a.TLSSkipVerify { cfg.Params["tls"] = "skip-verify" } else { cfg.Params["tls"] = trueStr @@ -672,27 +677,27 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p // prevents driver from switching to Primary node. q.Add("directConnection", trueStr) - if s.TLS { + if a.TLS { q.Add("ssl", trueStr) - if s.TLSSkipVerify { + if a.TLSSkipVerify { q.Add("tlsInsecure", trueStr) } } - if s.MongoDBOptions.TLSCertificateKey != "" { + if a.MongoDBOptions.TLSCertificateKey != "" { q.Add("tlsCertificateKeyFile", tdp.Left+".TextFiles."+certificateKeyFilePlaceholder+tdp.Right) } - if s.MongoDBOptions.TLSCertificateKeyFilePassword != "" { - q.Add("tlsCertificateKeyFilePassword", s.MongoDBOptions.TLSCertificateKeyFilePassword) + if a.MongoDBOptions.TLSCertificateKeyFilePassword != "" { + q.Add("tlsCertificateKeyFilePassword", a.MongoDBOptions.TLSCertificateKeyFilePassword) } - if s.MongoDBOptions.TLSCa != "" { + if a.MongoDBOptions.TLSCa != "" { q.Add("tlsCaFile", tdp.Left+".TextFiles."+caFilePlaceholder+tdp.Right) } - if s.MongoDBOptions.AuthenticationMechanism != "" { - q.Add("authMechanism", s.MongoDBOptions.AuthenticationMechanism) + if a.MongoDBOptions.AuthenticationMechanism != "" { + q.Add("authMechanism", a.MongoDBOptions.AuthenticationMechanism) } - if s.MongoDBOptions.AuthenticationDatabase != "" { - q.Add("authSource", s.MongoDBOptions.AuthenticationDatabase) + if a.MongoDBOptions.AuthenticationDatabase != "" { + q.Add("authSource", a.MongoDBOptions.AuthenticationDatabase) } address := socket @@ -721,8 +726,8 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p q := make(url.Values) sslmode := DisableSSLMode - if s.TLS { - if s.TLSSkipVerify { + if a.TLS { + if a.TLSSkipVerify { sslmode = RequireSSLMode } else { sslmode = VerifyCaSSLMode @@ -733,7 +738,7 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p } q.Set("sslmode", sslmode) - if files := s.Files(); len(files) != 0 { + if files := a.Files(); len(files) != 0 { for key := range files { switch key { case caFilePlaceholder: @@ -782,7 +787,7 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p case ValkeyExporterType: urlScheme := "redis" - if s.TLS { + if a.TLS { urlScheme += "s" } address := "" @@ -810,21 +815,41 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, p return dsn default: - panic(fmt.Errorf("unhandled AgentType %q", s.AgentType)) + panic(fmt.Errorf("unhandled AgentType %q", a.AgentType)) } } +// EffectiveDialTimeout returns the database connection timeout for DSN generation. +// Returns ExporterOptions.ConnectionTimeout if set, otherwise default based on agent type. +// +// Defaults: mysqld/mongodb/proxysql/postgres (2s), valkey (3s). +// +// Postgres on RDS/Azure uses 5s default but handled in postgresql.go (needs Node context). +// +// Exporters without DB connection (node, rds, azure, external) don't use this. +func (a *Agent) EffectiveDialTimeout() time.Duration { + if a.ExporterOptions.ConnectionTimeout != nil { + return *a.ExporterOptions.ConnectionTimeout + } + + if a.AgentType == ValkeyExporterType { + return valkeyDialTimeout + } + + return defaultDialTimeout +} + // ExporterURL composes URL to an external exporter. -func (s *Agent) ExporterURL(q *reform.Querier) (string, error) { - scheme := s.ExporterOptions.MetricsScheme - path := s.ExporterOptions.MetricsPath - listenPort := int(pointer.GetUint16(s.ListenPort)) - username := pointer.GetString(s.Username) - password := pointer.GetString(s.Password) +func (a *Agent) ExporterURL(q *reform.Querier) (string, error) { + scheme := a.ExporterOptions.MetricsScheme + path := a.ExporterOptions.MetricsPath + listenPort := int(pointer.GetUint16(a.ListenPort)) + username := pointer.GetString(a.Username) + password := pointer.GetString(a.Password) host := "127.0.0.1" - if !s.ExporterOptions.PushMetrics { - node, err := FindNodeByID(q, *s.RunsOnNodeID) + if !a.ExporterOptions.PushMetrics { + node, err := FindNodeByID(q, *a.RunsOnNodeID) if err != nil { return "", err } @@ -856,20 +881,20 @@ func (s *Agent) ExporterURL(q *reform.Querier) (string, error) { } // IsMySQLTablestatsGroupEnabled returns true if mysqld_exporter tablestats group collectors should be enabled. -func (s *Agent) IsMySQLTablestatsGroupEnabled() bool { - if s.AgentType != MySQLdExporterType { - panic(fmt.Errorf("unhandled AgentType %q", s.AgentType)) +func (a *Agent) IsMySQLTablestatsGroupEnabled() bool { + if a.AgentType != MySQLdExporterType { + panic(fmt.Errorf("unhandled AgentType %q", a.AgentType)) } switch { - case s.MySQLOptions.TableCountTablestatsGroupLimit == 0: // server defined + case a.MySQLOptions.TableCountTablestatsGroupLimit == 0: // server defined return true - case s.MySQLOptions.TableCountTablestatsGroupLimit < 0: // always disabled + case a.MySQLOptions.TableCountTablestatsGroupLimit < 0: // always disabled return false - case s.MySQLOptions.TableCount == nil: // for compatibility with 2.0 + case a.MySQLOptions.TableCount == nil: // for compatibility with 2.0 return true default: - return *s.MySQLOptions.TableCount <= s.MySQLOptions.TableCountTablestatsGroupLimit + return *a.MySQLOptions.TableCount <= a.MySQLOptions.TableCountTablestatsGroupLimit } } @@ -998,10 +1023,10 @@ const webConfigTemplate = `basic_auth_users: ` // BuildWebConfigFile builds prometheus-compatible basic auth configuration. -func (s *Agent) BuildWebConfigFile() (string, error) { +func (a *Agent) BuildWebConfigFile() (string, error) { // If not provided by the user, it is the `agent_id`. - password := s.GetAgentPassword() - salt := getPasswordSalt(s) + password := a.GetAgentPassword() + salt := getPasswordSalt(a) hashedPassword, err := HashPassword(password, salt) if err != nil { @@ -1022,9 +1047,9 @@ func (s *Agent) BuildWebConfigFile() (string, error) { return config, nil } -func getPasswordSalt(s *Agent) string { - if s.AgentID != "" && len(s.AgentID) >= bcrypt.MaxSaltSize { - return s.AgentID[len(s.AgentID)-bcrypt.MaxSaltSize:] +func getPasswordSalt(a *Agent) string { + if a.AgentID != "" && len(a.AgentID) >= bcrypt.MaxSaltSize { + return a.AgentID[len(a.AgentID)-bcrypt.MaxSaltSize:] } return "pmm-salt-magic--" diff --git a/managed/models/agent_model_test.go b/managed/models/agent_model_test.go index 7d0c7c7ca70..dd75842825d 100644 --- a/managed/models/agent_model_test.go +++ b/managed/models/agent_model_test.go @@ -22,7 +22,6 @@ import ( "time" "github.com/AlekSi/pointer" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -43,7 +42,7 @@ func TestAgent(t *testing.T) { "agent_id": "agent_id", "foo": "bar", } - assert.Equal(t, expected, actual) + require.Equal(t, expected, actual) }) t.Run("DSN", func(t *testing.T) { @@ -71,15 +70,15 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true", agent.DSN(service, models.DSNParams{}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true", agent.DSN(service, models.DSNParams{}, nil, nil)) }) }) @@ -102,7 +101,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } }) @@ -124,7 +123,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } }) @@ -171,7 +170,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -181,13 +180,13 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.TLSCertificateKeyFilePassword = "" agent.MongoDBOptions.AuthenticationMechanism = "" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", } - assert.Equal(t, expectedFiles, agent.Files()) + require.Equal(t, expectedFiles, agent.Files()) }) t.Run("MongoDB Auth Database", func(t *testing.T) { @@ -197,13 +196,13 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.AuthenticationMechanism = "MONGO-X509" agent.MongoDBOptions.AuthenticationDatabase = "$external" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", } - assert.Equal(t, expectedFiles, agent.Files()) + require.Equal(t, expectedFiles, agent.Files()) }) }) @@ -234,15 +233,15 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + require.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{}, nil, nil)) }) }) } @@ -274,13 +273,13 @@ func TestPostgresAgentTLS(t *testing.T) { t.Run(name, func(t *testing.T) { agent.TLS = testCase.tls agent.TLSSkipVerify = testCase.tlsSkipVerify - assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run(fmt.Sprintf("AutodiscoveryLimit set TLS:%v/TLSSkipVerify:%v", testCase.tls, testCase.tlsSkipVerify), func(t *testing.T) { agent.TLS = testCase.tls agent.TLSSkipVerify = testCase.tlsSkipVerify agent.PostgreSQLOptions = models.PostgreSQLOptions{AutoDiscoveryLimit: pointer.ToInt32(10)} - assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } } @@ -301,7 +300,7 @@ func TestValkey(t *testing.T) { expected := "redis://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345" - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("Valkey DSN with TLS", func(t *testing.T) { @@ -324,7 +323,7 @@ func TestValkey(t *testing.T) { expected := "rediss://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345" - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -342,7 +341,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString("/var/run/postgres"), } expect := "postgres://username@/database?connect_timeout=1&host=%2Fvar%2Frun%2Fpostgres&sslmode=verify-ca" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("empty-user-password", func(t *testing.T) { @@ -355,7 +354,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString("/var/run/postgres"), } expect := "postgres:///database?connect_timeout=1&host=%2Fvar%2Frun%2Fpostgres&sslmode=disable" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("dir-with-symbols", func(t *testing.T) { @@ -368,7 +367,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString(`/tmp/123\ A0m\%\$\@\8\,\+\-`), } expect := "postgres:///database?connect_timeout=1&host=%2Ftmp%2F123%5C+A0m%5C%25%5C%24%5C%40%5C8%5C%2C%5C%2B%5C-&sslmode=disable" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -386,7 +385,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString("/tmp/mongodb-27017.sock"), } expect := "mongodb://username@%2Ftmp%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("empty-user-password", func(t *testing.T) { @@ -399,7 +398,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString("/tmp/mongodb-27017.sock"), } expect := "mongodb://%2Ftmp%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("dir-with-symbols", func(t *testing.T) { @@ -412,7 +411,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString(`/tmp/123\ A0m\%\$\@\8\,\+\-/mongodb-27017.sock`), } expect := "mongodb://%2Ftmp%2F123%5C%20A0m%5C%25%5C$%5C%40%5C8%5C,%5C+%5C-%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) + require.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -444,7 +443,7 @@ func TestIsMySQLTablestatsGroupEnabled(t *testing.T) { TableCountTablestatsGroupLimit: testCase.limit, }, } - assert.Equal(t, testCase.expected, agent.IsMySQLTablestatsGroupEnabled()) + require.Equal(t, testCase.expected, agent.IsMySQLTablestatsGroupEnabled()) }) } } @@ -614,11 +613,82 @@ func TestExporterURL(t *testing.T) { } { t.Run(agentID, func(t *testing.T) { agent, err := models.FindAgentByID(q, agentID) - assert.NoError(t, err) + require.NoError(t, err) actual, err := agent.ExporterURL(q) - assert.NoError(t, err) - assert.Equal(t, expected, actual) + require.NoError(t, err) + require.Equal(t, expected, actual) }) } }) } + +func TestEffectiveDialTimeout(t *testing.T) { + t.Parallel() + + custom := 7 * time.Second + t.Run("explicit ExporterOptions.ConnectionTimeout", func(t *testing.T) { + t.Parallel() + a := &models.Agent{ + AgentType: models.QANMySQLPerfSchemaAgentType, + ExporterOptions: models.ExporterOptions{ + ConnectionTimeout: &custom, + }, + } + require.Equal(t, custom, a.EffectiveDialTimeout()) + }) + + t.Run("exporters with 2s default", func(t *testing.T) { + t.Parallel() + + for _, typ := range []models.AgentType{ + models.MySQLdExporterType, + models.MongoDBExporterType, + models.PostgresExporterType, + models.ProxySQLExporterType, + } { + t.Run(string(typ), func(t *testing.T) { + t.Parallel() + a := &models.Agent{AgentType: typ} + require.Equal(t, 2*time.Second, a.EffectiveDialTimeout()) + }) + } + }) + + t.Run("valkey_exporter returns 3s default", func(t *testing.T) { + t.Parallel() + a := &models.Agent{AgentType: models.ValkeyExporterType} + require.Equal(t, 3*time.Second, a.EffectiveDialTimeout()) + }) + + t.Run("non-exporter agent falls back to 2s", func(t *testing.T) { + t.Parallel() + a := &models.Agent{AgentType: models.QANMySQLPerfSchemaAgentType} + require.Equal(t, 2*time.Second, a.EffectiveDialTimeout()) + }) +} + +func TestExporterOptionsIsEmpty(t *testing.T) { + t.Parallel() + + t.Run("nil connection timeout is empty", func(t *testing.T) { + t.Parallel() + + require.True(t, (models.ExporterOptions{}).IsEmpty()) + }) + + t.Run("zero connection timeout is empty", func(t *testing.T) { + t.Parallel() + + require.True(t, (models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(0), + }).IsEmpty()) + }) + + t.Run("non-zero connection timeout is not empty", func(t *testing.T) { + t.Parallel() + + require.False(t, (models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(time.Second), + }).IsEmpty()) + }) +} diff --git a/managed/models/dsn_helpers.go b/managed/models/dsn_helpers.go index f49d47c90a0..9cd7b6c054a 100644 --- a/managed/models/dsn_helpers.go +++ b/managed/models/dsn_helpers.go @@ -89,6 +89,14 @@ func FindDSNByServiceIDandPMMAgentID(q *reform.Querier, serviceID, pmmAgentID, d if len(fexp) == 1 { agent := fexp[0] pmmAgentVersion := ExtractPmmAgentVersionFromAgent(q, agent) + + // Only the exporter agent types searched above use custom dial timeout here. + switch agent.AgentType { + case MySQLdExporterType, MongoDBExporterType, PostgresExporterType: + dsnParams.DialTimeout = agent.EffectiveDialTimeout() + default: + } + return agent.DSN(svc, dsnParams, nil, pmmAgentVersion), agent, nil } if len(fexp) > 1 { diff --git a/managed/models/dsn_helpers_test.go b/managed/models/dsn_helpers_test.go index d739283c3ae..74125129d3d 100644 --- a/managed/models/dsn_helpers_test.go +++ b/managed/models/dsn_helpers_test.go @@ -202,7 +202,7 @@ func TestFindDSNByServiceID(t *testing.T) { dsn, agent, err := models.FindDSNByServiceIDandPMMAgentID(q, "S1", "PA1", "test") require.NoError(t, err) - expected := "unix(/var/run/mysqld/mysqld.sock)/test?timeout=1s" + expected := "unix(/var/run/mysqld/mysqld.sock)/test?timeout=2s" assert.Equal(t, expected, dsn) assert.NotNil(t, agent) }) @@ -213,9 +213,9 @@ func TestFindDSNByServiceID(t *testing.T) { dsn, agent, err := models.FindDSNByServiceIDandPMMAgentID(q, "S4", "PA2", "test") require.NoError(t, err) - expected := "mongodb://pmm-user%7B%7B@127.0.0.1:27017/test?connectTimeoutMS=1000" + + expected := "mongodb://pmm-user%7B%7B@127.0.0.1:27017/test?connectTimeoutMS=2000" + "&directConnection=true" + - "&serverSelectionTimeoutMS=1000&ssl=true" + + "&serverSelectionTimeoutMS=2000&ssl=true" + "&tlsCaFile=[[.TextFiles.caFilePlaceholder]]" + "&tlsCertificateKeyFile=[[.TextFiles.certificateKeyFilePlaceholder]]" + "&tlsCertificateKeyFilePassword=passwordoftls" diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index 286d8773f7e..e199ed32667 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -64,7 +64,7 @@ func mongodbExporterConfig(node *models.Node, service *models.Service, exporter return nil, err } env := []string{ - fmt.Sprintf("MONGODB_URI=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: database}, tdp, pmmAgentVersion)), + fmt.Sprintf("MONGODB_URI=%s", exporter.DSN(service, models.DSNParams{DialTimeout: exporter.EffectiveDialTimeout(), Database: database}, tdp, pmmAgentVersion)), } res := &agentv1.SetStateRequest_AgentProcess{ diff --git a/managed/services/agents/mongodb_test.go b/managed/services/agents/mongodb_test.go index 6e15713a4a1..6dbe34a18ed 100644 --- a/managed/services/agents/mongodb_test.go +++ b/managed/services/agents/mongodb_test.go @@ -62,7 +62,7 @@ func TestMongodbExporterConfig225(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -125,7 +125,7 @@ func TestMongodbExporterConfig226(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -274,7 +274,7 @@ func TestMongodbExporterConfig2411(t *testing.T) { "--web.config={{ .TextFiles.webConfig }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, TextFiles: map[string]string{ @@ -465,7 +465,7 @@ func TestMongodbExporterConfig2432(t *testing.T) { "--web.config={{ .TextFiles.webConfig }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, TextFiles: map[string]string{ @@ -544,7 +544,7 @@ func TestMongodbExporterConfig(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -559,14 +559,14 @@ func TestMongodbExporterConfig(t *testing.T) { exporter.Password = nil actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", actual.Env[0]) }) t.Run("SSLEnabled", func(t *testing.T) { exporter.TLS = true @@ -576,7 +576,7 @@ func TestMongodbExporterConfig(t *testing.T) { TLSCa: "content-of-tls-ca", } actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) - expected := "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&" + + expected := "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000&ssl=true&" + "tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}&tlsCertificateKeyFilePassword=passwordoftls" assert.Equal(t, expected, actual.Env[0]) expectedFiles := map[string]string{ @@ -598,9 +598,9 @@ func TestMongodbExporterConfig(t *testing.T) { } actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) expected := `MONGODB_URI=mongodb://1.2.3.4:27017/$external?authMechanism=MONGODB-X509` + - `&authSource=%24external&connectTimeoutMS=1000` + + `&authSource=%24external&connectTimeoutMS=2000` + `&directConnection=true` + - `&serverSelectionTimeoutMS=1000` + + `&serverSelectionTimeoutMS=2000` + `&ssl=true` + `&tlsCaFile={{.TextFiles.caFilePlaceholder}}` + `&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}` + @@ -666,7 +666,7 @@ func TestNewMongodbExporterConfig(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, @@ -680,14 +680,23 @@ func TestNewMongodbExporterConfig(t *testing.T) { exporter.Password = nil actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", actual.Env[0]) + }) + + t.Run("ConnectionTimeout", func(t *testing.T) { + exporter.ExporterOptions = models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(1 * time.Minute), + } + actual, err := mongodbExporterConfig(node, mongodb, exporter, exposeSecrets, pmmAgentVersion) + require.NoError(t, err) + assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=60000&directConnection=true&serverSelectionTimeoutMS=60000", actual.Env[0]) }) } @@ -725,7 +734,7 @@ func TestMongodbExporterConfig228_WebConfigAuth(t *testing.T) { } expectedEnv := []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=2000&directConnection=true&serverSelectionTimeoutMS=2000", } t.Run("Custom_Password", func(t *testing.T) { diff --git a/managed/services/agents/mysql.go b/managed/services/agents/mysql.go index 21ab987e7a4..e840fd9a83f 100644 --- a/managed/services/agents/mysql.go +++ b/managed/services/agents/mysql.go @@ -18,6 +18,7 @@ package agents import ( "bytes" "fmt" + "math" "sort" "text/template" "time" @@ -149,13 +150,17 @@ func mysqldExporterConfig( TextFiles: textFiles, } + // MySQL client connection timeout is configured in whole seconds, so round up + // once here and reuse the normalized value for both my.cnf and legacy DSN paths. + connectionTimeout := time.Second * time.Duration(max(1, int(math.Ceil(exporter.EffectiveDialTimeout().Seconds())))) + if pmmAgentVersion.IsFeatureSupported(version.MysqlExporterV0_17_2) { if textFiles == nil { textFiles = make(map[string]string) } res.TextFiles = textFiles - cfg, err := buildMyCnfConfig(service, exporter, textFiles) + cfg, err := buildMyCnfConfig(service, exporter, textFiles, connectionTimeout) if err != nil { return nil, err } @@ -167,7 +172,7 @@ func mysqldExporterConfig( } } else { env := []string{ - fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion)), + fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: connectionTimeout, Database: ""}, nil, pmmAgentVersion)), fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword()), } res.Env = env @@ -226,6 +231,7 @@ const myCnfTemplate = `[client] {{if .User}}user={{ .User }}{{end}} {{if .Password}}password={{ .Password }}{{end}} {{if .Socket}}socket={{ .Socket }}{{end}} +{{if .ConnectTimeout}}connect_timeout={{ .ConnectTimeout }}{{end}} {{if .CaFile}}ssl-ca={{ .CaFile }}{{end}} {{if .CertFile}}ssl-cert={{ .CertFile }}{{end}} {{if .KeyFile}}ssl-key={{ .KeyFile }}{{end}} @@ -233,7 +239,7 @@ const myCnfTemplate = `[client] ` // buildMyCnfConfig builds my.cnf configuration for MySQL connection. -func buildMyCnfConfig(service *models.Service, agent *models.Agent, files map[string]string) (string, error) { +func buildMyCnfConfig(service *models.Service, agent *models.Agent, files map[string]string, connectTimeout time.Duration) (string, error) { tmpl, err := template.New("myCnf").Parse(myCnfTemplate) if err != nil { return "", fmt.Errorf("failed to parse myCnf template: %w", err) @@ -247,16 +253,18 @@ func buildMyCnfConfig(service *models.Service, agent *models.Agent, files map[st Socket string Host string Port int + ConnectTimeout int CaFile string CertFile string KeyFile string EnableClearTextPassword bool MyCnfPath string }{ - User: pointer.GetString(agent.Username), - Password: pointer.GetString(agent.Password), - Host: pointer.GetString(service.Address), - Port: int(pointer.GetUint16(service.Port)), + User: pointer.GetString(agent.Username), + Password: pointer.GetString(agent.Password), + Host: pointer.GetString(service.Address), + Port: int(pointer.GetUint16(service.Port)), + ConnectTimeout: max(1, int(connectTimeout.Seconds())), } if files["tlsCa"] != "" { diff --git a/managed/services/agents/mysql_test.go b/managed/services/agents/mysql_test.go index 3a709970832..3e4ffe14f2a 100644 --- a/managed/services/agents/mysql_test.go +++ b/managed/services/agents/mysql_test.go @@ -17,6 +17,7 @@ package agents import ( "testing" + "time" "github.com/AlekSi/pointer" "github.com/stretchr/testify/assert" @@ -93,7 +94,7 @@ func TestMySQLdExporterConfig(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -108,14 +109,14 @@ func TestMySQLdExporterConfig(t *testing.T) { exporter.Password = nil actual, err := mysqldExporterConfig(node, mysql, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=1s", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=2s", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual, err := mysqldExporterConfig(node, mysql, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=1s", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=2s", actual.Env[0]) }) t.Run("SSLEnabled", func(t *testing.T) { @@ -126,7 +127,7 @@ func TestMySQLdExporterConfig(t *testing.T) { TLSKey: "content-of-tls-key", } actual, err := mysqldExporterConfig(node, mysql, exporter, exposeSecrets, pmmAgentVersion) - expected := "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=1s&tls=custom" + expected := "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=2s&tls=custom" assert.Equal(t, expected, actual.Env[0]) expectedFiles := map[string]string{ "tlsCa": exporter.MySQLOptions.TLSCa, @@ -219,7 +220,7 @@ func TestMySQLdExporterConfigTablestatsGroupDisabled(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s&tls=custom", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s&tls=custom", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "content-of-tls-key"}, @@ -239,14 +240,14 @@ func TestMySQLdExporterConfigTablestatsGroupDisabled(t *testing.T) { exporter.Password = nil actual, err := mysqldExporterConfig(node, mysql, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=1s&tls=custom", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=2s&tls=custom", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual, err := mysqldExporterConfig(node, mysql, exporter, exposeSecrets, pmmAgentVersion) require.NoError(t, err) - assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=1s&tls=custom", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=2s&tls=custom", actual.Env[0]) }) t.Run("V236_EnablesPluginCollector", func(t *testing.T) { @@ -326,7 +327,7 @@ func TestMySQLdExporterConfigDisabledCollectors(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, @@ -412,7 +413,7 @@ func TestMySQLdExporterConfigMySQL8Support(t *testing.T) { }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password", "content-of-tls-key"}, TextFiles: map[string]string{ - "myCnf": "[client]\nhost=1.2.3.4\nport=3306\nuser=username\npassword=s3cur3 p@$$w0r4.\n\nssl-ca={{ .TextFiles.tlsCa }}\nssl-cert={{ .TextFiles.tlsCert }}\nssl-key={{ .TextFiles.tlsKey }}\n\n", + "myCnf": "[client]\nhost=1.2.3.4\nport=3306\nuser=username\npassword=s3cur3 p@$$w0r4.\n\nconnect_timeout=2\nssl-ca={{ .TextFiles.tlsCa }}\nssl-cert={{ .TextFiles.tlsCert }}\nssl-key={{ .TextFiles.tlsKey }}\n\n", "tlsCa": "content-of-tls-ca", "tlsCert": "content-of-tls-certificate-key", "tlsKey": "content-of-tls-key", @@ -477,7 +478,7 @@ func TestMySQLdExporterConfigMySQL8Support(t *testing.T) { }, RedactWords: []string{"agent-password", "content-of-tls-key"}, TextFiles: map[string]string{ - "myCnf": "[client]\nhost=1.2.3.4\nport=3306\nuser=username\n\n\nssl-ca={{ .TextFiles.tlsCa }}\nssl-cert={{ .TextFiles.tlsCert }}\nssl-key={{ .TextFiles.tlsKey }}\n\n", + "myCnf": "[client]\nhost=1.2.3.4\nport=3306\nuser=username\n\n\nconnect_timeout=2\nssl-ca={{ .TextFiles.tlsCa }}\nssl-cert={{ .TextFiles.tlsCert }}\nssl-key={{ .TextFiles.tlsKey }}\n\n", "tlsCa": "content-of-tls-ca", "tlsCert": "content-of-tls-certificate-key", "tlsKey": "content-of-tls-key", @@ -540,7 +541,7 @@ func TestMySQLdExporterConfigMySQL8Support(t *testing.T) { "--web.config.file={{ .TextFiles.webConfig }}", }, TextFiles: map[string]string{ - "myCnf": "[client]\nhost=1.2.3.4\nport=3306\n\npassword=s3cur3 p@$$w0r4.\n\n\n\n\n\n", + "myCnf": "[client]\nhost=1.2.3.4\nport=3306\n\npassword=s3cur3 p@$$w0r4.\n\nconnect_timeout=2\n\n\n\n\n", "webConfig": "basic_auth_users:\n pmm: agent-password\n", }, } @@ -549,3 +550,57 @@ func TestMySQLdExporterConfigMySQL8Support(t *testing.T) { assert.Equal(t, expected, actual) }) } + +func TestMySQLdExporterConfigRoundsUpConnectionTimeout(t *testing.T) { + t.Parallel() + + node := &models.Node{ + Address: "1.2.3.4", + } + service := &models.Service{ + Address: pointer.ToString("1.2.3.4"), + Port: pointer.ToUint16(3306), + } + + t.Run("myCnf", func(t *testing.T) { + t.Parallel() + + exporter := &models.Agent{ + AgentID: "agent-id", + AgentType: models.MySQLdExporterType, + Username: pointer.ToString("username"), + AgentPassword: pointer.ToString("agent-password"), + ExporterOptions: models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(1500 * time.Millisecond), + }, + } + + actual, err := mysqldExporterConfig(node, service, exporter, exposeSecrets, version.MustParse("3.2.0")) + require.NoError(t, err) + require.NotNil(t, exporter.ExporterOptions.ConnectionTimeout) + assert.Equal(t, 1500*time.Millisecond, *exporter.ExporterOptions.ConnectionTimeout) + require.Contains(t, actual.TextFiles, "myCnf") + assert.Contains(t, actual.TextFiles["myCnf"], "connect_timeout=2\n") + }) + + t.Run("legacy dsn", func(t *testing.T) { + t.Parallel() + + exporter := &models.Agent{ + AgentID: "agent-id", + AgentType: models.MySQLdExporterType, + Username: pointer.ToString("username"), + AgentPassword: pointer.ToString("agent-password"), + ExporterOptions: models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(1500 * time.Millisecond), + }, + } + + actual, err := mysqldExporterConfig(node, service, exporter, exposeSecrets, version.MustParse("2.21.0")) + require.NoError(t, err) + require.NotNil(t, exporter.ExporterOptions.ConnectionTimeout) + assert.Equal(t, 1500*time.Millisecond, *exporter.ExporterOptions.ConnectionTimeout) + require.Len(t, actual.Env, 2) + assert.Contains(t, actual.Env[0], "timeout=2s") + }) +} diff --git a/managed/services/agents/postgresql.go b/managed/services/agents/postgresql.go index 9b13c41c4ed..5bf9f51ddb5 100644 --- a/managed/services/agents/postgresql.go +++ b/managed/services/agents/postgresql.go @@ -17,6 +17,7 @@ package agents import ( "fmt" + "math" "sort" "strconv" "strings" @@ -31,6 +32,8 @@ import ( "github.com/percona/pmm/version" ) +const postgresCloudConnectionTimeout = 5 * time.Second + var ( postgresExporterAutodiscoveryVersion = version.MustParse("2.15.99") postgresExporterWebConfigVersion = version.MustParse("2.30.99") @@ -125,21 +128,27 @@ func postgresExporterConfig(node *models.Node, service *models.Service, exporter sort.Strings(args) dsnParams := models.DSNParams{ - DialTimeout: 1 * time.Second, Database: service.DatabaseName, PostgreSQLSupportsSSLSNI: !pmmAgentVersion.Less(postgresSSLSniVersion), } - // On AWS and Azure, we need to have a higher value for DialTimeout to avoid connection issues + var connectionTimeout time.Duration - // TODO: refactor with https://perconadev.atlassian.net/browse/PMM-12832 - if node.NodeType == models.RemoteRDSNodeType { - dsnParams.DialTimeout = 5 * time.Second - } - - if exporter.AzureOptions.ClientID != "" { - dsnParams.DialTimeout = 5 * time.Second + // Remote RDS / Azure: default use postgresCloudConnectionTimeout dial unless the user set ExporterOptions.ConnectionTimeout. + switch { + case exporter.AzureOptions.ClientID != "", + node.NodeType == models.RemoteRDSNodeType: + connectionTimeout = pointer.Get(exporter.ExporterOptions.ConnectionTimeout) + if connectionTimeout == 0 { + connectionTimeout = postgresCloudConnectionTimeout + } + default: + connectionTimeout = exporter.EffectiveDialTimeout() } + // PostgreSQL uses whole-second connection timeout values, so round up once here + // before rendering the connection string to avoid truncating sub-second values to 0. + connectionTimeout = time.Second * time.Duration(max(1, int(math.Ceil(connectionTimeout.Seconds())))) + dsnParams.DialTimeout = connectionTimeout res := &agentv1.SetStateRequest_AgentProcess{ Type: inventoryv1.AgentType_AGENT_TYPE_POSTGRES_EXPORTER, diff --git a/managed/services/agents/postgresql_test.go b/managed/services/agents/postgresql_test.go index 4a1620f46bb..4ec0f5742db 100644 --- a/managed/services/agents/postgresql_test.go +++ b/managed/services/agents/postgresql_test.go @@ -18,6 +18,7 @@ package agents import ( "fmt" "testing" + "time" "github.com/AlekSi/pointer" "github.com/stretchr/testify/assert" @@ -70,7 +71,7 @@ func (s *PostgresExporterConfigTestSuite) SetupTest() { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", + "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -94,7 +95,7 @@ func (s *PostgresExporterConfigTestSuite) TestConfig() { func (s *PostgresExporterConfigTestSuite) TestDatabaseName() { s.Run("Set", func() { s.postgresql.DatabaseName = "db1" - s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/db1?connect_timeout=1&sslmode=disable" + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/db1?connect_timeout=2&sslmode=disable" s.exporter.ExporterOptions = models.ExporterOptions{} s.exporter.AzureOptions = models.AzureOptions{} @@ -129,7 +130,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyPassword() { actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) s.NoError(err, "Failed to create exporter config") - s.Equal("DATA_SOURCE_NAME=postgres://username@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", actual.Env[0]) + s.Equal("DATA_SOURCE_NAME=postgres://username@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } func (s *PostgresExporterConfigTestSuite) TestEmptyUsername() { @@ -141,7 +142,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyUsername() { actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) s.NoError(err, "Failed to create exporter config") - s.Equal("DATA_SOURCE_NAME=postgres://:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", actual.Env[0]) + s.Equal("DATA_SOURCE_NAME=postgres://:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } func (s *PostgresExporterConfigTestSuite) TestEmptyUsernameAndPassword() { @@ -154,7 +155,7 @@ func (s *PostgresExporterConfigTestSuite) TestEmptyUsernameAndPassword() { actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) s.NoError(err, "Failed to create exporter config") - s.Equal("DATA_SOURCE_NAME=postgres://1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", actual.Env[0]) + s.Equal("DATA_SOURCE_NAME=postgres://1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", actual.Env[0]) } func (s *PostgresExporterConfigTestSuite) TestSocket() { @@ -170,7 +171,7 @@ func (s *PostgresExporterConfigTestSuite) TestSocket() { actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, exposeSecrets, s.pmmAgentVersion) s.NoError(err, "Failed to create exporter config") - s.Equal("DATA_SOURCE_NAME=postgres:///postgres?connect_timeout=1&host=%2Fvar%2Frun%2Fpostgres&sslmode=disable", actual.Env[0]) + s.Equal("DATA_SOURCE_NAME=postgres:///postgres?connect_timeout=2&host=%2Fvar%2Frun%2Fpostgres&sslmode=disable", actual.Env[0]) } func (s *PostgresExporterConfigTestSuite) TestDisabledCollectors() { @@ -207,6 +208,78 @@ func (s *PostgresExporterConfigTestSuite) TestDisabledCollectors() { s.Require().Equal(expected.Args, actual.Args) } +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRemoteRDSDefault() { + s.node.NodeType = models.RemoteRDSNodeType + s.exporter.ExporterOptions = models.ExporterOptions{} + s.exporter.AzureOptions = models.AzureOptions{} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=5&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) +} + +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRemoteRDSCustom() { + s.node.NodeType = models.RemoteRDSNodeType + s.exporter.ExporterOptions = models.ExporterOptions{ConnectionTimeout: pointer.ToDuration(8 * time.Second)} + s.exporter.AzureOptions = models.AzureOptions{} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=8&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) +} + +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutRoundsUpSubSecondCustom() { + s.exporter.ExporterOptions = models.ExporterOptions{ConnectionTimeout: pointer.ToDuration(1500 * time.Millisecond)} + s.exporter.AzureOptions = models.AzureOptions{} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) + s.Require().NotNil(s.exporter.ExporterOptions.ConnectionTimeout) + s.Equal(1500*time.Millisecond, *s.exporter.ExporterOptions.ConnectionTimeout) +} + +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureDefault() { + s.exporter.ExporterOptions = models.ExporterOptions{} + s.exporter.AzureOptions = models.AzureOptions{ClientID: "azure-client"} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=5&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) +} + +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureRoundsUpSubSecondCustom() { + s.exporter.ExporterOptions = models.ExporterOptions{ConnectionTimeout: pointer.ToDuration(1500 * time.Millisecond)} + s.exporter.AzureOptions = models.AzureOptions{ClientID: "azure-client"} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) + s.Require().NotNil(s.exporter.ExporterOptions.ConnectionTimeout) + s.Equal(1500*time.Millisecond, *s.exporter.ExporterOptions.ConnectionTimeout) +} + +func (s *PostgresExporterConfigTestSuite) TestDialTimeoutAzureCustom() { + s.exporter.ExporterOptions = models.ExporterOptions{ConnectionTimeout: pointer.ToDuration(4 * time.Second)} + s.exporter.AzureOptions = models.AzureOptions{ClientID: "azure-client"} + s.exporter.PostgreSQLOptions = models.PostgreSQLOptions{} + s.expected.Env[0] = "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=4&sslmode=disable" + + actual, err := postgresExporterConfig(s.node, s.postgresql, s.exporter, redactSecrets, s.pmmAgentVersion) + s.NoError(err) + s.Require().Equal(s.expected.Env, actual.Env) +} + func TestAutoDiscovery(t *testing.T) { const discoveryFlag = "--auto-discover-databases" const excludedFlag = "--exclude-databases=template0,template1,cloudsqladmin,pmm-managed-dev,azure_maintenance,rdsadmin" @@ -245,7 +318,7 @@ func TestAutoDiscovery(t *testing.T) { "--web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", + "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, @@ -364,7 +437,7 @@ func TestMaxConnections(t *testing.T) { "--web.config={{ .TextFiles.webConfig }}", }, Env: []string{ - "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=disable", + "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=disable", }, TextFiles: map[string]string{ "webConfig": "basic_auth_users:\n pmm: agent-id\n", @@ -496,7 +569,7 @@ func (s *PostgresExporterConfigTestSuite) TestPrometheusWebConfig() { "--web.config={{ .TextFiles.webConfig }}", }, Env: []string{ - "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=verify-ca", + "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=verify-ca", }, TextFiles: map[string]string{ "webConfig": "basic_auth_users:\n pmm: agent-id\n", @@ -548,7 +621,7 @@ func (s *PostgresExporterConfigTestSuite) TestSSLSni() { "--web.config={{ .TextFiles.webConfig }}", }, Env: []string{ - "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=1&sslmode=verify-ca&sslsni=0", + "DATA_SOURCE_NAME=postgres://username:s3cur3%20p%40$$w0r4.@1.2.3.4:5432/postgres?connect_timeout=2&sslmode=verify-ca&sslsni=0", }, TextFiles: map[string]string{ "webConfig": "basic_auth_users:\n pmm: agent-id\n", diff --git a/managed/services/agents/proxysql.go b/managed/services/agents/proxysql.go index 8f786c25e1d..f90d039cf73 100644 --- a/managed/services/agents/proxysql.go +++ b/managed/services/agents/proxysql.go @@ -18,7 +18,6 @@ package agents import ( "fmt" "sort" - "time" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" @@ -71,7 +70,7 @@ func proxysqlExporterConfig(node *models.Node, service *models.Service, exporter TemplateRightDelim: tdp.Right, Args: args, Env: []string{ - fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion)), + fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: exporter.EffectiveDialTimeout(), Database: ""}, nil, pmmAgentVersion)), fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword()), }, } diff --git a/managed/services/agents/proxysql_test.go b/managed/services/agents/proxysql_test.go index 4c4b161d830..4b231421c1a 100644 --- a/managed/services/agents/proxysql_test.go +++ b/managed/services/agents/proxysql_test.go @@ -59,7 +59,7 @@ func TestProxySQLExporterConfig(t *testing.T) { "-web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -71,13 +71,13 @@ func TestProxySQLExporterConfig(t *testing.T) { t.Run("EmptyPassword", func(t *testing.T) { exporter.Password = nil actual := proxysqlExporterConfig(node, proxysql, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=1s", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=username@tcp(1.2.3.4:3306)/?timeout=2s", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual := proxysqlExporterConfig(node, proxysql, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=1s", actual.Env[0]) + assert.Equal(t, "DATA_SOURCE_NAME=tcp(1.2.3.4:3306)/?timeout=2s", actual.Env[0]) }) t.Run("DisabledCollector", func(t *testing.T) { @@ -125,7 +125,7 @@ func TestProxySQLExporterConfig(t *testing.T) { "-web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, @@ -167,7 +167,7 @@ func TestProxySQLExporterConfig(t *testing.T) { "-web.listen-address=0.0.0.0:{{ .listen_port }}", }, Env: []string{ - "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=1s", + "DATA_SOURCE_NAME=username:s3cur3 p@$$w0r4.@tcp(1.2.3.4:3306)/?timeout=2s", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, diff --git a/managed/services/agents/valkey.go b/managed/services/agents/valkey.go index 4267bc401f0..b8a2fb20d31 100644 --- a/managed/services/agents/valkey.go +++ b/managed/services/agents/valkey.go @@ -17,7 +17,6 @@ package agents import ( "sort" - "time" agentv1 "github.com/percona/pmm/api/agent/v1" inventoryv1 "github.com/percona/pmm/api/inventory/v1" @@ -41,11 +40,10 @@ func valkeyExporterConfig(node *models.Node, service *models.Service, exporter * args = append(args, "--web.telemetry-path="+exporter.ExporterOptions.MetricsPath) } - dnsParams := models.DSNParams{ - DialTimeout: 3 * time.Second, - } + dsnParams := models.DSNParams{} - args = append(args, "--redis.addr="+exporter.DSN(service, dnsParams, nil, pmmAgentVersion)) + args = append(args, "--redis.addr="+exporter.DSN(service, dsnParams, nil, pmmAgentVersion)) + args = append(args, "--connection-timeout="+exporter.EffectiveDialTimeout().String()) args = withLogLevel(args, exporter.LogLevel, pmmAgentVersion, false) sort.Strings(args) diff --git a/managed/services/agents/valkey_test.go b/managed/services/agents/valkey_test.go new file mode 100644 index 00000000000..7ddecea0aa8 --- /dev/null +++ b/managed/services/agents/valkey_test.go @@ -0,0 +1,80 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package agents + +import ( + "testing" + "time" + + "github.com/AlekSi/pointer" + "github.com/stretchr/testify/require" + + agentv1 "github.com/percona/pmm/api/agent/v1" + inventoryv1 "github.com/percona/pmm/api/inventory/v1" + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/version" +) + +func TestValkeyExporterConfig(t *testing.T) { + t.Parallel() + + pmmAgentVersion := version.MustParse("2.44.0") + node := &models.Node{Address: "1.2.3.4"} + service := &models.Service{ + Address: pointer.ToString("1.2.3.4"), + Port: pointer.ToUint16(6379), + } + + t.Run("DefaultTimeoutUsesFlag", func(t *testing.T) { + t.Parallel() + exporter := &models.Agent{ + AgentID: "agent-id", + AgentType: models.ValkeyExporterType, + Username: pointer.ToString("username"), + Password: pointer.ToString("secret"), + } + actual := valkeyExporterConfig(node, service, exporter, redactSecrets, pmmAgentVersion) + expected := &agentv1.SetStateRequest_AgentProcess{ + Type: inventoryv1.AgentType_AGENT_TYPE_VALKEY_EXPORTER, + TemplateLeftDelim: "{{", + TemplateRightDelim: "}}", + Args: []string{ + "--connection-timeout=3s", + "--include-config-metrics", + "--include-system-metrics", + "--redis.addr=redis://username:secret@1.2.3.4:6379", + "--web.listen-address=0.0.0.0:{{ .listen_port }}", + }, + RedactWords: []string{"secret"}, + } + require.Equal(t, expected, actual) + }) + + t.Run("CustomTimeoutUsesFlag", func(t *testing.T) { + t.Parallel() + exporter := &models.Agent{ + AgentID: "agent-id", + AgentType: models.ValkeyExporterType, + Username: pointer.ToString("username"), + Password: pointer.ToString("secret"), + } + exporter.ExporterOptions.ConnectionTimeout = pointer.ToDuration(1500 * time.Millisecond) + + actual := valkeyExporterConfig(node, service, exporter, redactSecrets, pmmAgentVersion) + require.Contains(t, actual.Args, "--connection-timeout=1.5s") + require.Contains(t, actual.Args, "--redis.addr=redis://username:secret@1.2.3.4:6379") + }) +} diff --git a/managed/services/converters.go b/managed/services/converters.go index f28a4567a2b..d5cc42bb053 100644 --- a/managed/services/converters.go +++ b/managed/services/converters.go @@ -259,7 +259,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro }, nil case models.NodeExporterType: - return &inventoryv1.NodeExporter{ + exporter := &inventoryv1.NodeExporter{ AgentId: agent.AgentID, PmmAgentId: pointer.GetString(agent.PMMAgentID), Disabled: agent.Disabled, @@ -272,10 +272,11 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro LogLevel: inventoryv1.LogLevelAPIValue(agent.LogLevel), ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), - }, nil + } + return exporter, nil case models.MySQLdExporterType: - return &inventoryv1.MySQLdExporter{ + exporter := &inventoryv1.MySQLdExporter{ AgentId: agent.AgentID, PmmAgentId: pointer.GetString(agent.PMMAgentID), ServiceId: serviceID, @@ -296,7 +297,11 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), ExtraDsnParams: agent.MySQLOptions.ExtraDSNParams, - }, nil + } + if agent.ExporterOptions.ConnectionTimeout != nil { + exporter.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } + return exporter, nil case models.MongoDBExporterType: exporter := &inventoryv1.MongoDBExporter{ @@ -317,7 +322,9 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), } - + if agent.ExporterOptions.ConnectionTimeout != nil { + exporter.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } exporter.StatsCollections = agent.MongoDBOptions.StatsCollections exporter.CollectionsLimit = agent.MongoDBOptions.CollectionsLimit exporter.EnableAllCollectors = agent.MongoDBOptions.EnableAllCollectors @@ -343,7 +350,9 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), } - + if agent.ExporterOptions.ConnectionTimeout != nil { + exporter.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } exporter.AutoDiscoveryLimit = pointer.GetInt32(agent.PostgreSQLOptions.AutoDiscoveryLimit) exporter.MaxExporterConnections = agent.PostgreSQLOptions.MaxExporterConnections @@ -421,7 +430,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro }, nil case models.ProxySQLExporterType: - return &inventoryv1.ProxySQLExporter{ + exporter := &inventoryv1.ProxySQLExporter{ AgentId: agent.AgentID, PmmAgentId: pointer.GetString(agent.PMMAgentID), ServiceId: serviceID, @@ -438,7 +447,11 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro LogLevel: inventoryv1.LogLevelAPIValue(agent.LogLevel), ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), - }, nil + } + if agent.ExporterOptions.ConnectionTimeout != nil { + exporter.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } + return exporter, nil case models.QANPostgreSQLPgStatementsAgentType: return &inventoryv1.QANPostgreSQLPgStatementsAgent{ @@ -476,7 +489,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro }, nil case models.RDSExporterType: - return &inventoryv1.RDSExporter{ + exporter := &inventoryv1.RDSExporter{ AgentId: agent.AgentID, PmmAgentId: pointer.GetString(agent.PMMAgentID), NodeId: nodeID, @@ -491,7 +504,8 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventoryv1.LogLevelAPIValue(agent.LogLevel), MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), - }, nil + } + return exporter, nil case models.ExternalExporterType: if agent.RunsOnNodeID == nil && agent.PMMAgentID != nil { @@ -501,7 +515,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro } agent.RunsOnNodeID = pmmAgent.RunsOnNodeID } - return &inventoryv1.ExternalExporter{ + ext := &inventoryv1.ExternalExporter{ AgentId: agent.AgentID, RunsOnNodeId: pointer.GetString(agent.RunsOnNodeID), ServiceId: pointer.GetString(agent.ServiceID), @@ -516,10 +530,11 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), TlsSkipVerify: agent.TLSSkipVerify, Status: inventoryv1.AgentStatus(inventoryv1.AgentStatus_value[agent.Status]), - }, nil + } + return ext, nil case models.AzureDatabaseExporterType: - return &inventoryv1.AzureDatabaseExporter{ + exporter := &inventoryv1.AzureDatabaseExporter{ AgentId: agent.AgentID, PmmAgentId: pointer.GetString(agent.PMMAgentID), NodeId: nodeID, @@ -532,7 +547,8 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventoryv1.LogLevelAPIValue(agent.LogLevel), MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), - }, nil + } + return exporter, nil case models.VMAgentType: return &inventoryv1.VMAgent{ @@ -571,6 +587,9 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro ExposeExporter: agent.ExporterOptions.ExposeExporter, MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions), } + if agent.ExporterOptions.ConnectionTimeout != nil { + exporter.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } return exporter, nil case models.RTAMongoDBAgentType: diff --git a/managed/services/converters_test.go b/managed/services/converters_test.go index 8dcd34e6e9d..3a37af6bcce 100644 --- a/managed/services/converters_test.go +++ b/managed/services/converters_test.go @@ -54,6 +54,15 @@ func TestToAPIAgent(t *testing.T) { pmmAgent, err := models.CreatePMMAgent(db.Querier, node.NodeID, nil) require.NoError(t, err) + mysqlService, err := models.AddNewService(db.Querier, models.MySQLServiceType, &models.AddDBMSServiceParams{ + ServiceName: "test-mysql", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(3306), + Cluster: "test-cluster", + }) + require.NoError(t, err) + type args struct { q *reform.Querier agent *models.Agent @@ -96,6 +105,38 @@ func TestToAPIAgent(t *testing.T) { }, wantErr: nil, }, + { + name: "mysqld exporter with ExporterOptions timeout", + args: args{ + q: db.Querier, + agent: &models.Agent{ + AgentID: "mysqld-agent-1", + PMMAgentID: &pmmAgent.AgentID, + ServiceID: &mysqlService.ServiceID, + AgentType: models.MySQLdExporterType, + Disabled: false, + Username: pointer.To("exporter-user"), + Status: inventoryv1.AgentStatus_name[int32(inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN)], + MySQLOptions: models.MySQLOptions{ + TableCountTablestatsGroupLimit: 1000, + }, + ExporterOptions: models.ExporterOptions{ + ConnectionTimeout: pointer.ToDuration(9 * time.Second), + }, + }, + }, + want: &inventoryv1.MySQLdExporter{ + AgentId: "mysqld-agent-1", + PmmAgentId: pmmAgent.AgentID, + ServiceId: mysqlService.ServiceID, + Username: "exporter-user", + Disabled: false, + Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + TablestatsGroupTableLimit: 1000, + ConnectionTimeout: durationpb.New(9 * time.Second), + }, + wantErr: nil, + }, } for _, tt := range tests { diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 2508aadf64e..f0ac3731021 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -30,6 +30,7 @@ import ( inventoryv1 "github.com/percona/pmm/api/inventory/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" "github.com/percona/pmm/managed/utils/env" "github.com/percona/pmm/utils/logger" ) @@ -243,22 +244,24 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, p *inventoryv1.A } mysqlOptions.TableCountTablestatsGroupLimit = p.TablestatsGroupTableLimit e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + exporterOptions := models.ExporterOptions{ + PushMetrics: p.PushMetrics, + DisabledCollectors: p.DisableCollectors, + ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), + } params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - AgentPassword: p.AgentPassword, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - DisabledCollectors: p.DisableCollectors, - ExposeExporter: p.ExposeExporter, - }, - MySQLOptions: mysqlOptions, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + AgentPassword: p.AgentPassword, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + ExporterOptions: exporterOptions, + MySQLOptions: mysqlOptions, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), } var err error row, err = models.CreateAgent(tx.Querier, models.MySQLdExporterType, params) @@ -330,6 +333,7 @@ func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID strin DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } agent, err := as.executeAgentChange(ctx, agentID, params) @@ -368,6 +372,7 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, p *inventoryv1. PushMetrics: p.PushMetrics, DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), }, LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), } @@ -449,6 +454,7 @@ func (as *AgentsService) ChangeMongoDBExporter( DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } agent, err := as.executeAgentChange(ctx, agentID, params) @@ -698,20 +704,22 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent(ctx context.Context, agentID func (as *AgentsService) AddPostgresExporter(ctx context.Context, p *inventoryv1.AddPostgresExporterParams) (*inventoryv1.AddAgentResponse, error) { var agent *inventoryv1.PostgresExporter e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + exporterOptions := models.ExporterOptions{ + PushMetrics: p.PushMetrics, + DisabledCollectors: p.DisableCollectors, + ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), + } params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - AgentPassword: p.AgentPassword, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - DisabledCollectors: p.DisableCollectors, - ExposeExporter: p.ExposeExporter, - }, + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + AgentPassword: p.AgentPassword, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + ExporterOptions: exporterOptions, PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), } @@ -782,6 +790,7 @@ func (as *AgentsService) ChangePostgresExporter(ctx context.Context, agentID str DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } agent, err := as.executeAgentChange(ctx, agentID, params) @@ -804,21 +813,23 @@ func (as *AgentsService) ChangePostgresExporter(ctx context.Context, agentID str func (as *AgentsService) AddValkeyExporter(ctx context.Context, p *inventoryv1.AddValkeyExporterParams) (*inventoryv1.AddAgentResponse, error) { var agent *inventoryv1.ValkeyExporter e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + exporterOptions := models.ExporterOptions{ + PushMetrics: p.PushMetrics, + ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), + } params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - AgentPassword: p.AgentPassword, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - ExposeExporter: p.ExposeExporter, - }, - ValkeyOptions: models.ValkeyOptionsFromRequest(p), + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + AgentPassword: p.AgentPassword, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), + ExporterOptions: exporterOptions, + ValkeyOptions: models.ValkeyOptionsFromRequest(p), } row, err := models.CreateAgent(tx.Querier, models.ValkeyExporterType, params) if err != nil { @@ -888,6 +899,7 @@ func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID strin DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } agent, err := as.executeAgentChange(ctx, agentID, params) @@ -1124,21 +1136,23 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent(ctx context.Context, agen func (as *AgentsService) AddProxySQLExporter(ctx context.Context, p *inventoryv1.AddProxySQLExporterParams) (*inventoryv1.AddAgentResponse, error) { var agent *inventoryv1.ProxySQLExporter e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + exporterOptions := models.ExporterOptions{ + PushMetrics: p.PushMetrics, + DisabledCollectors: p.DisableCollectors, + ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), + } params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - AgentPassword: p.AgentPassword, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - DisabledCollectors: p.DisableCollectors, - ExposeExporter: p.ExposeExporter, - }, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + AgentPassword: p.AgentPassword, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + ExporterOptions: exporterOptions, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), } row, err := models.CreateAgent(tx.Querier, models.ProxySQLExporterType, params) if err != nil { @@ -1201,6 +1215,7 @@ func (as *AgentsService) ChangeProxySQLExporter(ctx context.Context, agentID str DisabledCollectors: p.DisableCollectors, ExposeExporter: p.ExposeExporter, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } agent, err := as.executeAgentChange(ctx, agentID, params) diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 667a3d968d5..1ea711f3d64 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -147,17 +147,19 @@ func TestAgents(t *testing.T) { require.NoError(t, err) actualAgent, err := as.AddMySQLdExporter(ctx, &inventoryv1.AddMySQLdExporterParams{ - PmmAgentId: pmmAgentID, - ServiceId: ms.ServiceId, - Username: "username", + PmmAgentId: pmmAgentID, + ServiceId: ms.ServiceId, + Username: "username", + ConnectionTimeout: durationpb.New(11 * time.Second), }) require.NoError(t, err) expectedMySQLdExporter = &inventoryv1.MySQLdExporter{ - AgentId: "00000000-0000-4000-8000-000000000008", - PmmAgentId: "00000000-0000-4000-8000-000000000005", - ServiceId: ms.ServiceId, - Username: "username", - Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + AgentId: "00000000-0000-4000-8000-000000000008", + PmmAgentId: "00000000-0000-4000-8000-000000000005", + ServiceId: ms.ServiceId, + Username: "username", + Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + ConnectionTimeout: durationpb.New(11 * time.Second), } assert.Equal(t, expectedMySQLdExporter, actualAgent.GetMysqldExporter()) @@ -229,17 +231,19 @@ func TestAgents(t *testing.T) { require.NoError(t, err) actualAgent, err := as.AddPostgresExporter(ctx, &inventoryv1.AddPostgresExporterParams{ - PmmAgentId: pmmAgentID, - ServiceId: ps.ServiceId, - Username: "username", + PmmAgentId: pmmAgentID, + ServiceId: ps.ServiceId, + Username: "username", + ConnectionTimeout: durationpb.New(13 * time.Second), }) require.NoError(t, err) expectedPostgresExporter = &inventoryv1.PostgresExporter{ - AgentId: "00000000-0000-4000-8000-00000000000d", - PmmAgentId: pmmAgentID, - ServiceId: ps.ServiceId, - Username: "username", - Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + AgentId: "00000000-0000-4000-8000-00000000000d", + PmmAgentId: pmmAgentID, + ServiceId: ps.ServiceId, + Username: "username", + Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + ConnectionTimeout: durationpb.New(13 * time.Second), } assert.Equal(t, expectedPostgresExporter, actualAgent.GetPostgresExporter()) @@ -464,6 +468,34 @@ func TestAgents(t *testing.T) { Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, } assert.Equal(t, expectedAgent, agent.GetRdsExporter()) + + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "pmm-server") + + changedAgent, err := as.ChangeRDSExporter(ctx, "00000000-0000-4000-8000-000000000006", &inventoryv1.ChangeRDSExporterParams{}) + require.NoError(t, err) + expectedAgent = &inventoryv1.RDSExporter{ + AgentId: "00000000-0000-4000-8000-000000000006", + PmmAgentId: "pmm-server", + NodeId: "00000000-0000-4000-8000-000000000005", + AwsAccessKey: "EXAMPLE_ACCESS_KEY", + CustomLabels: map[string]string{"baz": "qux"}, + Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + } + assert.Equal(t, expectedAgent, changedAgent.GetRdsExporter()) + + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "pmm-server") + + changedAgent, err = as.ChangeRDSExporter(ctx, "00000000-0000-4000-8000-000000000006", &inventoryv1.ChangeRDSExporterParams{}) + require.NoError(t, err) + expectedAgent = &inventoryv1.RDSExporter{ + AgentId: "00000000-0000-4000-8000-000000000006", + PmmAgentId: "pmm-server", + NodeId: "00000000-0000-4000-8000-000000000005", + AwsAccessKey: "EXAMPLE_ACCESS_KEY", + CustomLabels: map[string]string{"baz": "qux"}, + Status: inventoryv1.AgentStatus_AGENT_STATUS_UNKNOWN, + } + assert.Equal(t, expectedAgent, changedAgent.GetRdsExporter()) }) t.Run("AddExternalExporter", func(t *testing.T) { diff --git a/managed/services/management/add_service_exporter_timeout_test.go b/managed/services/management/add_service_exporter_timeout_test.go new file mode 100644 index 00000000000..159b7515e47 --- /dev/null +++ b/managed/services/management/add_service_exporter_timeout_test.go @@ -0,0 +1,270 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package management + +import ( + "context" + "testing" + "time" + + "github.com/AlekSi/pointer" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/durationpb" + "gopkg.in/reform.v1" + "gopkg.in/reform.v1/dialects/postgresql" + + managementv1 "github.com/percona/pmm/api/management/v1" + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/managed/utils/testdb" + "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" +) + +// Verifies management AddService paths persist ExporterOptions.ConnectionTimeout. +func TestAddServiceExporterTimeout(t *testing.T) { + uuid.SetRand(&tests.IDReader{}) + defer uuid.SetRand(nil) + + ctx := logger.Set(context.Background(), t.Name()) + sqlDB := testdb.Open(t, models.SetupFixtures, nil) + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck + db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) + + cc := &mockConnectionChecker{} + cc.Test(t) + sib := &mockServiceInfoBroker{} + sib.Test(t) + state := &mockAgentsStateUpdater{} + state.Test(t) + ar := &mockAgentsRegistry{} + ar.Test(t) + vmdb := &mockPrometheusService{} + vmdb.Test(t) + vc := &mockVersionCache{} + vc.Test(t) + grafanaClient := &mockGrafanaClient{} + grafanaClient.Test(t) + vmClient := &mockVictoriaMetricsClient{} + vmClient.Test(t) + + t.Cleanup(func() { + cc.AssertExpectations(t) + sib.AssertExpectations(t) + state.AssertExpectations(t) + ar.AssertExpectations(t) + vmdb.AssertExpectations(t) + vc.AssertExpectations(t) + grafanaClient.AssertExpectations(t) + vmClient.AssertExpectations(t) + }) + + s := NewManagementService(db, ar, state, cc, sib, vmdb, vc, grafanaClient, vmClient) + want := durationpb.New(17 * time.Second) + + t.Run("MySQL", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + vc.On("RequestSoftwareVersionsUpdate").Once() + + resp, err := s.AddService(ctx, &managementv1.AddServiceRequest{ + Service: &managementv1.AddServiceRequest_Mysql{ + Mysql: &managementv1.AddMySQLServiceParams{ + NodeId: models.PMMServerNodeID, + ServiceName: "mgmt-test-mysql-timeout", + Address: "127.0.0.1", + Port: 3306, + PmmAgentId: models.PMMServerAgentID, + Username: "root", + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetMysql()) + assert.Equal(t, want, resp.GetMysql().GetMysqldExporter().GetConnectionTimeout()) + }) + + t.Run("PostgreSQL", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + resp, err := s.AddService(ctx, &managementv1.AddServiceRequest{ + Service: &managementv1.AddServiceRequest_Postgresql{ + Postgresql: &managementv1.AddPostgreSQLServiceParams{ + NodeId: models.PMMServerNodeID, + ServiceName: "mgmt-test-pg-timeout", + Address: "127.0.0.1", + Port: 5432, + Database: "postgres", + PmmAgentId: models.PMMServerAgentID, + Username: "postgres", + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetPostgresql()) + assert.Equal(t, want, resp.GetPostgresql().GetPostgresExporter().GetConnectionTimeout()) + }) + + t.Run("ProxySQL", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + resp, err := s.AddService(ctx, &managementv1.AddServiceRequest{ + Service: &managementv1.AddServiceRequest_Proxysql{ + Proxysql: &managementv1.AddProxySQLServiceParams{ + NodeId: models.PMMServerNodeID, + ServiceName: "mgmt-test-px-timeout", + Address: "127.0.0.1", + Port: 6033, + PmmAgentId: models.PMMServerAgentID, + Username: "admin", + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetProxysql()) + assert.Equal(t, want, resp.GetProxysql().GetProxysqlExporter().GetConnectionTimeout()) + }) + + t.Run("Valkey", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + resp, err := s.AddService(ctx, &managementv1.AddServiceRequest{ + Service: &managementv1.AddServiceRequest_Valkey{ + Valkey: &managementv1.AddValkeyServiceParams{ + NodeId: models.PMMServerNodeID, + ServiceName: "mgmt-test-valkey-timeout", + Address: "127.0.0.1", + Port: 6379, + PmmAgentId: models.PMMServerAgentID, + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetValkey()) + assert.Equal(t, want, resp.GetValkey().GetValkeyExporter().GetConnectionTimeout()) + }) + + t.Run("Azure Database", func(t *testing.T) { + _, err := models.UpdateSettings(sqlDB, &models.ChangeSettingsParams{ + EnableAzurediscover: pointer.ToBool(true), + }) + require.NoError(t, err) + + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + _, err = s.AddAzureDatabase(ctx, &managementv1.AddAzureDatabaseRequest{ + Region: "westeurope", + InstanceId: "mgmt-test-azure-timeout-instance", + NodeName: "mgmt-test-azure-timeout-node", + ServiceName: "mgmt-test-azure-timeout", + NodeModel: "general-purpose", + Address: "127.0.0.1", + Port: 3306, + Username: "root", + Password: "secret", + AzureClientId: "client-id", + AzureClientSecret: "client-secret", + AzureTenantId: "tenant-id", + AzureSubscriptionId: "subscription-id", + AzureResourceGroup: "resource-group", + AzureDatabaseExporter: true, + SkipConnectionCheck: true, + Type: managementv1.DiscoverAzureDatabaseType_DISCOVER_AZURE_DATABASE_TYPE_MYSQL, + ConnectionTimeout: want, + }) + require.NoError(t, err) + + service, err := models.FindServiceByName(db.Querier, "mgmt-test-azure-timeout") + require.NoError(t, err) + + agents, err := models.FindAgents(db.Querier, models.AgentFilters{ServiceID: service.ServiceID}) + require.NoError(t, err) + require.Len(t, agents, 2) + + got := map[models.AgentType]time.Duration{} + for _, agent := range agents { + got[agent.AgentType] = pointer.Get(agent.ExporterOptions.ConnectionTimeout) + } + + assert.Zero(t, got[models.AzureDatabaseExporterType]) + assert.Equal(t, want.AsDuration(), got[models.MySQLdExporterType]) + }) + + t.Run("RDS MySQL", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + resp, err := s.addRDS(ctx, &managementv1.AddRDSServiceParams{ + Region: "us-east-1", + Az: "us-east-1b", + InstanceId: "mgmt-test-rds-mysql-timeout", + NodeModel: "db.t3.micro", + Address: "mgmt-test-rds-mysql-timeout.example.com", + Port: 3306, + Engine: managementv1.DiscoverRDSEngine_DISCOVER_RDS_ENGINE_MYSQL, + Username: "root", + Password: "secret", + AwsAccessKey: "access-key", + AwsSecretKey: "secret-key", + RdsExporter: true, + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetRds()) + assert.Equal(t, want, resp.GetRds().GetMysqldExporter().GetConnectionTimeout()) + }) + + t.Run("RDS PostgreSQL", func(t *testing.T) { + state.On("RequestStateUpdate", ctx, models.PMMServerAgentID).Once() + + resp, err := s.addRDS(ctx, &managementv1.AddRDSServiceParams{ + Region: "us-east-1", + Az: "us-east-1b", + InstanceId: "mgmt-test-rds-pg-timeout", + NodeModel: "db.t3.micro", + Address: "mgmt-test-rds-pg-timeout.example.com", + Port: 5432, + Engine: managementv1.DiscoverRDSEngine_DISCOVER_RDS_ENGINE_POSTGRESQL, + Database: "postgres", + Username: "postgres", + Password: "secret", + AwsAccessKey: "access-key", + AwsSecretKey: "secret-key", + RdsExporter: true, + SkipConnectionCheck: true, + MetricsMode: managementv1.MetricsMode_METRICS_MODE_PULL, + ConnectionTimeout: want, + AutoDiscoveryLimit: 10, + MaxPostgresqlExporterConnections: 15, + }) + require.NoError(t, err) + require.NotNil(t, resp.GetRds()) + assert.Equal(t, want, resp.GetRds().GetPostgresqlExporter().GetConnectionTimeout()) + }) +} diff --git a/managed/services/management/agent.go b/managed/services/management/agent.go index bae1d2c0c28..138cc454409 100644 --- a/managed/services/management/agent.go +++ b/managed/services/management/agent.go @@ -175,6 +175,9 @@ func (s *ManagementService) agentToAPI(agent *models.Agent) (*managementv1.Unive ua.MetricsScheme = agent.ExporterOptions.MetricsScheme ua.PushMetrics = agent.ExporterOptions.PushMetrics ua.ExposeExporter = agent.ExporterOptions.ExposeExporter + if agent.ExporterOptions.ConnectionTimeout != nil { + ua.ConnectionTimeout = durationpb.New(*agent.ExporterOptions.ConnectionTimeout) + } // QAN options ua.MaxQueryLength = agent.QANOptions.MaxQueryLength diff --git a/managed/services/management/azure_database.go b/managed/services/management/azure_database.go index a8a6fe0c24c..64d87eca376 100644 --- a/managed/services/management/azure_database.go +++ b/managed/services/management/azure_database.go @@ -31,6 +31,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" "github.com/percona/pmm/utils/logger" ) @@ -277,6 +278,9 @@ func (s *ManagementService) AddAzureDatabase(ctx context.Context, req *managemen Password: req.Password, TLS: req.Tls, TLSSkipVerify: req.TlsSkipVerify, + ExporterOptions: models.ExporterOptions{ + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), + }, MySQLOptions: models.MySQLOptions{ TableCountTablestatsGroupLimit: tablestatsGroupTableLimit, }, diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index 15573547446..7671db6748d 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -25,6 +25,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" ) // AddMongoDB adds "MongoDB Service", "MongoDB Exporter Agent", "QAN MongoDB Profiler" and "Real-Time Analytics Agent". @@ -77,6 +78,7 @@ func (s *ManagementService) addMongoDB(ctx context.Context, req *managementv1.Ad ExposeExporter: req.ExposeExporter, PushMetrics: isPushMode(req.MetricsMode), DisabledCollectors: req.DisableCollectors, + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, }) if err != nil { diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index baa9e60f42a..564b04e28c1 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -25,6 +25,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" ) const ( @@ -105,6 +106,7 @@ func (s *ManagementService) addMySQL(ctx context.Context, req *managementv1.AddM ExposeExporter: req.ExposeExporter, PushMetrics: isPushMode(req.MetricsMode), DisabledCollectors: req.DisableCollectors, + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, LogLevel: services.SpecifyLogLevel(req.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), }) diff --git a/managed/services/management/postgresql.go b/managed/services/management/postgresql.go index 2a976287333..7fa898f1ef5 100644 --- a/managed/services/management/postgresql.go +++ b/managed/services/management/postgresql.go @@ -25,6 +25,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" ) // AddPostgreSQL adds "PostgreSQL Service", "PostgreSQL Exporter Agent" and "QAN PostgreSQL PerfSchema Agent". @@ -76,6 +77,7 @@ func (s *ManagementService) addPostgreSQL(ctx context.Context, req *managementv1 ExposeExporter: req.ExposeExporter, PushMetrics: isPushMode(req.MetricsMode), DisabledCollectors: req.DisableCollectors, + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), LogLevel: services.SpecifyLogLevel(req.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), diff --git a/managed/services/management/proxysql.go b/managed/services/management/proxysql.go index addbb8f8728..93e0210f5f4 100644 --- a/managed/services/management/proxysql.go +++ b/managed/services/management/proxysql.go @@ -25,6 +25,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" ) // AddProxySQL adds "ProxySQL Service", "ProxySQL Exporter Agent" and "QAN ProxySQL PerfSchema Agent". @@ -74,6 +75,7 @@ func (s *ManagementService) addProxySQL(ctx context.Context, req *managementv1.A ExposeExporter: req.ExposeExporter, PushMetrics: isPushMode(req.MetricsMode), DisabledCollectors: req.DisableCollectors, + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, LogLevel: services.SpecifyLogLevel(req.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), }) diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index 2e9b8a1222a..0f6c2603738 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -39,6 +39,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" "github.com/percona/pmm/utils/logger" ) @@ -364,7 +365,8 @@ func (s *ManagementService) addRDS(ctx context.Context, req *managementv1.AddRDS TLS: req.Tls, TLSSkipVerify: req.TlsSkipVerify, ExporterOptions: models.ExporterOptions{ - PushMetrics: isPushMode(metricsMode), + PushMetrics: isPushMode(metricsMode), + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, MySQLOptions: models.MySQLOptions{ TableCountTablestatsGroupLimit: tablestatsGroupTableLimit, @@ -445,7 +447,8 @@ func (s *ManagementService) addRDS(ctx context.Context, req *managementv1.AddRDS TLS: req.Tls, TLSSkipVerify: req.TlsSkipVerify, ExporterOptions: models.ExporterOptions{ - PushMetrics: isPushMode(metricsMode), + PushMetrics: isPushMode(metricsMode), + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, MySQLOptions: models.MySQLOptions{ TableCountTablestatsGroupLimit: tablestatsGroupTableLimit, diff --git a/managed/services/management/valkey.go b/managed/services/management/valkey.go index 1518893e647..66cfee7ca9e 100644 --- a/managed/services/management/valkey.go +++ b/managed/services/management/valkey.go @@ -25,6 +25,7 @@ import ( managementv1 "github.com/percona/pmm/api/management/v1" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/duration" ) // addValkey adds a new Valkey service and an accompanying "Valkey Exporter agent". @@ -71,8 +72,9 @@ func (s *ManagementService) addValkey(ctx context.Context, req *managementv1.Add TLS: req.Tls, TLSSkipVerify: req.TlsSkipVerify, ExporterOptions: models.ExporterOptions{ - ExposeExporter: req.ExposeExporter, - PushMetrics: isPushMode(req.MetricsMode), + ExposeExporter: req.ExposeExporter, + PushMetrics: isPushMode(req.MetricsMode), + ConnectionTimeout: duration.OptionalFromProto(req.ConnectionTimeout), }, ValkeyOptions: models.ValkeyOptionsFromRequest(req), }) diff --git a/managed/utils/duration/duration.go b/managed/utils/duration/duration.go new file mode 100644 index 00000000000..53d9c3cb59f --- /dev/null +++ b/managed/utils/duration/duration.go @@ -0,0 +1,33 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package duration provides utilities for working with time durations. +package duration + +import ( + "time" + + "github.com/AlekSi/pointer" + durationpb "google.golang.org/protobuf/types/known/durationpb" +) + +// OptionalFromProto converts a protobuf Duration to a *time.Duration, preserving nil vs zero. +func OptionalFromProto(d *durationpb.Duration) *time.Duration { + if d == nil { + return nil + } + + return pointer.To(d.AsDuration()) +} diff --git a/managed/utils/duration/duration_test.go b/managed/utils/duration/duration_test.go new file mode 100644 index 00000000000..33ac1606c0d --- /dev/null +++ b/managed/utils/duration/duration_test.go @@ -0,0 +1,42 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package duration + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/durationpb" +) + +func TestOptionalFromProto(t *testing.T) { + t.Run("nil", func(t *testing.T) { + require.Nil(t, OptionalFromProto(nil)) + }) + + t.Run("zero", func(t *testing.T) { + actual := OptionalFromProto(durationpb.New(0)) + require.NotNil(t, actual) + require.Equal(t, time.Duration(0), *actual) + }) + + t.Run("non-zero", func(t *testing.T) { + actual := OptionalFromProto(durationpb.New(1500 * time.Millisecond)) + require.NotNil(t, actual) + require.Equal(t, 1500*time.Millisecond, *actual) + }) +}