From d4605119655c7871c1a857a531b13834a2fef6f9 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Wed, 8 Jul 2026 16:21:54 +0200 Subject: [PATCH 01/12] PMM-15130 Validate connection on agent params change --- .../change_agent_external_exporter.go | 16 +- .../change_agent_mongodb_exporter.go | 4 + .../inventory/change_agent_mysqld_exporter.go | 4 + .../change_agent_postgres_exporter.go | 4 + .../change_agent_proxysql_exporter.go | 24 ++- ...change_agent_qan_mongodb_mongolog_agent.go | 4 + ...change_agent_qan_mongodb_profiler_agent.go | 4 + ...change_agent_qan_mysql_perfschema_agent.go | 4 + .../change_agent_qan_mysql_slowlog_agent.go | 4 + ...agent_qan_postgresql_pgstatements_agent.go | 4 + ...gent_qan_postgresql_pgstatmonitor_agent.go | 4 + .../inventory/change_agent_rta_mongodb.go | 4 + .../inventory/change_agent_valkey_exporter.go | 30 +-- .../agents_external_exporter_test.go | 20 +- .../inventory/agents_mongodb_exporter_test.go | 7 +- .../inventory/agents_mysqld_exporter_test.go | 8 +- .../agents_postgres_exporter_test.go | 79 ++++++-- .../agents_proxysql_exporter_test.go | 22 ++- .../agents_qan_mongodb_profiler_test.go | 22 ++- .../agents_qan_mysql_slowlog_test.go | 12 +- api-tests/inventory/agents_qan_mysql_test.go | 12 +- ...agents_qan_postgresql_pgstatements_test.go | 22 ++- ...gents_qan_postgresql_pgstatmonitor_test.go | 12 +- .../inventory/agents_rta_mongodb_test.go | 20 +- api/inventory/v1/agents.pb.go | 184 +++++++++++++----- api/inventory/v1/agents.pb.validate.go | 32 +++ api/inventory/v1/agents.proto | 16 ++ .../agents_service/change_agent_responses.go | 24 +++ api/inventory/v1/json/v1.json | 48 +++++ api/swagger/swagger-dev.json | 48 +++++ api/swagger/swagger.json | 48 +++++ managed/models/agent_helpers.go | 43 ++++ managed/models/agent_helpers_test.go | 60 ++++++ managed/services/inventory/agents.go | 51 +++-- managed/services/inventory/agents_test.go | 111 +++++++++++ 35 files changed, 842 insertions(+), 169 deletions(-) diff --git a/admin/commands/inventory/change_agent_external_exporter.go b/admin/commands/inventory/change_agent_external_exporter.go index 08e2f944cfb..3a54560ab50 100644 --- a/admin/commands/inventory/change_agent_external_exporter.go +++ b/admin/commands/inventory/change_agent_external_exporter.go @@ -72,6 +72,9 @@ type ChangeAgentExternalExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentExternalExporterCommand and returns the result. @@ -82,12 +85,13 @@ func (cmd *ChangeAgentExternalExporterCommand) RunCmd() (commands.Result, error) customLabels := commands.ParseKeyValuePair(cmd.CustomLabels) body := &agents.ChangeAgentParamsBodyExternalExporter{ - Enable: cmd.Enable, - Username: cmd.Username, - ListenPort: cmd.ListenPort, - Scheme: cmd.MetricsScheme, - MetricsPath: cmd.MetricsPath, - EnablePushMetrics: cmd.PushMetrics, + Enable: cmd.Enable, + Username: cmd.Username, + ListenPort: cmd.ListenPort, + Scheme: cmd.MetricsScheme, + MetricsPath: cmd.MetricsPath, + EnablePushMetrics: cmd.PushMetrics, + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_mongodb_exporter.go b/admin/commands/inventory/change_agent_mongodb_exporter.go index b6bf3d413d3..ce0187ef8c8 100644 --- a/admin/commands/inventory/change_agent_mongodb_exporter.go +++ b/admin/commands/inventory/change_agent_mongodb_exporter.go @@ -95,6 +95,9 @@ type ChangeAgentMongodbExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentMongodbExporterCommand and returns the result. @@ -152,6 +155,7 @@ func (cmd *ChangeAgentMongodbExporterCommand) RunCmd() (commands.Result, error) ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } 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..d393d433ac1 100644 --- a/admin/commands/inventory/change_agent_mysqld_exporter.go +++ b/admin/commands/inventory/change_agent_mysqld_exporter.go @@ -89,6 +89,9 @@ type ChangeAgentMysqldExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentMysqldExporterCommand and returns the result. @@ -143,6 +146,7 @@ func (cmd *ChangeAgentMysqldExporterCommand) RunCmd() (commands.Result, error) { ExposeExporter: cmd.ExposeExporter, EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } 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..4a572daec76 100644 --- a/admin/commands/inventory/change_agent_postgres_exporter.go +++ b/admin/commands/inventory/change_agent_postgres_exporter.go @@ -90,6 +90,9 @@ type ChangeAgentPostgresExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentPostgresExporterCommand and returns the result. @@ -145,6 +148,7 @@ func (cmd *ChangeAgentPostgresExporterCommand) RunCmd() (commands.Result, error) AutoDiscoveryLimit: cmd.AutoDiscoveryLimit, MaxExporterConnections: cmd.MaxExporterConnections, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } 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..926864bc432 100644 --- a/admin/commands/inventory/change_agent_proxysql_exporter.go +++ b/admin/commands/inventory/change_agent_proxysql_exporter.go @@ -85,6 +85,9 @@ type ChangeAgentProxysqlExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentProxysqlExporterCommand and returns the result. @@ -95,16 +98,17 @@ func (cmd *ChangeAgentProxysqlExporterCommand) RunCmd() (commands.Result, error) customLabels := commands.ParseKeyValuePair(cmd.CustomLabels) body := &agents.ChangeAgentParamsBodyProxysqlExporter{ - Enable: cmd.Enable, - Username: cmd.Username, - Password: cmd.Password, - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - DisableCollectors: cmd.DisableCollectors, - AgentPassword: cmd.AgentPassword, - ExposeExporter: cmd.ExposeExporter, - EnablePushMetrics: cmd.PushMetrics, - LogLevel: convertLogLevelPtr(cmd.LogLevel), + Enable: cmd.Enable, + Username: cmd.Username, + Password: cmd.Password, + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + DisableCollectors: cmd.DisableCollectors, + AgentPassword: cmd.AgentPassword, + ExposeExporter: cmd.ExposeExporter, + EnablePushMetrics: cmd.PushMetrics, + LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go index 8544d242d73..a6b6c49c3c2 100644 --- a/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go @@ -86,6 +86,9 @@ type ChangeAgentQANMongoDBMongologAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMongoDBMongologAgentCommand and returns the result. @@ -126,6 +129,7 @@ func (cmd *ChangeAgentQANMongoDBMongologAgentCommand) RunCmd() (commands.Result, AuthenticationMechanism: cmd.AuthenticationMechanism, AuthenticationDatabase: cmd.AuthenticationDatabase, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } // Parse custom labels if provided diff --git a/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go b/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go index 29ae17ad44e..99edaad1331 100644 --- a/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go +++ b/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go @@ -87,6 +87,9 @@ type ChangeAgentQANMongoDBProfilerAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMongoDBProfilerAgentCommand and returns the result. @@ -130,6 +133,7 @@ func (cmd *ChangeAgentQANMongoDBProfilerAgentCommand) RunCmd() (commands.Result, AuthenticationDatabase: cmd.AuthenticationDatabase, MaxQueryLength: cmd.MaxQueryLength, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go b/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go index 5f8c1040ef2..77d10c6ddbb 100644 --- a/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go +++ b/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go @@ -84,6 +84,9 @@ type ChangeAgentQANMySQLPerfSchemaAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMySQLPerfSchemaAgentCommand and returns the result. @@ -135,6 +138,7 @@ func (cmd *ChangeAgentQANMySQLPerfSchemaAgentCommand) RunCmd() (commands.Result, DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go b/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go index 4ed0fd2cab9..cb00dbb2848 100644 --- a/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go +++ b/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go @@ -85,6 +85,9 @@ type ChangeAgentQANMySQLSlowlogAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMySQLSlowlogAgentCommand and returns the result. @@ -135,6 +138,7 @@ func (cmd *ChangeAgentQANMySQLSlowlogAgentCommand) RunCmd() (commands.Result, er DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go b/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go index 883f6097261..3bb37e45bc4 100644 --- a/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go +++ b/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go @@ -85,6 +85,9 @@ type ChangeAgentQANPostgreSQLPgStatementsAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANPostgreSQLPgStatementsAgentCommand and returns the result. @@ -133,6 +136,7 @@ func (cmd *ChangeAgentQANPostgreSQLPgStatementsAgentCommand) RunCmd() (commands. MaxQueryLength: cmd.MaxQueryLength, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go b/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go index f8fde3deb58..0459b73537b 100644 --- a/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go +++ b/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go @@ -87,6 +87,9 @@ type ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand and returns the result. @@ -136,6 +139,7 @@ func (cmd *ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand) RunCmd() (commands DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_rta_mongodb.go b/admin/commands/inventory/change_agent_rta_mongodb.go index 776046e3d52..780111a8847 100644 --- a/admin/commands/inventory/change_agent_rta_mongodb.go +++ b/admin/commands/inventory/change_agent_rta_mongodb.go @@ -86,6 +86,9 @@ type ChangeAgentRTAMongoDBAgentCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentRTAMongoDBAgentCommand and returns the result. @@ -127,6 +130,7 @@ func (cmd *ChangeAgentRTAMongoDBAgentCommand) RunCmd() (commands.Result, error) TLSCa: tlsCa, AuthenticationMechanism: cmd.AuthenticationMechanism, LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } 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..11e6797dd2e 100644 --- a/admin/commands/inventory/change_agent_valkey_exporter.go +++ b/admin/commands/inventory/change_agent_valkey_exporter.go @@ -87,6 +87,9 @@ type ChangeAgentValkeyExporterCommand struct { // Custom labels CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` + + // Connection check + SkipConnectionCheck bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentValkeyExporterCommand and returns the result. @@ -124,19 +127,20 @@ func (cmd *ChangeAgentValkeyExporterCommand) RunCmd() (commands.Result, error) { } body := &agents.ChangeAgentParamsBodyValkeyExporter{ - Enable: cmd.Enable, - Username: cmd.Username, - Password: cmd.Password, - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - AgentPassword: cmd.AgentPassword, - TLSCa: tlsCa, - TLSCert: tlsCert, - TLSKey: tlsKey, - DisableCollectors: cmd.DisableCollectors, - ExposeExporter: cmd.ExposeExporter, - EnablePushMetrics: cmd.PushMetrics, - LogLevel: convertLogLevelPtr(cmd.LogLevel), + Enable: cmd.Enable, + Username: cmd.Username, + Password: cmd.Password, + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + AgentPassword: cmd.AgentPassword, + TLSCa: tlsCa, + TLSCert: tlsCert, + TLSKey: tlsKey, + DisableCollectors: cmd.DisableCollectors, + ExposeExporter: cmd.ExposeExporter, + EnablePushMetrics: cmd.PushMetrics, + LogLevel: convertLogLevelPtr(cmd.LogLevel), + SkipConnectionCheck: &cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/api-tests/inventory/agents_external_exporter_test.go b/api-tests/inventory/agents_external_exporter_test.go index b99a2eb092a..628d5b5348d 100644 --- a/api-tests/inventory/agents_external_exporter_test.go +++ b/api-tests/inventory/agents_external_exporter_test.go @@ -453,7 +453,8 @@ func TestExternalExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ExternalExporter: &agents.ChangeAgentParamsBodyExternalExporter{ - Username: new("rotated-external-user"), + SkipConnectionCheck: new(true), + Username: new("rotated-external-user"), }, }, Context: pmmapitests.Context, @@ -467,8 +468,9 @@ func TestExternalExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ExternalExporter: &agents.ChangeAgentParamsBodyExternalExporter{ - Scheme: new("http"), - MetricsPath: new("/new-metrics"), + SkipConnectionCheck: new(true), + Scheme: new("http"), + MetricsPath: new("/new-metrics"), }, }, Context: pmmapitests.Context, @@ -527,7 +529,8 @@ func TestExternalExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ExternalExporter: &agents.ChangeAgentParamsBodyExternalExporter{ - Username: new("changed-external-user"), + SkipConnectionCheck: new(true), + Username: new("changed-external-user"), // Note: custom labels, scheme, metrics path, push metrics are NOT specified }, }, @@ -598,10 +601,11 @@ func TestExternalExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ExternalExporter: &agents.ChangeAgentParamsBodyExternalExporter{ - Username: new("changed-external-user"), - Scheme: new("https"), - MetricsPath: new("/new-metrics"), - ListenPort: new(int64(8080)), + SkipConnectionCheck: new(true), + Username: new("changed-external-user"), + Scheme: new("https"), + MetricsPath: new("/new-metrics"), + ListenPort: new(int64(8080)), CustomLabels: &agents.ChangeAgentParamsBodyExternalExporterCustomLabels{ Values: map[string]string{ "environment": "production", diff --git a/api-tests/inventory/agents_mongodb_exporter_test.go b/api-tests/inventory/agents_mongodb_exporter_test.go index 7620c751596..8205c7a5184 100644 --- a/api-tests/inventory/agents_mongodb_exporter_test.go +++ b/api-tests/inventory/agents_mongodb_exporter_test.go @@ -599,7 +599,8 @@ func TestMongoDBExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ MongodbExporter: &agents.ChangeAgentParamsBodyMongodbExporter{ - Password: new("rotated-mongodb-password-456"), + SkipConnectionCheck: new(true), + Password: new("rotated-mongodb-password-456"), }, }, Context: pmmapitests.Context, @@ -627,6 +628,7 @@ func TestMongoDBExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ MongodbExporter: &agents.ChangeAgentParamsBodyMongodbExporter{ + SkipConnectionCheck: new(true), Username: new("new-mongodb-user"), Password: new("final-mongodb-password-789"), AuthenticationMechanism: new("SCRAM-SHA-256"), @@ -714,7 +716,8 @@ func TestMongoDBExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ MongodbExporter: &agents.ChangeAgentParamsBodyMongodbExporter{ - Password: new("new-password-only"), + SkipConnectionCheck: new(true), + Password: new("new-password-only"), // All other fields are intentionally NOT set (nil) }, }, diff --git a/api-tests/inventory/agents_mysqld_exporter_test.go b/api-tests/inventory/agents_mysqld_exporter_test.go index c31ef23e9f0..1bcf995e57e 100644 --- a/api-tests/inventory/agents_mysqld_exporter_test.go +++ b/api-tests/inventory/agents_mysqld_exporter_test.go @@ -770,7 +770,8 @@ func TestMySQLdExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ MysqldExporter: &agents.ChangeAgentParamsBodyMysqldExporter{ - Password: new("rotated-password-456"), + SkipConnectionCheck: new(true), + Password: new("rotated-password-456"), }, }, Context: pmmapitests.Context, @@ -798,8 +799,9 @@ func TestMySQLdExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ MysqldExporter: &agents.ChangeAgentParamsBodyMysqldExporter{ - Username: new("new-mysql-user"), - Password: new("final-password-789"), + SkipConnectionCheck: new(true), + Username: new("new-mysql-user"), + Password: new("final-password-789"), }, }, Context: pmmapitests.Context, diff --git a/api-tests/inventory/agents_postgres_exporter_test.go b/api-tests/inventory/agents_postgres_exporter_test.go index 0790e7acf45..49f46c2533f 100644 --- a/api-tests/inventory/agents_postgres_exporter_test.go +++ b/api-tests/inventory/agents_postgres_exporter_test.go @@ -413,12 +413,13 @@ func TestPostgresExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ PostgresExporter: &agents.ChangeAgentParamsBodyPostgresExporter{ - TLS: new(true), - TLSSkipVerify: new(false), - AgentPassword: new("new-agent-password"), - LogLevel: new(agents.ChangeAgentParamsBodyPostgresExporterLogLevelLOGLEVELWARN), - DisableCollectors: []string{"collector1", "collector2"}, - ExposeExporter: new(true), + SkipConnectionCheck: new(true), + TLS: new(true), + TLSSkipVerify: new(false), + AgentPassword: new("new-agent-password"), + LogLevel: new(agents.ChangeAgentParamsBodyPostgresExporterLogLevelLOGLEVELWARN), + DisableCollectors: []string{"collector1", "collector2"}, + ExposeExporter: new(true), }, }, Context: pmmapitests.Context, @@ -476,7 +477,8 @@ func TestPostgresExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ PostgresExporter: &agents.ChangeAgentParamsBodyPostgresExporter{ - Password: new("rotated-postgres-password-456"), + SkipConnectionCheck: new(true), + Password: new("rotated-postgres-password-456"), }, }, Context: pmmapitests.Context, @@ -504,10 +506,11 @@ func TestPostgresExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ PostgresExporter: &agents.ChangeAgentParamsBodyPostgresExporter{ - Username: new("new-postgres-user"), - Password: new("final-postgres-password-789"), - TLS: new(true), - TLSSkipVerify: new(false), + SkipConnectionCheck: new(true), + Username: new("new-postgres-user"), + Password: new("final-postgres-password-789"), + TLS: new(true), + TLSSkipVerify: new(false), }, }, Context: pmmapitests.Context, @@ -528,6 +531,57 @@ func TestPostgresExporter(t *testing.T) { assert.False(t, getAgentRes.Payload.PostgresExporter.Disabled) }) + t.Run("ChangeConnectionCheckFails", func(t *testing.T) { + t.Parallel() + + genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID + nodeID := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for postgres exporter")).NodeID + + service := pmmapitests.AddService(t, services.AddServiceBody{ + Postgresql: &services.AddServiceParamsBodyPostgresql{ + NodeID: genericNodeID, + Address: pmmapitests.TestString(t, "localhost"), + Port: 5432, + ServiceName: pmmapitests.TestString(t, "PostgreSQL Service for connection check test"), + }, + }) + serviceID := service.Postgresql.ServiceID + pmmAgentID := pmmapitests.AddPMMAgent(t, nodeID).AgentID + + res := pmmapitests.AddAgent(t, agents.AddAgentBody{ + PostgresExporter: &agents.AddAgentParamsBodyPostgresExporter{ + ServiceID: serviceID, + Username: "username", + Password: "password", + PMMAgentID: pmmAgentID, + SkipConnectionCheck: true, + }, + }) + agentID := res.PostgresExporter.AgentID + + // Changing a connection-affecting field without SkipConnectionCheck triggers + // a connection check, which fails because pmm-agent is not connected. + _, err := client.Default.AgentsService.ChangeAgent(&agents.ChangeAgentParams{ + AgentID: agentID, + Body: agents.ChangeAgentBody{ + PostgresExporter: &agents.ChangeAgentParamsBodyPostgresExporter{ + Password: new("wrong-password"), + }, + }, + Context: pmmapitests.Context, + }) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.FailedPrecondition, "is not currently connected") + + // Verify that the change was not applied. + getAgentRes, err := client.Default.AgentsService.GetAgent(&agents.GetAgentParams{ + AgentID: agentID, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + require.NotNil(t, getAgentRes.Payload.PostgresExporter) + assert.Equal(t, "username", getAgentRes.Payload.PostgresExporter.Username) + }) + t.Run("ChangeOnlySpecifiedFields_KeepOthersUnchanged", func(t *testing.T) { t.Parallel() @@ -591,7 +645,8 @@ func TestPostgresExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ PostgresExporter: &agents.ChangeAgentParamsBodyPostgresExporter{ - Password: new("new-password-only"), + SkipConnectionCheck: new(true), + Password: new("new-password-only"), // All other fields are intentionally NOT set (nil) }, }, diff --git a/api-tests/inventory/agents_proxysql_exporter_test.go b/api-tests/inventory/agents_proxysql_exporter_test.go index 003bdb2e9d5..39ca990c2eb 100644 --- a/api-tests/inventory/agents_proxysql_exporter_test.go +++ b/api-tests/inventory/agents_proxysql_exporter_test.go @@ -404,7 +404,8 @@ func TestProxySQLExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ProxysqlExporter: &agents.ChangeAgentParamsBodyProxysqlExporter{ - Password: new("new-rotated-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-password"), }, }, Context: pmmapitests.Context, @@ -418,8 +419,9 @@ func TestProxySQLExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ProxysqlExporter: &agents.ChangeAgentParamsBodyProxysqlExporter{ - Username: new("new-proxysql-user"), - Password: new("another-new-password"), + SkipConnectionCheck: new(true), + Username: new("new-proxysql-user"), + Password: new("another-new-password"), }, }, Context: pmmapitests.Context, @@ -477,7 +479,8 @@ func TestProxySQLExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ProxysqlExporter: &agents.ChangeAgentParamsBodyProxysqlExporter{ - Username: new("changed-user"), + SkipConnectionCheck: new(true), + Username: new("changed-user"), // Note: password, custom labels, push metrics, and log level are NOT specified }, }, @@ -546,11 +549,12 @@ func TestProxySQLExporter(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ ProxysqlExporter: &agents.ChangeAgentParamsBodyProxysqlExporter{ - Username: new("new-proxysql-user"), - Password: new("new-proxysql-password"), - LogLevel: new("LOG_LEVEL_ERROR"), - EnablePushMetrics: new(true), - DisableCollectors: []string{"mysql_connection_pool", "mysql_connection_list"}, + SkipConnectionCheck: new(true), + Username: new("new-proxysql-user"), + Password: new("new-proxysql-password"), + LogLevel: new("LOG_LEVEL_ERROR"), + EnablePushMetrics: new(true), + DisableCollectors: []string{"mysql_connection_pool", "mysql_connection_list"}, CustomLabels: &agents.ChangeAgentParamsBodyProxysqlExporterCustomLabels{ Values: map[string]string{ "environment": "production", diff --git a/api-tests/inventory/agents_qan_mongodb_profiler_test.go b/api-tests/inventory/agents_qan_mongodb_profiler_test.go index a70d275bb80..5a9531fa39c 100644 --- a/api-tests/inventory/agents_qan_mongodb_profiler_test.go +++ b/api-tests/inventory/agents_qan_mongodb_profiler_test.go @@ -181,7 +181,8 @@ func TestQANMongoDBProfilerAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMongodbProfilerAgent: &agents.ChangeAgentParamsBodyQANMongodbProfilerAgent{ - Password: new("new-rotated-mongodb-profiler-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-mongodb-profiler-password"), }, }, Context: pmmapitests.Context, @@ -195,8 +196,9 @@ func TestQANMongoDBProfilerAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMongodbProfilerAgent: &agents.ChangeAgentParamsBodyQANMongodbProfilerAgent{ - Username: new("new-mongodb-profiler-user"), - Password: new("another-new-mongodb-profiler-password"), + SkipConnectionCheck: new(true), + Username: new("new-mongodb-profiler-user"), + Password: new("another-new-mongodb-profiler-password"), }, }, Context: pmmapitests.Context, @@ -256,7 +258,8 @@ func TestQANMongoDBProfilerAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMongodbProfilerAgent: &agents.ChangeAgentParamsBodyQANMongodbProfilerAgent{ - Username: new("updated-profiler-user"), + SkipConnectionCheck: new(true), + Username: new("updated-profiler-user"), }, }, Context: pmmapitests.Context, @@ -325,11 +328,12 @@ func TestQANMongoDBProfilerAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMongodbProfilerAgent: &agents.ChangeAgentParamsBodyQANMongodbProfilerAgent{ - Username: new("changed-mongodb-user"), - Password: new("changed-mongodb-password"), - MaxQueryLength: new(int32(4096)), - TLS: new(true), - TLSSkipVerify: new(false), + SkipConnectionCheck: new(true), + Username: new("changed-mongodb-user"), + Password: new("changed-mongodb-password"), + MaxQueryLength: new(int32(4096)), + TLS: new(true), + TLSSkipVerify: new(false), CustomLabels: &agents.ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels{ Values: map[string]string{ "environment": "production", diff --git a/api-tests/inventory/agents_qan_mysql_slowlog_test.go b/api-tests/inventory/agents_qan_mysql_slowlog_test.go index bf8b8118268..d5080c80999 100644 --- a/api-tests/inventory/agents_qan_mysql_slowlog_test.go +++ b/api-tests/inventory/agents_qan_mysql_slowlog_test.go @@ -186,7 +186,8 @@ func TestQANMySQLSlowlogAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlSlowlogAgent: &agents.ChangeAgentParamsBodyQANMysqlSlowlogAgent{ - Password: new("new-rotated-mysql-slowlog-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-mysql-slowlog-password"), }, }, Context: pmmapitests.Context, @@ -200,8 +201,9 @@ func TestQANMySQLSlowlogAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlSlowlogAgent: &agents.ChangeAgentParamsBodyQANMysqlSlowlogAgent{ - Username: new("new-mysql-slowlog-user"), - Password: new("another-new-mysql-slowlog-password"), + SkipConnectionCheck: new(true), + Username: new("new-mysql-slowlog-user"), + Password: new("another-new-mysql-slowlog-password"), }, }, Context: pmmapitests.Context, @@ -261,7 +263,8 @@ func TestQANMySQLSlowlogAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlSlowlogAgent: &agents.ChangeAgentParamsBodyQANMysqlSlowlogAgent{ - Username: new("updated-slowlog-user"), + SkipConnectionCheck: new(true), + Username: new("updated-slowlog-user"), }, }, Context: pmmapitests.Context, @@ -335,6 +338,7 @@ func TestQANMySQLSlowlogAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlSlowlogAgent: &agents.ChangeAgentParamsBodyQANMysqlSlowlogAgent{ + SkipConnectionCheck: new(true), Username: new("changed-slowlog-user"), Password: new("changed-slowlog-password"), MaxQueryLength: new(int32(2048)), diff --git a/api-tests/inventory/agents_qan_mysql_test.go b/api-tests/inventory/agents_qan_mysql_test.go index 99c8e875029..9a03fc152bc 100644 --- a/api-tests/inventory/agents_qan_mysql_test.go +++ b/api-tests/inventory/agents_qan_mysql_test.go @@ -182,7 +182,8 @@ func TestQANMySQLPerfSchemaAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlPerfschemaAgent: &agents.ChangeAgentParamsBodyQANMysqlPerfschemaAgent{ - Password: new("new-rotated-mysql-qan-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-mysql-qan-password"), }, }, Context: pmmapitests.Context, @@ -196,8 +197,9 @@ func TestQANMySQLPerfSchemaAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlPerfschemaAgent: &agents.ChangeAgentParamsBodyQANMysqlPerfschemaAgent{ - Username: new("new-mysql-qan-user"), - Password: new("another-new-mysql-qan-password"), + SkipConnectionCheck: new(true), + Username: new("new-mysql-qan-user"), + Password: new("another-new-mysql-qan-password"), }, }, Context: pmmapitests.Context, @@ -254,7 +256,8 @@ func TestQANMySQLPerfSchemaAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlPerfschemaAgent: &agents.ChangeAgentParamsBodyQANMysqlPerfschemaAgent{ - Username: new("changed-mysql-qan-user"), + SkipConnectionCheck: new(true), + Username: new("changed-mysql-qan-user"), // Note: password, custom labels, and log level are NOT specified }, }, @@ -325,6 +328,7 @@ func TestQANMySQLPerfSchemaAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANMysqlPerfschemaAgent: &agents.ChangeAgentParamsBodyQANMysqlPerfschemaAgent{ + SkipConnectionCheck: new(true), Username: new("changed-perfschema-user"), Password: new("changed-perfschema-password"), MaxQueryLength: new(int32(1536)), diff --git a/api-tests/inventory/agents_qan_postgresql_pgstatements_test.go b/api-tests/inventory/agents_qan_postgresql_pgstatements_test.go index 0addbeab4a8..cac13f49b9f 100644 --- a/api-tests/inventory/agents_qan_postgresql_pgstatements_test.go +++ b/api-tests/inventory/agents_qan_postgresql_pgstatements_test.go @@ -182,7 +182,8 @@ func TestPGStatStatementsQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatementsAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent{ - Password: new("new-rotated-postgres-qan-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-postgres-qan-password"), }, }, Context: pmmapitests.Context, @@ -196,8 +197,9 @@ func TestPGStatStatementsQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatementsAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent{ - Username: new("new-postgres-qan-user"), - Password: new("another-new-postgres-qan-password"), + SkipConnectionCheck: new(true), + Username: new("new-postgres-qan-user"), + Password: new("another-new-postgres-qan-password"), }, }, Context: pmmapitests.Context, @@ -257,7 +259,8 @@ func TestPGStatStatementsQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatementsAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent{ - Username: new("updated-pgstatements-user"), + SkipConnectionCheck: new(true), + Username: new("updated-pgstatements-user"), }, }, Context: pmmapitests.Context, @@ -328,11 +331,12 @@ func TestPGStatStatementsQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatementsAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent{ - Username: new("changed-pgstatements-user"), - Password: new("changed-pgstatements-password"), - MaxQueryLength: new(int32(4096)), - TLS: new(true), - TLSSkipVerify: new(false), + SkipConnectionCheck: new(true), + Username: new("changed-pgstatements-user"), + Password: new("changed-pgstatements-password"), + MaxQueryLength: new(int32(4096)), + TLS: new(true), + TLSSkipVerify: new(false), CustomLabels: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentCustomLabels{ Values: map[string]string{ "environment": "production", diff --git a/api-tests/inventory/agents_qan_postgresql_pgstatmonitor_test.go b/api-tests/inventory/agents_qan_postgresql_pgstatmonitor_test.go index bd8c79e70c8..07226200be1 100644 --- a/api-tests/inventory/agents_qan_postgresql_pgstatmonitor_test.go +++ b/api-tests/inventory/agents_qan_postgresql_pgstatmonitor_test.go @@ -180,7 +180,8 @@ func TestPGStatMonitorQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatmonitorAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent{ - Password: new("new-rotated-postgres-monitor-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-postgres-monitor-password"), }, }, Context: pmmapitests.Context, @@ -194,8 +195,9 @@ func TestPGStatMonitorQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatmonitorAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent{ - Username: new("new-postgres-monitor-user"), - Password: new("another-new-postgres-monitor-password"), + SkipConnectionCheck: new(true), + Username: new("new-postgres-monitor-user"), + Password: new("another-new-postgres-monitor-password"), }, }, Context: pmmapitests.Context, @@ -255,7 +257,8 @@ func TestPGStatMonitorQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatmonitorAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent{ - Username: new("updated-pgstatmonitor-user"), + SkipConnectionCheck: new(true), + Username: new("updated-pgstatmonitor-user"), }, }, Context: pmmapitests.Context, @@ -327,6 +330,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ QANPostgresqlPgstatmonitorAgent: &agents.ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent{ + SkipConnectionCheck: new(true), Username: new("changed-pgstatmonitor-user"), Password: new("changed-pgstatmonitor-password"), MaxQueryLength: new(int32(4096)), diff --git a/api-tests/inventory/agents_rta_mongodb_test.go b/api-tests/inventory/agents_rta_mongodb_test.go index 0aa18eddae6..c3a5c37d665 100644 --- a/api-tests/inventory/agents_rta_mongodb_test.go +++ b/api-tests/inventory/agents_rta_mongodb_test.go @@ -203,7 +203,8 @@ func TestRTAMongoDBAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ RtaMongodbAgent: &agents.ChangeAgentParamsBodyRtaMongodbAgent{ - Password: new("new-rotated-rta-mongodb-password"), + SkipConnectionCheck: new(true), + Password: new("new-rotated-rta-mongodb-password"), }, }, Context: pmmapitests.Context, @@ -217,8 +218,9 @@ func TestRTAMongoDBAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ RtaMongodbAgent: &agents.ChangeAgentParamsBodyRtaMongodbAgent{ - Username: new("new-rta-mongodb-user"), - Password: new("another-new-rta-mongodb-password"), + SkipConnectionCheck: new(true), + Username: new("new-rta-mongodb-user"), + Password: new("another-new-rta-mongodb-password"), }, }, Context: pmmapitests.Context, @@ -279,7 +281,8 @@ func TestRTAMongoDBAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ RtaMongodbAgent: &agents.ChangeAgentParamsBodyRtaMongodbAgent{ - Username: new("updated-profiler-user"), + SkipConnectionCheck: new(true), + Username: new("updated-profiler-user"), }, }, Context: pmmapitests.Context, @@ -349,10 +352,11 @@ func TestRTAMongoDBAgent(t *testing.T) { AgentID: agentID, Body: agents.ChangeAgentBody{ RtaMongodbAgent: &agents.ChangeAgentParamsBodyRtaMongodbAgent{ - Username: new("changed-mongodb-user"), - Password: new("changed-mongodb-password"), - TLS: new(true), - TLSSkipVerify: new(false), + SkipConnectionCheck: new(true), + Username: new("changed-mongodb-user"), + Password: new("changed-mongodb-password"), + TLS: new(true), + TLSSkipVerify: new(false), CustomLabels: &agents.ChangeAgentParamsBodyRtaMongodbAgentCustomLabels{ Values: map[string]string{ "environment": "production", diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index 591af43e6a0..2ec6023d245 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -7039,8 +7039,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 + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,13,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeProxySQLExporterParams) Reset() { @@ -7157,6 +7159,13 @@ func (x *ChangeProxySQLExporterParams) GetExposeExporter() bool { return false } +func (x *ChangeProxySQLExporterParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddQANMySQLPerfSchemaAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -8100,9 +8109,11 @@ type ChangeQANMongoDBProfilerAgentParams struct { // Authentication database. AuthenticationDatabase *string `protobuf:"bytes,14,opt,name=authentication_database,json=authenticationDatabase,proto3,oneof" json:"authentication_database,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"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,16,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeQANMongoDBProfilerAgentParams) Reset() { @@ -8240,6 +8251,13 @@ func (x *ChangeQANMongoDBProfilerAgentParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeQANMongoDBProfilerAgentParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddQANMongoDBMongologAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -8444,9 +8462,11 @@ type ChangeQANMongoDBMongologAgentParams struct { // Authentication database. AuthenticationDatabase *string `protobuf:"bytes,14,opt,name=authentication_database,json=authenticationDatabase,proto3,oneof" json:"authentication_database,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"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,16,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeQANMongoDBMongologAgentParams) Reset() { @@ -8584,6 +8604,13 @@ func (x *ChangeQANMongoDBMongologAgentParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeQANMongoDBMongologAgentParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddQANPostgreSQLPgStatementsAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -8775,9 +8802,11 @@ type ChangeQANPostgreSQLPgStatementsAgentParams struct { // TLS Certificate Key. TlsKey *string `protobuf:"bytes,13,opt,name=tls_key,json=tlsKey,proto3,oneof" json:"tls_key,omitempty"` // Log level for exporter. - LogLevel *LogLevel `protobuf:"varint,14,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,14,opt,name=log_level,json=logLevel,proto3,enum=inventory.v1.LogLevel,oneof" json:"log_level,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,15,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeQANPostgreSQLPgStatementsAgentParams) Reset() { @@ -8908,6 +8937,13 @@ func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeQANPostgreSQLPgStatementsAgentParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddQANPostgreSQLPgStatMonitorAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -9110,9 +9146,11 @@ type ChangeQANPostgreSQLPgStatMonitorAgentParams struct { // TLS Certificate Key. TlsKey *string `protobuf:"bytes,14,opt,name=tls_key,json=tlsKey,proto3,oneof" json:"tls_key,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"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,16,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) Reset() { @@ -9250,6 +9288,13 @@ func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeQANPostgreSQLPgStatMonitorAgentParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddRDSExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -9636,9 +9681,11 @@ type ChangeExternalExporterParams struct { // Path under which metrics are exposed, used to generate URI. MetricsPath *string `protobuf:"bytes,7,opt,name=metrics_path,json=metricsPath,proto3,oneof" json:"metrics_path,omitempty"` // Listen port for scraping metrics. - ListenPort *uint32 `protobuf:"varint,8,opt,name=listen_port,json=listenPort,proto3,oneof" json:"listen_port,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + ListenPort *uint32 `protobuf:"varint,8,opt,name=listen_port,json=listenPort,proto3,oneof" json:"listen_port,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,9,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeExternalExporterParams) Reset() { @@ -9727,6 +9774,13 @@ func (x *ChangeExternalExporterParams) GetListenPort() uint32 { return 0 } +func (x *ChangeExternalExporterParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddAzureDatabaseExporterParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -10253,9 +10307,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"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,16,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeValkeyExporterParams) Reset() { @@ -10393,6 +10449,13 @@ func (x *ChangeValkeyExporterParams) GetLogLevel() LogLevel { return LogLevel_LOG_LEVEL_UNSPECIFIED } +func (x *ChangeValkeyExporterParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type AddRTAMongoDBAgentParams struct { state protoimpl.MessageState `protogen:"open.v1"` // The pmm-agent identifier which runs this instance. @@ -10583,9 +10646,11 @@ type ChangeRTAMongoDBAgentParams struct { // Authentication mechanism. AuthenticationMechanism *string `protobuf:"bytes,11,opt,name=authentication_mechanism,json=authenticationMechanism,proto3,oneof" json:"authentication_mechanism,omitempty"` // Real-Time Analytics options. - RtaOptions *RTAOptions `protobuf:"bytes,12,opt,name=rta_options,json=rtaOptions,proto3,oneof" json:"rta_options,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + RtaOptions *RTAOptions `protobuf:"bytes,12,opt,name=rta_options,json=rtaOptions,proto3,oneof" json:"rta_options,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `protobuf:"varint,13,opt,name=skip_connection_check,json=skipConnectionCheck,proto3,oneof" json:"skip_connection_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeRTAMongoDBAgentParams) Reset() { @@ -10702,6 +10767,13 @@ func (x *ChangeRTAMongoDBAgentParams) GetRtaOptions() *RTAOptions { return nil } +func (x *ChangeRTAMongoDBAgentParams) GetSkipConnectionCheck() bool { + if x != nil && x.SkipConnectionCheck != nil { + return *x.SkipConnectionCheck + } + return false +} + type RemoveAgentRequest struct { state protoimpl.MessageState `protogen:"open.v1"` AgentId string `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` @@ -11606,7 +11678,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0fexpose_exporter\x18\r \x01(\bR\x0eexposeExporter\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\"\xc8\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 +11692,9 @@ 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\x127\n" + + "\x15skip_connection_check\x18\r \x01(\bH\n" + + "R\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11631,7 +11705,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0f_agent_passwordB\f\n" + "\n" + "_log_levelB\x12\n" + - "\x10_expose_exporter\"\xa1\a\n" + + "\x10_expose_exporterB\x18\n" + + "\x16_skip_connection_check\"\xa1\a\n" + " AddQANMySQLPerfSchemaAgentParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11780,7 +11855,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb0\b\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x83\t\n" + "#ChangeQANMongoDBProfilerAgentParams\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" + @@ -11798,7 +11873,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "R\x0emaxQueryLength\x88\x01\x01\x12>\n" + "\x18authentication_mechanism\x18\r \x01(\tH\vR\x17authenticationMechanism\x88\x01\x01\x12<\n" + "\x17authentication_database\x18\x0e \x01(\tH\fR\x16authenticationDatabase\x88\x01\x01\x128\n" + - "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01B\t\n" + + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\x10 \x01(\bH\x0eR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11813,7 +11889,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x19_authentication_mechanismB\x1a\n" + "\x18_authentication_databaseB\f\n" + "\n" + - "_log_level\"\xb9\x06\n" + + "_log_levelB\x18\n" + + "\x16_skip_connection_check\"\xb9\x06\n" + " AddQANMongoDBMongologAgentParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11835,7 +11912,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xb0\b\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x83\t\n" + "#ChangeQANMongoDBMongologAgentParams\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" + @@ -11853,7 +11930,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "R\x0emaxQueryLength\x88\x01\x01\x12>\n" + "\x18authentication_mechanism\x18\r \x01(\tH\vR\x17authenticationMechanism\x88\x01\x01\x12<\n" + "\x17authentication_database\x18\x0e \x01(\tH\fR\x16authenticationDatabase\x88\x01\x01\x128\n" + - "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01B\t\n" + + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\x10 \x01(\bH\x0eR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11868,7 +11946,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x19_authentication_mechanismB\x1a\n" + "\x18_authentication_databaseB\f\n" + "\n" + - "_log_level\"\xc8\x05\n" + + "_log_levelB\x18\n" + + "\x16_skip_connection_check\"\xc8\x05\n" + "'AddQANPostgreSQLPgStatementsAgentParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11889,7 +11968,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0e \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xeb\x06\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xbe\a\n" + "*ChangeQANPostgreSQLPgStatementsAgentParams\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" + @@ -11906,7 +11985,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\btls_cert\x18\f \x01(\tH\n" + "R\atlsCert\x88\x01\x01\x12\x1c\n" + "\atls_key\x18\r \x01(\tH\vR\x06tlsKey\x88\x01\x01\x128\n" + - "\tlog_level\x18\x0e \x01(\x0e2\x16.inventory.v1.LogLevelH\fR\blogLevel\x88\x01\x01B\t\n" + + "\tlog_level\x18\x0e \x01(\x0e2\x16.inventory.v1.LogLevelH\fR\blogLevel\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\x0f \x01(\bH\rR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11921,7 +12001,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\n" + "\b_tls_keyB\f\n" + "\n" + - "_log_level\"\x80\x06\n" + + "_log_levelB\x18\n" + + "\x16_skip_connection_check\"\x80\x06\n" + "(AddQANPostgreSQLPgStatMonitorAgentParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -11943,7 +12024,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc2\a\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x95\b\n" + "+ChangeQANPostgreSQLPgStatMonitorAgentParams\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" + @@ -11961,7 +12042,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "R\x05tlsCa\x88\x01\x01\x12\x1e\n" + "\btls_cert\x18\r \x01(\tH\vR\atlsCert\x88\x01\x01\x12\x1c\n" + "\atls_key\x18\x0e \x01(\tH\fR\x06tlsKey\x88\x01\x01\x128\n" + - "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01B\t\n" + + "\tlog_level\x18\x0f \x01(\x0e2\x16.inventory.v1.LogLevelH\rR\blogLevel\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\x10 \x01(\bH\x0eR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -11977,7 +12059,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\n" + "\b_tls_keyB\f\n" + "\n" + - "_log_level\"\xd1\x04\n" + + "_log_levelB\x18\n" + + "\x16_skip_connection_check\"\xd1\x04\n" + "\x14AddRDSExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12 \n" + @@ -12029,7 +12112,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0ftls_skip_verify\x18\f \x01(\bR\rtlsSkipVerify\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf4\x03\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc7\x04\n" + "\x1cChangeExternalExporterParams\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" + @@ -12039,14 +12122,16 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x06scheme\x18\x06 \x01(\tH\x04R\x06scheme\x88\x01\x01\x12&\n" + "\fmetrics_path\x18\a \x01(\tH\x05R\vmetricsPath\x88\x01\x01\x12$\n" + "\vlisten_port\x18\b \x01(\rH\x06R\n" + - "listenPort\x88\x01\x01B\t\n" + + "listenPort\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\t \x01(\bH\aR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + "\t_usernameB\t\n" + "\a_schemeB\x0f\n" + "\r_metrics_pathB\x0e\n" + - "\f_listen_port\"\xdb\x05\n" + + "\f_listen_portB\x18\n" + + "\x16_skip_connection_check\"\xdb\x05\n" + "\x1eAddAzureDatabaseExporterParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12 \n" + @@ -12111,7 +12196,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\tlog_level\x18\x10 \x01(\x0e2\x16.inventory.v1.LogLevelR\blogLevel\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\"\xcb\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 +12214,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\x127\n" + + "\x15skip_connection_check\x18\x10 \x01(\bH\rR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\x16\n" + "\x14_enable_push_metricsB\v\n" + @@ -12144,7 +12230,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x0f_agent_passwordB\x12\n" + "\x10_expose_exporterB\f\n" + "\n" + - "_log_level\"\x81\x06\n" + + "_log_levelB\x18\n" + + "\x16_skip_connection_check\"\x81\x06\n" + "\x18AddRTAMongoDBAgentParams\x12)\n" + "\fpmm_agent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\n" + "pmmAgentId\x12&\n" + @@ -12166,7 +12253,7 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "rtaOptions\x1a?\n" + "\x11CustomLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc0\x06\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x93\a\n" + "\x1bChangeRTAMongoDBAgentParams\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\x128\n" + @@ -12182,7 +12269,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\x18authentication_mechanism\x18\v \x01(\tH\n" + "R\x17authenticationMechanism\x88\x01\x01\x12>\n" + "\vrta_options\x18\f \x01(\v2\x18.inventory.v1.RTAOptionsH\vR\n" + - "rtaOptions\x88\x01\x01B\t\n" + + "rtaOptions\x88\x01\x01\x127\n" + + "\x15skip_connection_check\x18\r \x01(\bH\fR\x13skipConnectionCheck\x88\x01\x01B\t\n" + "\a_enableB\x10\n" + "\x0e_custom_labelsB\f\n" + "\n" + @@ -12195,7 +12283,8 @@ const file_inventory_v1_agents_proto_rawDesc = "" + "\"_tls_certificate_key_file_passwordB\t\n" + "\a_tls_caB\x1b\n" + "\x19_authentication_mechanismB\x0e\n" + - "\f_rta_options\"N\n" + + "\f_rta_optionsB\x18\n" + + "\x16_skip_connection_check\"N\n" + "\x12RemoveAgentRequest\x12\"\n" + "\bagent_id\x18\x01 \x01(\tB\a\xfaB\x04r\x02\x10\x01R\aagentId\x12\x14\n" + "\x05force\x18\x02 \x01(\bR\x05force\"\x15\n" + @@ -12363,7 +12452,6 @@ var ( (*common.StringMap)(nil), // 112: common.StringMap } ) - var file_inventory_v1_agents_proto_depIdxs = []int32{ 68, // 0: inventory.v1.PMMAgent.custom_labels:type_name -> inventory.v1.PMMAgent.CustomLabelsEntry 108, // 1: inventory.v1.VMAgent.status:type_name -> inventory.v1.AgentStatus diff --git a/api/inventory/v1/agents.pb.validate.go b/api/inventory/v1/agents.pb.validate.go index 784eafd82f3..d92b0d0c0c8 100644 --- a/api/inventory/v1/agents.pb.validate.go +++ b/api/inventory/v1/agents.pb.validate.go @@ -10200,6 +10200,10 @@ func (m *ChangeProxySQLExporterParams) validate(all bool) error { // no validation rules for ExposeExporter } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeProxySQLExporterParamsMultiError(errors) } @@ -11349,6 +11353,10 @@ func (m *ChangeQANMongoDBProfilerAgentParams) validate(all bool) error { // no validation rules for LogLevel } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeQANMongoDBProfilerAgentParamsMultiError(errors) } @@ -11721,6 +11729,10 @@ func (m *ChangeQANMongoDBMongologAgentParams) validate(all bool) error { // no validation rules for LogLevel } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeQANMongoDBMongologAgentParamsMultiError(errors) } @@ -12098,6 +12110,10 @@ func (m *ChangeQANPostgreSQLPgStatementsAgentParams) validate(all bool) error { // no validation rules for LogLevel } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeQANPostgreSQLPgStatementsAgentParamsMultiError(errors) } @@ -12481,6 +12497,10 @@ func (m *ChangeQANPostgreSQLPgStatMonitorAgentParams) validate(all bool) error { // no validation rules for LogLevel } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeQANPostgreSQLPgStatMonitorAgentParamsMultiError(errors) } @@ -13143,6 +13163,10 @@ func (m *ChangeExternalExporterParams) validate(all bool) error { // no validation rules for ListenPort } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeExternalExporterParamsMultiError(errors) } @@ -13993,6 +14017,10 @@ func (m *ChangeValkeyExporterParams) validate(all bool) error { // no validation rules for LogLevel } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeValkeyExporterParamsMultiError(errors) } @@ -14374,6 +14402,10 @@ func (m *ChangeRTAMongoDBAgentParams) validate(all bool) error { } } + if m.SkipConnectionCheck != nil { + // no validation rules for SkipConnectionCheck + } + if len(errors) > 0 { return ChangeRTAMongoDBAgentParamsMultiError(errors) } diff --git a/api/inventory/v1/agents.proto b/api/inventory/v1/agents.proto index ad32b488c83..8f4e080236d 100644 --- a/api/inventory/v1/agents.proto +++ b/api/inventory/v1/agents.proto @@ -1306,6 +1306,8 @@ message ChangeProxySQLExporterParams { optional LogLevel log_level = 11; // Optionally expose the exporter process on all public interfaces. optional bool expose_exporter = 12; + // Skip connection check. + optional bool skip_connection_check = 13; } // Add/Change QANMySQLPerfSchemaAgent @@ -1531,6 +1533,8 @@ message ChangeQANMongoDBProfilerAgentParams { optional string authentication_database = 14; // Log level for exporter. optional LogLevel log_level = 15; + // Skip connection check. + optional bool skip_connection_check = 16; } // Add/Change QANMongoDBMongologAgent @@ -1601,6 +1605,8 @@ message ChangeQANMongoDBMongologAgentParams { optional string authentication_database = 14; // Log level for exporter. optional LogLevel log_level = 15; + // Skip connection check. + optional bool skip_connection_check = 16; } // Add/Change QANPostgreSQLPgStatementsAgent @@ -1668,6 +1674,8 @@ message ChangeQANPostgreSQLPgStatementsAgentParams { optional string tls_key = 13; // Log level for exporter. optional LogLevel log_level = 14; + // Skip connection check. + optional bool skip_connection_check = 15; } // Add/Change QANPostgreSQLPgStatMonitorAgent @@ -1739,6 +1747,8 @@ message ChangeQANPostgreSQLPgStatMonitorAgentParams { optional string tls_key = 14; // Log level for exporter. optional LogLevel log_level = 15; + // Skip connection check. + optional bool skip_connection_check = 16; } // Add/Change RDSExporter @@ -1832,6 +1842,8 @@ message ChangeExternalExporterParams { optional string metrics_path = 7; // Listen port for scraping metrics. optional uint32 listen_port = 8; + // Skip connection check. + optional bool skip_connection_check = 9; } // Add/Change AzureDatabaseExporter @@ -1965,6 +1977,8 @@ message ChangeValkeyExporterParams { optional bool expose_exporter = 14; // Log level for exporter. optional LogLevel log_level = 15; + // Skip connection check. + optional bool skip_connection_check = 16; } // Add/Change RTAMongoDBAgent @@ -2029,6 +2043,8 @@ message ChangeRTAMongoDBAgentParams { optional string authentication_mechanism = 11; // Real-Time Analytics options. optional RTAOptions rta_options = 12; + // Skip connection check. + optional bool skip_connection_check = 13; } // Remove 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 970d51aa1c3..ed41156d525 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 @@ -7359,6 +7359,9 @@ type ChangeAgentParamsBodyExternalExporter struct { // Listen port for scraping metrics. ListenPort *int64 `json:"listen_port,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyExternalExporterCustomLabels `json:"custom_labels,omitempty"` @@ -9038,6 +9041,9 @@ type ChangeAgentParamsBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces. ExposeExporter *bool `json:"expose_exporter,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyProxysqlExporterCustomLabels `json:"custom_labels,omitempty"` @@ -9378,6 +9384,9 @@ type ChangeAgentParamsBodyQANMongodbMongologAgent 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"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels `json:"custom_labels,omitempty"` @@ -9718,6 +9727,9 @@ type ChangeAgentParamsBodyQANMongodbProfilerAgent 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"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels `json:"custom_labels,omitempty"` @@ -10744,6 +10756,9 @@ type ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent 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"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentCustomLabels `json:"custom_labels,omitempty"` @@ -11084,6 +11099,9 @@ type ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent 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"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentCustomLabels `json:"custom_labels,omitempty"` @@ -11737,6 +11755,9 @@ type ChangeAgentParamsBodyRtaMongodbAgent struct { // Authentication mechanism. AuthenticationMechanism *string `json:"authentication_mechanism,omitempty"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyRtaMongodbAgentCustomLabels `json:"custom_labels,omitempty"` @@ -12071,6 +12092,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"` + // Skip connection check. + SkipConnectionCheck *bool `json:"skip_connection_check,omitempty"` + // custom labels CustomLabels *ChangeAgentParamsBodyValkeyExporterCustomLabels `json:"custom_labels,omitempty"` diff --git a/api/inventory/v1/json/v1.json b/api/inventory/v1/json/v1.json index 18b9a0b485c..153e61a049f 100644 --- a/api/inventory/v1/json/v1.json +++ b/api/inventory/v1/json/v1.json @@ -8537,6 +8537,12 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 4 @@ -8617,6 +8623,12 @@ "format": "int64", "x-nullable": true, "x-order": 7 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 8 } }, "x-order": 5 @@ -9228,6 +9240,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 10 @@ -9360,6 +9378,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 11 @@ -9486,6 +9510,12 @@ ], "x-nullable": true, "x-order": 13 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 14 } }, "x-order": 12 @@ -9618,6 +9648,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 13 @@ -9763,6 +9799,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 15 @@ -9867,6 +9909,12 @@ }, "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 16 diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 1ca1471e02b..1fe1cd18e54 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -13810,6 +13810,12 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 4 @@ -13890,6 +13896,12 @@ "format": "int64", "x-nullable": true, "x-order": 7 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 8 } }, "x-order": 5 @@ -14501,6 +14513,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 10 @@ -14633,6 +14651,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 11 @@ -14759,6 +14783,12 @@ ], "x-nullable": true, "x-order": 13 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 14 } }, "x-order": 12 @@ -14891,6 +14921,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 13 @@ -15036,6 +15072,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 15 @@ -15140,6 +15182,12 @@ }, "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 16 diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 6650f3b8266..8a180aa156c 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -12852,6 +12852,12 @@ "type": "boolean", "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 4 @@ -12932,6 +12938,12 @@ "format": "int64", "x-nullable": true, "x-order": 7 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 8 } }, "x-order": 5 @@ -13543,6 +13555,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 10 @@ -13675,6 +13693,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 11 @@ -13801,6 +13825,12 @@ ], "x-nullable": true, "x-order": 13 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 14 } }, "x-order": 12 @@ -13933,6 +13963,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 13 @@ -14078,6 +14114,12 @@ ], "x-nullable": true, "x-order": 14 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 15 } }, "x-order": 15 @@ -14182,6 +14224,12 @@ }, "x-nullable": true, "x-order": 11 + }, + "skip_connection_check": { + "description": "Skip connection check.", + "type": "boolean", + "x-nullable": true, + "x-order": 12 } }, "x-order": 16 diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 7ab432e6666..142ad8c1928 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -1108,6 +1108,49 @@ type ChangeAgentParams struct { ListenPort *uint32 // for external exporter } +// AffectsConnection returns true if the change modifies parameters used to connect +// to the service (credentials, TLS options, endpoint), i.e. changes that should be +// validated with a connection check before they are applied. +func (p *ChangeAgentParams) AffectsConnection() bool { + if p.Username != nil || p.Password != nil || p.TLS != nil || p.TLSSkipVerify != nil || p.ListenPort != nil { + return true + } + + if o := p.MySQLOptions; o != nil { + if o.TLSCa != nil || o.TLSCert != nil || o.TLSKey != nil { + return true + } + } + + if o := p.PostgreSQLOptions; o != nil { + if o.SSLCa != nil || o.SSLCert != nil || o.SSLKey != nil { + return true + } + } + + if o := p.MongoDBOptions; o != nil { + if o.TLSCertificateKey != nil || o.TLSCertificateKeyFilePassword != nil || o.TLSCa != nil || + o.AuthenticationMechanism != nil || o.AuthenticationDatabase != nil { + return true + } + } + + if o := p.ValkeyOptions; o != nil { + if o.SSLCa != nil || o.SSLCert != nil || o.SSLKey != nil { + return true + } + } + + if o := p.ExporterOptions; o != nil { + // Scheme and path define the external exporter's metrics endpoint. + if o.MetricsScheme != nil || o.MetricsPath != nil { + return true + } + } + + return false +} + // ChangeAgent changes agent parameters based on agent type. func ChangeAgent(q *reform.Querier, agentID string, params *ChangeAgentParams) (*Agent, error) { //nolint:cyclop,maintidx row, err := FindAgentByID(q, agentID) diff --git a/managed/models/agent_helpers_test.go b/managed/models/agent_helpers_test.go index 8dafb74129f..ab88ccda16b 100644 --- a/managed/models/agent_helpers_test.go +++ b/managed/models/agent_helpers_test.go @@ -1617,3 +1617,63 @@ func TestAgentHelpers(t *testing.T) { }) }) } + +func TestChangeAgentParamsAffectsConnection(t *testing.T) { + for name, tc := range map[string]struct { + params models.ChangeAgentParams + expected bool + }{ + "empty": {models.ChangeAgentParams{}, false}, + "username": {models.ChangeAgentParams{Username: new("user")}, true}, + "password": {models.ChangeAgentParams{Password: new("pass")}, true}, + "tls": {models.ChangeAgentParams{TLS: new(true)}, true}, + "tls skip verify": {models.ChangeAgentParams{TLSSkipVerify: new(false)}, true}, + "listen port": {models.ChangeAgentParams{ListenPort: new(uint32(9104))}, true}, + "mysql tls ca": {models.ChangeAgentParams{MySQLOptions: &models.ChangeMySQLOptions{TLSCa: new("ca")}}, true}, + "mysql tls cert": {models.ChangeAgentParams{MySQLOptions: &models.ChangeMySQLOptions{TLSCert: new("cert")}}, true}, + "mysql tls key": {models.ChangeAgentParams{MySQLOptions: &models.ChangeMySQLOptions{TLSKey: new("key")}}, true}, + "postgres ssl ca": {models.ChangeAgentParams{PostgreSQLOptions: &models.ChangePostgreSQLOptions{SSLCa: new("ca")}}, true}, + "postgres ssl key": {models.ChangeAgentParams{PostgreSQLOptions: &models.ChangePostgreSQLOptions{SSLKey: new("key")}}, true}, + "mongodb cert key": {models.ChangeAgentParams{MongoDBOptions: &models.ChangeMongoDBOptions{TLSCertificateKey: new("key")}}, true}, + "mongodb auth mechanism": { + models.ChangeAgentParams{MongoDBOptions: &models.ChangeMongoDBOptions{AuthenticationMechanism: new("SCRAM-SHA-256")}}, + true, + }, + "mongodb auth database": { + models.ChangeAgentParams{MongoDBOptions: &models.ChangeMongoDBOptions{AuthenticationDatabase: new("admin")}}, + true, + }, + "valkey ssl cert": {models.ChangeAgentParams{ValkeyOptions: &models.ChangeValkeyOptions{SSLCert: new("cert")}}, true}, + "metrics scheme": {models.ChangeAgentParams{ExporterOptions: &models.ChangeExporterOptions{MetricsScheme: new("https")}}, true}, + "metrics path": {models.ChangeAgentParams{ExporterOptions: &models.ChangeExporterOptions{MetricsPath: new("/metrics")}}, true}, + + "enabled": {models.ChangeAgentParams{Enabled: new(false)}, false}, + "custom labels": {models.ChangeAgentParams{CustomLabels: &map[string]string{"env": "test"}}, false}, + "log level": {models.ChangeAgentParams{LogLevel: new("debug")}, false}, + "agent password": {models.ChangeAgentParams{AgentPassword: new("pass")}, false}, + "empty option structs": { + models.ChangeAgentParams{ + MySQLOptions: &models.ChangeMySQLOptions{}, + PostgreSQLOptions: &models.ChangePostgreSQLOptions{}, + MongoDBOptions: &models.ChangeMongoDBOptions{}, + ValkeyOptions: &models.ChangeValkeyOptions{}, + ExporterOptions: &models.ChangeExporterOptions{}, + }, + false, + }, + "push metrics": {models.ChangeAgentParams{ExporterOptions: &models.ChangeExporterOptions{PushMetrics: new(true)}}, false}, + "mysql table count limit": { + models.ChangeAgentParams{MySQLOptions: &models.ChangeMySQLOptions{TableCountTablestatsGroupLimit: new(int32(1000))}}, + false, + }, + "mongodb collectors": { + models.ChangeAgentParams{MongoDBOptions: &models.ChangeMongoDBOptions{EnableAllCollectors: new(true)}}, + false, + }, + "qan options": {models.ChangeAgentParams{QANOptions: &models.ChangeQANOptions{MaxQueryLength: new(int32(1024))}}, false}, + } { + t.Run(name, func(t *testing.T) { + assert.Equal(t, tc.expected, tc.params.AffectsConnection()) + }) + } +} diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 69a3affe5c5..7a98117e499 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -215,7 +215,7 @@ func (as *AgentsService) ChangeNodeExporter(ctx context.Context, agentID string, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, true) if err != nil { return nil, err } @@ -332,7 +332,7 @@ func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID strin MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -451,7 +451,7 @@ func (as *AgentsService) ChangeMongoDBExporter( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -561,7 +561,7 @@ func (as *AgentsService) ChangeQANMySQLPerfSchemaAgent(ctx context.Context, agen MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -678,7 +678,7 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent(ctx context.Context, agentID MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -784,7 +784,7 @@ func (as *AgentsService) ChangePostgresExporter(ctx context.Context, agentID str MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -890,7 +890,7 @@ func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID strin MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -997,7 +997,7 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent(ctx context.Context, agen MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1104,7 +1104,7 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent(ctx context.Context, agen MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1203,7 +1203,7 @@ func (as *AgentsService) ChangeProxySQLExporter(ctx context.Context, agentID str MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1306,7 +1306,7 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent(ctx context.Contex MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) // Check if we're trying to modify the internal PostgreSQL QAN agent and if the environment variable is set envVar, exists := os.LookupEnv(env.EnableInternalPgQAN) if exists && envVar != "" { @@ -1427,7 +1427,7 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatMonitorAgent(ctx context.Conte MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1516,7 +1516,7 @@ func (as *AgentsService) ChangeRDSExporter(ctx context.Context, agentID string, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, true) if err != nil { return nil, err } @@ -1602,7 +1602,7 @@ func (as *AgentsService) ChangeExternalExporter(ctx context.Context, agentID str MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1690,7 +1690,7 @@ func (as *AgentsService) ChangeAzureDatabaseExporter( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params) + agent, err := as.executeAgentChange(ctx, agentID, params, true) if err != nil { return nil, err } @@ -1713,7 +1713,7 @@ func (as *AgentsService) ChangeNomadAgent(ctx context.Context, agentID string, p Enabled: params.Enable, } - agent, err := as.executeAgentChange(ctx, agentID, changeParams) + agent, err := as.executeAgentChange(ctx, agentID, changeParams, true) if err != nil { return nil, err } @@ -1828,7 +1828,7 @@ func (as *AgentsService) ChangeRTAMongoDBAgent(ctx context.Context, agentID stri changeParams.RTAOptions = models.RTAOptionsFromRequest(p.RtaOptions) } - ag, err := as.executeAgentChange(ctx, agentID, changeParams) + ag, err := as.executeAgentChange(ctx, agentID, changeParams, p.GetSkipConnectionCheck()) if err != nil { return nil, err } @@ -1922,16 +1922,27 @@ func convertMetricsResolutions(mrs *common.MetricsResolutions) *models.ChangeMet } // Helper function to execute agent change and build response. -func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams) (inventoryv1.Agent, error) { //nolint:ireturn +func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams, skipConnectionCheck bool) (inventoryv1.Agent, error) { //nolint:ireturn,lll var agent inventoryv1.Agent err := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - row, err := models.ChangeAgent(tx.Querier, agentID, params) + updatedAgent, err := models.ChangeAgent(tx.Querier, agentID, params) if err != nil { return err } - agent, err = toInventoryAgent(tx.Querier, row, as.r) + if !skipConnectionCheck && params.AffectsConnection() && updatedAgent.ServiceID != nil { + service, err := models.FindServiceByID(tx.Querier, pointer.GetString(updatedAgent.ServiceID)) + if err != nil { + return err + } + + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, updatedAgent); err != nil { + return err + } + } + + agent, err = toInventoryAgent(tx.Querier, updatedAgent, as.r) return err }) diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index b65524cb44f..488f13aed3e 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -16,6 +16,7 @@ package inventory import ( + "context" "reflect" "testing" "time" @@ -990,3 +991,113 @@ func TestChangeRTAMongoDBAgent(t *testing.T) { assert.Equal(t, durationpb.New(5*time.Second), resp.GetRtaMongodbAgent().RtaOptions.CollectInterval) }) } + +func TestChangeAgentConnectionCheck(t *testing.T) { + // Adds a pmm-agent, a PostgreSQL service and a postgres_exporter (without connection check) + // and returns the exporter's agent ID. Expects stateUpdates calls to RequestStateUpdate: + // one is made here (AddPostgresExporter), plus one per successful change. + addPostgresExporter := func(t *testing.T, ss *ServicesService, as *AgentsService, ctx context.Context, stateUpdates int) string { + t.Helper() + + as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005").Times(stateUpdates) + + pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ + RunsOnNodeId: models.PMMServerNodeID, + }) + require.NoError(t, err) + + ps, err := ss.AddPostgreSQL(ctx, &models.AddDBMSServiceParams{ + ServiceName: "test-postgres", + NodeID: models.PMMServerNodeID, + Address: new("127.0.0.1"), + Port: new(uint16(5432)), + }) + require.NoError(t, err) + + exporter, err := as.AddPostgresExporter(ctx, &inventoryv1.AddPostgresExporterParams{ + PmmAgentId: pmmAgent.GetPmmAgent().AgentId, + ServiceId: ps.ServiceId, + Username: "username", + SkipConnectionCheck: true, + }) + require.NoError(t, err) + + return exporter.GetPostgresExporter().AgentId + } + + connectionCheckCall := func(as *AgentsService, ctx context.Context) *mock.Call { + return as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())) + } + + t.Run("CheckRunsOnCredentialChange", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addPostgresExporter(t, ss, as, ctx, 2) + + connectionCheckCall(as, ctx).Return(nil).Once() + + resp, err := as.ChangePostgresExporter(ctx, agentID, &inventoryv1.ChangePostgresExporterParams{ + Username: new("new-username"), + }) + require.NoError(t, err) + assert.Equal(t, "new-username", resp.GetPostgresExporter().Username) + }) + + t.Run("RollbackOnFailedCheck", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addPostgresExporter(t, ss, as, ctx, 1) + + checkErr := status.Error(codes.FailedPrecondition, "Connection check failed: FATAL: password authentication failed.") + connectionCheckCall(as, ctx).Return(checkErr).Once() + + _, err := as.ChangePostgresExporter(ctx, agentID, &inventoryv1.ChangePostgresExporterParams{ + Username: new("wrong-username"), + Password: new("wrong-password"), + }) + tests.AssertGRPCError(t, status.Convert(checkErr), err) + + // The change must be rolled back. + agent, err := as.Get(ctx, agentID) + require.NoError(t, err) + assert.Equal(t, "username", agent.(*inventoryv1.PostgresExporter).Username) + }) + + t.Run("NoCheckForUnrelatedChange", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addPostgresExporter(t, ss, as, ctx, 2) + + // No CheckConnectionToService or GetInfoFromService expectations: + // changing only labels must not trigger a connection check. + resp, err := as.ChangePostgresExporter(ctx, agentID, &inventoryv1.ChangePostgresExporterParams{ + CustomLabels: &common.StringMap{Values: map[string]string{"environment": "test"}}, + }) + require.NoError(t, err) + assert.Equal(t, map[string]string{"environment": "test"}, resp.GetPostgresExporter().CustomLabels) + }) + + t.Run("SkipConnectionCheckHonored", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addPostgresExporter(t, ss, as, ctx, 2) + + // No CheckConnectionToService or GetInfoFromService expectations: + // the explicit skip flag must bypass the check. + resp, err := as.ChangePostgresExporter(ctx, agentID, &inventoryv1.ChangePostgresExporterParams{ + Username: new("new-username"), + Password: new("new-password"), + SkipConnectionCheck: new(true), + }) + require.NoError(t, err) + assert.Equal(t, "new-username", resp.GetPostgresExporter().Username) + }) +} From 7aea13efddea6a59d2b9b20f8b4882f00e01cafe Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 9 Jul 2026 13:29:17 +0200 Subject: [PATCH 02/12] PMM-15130 Use *bool for change-agent skip_connection_check flag --- admin/commands/inventory/change_agent_external_exporter.go | 4 ++-- admin/commands/inventory/change_agent_mongodb_exporter.go | 4 ++-- admin/commands/inventory/change_agent_mysqld_exporter.go | 4 ++-- admin/commands/inventory/change_agent_postgres_exporter.go | 4 ++-- admin/commands/inventory/change_agent_proxysql_exporter.go | 4 ++-- .../inventory/change_agent_qan_mongodb_mongolog_agent.go | 4 ++-- .../inventory/change_agent_qan_mongodb_profiler_agent.go | 4 ++-- .../inventory/change_agent_qan_mysql_perfschema_agent.go | 4 ++-- .../inventory/change_agent_qan_mysql_slowlog_agent.go | 4 ++-- .../change_agent_qan_postgresql_pgstatements_agent.go | 4 ++-- .../change_agent_qan_postgresql_pgstatmonitor_agent.go | 4 ++-- admin/commands/inventory/change_agent_rta_mongodb.go | 4 ++-- admin/commands/inventory/change_agent_valkey_exporter.go | 4 ++-- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/admin/commands/inventory/change_agent_external_exporter.go b/admin/commands/inventory/change_agent_external_exporter.go index 3a54560ab50..ff79db9e9c3 100644 --- a/admin/commands/inventory/change_agent_external_exporter.go +++ b/admin/commands/inventory/change_agent_external_exporter.go @@ -74,7 +74,7 @@ type ChangeAgentExternalExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentExternalExporterCommand and returns the result. @@ -91,7 +91,7 @@ func (cmd *ChangeAgentExternalExporterCommand) RunCmd() (commands.Result, error) Scheme: cmd.MetricsScheme, MetricsPath: cmd.MetricsPath, EnablePushMetrics: cmd.PushMetrics, - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_mongodb_exporter.go b/admin/commands/inventory/change_agent_mongodb_exporter.go index b171395458c..a7e27b47b86 100644 --- a/admin/commands/inventory/change_agent_mongodb_exporter.go +++ b/admin/commands/inventory/change_agent_mongodb_exporter.go @@ -99,7 +99,7 @@ type ChangeAgentMongodbExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentMongodbExporterCommand and returns the result. @@ -158,7 +158,7 @@ func (cmd *ChangeAgentMongodbExporterCommand) RunCmd() (commands.Result, error) EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_mysqld_exporter.go b/admin/commands/inventory/change_agent_mysqld_exporter.go index ec325c55cad..49468ae617e 100644 --- a/admin/commands/inventory/change_agent_mysqld_exporter.go +++ b/admin/commands/inventory/change_agent_mysqld_exporter.go @@ -93,7 +93,7 @@ type ChangeAgentMysqldExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentMysqldExporterCommand and returns the result. @@ -149,7 +149,7 @@ func (cmd *ChangeAgentMysqldExporterCommand) RunCmd() (commands.Result, error) { EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_postgres_exporter.go b/admin/commands/inventory/change_agent_postgres_exporter.go index b6fee00eaeb..b617b2946ec 100644 --- a/admin/commands/inventory/change_agent_postgres_exporter.go +++ b/admin/commands/inventory/change_agent_postgres_exporter.go @@ -94,7 +94,7 @@ type ChangeAgentPostgresExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentPostgresExporterCommand and returns the result. @@ -151,7 +151,7 @@ func (cmd *ChangeAgentPostgresExporterCommand) RunCmd() (commands.Result, error) MaxExporterConnections: cmd.MaxExporterConnections, LogLevel: convertLogLevelPtr(cmd.LogLevel), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_proxysql_exporter.go b/admin/commands/inventory/change_agent_proxysql_exporter.go index c2364b42738..14c0590e651 100644 --- a/admin/commands/inventory/change_agent_proxysql_exporter.go +++ b/admin/commands/inventory/change_agent_proxysql_exporter.go @@ -89,7 +89,7 @@ type ChangeAgentProxysqlExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentProxysqlExporterCommand and returns the result. @@ -111,7 +111,7 @@ func (cmd *ChangeAgentProxysqlExporterCommand) RunCmd() (commands.Result, error) EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go b/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go index a6b6c49c3c2..af97ecf8a37 100644 --- a/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go +++ b/admin/commands/inventory/change_agent_qan_mongodb_mongolog_agent.go @@ -88,7 +88,7 @@ type ChangeAgentQANMongoDBMongologAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMongoDBMongologAgentCommand and returns the result. @@ -129,7 +129,7 @@ func (cmd *ChangeAgentQANMongoDBMongologAgentCommand) RunCmd() (commands.Result, AuthenticationMechanism: cmd.AuthenticationMechanism, AuthenticationDatabase: cmd.AuthenticationDatabase, LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } // Parse custom labels if provided diff --git a/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go b/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go index 99edaad1331..a5a679cf2a5 100644 --- a/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go +++ b/admin/commands/inventory/change_agent_qan_mongodb_profiler_agent.go @@ -89,7 +89,7 @@ type ChangeAgentQANMongoDBProfilerAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMongoDBProfilerAgentCommand and returns the result. @@ -133,7 +133,7 @@ func (cmd *ChangeAgentQANMongoDBProfilerAgentCommand) RunCmd() (commands.Result, AuthenticationDatabase: cmd.AuthenticationDatabase, MaxQueryLength: cmd.MaxQueryLength, LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go b/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go index 77d10c6ddbb..a63dc4359f9 100644 --- a/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go +++ b/admin/commands/inventory/change_agent_qan_mysql_perfschema_agent.go @@ -86,7 +86,7 @@ type ChangeAgentQANMySQLPerfSchemaAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMySQLPerfSchemaAgentCommand and returns the result. @@ -138,7 +138,7 @@ func (cmd *ChangeAgentQANMySQLPerfSchemaAgentCommand) RunCmd() (commands.Result, DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go b/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go index cb00dbb2848..87c52d2c90c 100644 --- a/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go +++ b/admin/commands/inventory/change_agent_qan_mysql_slowlog_agent.go @@ -87,7 +87,7 @@ type ChangeAgentQANMySQLSlowlogAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANMySQLSlowlogAgentCommand and returns the result. @@ -138,7 +138,7 @@ func (cmd *ChangeAgentQANMySQLSlowlogAgentCommand) RunCmd() (commands.Result, er DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go b/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go index 3bb37e45bc4..ed0b139fde3 100644 --- a/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go +++ b/admin/commands/inventory/change_agent_qan_postgresql_pgstatements_agent.go @@ -87,7 +87,7 @@ type ChangeAgentQANPostgreSQLPgStatementsAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANPostgreSQLPgStatementsAgentCommand and returns the result. @@ -136,7 +136,7 @@ func (cmd *ChangeAgentQANPostgreSQLPgStatementsAgentCommand) RunCmd() (commands. MaxQueryLength: cmd.MaxQueryLength, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go b/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go index 0459b73537b..33b918f4d4f 100644 --- a/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go +++ b/admin/commands/inventory/change_agent_qan_postgresql_pgstatmonitor_agent.go @@ -89,7 +89,7 @@ type ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand and returns the result. @@ -139,7 +139,7 @@ func (cmd *ChangeAgentQANPostgreSQLPgStatMonitorAgentCommand) RunCmd() (commands DisableQueryExamples: cmd.DisableQueryExamples, DisableCommentsParsing: cmd.CommentsParsingDisabled(), LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_rta_mongodb.go b/admin/commands/inventory/change_agent_rta_mongodb.go index 780111a8847..9ceccd624c3 100644 --- a/admin/commands/inventory/change_agent_rta_mongodb.go +++ b/admin/commands/inventory/change_agent_rta_mongodb.go @@ -88,7 +88,7 @@ type ChangeAgentRTAMongoDBAgentCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentRTAMongoDBAgentCommand and returns the result. @@ -130,7 +130,7 @@ func (cmd *ChangeAgentRTAMongoDBAgentCommand) RunCmd() (commands.Result, error) TLSCa: tlsCa, AuthenticationMechanism: cmd.AuthenticationMechanism, LogLevel: convertLogLevelPtr(cmd.LogLevel), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { diff --git a/admin/commands/inventory/change_agent_valkey_exporter.go b/admin/commands/inventory/change_agent_valkey_exporter.go index ef265f48353..385bbcd9798 100644 --- a/admin/commands/inventory/change_agent_valkey_exporter.go +++ b/admin/commands/inventory/change_agent_valkey_exporter.go @@ -91,7 +91,7 @@ type ChangeAgentValkeyExporterCommand struct { CustomLabels *map[string]string `mapsep:"," help:"Custom user-assigned labels"` // Connection check - SkipConnectionCheck bool `help:"Skip connection check"` + SkipConnectionCheck *bool `help:"Skip connection check"` } // RunCmd executes the ChangeAgentValkeyExporterCommand and returns the result. @@ -143,7 +143,7 @@ func (cmd *ChangeAgentValkeyExporterCommand) RunCmd() (commands.Result, error) { EnablePushMetrics: cmd.PushMetrics, LogLevel: convertLogLevelPtr(cmd.LogLevel), ConnectionTimeout: commands.DurationString(cmd.ConnectionTimeout), - SkipConnectionCheck: &cmd.SkipConnectionCheck, + SkipConnectionCheck: cmd.SkipConnectionCheck, } if customLabels != nil { From 5016b8675ce163bb70d0f61b58dbe38c3bc43601 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 9 Jul 2026 13:29:28 +0200 Subject: [PATCH 03/12] PMM-15130 Add tests --- managed/services/inventory/agents_test.go | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index d62304ffc39..9416c9f61eb 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -1058,6 +1058,38 @@ func TestChangeAgentConnectionCheck(t *testing.T) { return exporter.GetPostgresExporter().AgentId } + // Adds a pmm-agent, a MySQL service and a mysqld_exporter (without connection check) and returns the exporter's agent ID. + addMysqldExporter := func(t *testing.T, ss *ServicesService, as *AgentsService, ctx context.Context, stateUpdates int) string { + t.Helper() + + as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005").Times(stateUpdates) + + pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ + RunsOnNodeId: models.PMMServerNodeID, + }) + require.NoError(t, err) + + ss.vc.(*mockVersionCache).On("RequestSoftwareVersionsUpdate").Once() + ms, err := ss.AddMySQL(ctx, &models.AddDBMSServiceParams{ + ServiceName: "test-mysql", + NodeID: models.PMMServerNodeID, + Address: new("127.0.0.1"), + Port: new(uint16(3306)), + }) + require.NoError(t, err) + + exporter, err := as.AddMySQLdExporter(ctx, &inventoryv1.AddMySQLdExporterParams{ + PmmAgentId: pmmAgent.GetPmmAgent().AgentId, + ServiceId: ms.ServiceId, + Username: "username", + SkipConnectionCheck: true, + }) + require.NoError(t, err) + + return exporter.GetMysqldExporter().AgentId + } + connectionCheckCall := func(as *AgentsService, ctx context.Context) *mock.Call { return as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), @@ -1132,4 +1164,37 @@ func TestChangeAgentConnectionCheck(t *testing.T) { require.NoError(t, err) assert.Equal(t, "new-username", resp.GetPostgresExporter().Username) }) + + t.Run("MysqldOmittedSkipRunsCheck", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addMysqldExporter(t, ss, as, ctx, 2) + + connectionCheckCall(as, ctx).Return(nil).Once() + + // SkipConnectionCheck left nil (omitted) -> GetSkipConnectionCheck() == false -> check runs. + resp, err := as.ChangeMySQLdExporter(ctx, agentID, &inventoryv1.ChangeMySQLdExporterParams{ + Username: new("new-username"), // AffectsConnection() == true + }) + require.NoError(t, err) + assert.Equal(t, "new-username", resp.GetMysqldExporter().Username) + }) + + t.Run("MysqldExplicitFalseSkipRunsCheck", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + agentID := addMysqldExporter(t, ss, as, ctx, 2) + + connectionCheckCall(as, ctx).Return(nil).Once() + + // Explicit false must behave identically to omitted: the check still runs. + resp, err := as.ChangeMySQLdExporter(ctx, agentID, &inventoryv1.ChangeMySQLdExporterParams{ + Username: new("new-username"), + SkipConnectionCheck: new(false), + }) + require.NoError(t, err) + assert.Equal(t, "new-username", resp.GetMysqldExporter().Username) + }) } From 5eb363f0a06c1e91d2177aa7e002d06752e3f389 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 9 Jul 2026 15:12:46 +0200 Subject: [PATCH 04/12] PMM-15130 make gen && make format --- api/inventory/v1/agents.pb.go | 249 +++++++++--------- .../agents_service/change_agent_responses.go | 163 ------------ 2 files changed, 127 insertions(+), 285 deletions(-) diff --git a/api/inventory/v1/agents.pb.go b/api/inventory/v1/agents.pb.go index b7e8af3bded..ea65b10e4eb 100644 --- a/api/inventory/v1/agents.pb.go +++ b/api/inventory/v1/agents.pb.go @@ -7,17 +7,19 @@ package inventoryv1 import ( + reflect "reflect" + sync "sync" + unsafe "unsafe" + _ "github.com/envoyproxy/protoc-gen-validate/validate" _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" - common "github.com/percona/pmm/api/common" - _ "github.com/percona/pmm/api/extensions/v1" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" - reflect "reflect" - sync "sync" - unsafe "unsafe" + + common "github.com/percona/pmm/api/common" + _ "github.com/percona/pmm/api/extensions/v1" ) const ( @@ -12481,123 +12483,126 @@ func file_inventory_v1_agents_proto_rawDescGZIP() []byte { return file_inventory_v1_agents_proto_rawDescData } -var file_inventory_v1_agents_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_inventory_v1_agents_proto_msgTypes = make([]protoimpl.MessageInfo, 107) -var file_inventory_v1_agents_proto_goTypes = []any{ - (AgentType)(0), // 0: inventory.v1.AgentType - (*PMMAgent)(nil), // 1: inventory.v1.PMMAgent - (*VMAgent)(nil), // 2: inventory.v1.VMAgent - (*NomadAgent)(nil), // 3: inventory.v1.NomadAgent - (*NodeExporter)(nil), // 4: inventory.v1.NodeExporter - (*MySQLdExporter)(nil), // 5: inventory.v1.MySQLdExporter - (*MongoDBExporter)(nil), // 6: inventory.v1.MongoDBExporter - (*PostgresExporter)(nil), // 7: inventory.v1.PostgresExporter - (*ProxySQLExporter)(nil), // 8: inventory.v1.ProxySQLExporter - (*ValkeyExporter)(nil), // 9: inventory.v1.ValkeyExporter - (*QANMySQLPerfSchemaAgent)(nil), // 10: inventory.v1.QANMySQLPerfSchemaAgent - (*QANMySQLSlowlogAgent)(nil), // 11: inventory.v1.QANMySQLSlowlogAgent - (*QANMongoDBProfilerAgent)(nil), // 12: inventory.v1.QANMongoDBProfilerAgent - (*QANMongoDBMongologAgent)(nil), // 13: inventory.v1.QANMongoDBMongologAgent - (*RTAOptions)(nil), // 14: inventory.v1.RTAOptions - (*RTAMongoDBAgent)(nil), // 15: inventory.v1.RTAMongoDBAgent - (*QANPostgreSQLPgStatementsAgent)(nil), // 16: inventory.v1.QANPostgreSQLPgStatementsAgent - (*QANPostgreSQLPgStatMonitorAgent)(nil), // 17: inventory.v1.QANPostgreSQLPgStatMonitorAgent - (*RDSExporter)(nil), // 18: inventory.v1.RDSExporter - (*ExternalExporter)(nil), // 19: inventory.v1.ExternalExporter - (*AzureDatabaseExporter)(nil), // 20: inventory.v1.AzureDatabaseExporter - (*ChangeCommonAgentParams)(nil), // 21: inventory.v1.ChangeCommonAgentParams - (*ListAgentsRequest)(nil), // 22: inventory.v1.ListAgentsRequest - (*ListAgentsResponse)(nil), // 23: inventory.v1.ListAgentsResponse - (*GetAgentRequest)(nil), // 24: inventory.v1.GetAgentRequest - (*GetAgentResponse)(nil), // 25: inventory.v1.GetAgentResponse - (*GetAgentLogsRequest)(nil), // 26: inventory.v1.GetAgentLogsRequest - (*GetAgentLogsResponse)(nil), // 27: inventory.v1.GetAgentLogsResponse - (*AddAgentRequest)(nil), // 28: inventory.v1.AddAgentRequest - (*AddAgentResponse)(nil), // 29: inventory.v1.AddAgentResponse - (*ChangeAgentRequest)(nil), // 30: inventory.v1.ChangeAgentRequest - (*ChangeAgentResponse)(nil), // 31: inventory.v1.ChangeAgentResponse - (*AddPMMAgentParams)(nil), // 32: inventory.v1.AddPMMAgentParams - (*AddNodeExporterParams)(nil), // 33: inventory.v1.AddNodeExporterParams - (*ChangeNodeExporterParams)(nil), // 34: inventory.v1.ChangeNodeExporterParams - (*AddMySQLdExporterParams)(nil), // 35: inventory.v1.AddMySQLdExporterParams - (*ChangeMySQLdExporterParams)(nil), // 36: inventory.v1.ChangeMySQLdExporterParams - (*AddMongoDBExporterParams)(nil), // 37: inventory.v1.AddMongoDBExporterParams - (*ChangeMongoDBExporterParams)(nil), // 38: inventory.v1.ChangeMongoDBExporterParams - (*AddPostgresExporterParams)(nil), // 39: inventory.v1.AddPostgresExporterParams - (*ChangePostgresExporterParams)(nil), // 40: inventory.v1.ChangePostgresExporterParams - (*AddProxySQLExporterParams)(nil), // 41: inventory.v1.AddProxySQLExporterParams - (*ChangeProxySQLExporterParams)(nil), // 42: inventory.v1.ChangeProxySQLExporterParams - (*AddQANMySQLPerfSchemaAgentParams)(nil), // 43: inventory.v1.AddQANMySQLPerfSchemaAgentParams - (*ChangeQANMySQLPerfSchemaAgentParams)(nil), // 44: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams - (*AddQANMySQLSlowlogAgentParams)(nil), // 45: inventory.v1.AddQANMySQLSlowlogAgentParams - (*ChangeQANMySQLSlowlogAgentParams)(nil), // 46: inventory.v1.ChangeQANMySQLSlowlogAgentParams - (*AddQANMongoDBProfilerAgentParams)(nil), // 47: inventory.v1.AddQANMongoDBProfilerAgentParams - (*ChangeQANMongoDBProfilerAgentParams)(nil), // 48: inventory.v1.ChangeQANMongoDBProfilerAgentParams - (*AddQANMongoDBMongologAgentParams)(nil), // 49: inventory.v1.AddQANMongoDBMongologAgentParams - (*ChangeQANMongoDBMongologAgentParams)(nil), // 50: inventory.v1.ChangeQANMongoDBMongologAgentParams - (*AddQANPostgreSQLPgStatementsAgentParams)(nil), // 51: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams - (*ChangeQANPostgreSQLPgStatementsAgentParams)(nil), // 52: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams - (*AddQANPostgreSQLPgStatMonitorAgentParams)(nil), // 53: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams - (*ChangeQANPostgreSQLPgStatMonitorAgentParams)(nil), // 54: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams - (*AddRDSExporterParams)(nil), // 55: inventory.v1.AddRDSExporterParams - (*ChangeRDSExporterParams)(nil), // 56: inventory.v1.ChangeRDSExporterParams - (*AddExternalExporterParams)(nil), // 57: inventory.v1.AddExternalExporterParams - (*ChangeExternalExporterParams)(nil), // 58: inventory.v1.ChangeExternalExporterParams - (*AddAzureDatabaseExporterParams)(nil), // 59: inventory.v1.AddAzureDatabaseExporterParams - (*ChangeAzureDatabaseExporterParams)(nil), // 60: inventory.v1.ChangeAzureDatabaseExporterParams - (*ChangeNomadAgentParams)(nil), // 61: inventory.v1.ChangeNomadAgentParams - (*AddValkeyExporterParams)(nil), // 62: inventory.v1.AddValkeyExporterParams - (*ChangeValkeyExporterParams)(nil), // 63: inventory.v1.ChangeValkeyExporterParams - (*AddRTAMongoDBAgentParams)(nil), // 64: inventory.v1.AddRTAMongoDBAgentParams - (*ChangeRTAMongoDBAgentParams)(nil), // 65: inventory.v1.ChangeRTAMongoDBAgentParams - (*RemoveAgentRequest)(nil), // 66: inventory.v1.RemoveAgentRequest - (*RemoveAgentResponse)(nil), // 67: inventory.v1.RemoveAgentResponse - nil, // 68: inventory.v1.PMMAgent.CustomLabelsEntry - nil, // 69: inventory.v1.NodeExporter.CustomLabelsEntry - nil, // 70: inventory.v1.MySQLdExporter.CustomLabelsEntry - nil, // 71: inventory.v1.MySQLdExporter.ExtraDsnParamsEntry - nil, // 72: inventory.v1.MongoDBExporter.CustomLabelsEntry - nil, // 73: inventory.v1.PostgresExporter.CustomLabelsEntry - nil, // 74: inventory.v1.ProxySQLExporter.CustomLabelsEntry - nil, // 75: inventory.v1.ValkeyExporter.CustomLabelsEntry - nil, // 76: inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry - nil, // 77: inventory.v1.QANMySQLPerfSchemaAgent.ExtraDsnParamsEntry - nil, // 78: inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry - nil, // 79: inventory.v1.QANMySQLSlowlogAgent.ExtraDsnParamsEntry - nil, // 80: inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry - nil, // 81: inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry - nil, // 82: inventory.v1.RTAMongoDBAgent.CustomLabelsEntry - nil, // 83: inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry - nil, // 84: inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry - nil, // 85: inventory.v1.RDSExporter.CustomLabelsEntry - nil, // 86: inventory.v1.ExternalExporter.CustomLabelsEntry - nil, // 87: inventory.v1.AzureDatabaseExporter.CustomLabelsEntry - nil, // 88: inventory.v1.AddPMMAgentParams.CustomLabelsEntry - nil, // 89: inventory.v1.AddNodeExporterParams.CustomLabelsEntry - nil, // 90: inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry - nil, // 91: inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntry - nil, // 92: inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry - nil, // 93: inventory.v1.AddPostgresExporterParams.CustomLabelsEntry - nil, // 94: inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry - nil, // 95: inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry - nil, // 96: inventory.v1.AddQANMySQLPerfSchemaAgentParams.ExtraDsnParamsEntry - nil, // 97: inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry - nil, // 98: inventory.v1.AddQANMySQLSlowlogAgentParams.ExtraDsnParamsEntry - nil, // 99: inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry - nil, // 100: inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry - nil, // 101: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry - nil, // 102: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry - nil, // 103: inventory.v1.AddRDSExporterParams.CustomLabelsEntry - nil, // 104: inventory.v1.AddExternalExporterParams.CustomLabelsEntry - nil, // 105: inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry - nil, // 106: inventory.v1.AddValkeyExporterParams.CustomLabelsEntry - nil, // 107: inventory.v1.AddRTAMongoDBAgentParams.CustomLabelsEntry - (AgentStatus)(0), // 108: inventory.v1.AgentStatus - (LogLevel)(0), // 109: inventory.v1.LogLevel - (*common.MetricsResolutions)(nil), // 110: common.MetricsResolutions - (*durationpb.Duration)(nil), // 111: google.protobuf.Duration - (*common.StringMap)(nil), // 112: common.StringMap -} +var ( + file_inventory_v1_agents_proto_enumTypes = make([]protoimpl.EnumInfo, 1) + file_inventory_v1_agents_proto_msgTypes = make([]protoimpl.MessageInfo, 107) + file_inventory_v1_agents_proto_goTypes = []any{ + AgentType(0), // 0: inventory.v1.AgentType + (*PMMAgent)(nil), // 1: inventory.v1.PMMAgent + (*VMAgent)(nil), // 2: inventory.v1.VMAgent + (*NomadAgent)(nil), // 3: inventory.v1.NomadAgent + (*NodeExporter)(nil), // 4: inventory.v1.NodeExporter + (*MySQLdExporter)(nil), // 5: inventory.v1.MySQLdExporter + (*MongoDBExporter)(nil), // 6: inventory.v1.MongoDBExporter + (*PostgresExporter)(nil), // 7: inventory.v1.PostgresExporter + (*ProxySQLExporter)(nil), // 8: inventory.v1.ProxySQLExporter + (*ValkeyExporter)(nil), // 9: inventory.v1.ValkeyExporter + (*QANMySQLPerfSchemaAgent)(nil), // 10: inventory.v1.QANMySQLPerfSchemaAgent + (*QANMySQLSlowlogAgent)(nil), // 11: inventory.v1.QANMySQLSlowlogAgent + (*QANMongoDBProfilerAgent)(nil), // 12: inventory.v1.QANMongoDBProfilerAgent + (*QANMongoDBMongologAgent)(nil), // 13: inventory.v1.QANMongoDBMongologAgent + (*RTAOptions)(nil), // 14: inventory.v1.RTAOptions + (*RTAMongoDBAgent)(nil), // 15: inventory.v1.RTAMongoDBAgent + (*QANPostgreSQLPgStatementsAgent)(nil), // 16: inventory.v1.QANPostgreSQLPgStatementsAgent + (*QANPostgreSQLPgStatMonitorAgent)(nil), // 17: inventory.v1.QANPostgreSQLPgStatMonitorAgent + (*RDSExporter)(nil), // 18: inventory.v1.RDSExporter + (*ExternalExporter)(nil), // 19: inventory.v1.ExternalExporter + (*AzureDatabaseExporter)(nil), // 20: inventory.v1.AzureDatabaseExporter + (*ChangeCommonAgentParams)(nil), // 21: inventory.v1.ChangeCommonAgentParams + (*ListAgentsRequest)(nil), // 22: inventory.v1.ListAgentsRequest + (*ListAgentsResponse)(nil), // 23: inventory.v1.ListAgentsResponse + (*GetAgentRequest)(nil), // 24: inventory.v1.GetAgentRequest + (*GetAgentResponse)(nil), // 25: inventory.v1.GetAgentResponse + (*GetAgentLogsRequest)(nil), // 26: inventory.v1.GetAgentLogsRequest + (*GetAgentLogsResponse)(nil), // 27: inventory.v1.GetAgentLogsResponse + (*AddAgentRequest)(nil), // 28: inventory.v1.AddAgentRequest + (*AddAgentResponse)(nil), // 29: inventory.v1.AddAgentResponse + (*ChangeAgentRequest)(nil), // 30: inventory.v1.ChangeAgentRequest + (*ChangeAgentResponse)(nil), // 31: inventory.v1.ChangeAgentResponse + (*AddPMMAgentParams)(nil), // 32: inventory.v1.AddPMMAgentParams + (*AddNodeExporterParams)(nil), // 33: inventory.v1.AddNodeExporterParams + (*ChangeNodeExporterParams)(nil), // 34: inventory.v1.ChangeNodeExporterParams + (*AddMySQLdExporterParams)(nil), // 35: inventory.v1.AddMySQLdExporterParams + (*ChangeMySQLdExporterParams)(nil), // 36: inventory.v1.ChangeMySQLdExporterParams + (*AddMongoDBExporterParams)(nil), // 37: inventory.v1.AddMongoDBExporterParams + (*ChangeMongoDBExporterParams)(nil), // 38: inventory.v1.ChangeMongoDBExporterParams + (*AddPostgresExporterParams)(nil), // 39: inventory.v1.AddPostgresExporterParams + (*ChangePostgresExporterParams)(nil), // 40: inventory.v1.ChangePostgresExporterParams + (*AddProxySQLExporterParams)(nil), // 41: inventory.v1.AddProxySQLExporterParams + (*ChangeProxySQLExporterParams)(nil), // 42: inventory.v1.ChangeProxySQLExporterParams + (*AddQANMySQLPerfSchemaAgentParams)(nil), // 43: inventory.v1.AddQANMySQLPerfSchemaAgentParams + (*ChangeQANMySQLPerfSchemaAgentParams)(nil), // 44: inventory.v1.ChangeQANMySQLPerfSchemaAgentParams + (*AddQANMySQLSlowlogAgentParams)(nil), // 45: inventory.v1.AddQANMySQLSlowlogAgentParams + (*ChangeQANMySQLSlowlogAgentParams)(nil), // 46: inventory.v1.ChangeQANMySQLSlowlogAgentParams + (*AddQANMongoDBProfilerAgentParams)(nil), // 47: inventory.v1.AddQANMongoDBProfilerAgentParams + (*ChangeQANMongoDBProfilerAgentParams)(nil), // 48: inventory.v1.ChangeQANMongoDBProfilerAgentParams + (*AddQANMongoDBMongologAgentParams)(nil), // 49: inventory.v1.AddQANMongoDBMongologAgentParams + (*ChangeQANMongoDBMongologAgentParams)(nil), // 50: inventory.v1.ChangeQANMongoDBMongologAgentParams + (*AddQANPostgreSQLPgStatementsAgentParams)(nil), // 51: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams + (*ChangeQANPostgreSQLPgStatementsAgentParams)(nil), // 52: inventory.v1.ChangeQANPostgreSQLPgStatementsAgentParams + (*AddQANPostgreSQLPgStatMonitorAgentParams)(nil), // 53: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams + (*ChangeQANPostgreSQLPgStatMonitorAgentParams)(nil), // 54: inventory.v1.ChangeQANPostgreSQLPgStatMonitorAgentParams + (*AddRDSExporterParams)(nil), // 55: inventory.v1.AddRDSExporterParams + (*ChangeRDSExporterParams)(nil), // 56: inventory.v1.ChangeRDSExporterParams + (*AddExternalExporterParams)(nil), // 57: inventory.v1.AddExternalExporterParams + (*ChangeExternalExporterParams)(nil), // 58: inventory.v1.ChangeExternalExporterParams + (*AddAzureDatabaseExporterParams)(nil), // 59: inventory.v1.AddAzureDatabaseExporterParams + (*ChangeAzureDatabaseExporterParams)(nil), // 60: inventory.v1.ChangeAzureDatabaseExporterParams + (*ChangeNomadAgentParams)(nil), // 61: inventory.v1.ChangeNomadAgentParams + (*AddValkeyExporterParams)(nil), // 62: inventory.v1.AddValkeyExporterParams + (*ChangeValkeyExporterParams)(nil), // 63: inventory.v1.ChangeValkeyExporterParams + (*AddRTAMongoDBAgentParams)(nil), // 64: inventory.v1.AddRTAMongoDBAgentParams + (*ChangeRTAMongoDBAgentParams)(nil), // 65: inventory.v1.ChangeRTAMongoDBAgentParams + (*RemoveAgentRequest)(nil), // 66: inventory.v1.RemoveAgentRequest + (*RemoveAgentResponse)(nil), // 67: inventory.v1.RemoveAgentResponse + nil, // 68: inventory.v1.PMMAgent.CustomLabelsEntry + nil, // 69: inventory.v1.NodeExporter.CustomLabelsEntry + nil, // 70: inventory.v1.MySQLdExporter.CustomLabelsEntry + nil, // 71: inventory.v1.MySQLdExporter.ExtraDsnParamsEntry + nil, // 72: inventory.v1.MongoDBExporter.CustomLabelsEntry + nil, // 73: inventory.v1.PostgresExporter.CustomLabelsEntry + nil, // 74: inventory.v1.ProxySQLExporter.CustomLabelsEntry + nil, // 75: inventory.v1.ValkeyExporter.CustomLabelsEntry + nil, // 76: inventory.v1.QANMySQLPerfSchemaAgent.CustomLabelsEntry + nil, // 77: inventory.v1.QANMySQLPerfSchemaAgent.ExtraDsnParamsEntry + nil, // 78: inventory.v1.QANMySQLSlowlogAgent.CustomLabelsEntry + nil, // 79: inventory.v1.QANMySQLSlowlogAgent.ExtraDsnParamsEntry + nil, // 80: inventory.v1.QANMongoDBProfilerAgent.CustomLabelsEntry + nil, // 81: inventory.v1.QANMongoDBMongologAgent.CustomLabelsEntry + nil, // 82: inventory.v1.RTAMongoDBAgent.CustomLabelsEntry + nil, // 83: inventory.v1.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry + nil, // 84: inventory.v1.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry + nil, // 85: inventory.v1.RDSExporter.CustomLabelsEntry + nil, // 86: inventory.v1.ExternalExporter.CustomLabelsEntry + nil, // 87: inventory.v1.AzureDatabaseExporter.CustomLabelsEntry + nil, // 88: inventory.v1.AddPMMAgentParams.CustomLabelsEntry + nil, // 89: inventory.v1.AddNodeExporterParams.CustomLabelsEntry + nil, // 90: inventory.v1.AddMySQLdExporterParams.CustomLabelsEntry + nil, // 91: inventory.v1.AddMySQLdExporterParams.ExtraDsnParamsEntry + nil, // 92: inventory.v1.AddMongoDBExporterParams.CustomLabelsEntry + nil, // 93: inventory.v1.AddPostgresExporterParams.CustomLabelsEntry + nil, // 94: inventory.v1.AddProxySQLExporterParams.CustomLabelsEntry + nil, // 95: inventory.v1.AddQANMySQLPerfSchemaAgentParams.CustomLabelsEntry + nil, // 96: inventory.v1.AddQANMySQLPerfSchemaAgentParams.ExtraDsnParamsEntry + nil, // 97: inventory.v1.AddQANMySQLSlowlogAgentParams.CustomLabelsEntry + nil, // 98: inventory.v1.AddQANMySQLSlowlogAgentParams.ExtraDsnParamsEntry + nil, // 99: inventory.v1.AddQANMongoDBProfilerAgentParams.CustomLabelsEntry + nil, // 100: inventory.v1.AddQANMongoDBMongologAgentParams.CustomLabelsEntry + nil, // 101: inventory.v1.AddQANPostgreSQLPgStatementsAgentParams.CustomLabelsEntry + nil, // 102: inventory.v1.AddQANPostgreSQLPgStatMonitorAgentParams.CustomLabelsEntry + nil, // 103: inventory.v1.AddRDSExporterParams.CustomLabelsEntry + nil, // 104: inventory.v1.AddExternalExporterParams.CustomLabelsEntry + nil, // 105: inventory.v1.AddAzureDatabaseExporterParams.CustomLabelsEntry + nil, // 106: inventory.v1.AddValkeyExporterParams.CustomLabelsEntry + nil, // 107: inventory.v1.AddRTAMongoDBAgentParams.CustomLabelsEntry + AgentStatus(0), // 108: inventory.v1.AgentStatus + LogLevel(0), // 109: inventory.v1.LogLevel + (*common.MetricsResolutions)(nil), // 110: common.MetricsResolutions + (*durationpb.Duration)(nil), // 111: google.protobuf.Duration + (*common.StringMap)(nil), // 112: common.StringMap + } +) + var file_inventory_v1_agents_proto_depIdxs = []int32{ 68, // 0: inventory.v1.PMMAgent.custom_labels:type_name -> inventory.v1.PMMAgent.CustomLabelsEntry 108, // 1: inventory.v1.VMAgent.status:type_name -> inventory.v1.AgentStatus 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 4860035426f..0af57af86c3 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 @@ -102,7 +102,6 @@ func (o *ChangeAgentOK) GetPayload() *ChangeAgentOKBody { } func (o *ChangeAgentOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - o.Payload = new(ChangeAgentOKBody) // response payload @@ -176,7 +175,6 @@ func (o *ChangeAgentDefault) GetPayload() *ChangeAgentDefaultBody { } func (o *ChangeAgentDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - o.Payload = new(ChangeAgentDefaultBody) // response payload @@ -192,7 +190,6 @@ ChangeAgentBody change agent body swagger:model ChangeAgentBody */ type ChangeAgentBody struct { - // azure database exporter AzureDatabaseExporter *ChangeAgentParamsBodyAzureDatabaseExporter `json:"azure_database_exporter,omitempty"` @@ -793,7 +790,6 @@ func (o *ChangeAgentBody) ContextValidate(ctx context.Context, formats strfmt.Re } func (o *ChangeAgentBody) contextValidateAzureDatabaseExporter(ctx context.Context, formats strfmt.Registry) error { - if o.AzureDatabaseExporter != nil { if swag.IsZero(o.AzureDatabaseExporter) { // not required @@ -818,7 +814,6 @@ func (o *ChangeAgentBody) contextValidateAzureDatabaseExporter(ctx context.Conte } func (o *ChangeAgentBody) contextValidateExternalExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ExternalExporter != nil { if swag.IsZero(o.ExternalExporter) { // not required @@ -843,7 +838,6 @@ func (o *ChangeAgentBody) contextValidateExternalExporter(ctx context.Context, f } func (o *ChangeAgentBody) contextValidateMongodbExporter(ctx context.Context, formats strfmt.Registry) error { - if o.MongodbExporter != nil { if swag.IsZero(o.MongodbExporter) { // not required @@ -868,7 +862,6 @@ func (o *ChangeAgentBody) contextValidateMongodbExporter(ctx context.Context, fo } func (o *ChangeAgentBody) contextValidateMysqldExporter(ctx context.Context, formats strfmt.Registry) error { - if o.MysqldExporter != nil { if swag.IsZero(o.MysqldExporter) { // not required @@ -893,7 +886,6 @@ func (o *ChangeAgentBody) contextValidateMysqldExporter(ctx context.Context, for } func (o *ChangeAgentBody) contextValidateNodeExporter(ctx context.Context, formats strfmt.Registry) error { - if o.NodeExporter != nil { if swag.IsZero(o.NodeExporter) { // not required @@ -918,7 +910,6 @@ func (o *ChangeAgentBody) contextValidateNodeExporter(ctx context.Context, forma } func (o *ChangeAgentBody) contextValidateNomadAgent(ctx context.Context, formats strfmt.Registry) error { - if o.NomadAgent != nil { if swag.IsZero(o.NomadAgent) { // not required @@ -943,7 +934,6 @@ func (o *ChangeAgentBody) contextValidateNomadAgent(ctx context.Context, formats } func (o *ChangeAgentBody) contextValidatePostgresExporter(ctx context.Context, formats strfmt.Registry) error { - if o.PostgresExporter != nil { if swag.IsZero(o.PostgresExporter) { // not required @@ -968,7 +958,6 @@ func (o *ChangeAgentBody) contextValidatePostgresExporter(ctx context.Context, f } func (o *ChangeAgentBody) contextValidateProxysqlExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ProxysqlExporter != nil { if swag.IsZero(o.ProxysqlExporter) { // not required @@ -993,7 +982,6 @@ func (o *ChangeAgentBody) contextValidateProxysqlExporter(ctx context.Context, f } func (o *ChangeAgentBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbMongologAgent != nil { if swag.IsZero(o.QANMongodbMongologAgent) { // not required @@ -1018,7 +1006,6 @@ func (o *ChangeAgentBody) contextValidateQANMongodbMongologAgent(ctx context.Con } func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { if swag.IsZero(o.QANMongodbProfilerAgent) { // not required @@ -1043,7 +1030,6 @@ func (o *ChangeAgentBody) contextValidateQANMongodbProfilerAgent(ctx context.Con } func (o *ChangeAgentBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMysqlPerfschemaAgent != nil { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required @@ -1068,7 +1054,6 @@ func (o *ChangeAgentBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Con } func (o *ChangeAgentBody) contextValidateQANMysqlSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMysqlSlowlogAgent != nil { if swag.IsZero(o.QANMysqlSlowlogAgent) { // not required @@ -1093,7 +1078,6 @@ func (o *ChangeAgentBody) contextValidateQANMysqlSlowlogAgent(ctx context.Contex } func (o *ChangeAgentBody) contextValidateQANPostgresqlPgstatementsAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANPostgresqlPgstatementsAgent != nil { if swag.IsZero(o.QANPostgresqlPgstatementsAgent) { // not required @@ -1118,7 +1102,6 @@ func (o *ChangeAgentBody) contextValidateQANPostgresqlPgstatementsAgent(ctx cont } func (o *ChangeAgentBody) contextValidateQANPostgresqlPgstatmonitorAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANPostgresqlPgstatmonitorAgent != nil { if swag.IsZero(o.QANPostgresqlPgstatmonitorAgent) { // not required @@ -1143,7 +1126,6 @@ func (o *ChangeAgentBody) contextValidateQANPostgresqlPgstatmonitorAgent(ctx con } func (o *ChangeAgentBody) contextValidateRDSExporter(ctx context.Context, formats strfmt.Registry) error { - if o.RDSExporter != nil { if swag.IsZero(o.RDSExporter) { // not required @@ -1168,7 +1150,6 @@ func (o *ChangeAgentBody) contextValidateRDSExporter(ctx context.Context, format } func (o *ChangeAgentBody) contextValidateRtaMongodbAgent(ctx context.Context, formats strfmt.Registry) error { - if o.RtaMongodbAgent != nil { if swag.IsZero(o.RtaMongodbAgent) { // not required @@ -1193,7 +1174,6 @@ func (o *ChangeAgentBody) contextValidateRtaMongodbAgent(ctx context.Context, fo } func (o *ChangeAgentBody) contextValidateValkeyExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ValkeyExporter != nil { if swag.IsZero(o.ValkeyExporter) { // not required @@ -1240,7 +1220,6 @@ ChangeAgentDefaultBody change agent default body swagger:model ChangeAgentDefaultBody */ type ChangeAgentDefaultBody struct { - // code Code int32 `json:"code,omitempty"` @@ -1310,9 +1289,7 @@ func (o *ChangeAgentDefaultBody) ContextValidate(ctx context.Context, formats st } func (o *ChangeAgentDefaultBody) contextValidateDetails(ctx context.Context, formats strfmt.Registry) error { - for i := 0; i < len(o.Details); i++ { - if o.Details[i] != nil { if swag.IsZero(o.Details[i]) { // not required @@ -1332,7 +1309,6 @@ func (o *ChangeAgentDefaultBody) contextValidateDetails(ctx context.Context, for return err } } - } return nil @@ -1361,7 +1337,6 @@ ChangeAgentDefaultBodyDetailsItems0 change agent default body details items0 swagger:model ChangeAgentDefaultBodyDetailsItems0 */ type ChangeAgentDefaultBodyDetailsItems0 struct { - // at type AtType string `json:"@type,omitempty"` @@ -1373,7 +1348,6 @@ type ChangeAgentDefaultBodyDetailsItems0 struct { func (o *ChangeAgentDefaultBodyDetailsItems0) UnmarshalJSON(data []byte) error { // stage 1, bind the properties var stage1 struct { - // at type AtType string `json:"@type,omitempty"` } @@ -1411,7 +1385,6 @@ func (o *ChangeAgentDefaultBodyDetailsItems0) UnmarshalJSON(data []byte) error { // MarshalJSON marshals this object with additional properties into a JSON object func (o ChangeAgentDefaultBodyDetailsItems0) MarshalJSON() ([]byte, error) { var stage1 struct { - // at type AtType string `json:"@type,omitempty"` } @@ -1475,7 +1448,6 @@ ChangeAgentOKBody change agent OK body swagger:model ChangeAgentOKBody */ type ChangeAgentOKBody struct { - // azure database exporter AzureDatabaseExporter *ChangeAgentOKBodyAzureDatabaseExporter `json:"azure_database_exporter,omitempty"` @@ -2076,7 +2048,6 @@ func (o *ChangeAgentOKBody) ContextValidate(ctx context.Context, formats strfmt. } func (o *ChangeAgentOKBody) contextValidateAzureDatabaseExporter(ctx context.Context, formats strfmt.Registry) error { - if o.AzureDatabaseExporter != nil { if swag.IsZero(o.AzureDatabaseExporter) { // not required @@ -2101,7 +2072,6 @@ func (o *ChangeAgentOKBody) contextValidateAzureDatabaseExporter(ctx context.Con } func (o *ChangeAgentOKBody) contextValidateExternalExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ExternalExporter != nil { if swag.IsZero(o.ExternalExporter) { // not required @@ -2126,7 +2096,6 @@ func (o *ChangeAgentOKBody) contextValidateExternalExporter(ctx context.Context, } func (o *ChangeAgentOKBody) contextValidateMongodbExporter(ctx context.Context, formats strfmt.Registry) error { - if o.MongodbExporter != nil { if swag.IsZero(o.MongodbExporter) { // not required @@ -2151,7 +2120,6 @@ func (o *ChangeAgentOKBody) contextValidateMongodbExporter(ctx context.Context, } func (o *ChangeAgentOKBody) contextValidateMysqldExporter(ctx context.Context, formats strfmt.Registry) error { - if o.MysqldExporter != nil { if swag.IsZero(o.MysqldExporter) { // not required @@ -2176,7 +2144,6 @@ func (o *ChangeAgentOKBody) contextValidateMysqldExporter(ctx context.Context, f } func (o *ChangeAgentOKBody) contextValidateNodeExporter(ctx context.Context, formats strfmt.Registry) error { - if o.NodeExporter != nil { if swag.IsZero(o.NodeExporter) { // not required @@ -2201,7 +2168,6 @@ func (o *ChangeAgentOKBody) contextValidateNodeExporter(ctx context.Context, for } func (o *ChangeAgentOKBody) contextValidateNomadAgent(ctx context.Context, formats strfmt.Registry) error { - if o.NomadAgent != nil { if swag.IsZero(o.NomadAgent) { // not required @@ -2226,7 +2192,6 @@ func (o *ChangeAgentOKBody) contextValidateNomadAgent(ctx context.Context, forma } func (o *ChangeAgentOKBody) contextValidatePostgresExporter(ctx context.Context, formats strfmt.Registry) error { - if o.PostgresExporter != nil { if swag.IsZero(o.PostgresExporter) { // not required @@ -2251,7 +2216,6 @@ func (o *ChangeAgentOKBody) contextValidatePostgresExporter(ctx context.Context, } func (o *ChangeAgentOKBody) contextValidateProxysqlExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ProxysqlExporter != nil { if swag.IsZero(o.ProxysqlExporter) { // not required @@ -2276,7 +2240,6 @@ func (o *ChangeAgentOKBody) contextValidateProxysqlExporter(ctx context.Context, } func (o *ChangeAgentOKBody) contextValidateQANMongodbMongologAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbMongologAgent != nil { if swag.IsZero(o.QANMongodbMongologAgent) { // not required @@ -2301,7 +2264,6 @@ func (o *ChangeAgentOKBody) contextValidateQANMongodbMongologAgent(ctx context.C } func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMongodbProfilerAgent != nil { if swag.IsZero(o.QANMongodbProfilerAgent) { // not required @@ -2326,7 +2288,6 @@ func (o *ChangeAgentOKBody) contextValidateQANMongodbProfilerAgent(ctx context.C } func (o *ChangeAgentOKBody) contextValidateQANMysqlPerfschemaAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMysqlPerfschemaAgent != nil { if swag.IsZero(o.QANMysqlPerfschemaAgent) { // not required @@ -2351,7 +2312,6 @@ func (o *ChangeAgentOKBody) contextValidateQANMysqlPerfschemaAgent(ctx context.C } func (o *ChangeAgentOKBody) contextValidateQANMysqlSlowlogAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANMysqlSlowlogAgent != nil { if swag.IsZero(o.QANMysqlSlowlogAgent) { // not required @@ -2376,7 +2336,6 @@ func (o *ChangeAgentOKBody) contextValidateQANMysqlSlowlogAgent(ctx context.Cont } func (o *ChangeAgentOKBody) contextValidateQANPostgresqlPgstatementsAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANPostgresqlPgstatementsAgent != nil { if swag.IsZero(o.QANPostgresqlPgstatementsAgent) { // not required @@ -2401,7 +2360,6 @@ func (o *ChangeAgentOKBody) contextValidateQANPostgresqlPgstatementsAgent(ctx co } func (o *ChangeAgentOKBody) contextValidateQANPostgresqlPgstatmonitorAgent(ctx context.Context, formats strfmt.Registry) error { - if o.QANPostgresqlPgstatmonitorAgent != nil { if swag.IsZero(o.QANPostgresqlPgstatmonitorAgent) { // not required @@ -2426,7 +2384,6 @@ func (o *ChangeAgentOKBody) contextValidateQANPostgresqlPgstatmonitorAgent(ctx c } func (o *ChangeAgentOKBody) contextValidateRDSExporter(ctx context.Context, formats strfmt.Registry) error { - if o.RDSExporter != nil { if swag.IsZero(o.RDSExporter) { // not required @@ -2451,7 +2408,6 @@ func (o *ChangeAgentOKBody) contextValidateRDSExporter(ctx context.Context, form } func (o *ChangeAgentOKBody) contextValidateRtaMongodbAgent(ctx context.Context, formats strfmt.Registry) error { - if o.RtaMongodbAgent != nil { if swag.IsZero(o.RtaMongodbAgent) { // not required @@ -2476,7 +2432,6 @@ func (o *ChangeAgentOKBody) contextValidateRtaMongodbAgent(ctx context.Context, } func (o *ChangeAgentOKBody) contextValidateValkeyExporter(ctx context.Context, formats strfmt.Registry) error { - if o.ValkeyExporter != nil { if swag.IsZero(o.ValkeyExporter) { // not required @@ -2523,7 +2478,6 @@ ChangeAgentOKBodyAzureDatabaseExporter AzureDatabaseExporter runs on Generic or swagger:model ChangeAgentOKBodyAzureDatabaseExporter */ type ChangeAgentOKBodyAzureDatabaseExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -2750,7 +2704,6 @@ func (o *ChangeAgentOKBodyAzureDatabaseExporter) ContextValidate(ctx context.Con } func (o *ChangeAgentOKBodyAzureDatabaseExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -2797,7 +2750,6 @@ ChangeAgentOKBodyAzureDatabaseExporterMetricsResolutions MetricsResolutions repr swagger:model ChangeAgentOKBodyAzureDatabaseExporterMetricsResolutions */ type ChangeAgentOKBodyAzureDatabaseExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -2841,7 +2793,6 @@ ChangeAgentOKBodyExternalExporter ExternalExporter runs on any Node type, includ swagger:model ChangeAgentOKBodyExternalExporter */ type ChangeAgentOKBodyExternalExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3010,7 +2961,6 @@ func (o *ChangeAgentOKBodyExternalExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -3057,7 +3007,6 @@ ChangeAgentOKBodyExternalExporterMetricsResolutions MetricsResolutions represent swagger:model ChangeAgentOKBodyExternalExporterMetricsResolutions */ type ChangeAgentOKBodyExternalExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -3101,7 +3050,6 @@ ChangeAgentOKBodyMongodbExporter MongoDBExporter runs on Generic or Container No swagger:model ChangeAgentOKBodyMongodbExporter */ type ChangeAgentOKBodyMongodbExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3353,7 +3301,6 @@ func (o *ChangeAgentOKBodyMongodbExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentOKBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -3400,7 +3347,6 @@ ChangeAgentOKBodyMongodbExporterMetricsResolutions MetricsResolutions represents swagger:model ChangeAgentOKBodyMongodbExporterMetricsResolutions */ type ChangeAgentOKBodyMongodbExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -3444,7 +3390,6 @@ ChangeAgentOKBodyMysqldExporter MySQLdExporter runs on Generic or Container Node swagger:model ChangeAgentOKBodyMysqldExporter */ type ChangeAgentOKBodyMysqldExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -3706,7 +3651,6 @@ func (o *ChangeAgentOKBodyMysqldExporter) ContextValidate(ctx context.Context, f } func (o *ChangeAgentOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -3753,7 +3697,6 @@ ChangeAgentOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents swagger:model ChangeAgentOKBodyMysqldExporterMetricsResolutions */ type ChangeAgentOKBodyMysqldExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -3797,7 +3740,6 @@ ChangeAgentOKBodyNodeExporter NodeExporter runs on Generic or Container Node and swagger:model ChangeAgentOKBodyNodeExporter */ type ChangeAgentOKBodyNodeExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4021,7 +3963,6 @@ func (o *ChangeAgentOKBodyNodeExporter) ContextValidate(ctx context.Context, for } func (o *ChangeAgentOKBodyNodeExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -4068,7 +4009,6 @@ ChangeAgentOKBodyNodeExporterMetricsResolutions MetricsResolutions represents Pr swagger:model ChangeAgentOKBodyNodeExporterMetricsResolutions */ type ChangeAgentOKBodyNodeExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -4112,7 +4052,6 @@ ChangeAgentOKBodyNomadAgent change agent OK body nomad agent swagger:model ChangeAgentOKBodyNomadAgent */ type ChangeAgentOKBodyNomadAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4243,7 +4182,6 @@ ChangeAgentOKBodyPostgresExporter PostgresExporter runs on Generic or Container swagger:model ChangeAgentOKBodyPostgresExporter */ type ChangeAgentOKBodyPostgresExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4488,7 +4426,6 @@ func (o *ChangeAgentOKBodyPostgresExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentOKBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -4535,7 +4472,6 @@ ChangeAgentOKBodyPostgresExporterMetricsResolutions MetricsResolutions represent swagger:model ChangeAgentOKBodyPostgresExporterMetricsResolutions */ type ChangeAgentOKBodyPostgresExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -4579,7 +4515,6 @@ ChangeAgentOKBodyProxysqlExporter ProxySQLExporter runs on Generic or Container swagger:model ChangeAgentOKBodyProxysqlExporter */ type ChangeAgentOKBodyProxysqlExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -4818,7 +4753,6 @@ func (o *ChangeAgentOKBodyProxysqlExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentOKBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -4865,7 +4799,6 @@ ChangeAgentOKBodyProxysqlExporterMetricsResolutions MetricsResolutions represent swagger:model ChangeAgentOKBodyProxysqlExporterMetricsResolutions */ type ChangeAgentOKBodyProxysqlExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -4909,7 +4842,6 @@ ChangeAgentOKBodyQANMongodbMongologAgent QANMongoDBMongologAgent runs within pmm swagger:model ChangeAgentOKBodyQANMongodbMongologAgent */ type ChangeAgentOKBodyQANMongodbMongologAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -5119,7 +5051,6 @@ ChangeAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm swagger:model ChangeAgentOKBodyQANMongodbProfilerAgent */ type ChangeAgentOKBodyQANMongodbProfilerAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -5329,7 +5260,6 @@ ChangeAgentOKBodyQANMysqlPerfschemaAgent QANMySQLPerfSchemaAgent runs within pmm swagger:model ChangeAgentOKBodyQANMysqlPerfschemaAgent */ type ChangeAgentOKBodyQANMysqlPerfschemaAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -5557,7 +5487,6 @@ ChangeAgentOKBodyQANMysqlSlowlogAgent QANMySQLSlowlogAgent runs within pmm-agent swagger:model ChangeAgentOKBodyQANMysqlSlowlogAgent */ type ChangeAgentOKBodyQANMysqlSlowlogAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -5788,7 +5717,6 @@ ChangeAgentOKBodyQANPostgresqlPgstatementsAgent QANPostgreSQLPgStatementsAgent r swagger:model ChangeAgentOKBodyQANPostgresqlPgstatementsAgent */ type ChangeAgentOKBodyQANPostgresqlPgstatementsAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -6001,7 +5929,6 @@ ChangeAgentOKBodyQANPostgresqlPgstatmonitorAgent QANPostgreSQLPgStatMonitorAgent swagger:model ChangeAgentOKBodyQANPostgresqlPgstatmonitorAgent */ type ChangeAgentOKBodyQANPostgresqlPgstatmonitorAgent struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -6217,7 +6144,6 @@ ChangeAgentOKBodyRDSExporter RDSExporter runs on Generic or Container Node and e swagger:model ChangeAgentOKBodyRDSExporter */ type ChangeAgentOKBodyRDSExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -6450,7 +6376,6 @@ func (o *ChangeAgentOKBodyRDSExporter) ContextValidate(ctx context.Context, form } func (o *ChangeAgentOKBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -6497,7 +6422,6 @@ ChangeAgentOKBodyRDSExporterMetricsResolutions MetricsResolutions represents Pro swagger:model ChangeAgentOKBodyRDSExporterMetricsResolutions */ type ChangeAgentOKBodyRDSExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -6541,7 +6465,6 @@ ChangeAgentOKBodyRtaMongodbAgent RTAMongoDBAgent runs within pmm-agent and sends swagger:model ChangeAgentOKBodyRtaMongodbAgent */ type ChangeAgentOKBodyRtaMongodbAgent struct { - // Unique agent identifier. AgentID string `json:"agent_id,omitempty"` @@ -6762,7 +6685,6 @@ func (o *ChangeAgentOKBodyRtaMongodbAgent) ContextValidate(ctx context.Context, } func (o *ChangeAgentOKBodyRtaMongodbAgent) contextValidateRtaOptions(ctx context.Context, formats strfmt.Registry) error { - if o.RtaOptions != nil { if swag.IsZero(o.RtaOptions) { // not required @@ -6809,7 +6731,6 @@ ChangeAgentOKBodyRtaMongodbAgentRtaOptions RTAOptions holds Real-Time Query Anal swagger:model ChangeAgentOKBodyRtaMongodbAgentRtaOptions */ type ChangeAgentOKBodyRtaMongodbAgentRtaOptions struct { - // Query collect interval (default 2s is set by server). CollectInterval string `json:"collect_interval,omitempty"` } @@ -6847,7 +6768,6 @@ ChangeAgentOKBodyValkeyExporter ValkeyExporter runs on Generic or Container Node swagger:model ChangeAgentOKBodyValkeyExporter */ type ChangeAgentOKBodyValkeyExporter struct { - // Unique randomly generated instance identifier. AgentID string `json:"agent_id,omitempty"` @@ -7022,7 +6942,6 @@ func (o *ChangeAgentOKBodyValkeyExporter) ContextValidate(ctx context.Context, f } func (o *ChangeAgentOKBodyValkeyExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7069,7 +6988,6 @@ ChangeAgentOKBodyValkeyExporterMetricsResolutions MetricsResolutions represents swagger:model ChangeAgentOKBodyValkeyExporterMetricsResolutions */ type ChangeAgentOKBodyValkeyExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -7113,7 +7031,6 @@ ChangeAgentParamsBodyAzureDatabaseExporter change agent params body azure databa swagger:model ChangeAgentParamsBodyAzureDatabaseExporter */ type ChangeAgentParamsBodyAzureDatabaseExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -7289,7 +7206,6 @@ func (o *ChangeAgentParamsBodyAzureDatabaseExporter) ContextValidate(ctx context } func (o *ChangeAgentParamsBodyAzureDatabaseExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -7314,7 +7230,6 @@ func (o *ChangeAgentParamsBodyAzureDatabaseExporter) contextValidateCustomLabels } func (o *ChangeAgentParamsBodyAzureDatabaseExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7361,7 +7276,6 @@ ChangeAgentParamsBodyAzureDatabaseExporterCustomLabels A wrapper for map[string] swagger:model ChangeAgentParamsBodyAzureDatabaseExporterCustomLabels */ type ChangeAgentParamsBodyAzureDatabaseExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -7399,7 +7313,6 @@ ChangeAgentParamsBodyAzureDatabaseExporterMetricsResolutions MetricsResolutions swagger:model ChangeAgentParamsBodyAzureDatabaseExporterMetricsResolutions */ type ChangeAgentParamsBodyAzureDatabaseExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -7443,7 +7356,6 @@ ChangeAgentParamsBodyExternalExporter change agent params body external exporter swagger:model ChangeAgentParamsBodyExternalExporter */ type ChangeAgentParamsBodyExternalExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -7555,7 +7467,6 @@ func (o *ChangeAgentParamsBodyExternalExporter) ContextValidate(ctx context.Cont } func (o *ChangeAgentParamsBodyExternalExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -7580,7 +7491,6 @@ func (o *ChangeAgentParamsBodyExternalExporter) contextValidateCustomLabels(ctx } func (o *ChangeAgentParamsBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7627,7 +7537,6 @@ ChangeAgentParamsBodyExternalExporterCustomLabels A wrapper for map[string]strin swagger:model ChangeAgentParamsBodyExternalExporterCustomLabels */ type ChangeAgentParamsBodyExternalExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -7665,7 +7574,6 @@ ChangeAgentParamsBodyExternalExporterMetricsResolutions MetricsResolutions repre swagger:model ChangeAgentParamsBodyExternalExporterMetricsResolutions */ type ChangeAgentParamsBodyExternalExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -7709,7 +7617,6 @@ ChangeAgentParamsBodyMongodbExporter change agent params body mongodb exporter swagger:model ChangeAgentParamsBodyMongodbExporter */ type ChangeAgentParamsBodyMongodbExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -7921,7 +7828,6 @@ func (o *ChangeAgentParamsBodyMongodbExporter) ContextValidate(ctx context.Conte } func (o *ChangeAgentParamsBodyMongodbExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -7946,7 +7852,6 @@ func (o *ChangeAgentParamsBodyMongodbExporter) contextValidateCustomLabels(ctx c } func (o *ChangeAgentParamsBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -7993,7 +7898,6 @@ ChangeAgentParamsBodyMongodbExporterCustomLabels A wrapper for map[string]string swagger:model ChangeAgentParamsBodyMongodbExporterCustomLabels */ type ChangeAgentParamsBodyMongodbExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -8031,7 +7935,6 @@ ChangeAgentParamsBodyMongodbExporterMetricsResolutions MetricsResolutions repres swagger:model ChangeAgentParamsBodyMongodbExporterMetricsResolutions */ type ChangeAgentParamsBodyMongodbExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -8075,7 +7978,6 @@ ChangeAgentParamsBodyMysqldExporter change agent params body mysqld exporter swagger:model ChangeAgentParamsBodyMysqldExporter */ type ChangeAgentParamsBodyMysqldExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -8275,7 +8177,6 @@ func (o *ChangeAgentParamsBodyMysqldExporter) ContextValidate(ctx context.Contex } func (o *ChangeAgentParamsBodyMysqldExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -8300,7 +8201,6 @@ func (o *ChangeAgentParamsBodyMysqldExporter) contextValidateCustomLabels(ctx co } func (o *ChangeAgentParamsBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -8347,7 +8247,6 @@ ChangeAgentParamsBodyMysqldExporterCustomLabels A wrapper for map[string]string. swagger:model ChangeAgentParamsBodyMysqldExporterCustomLabels */ type ChangeAgentParamsBodyMysqldExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -8385,7 +8284,6 @@ ChangeAgentParamsBodyMysqldExporterMetricsResolutions MetricsResolutions represe swagger:model ChangeAgentParamsBodyMysqldExporterMetricsResolutions */ type ChangeAgentParamsBodyMysqldExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -8429,7 +8327,6 @@ ChangeAgentParamsBodyNodeExporter change agent params body node exporter swagger:model ChangeAgentParamsBodyNodeExporter */ type ChangeAgentParamsBodyNodeExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -8596,7 +8493,6 @@ func (o *ChangeAgentParamsBodyNodeExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentParamsBodyNodeExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -8621,7 +8517,6 @@ func (o *ChangeAgentParamsBodyNodeExporter) contextValidateCustomLabels(ctx cont } func (o *ChangeAgentParamsBodyNodeExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -8668,7 +8563,6 @@ ChangeAgentParamsBodyNodeExporterCustomLabels A wrapper for map[string]string. T swagger:model ChangeAgentParamsBodyNodeExporterCustomLabels */ type ChangeAgentParamsBodyNodeExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -8706,7 +8600,6 @@ ChangeAgentParamsBodyNodeExporterMetricsResolutions MetricsResolutions represent swagger:model ChangeAgentParamsBodyNodeExporterMetricsResolutions */ type ChangeAgentParamsBodyNodeExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -8750,7 +8643,6 @@ ChangeAgentParamsBodyNomadAgent change agent params body nomad agent swagger:model ChangeAgentParamsBodyNomadAgent */ type ChangeAgentParamsBodyNomadAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` } @@ -8788,7 +8680,6 @@ ChangeAgentParamsBodyPostgresExporter change agent params body postgres exporter swagger:model ChangeAgentParamsBodyPostgresExporter */ type ChangeAgentParamsBodyPostgresExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -8991,7 +8882,6 @@ func (o *ChangeAgentParamsBodyPostgresExporter) ContextValidate(ctx context.Cont } func (o *ChangeAgentParamsBodyPostgresExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -9016,7 +8906,6 @@ func (o *ChangeAgentParamsBodyPostgresExporter) contextValidateCustomLabels(ctx } func (o *ChangeAgentParamsBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -9063,7 +8952,6 @@ ChangeAgentParamsBodyPostgresExporterCustomLabels A wrapper for map[string]strin swagger:model ChangeAgentParamsBodyPostgresExporterCustomLabels */ type ChangeAgentParamsBodyPostgresExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -9101,7 +8989,6 @@ ChangeAgentParamsBodyPostgresExporterMetricsResolutions MetricsResolutions repre swagger:model ChangeAgentParamsBodyPostgresExporterMetricsResolutions */ type ChangeAgentParamsBodyPostgresExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -9145,7 +9032,6 @@ ChangeAgentParamsBodyProxysqlExporter change agent params body proxysql exporter swagger:model ChangeAgentParamsBodyProxysqlExporter */ type ChangeAgentParamsBodyProxysqlExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -9333,7 +9219,6 @@ func (o *ChangeAgentParamsBodyProxysqlExporter) ContextValidate(ctx context.Cont } func (o *ChangeAgentParamsBodyProxysqlExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -9358,7 +9243,6 @@ func (o *ChangeAgentParamsBodyProxysqlExporter) contextValidateCustomLabels(ctx } func (o *ChangeAgentParamsBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -9405,7 +9289,6 @@ ChangeAgentParamsBodyProxysqlExporterCustomLabels A wrapper for map[string]strin swagger:model ChangeAgentParamsBodyProxysqlExporterCustomLabels */ type ChangeAgentParamsBodyProxysqlExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -9443,7 +9326,6 @@ ChangeAgentParamsBodyProxysqlExporterMetricsResolutions MetricsResolutions repre swagger:model ChangeAgentParamsBodyProxysqlExporterMetricsResolutions */ type ChangeAgentParamsBodyProxysqlExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -9487,7 +9369,6 @@ ChangeAgentParamsBodyQANMongodbMongologAgent change agent params body QAN mongod swagger:model ChangeAgentParamsBodyQANMongodbMongologAgent */ type ChangeAgentParamsBodyQANMongodbMongologAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -9681,7 +9562,6 @@ func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) ContextValidate(ctx conte } func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -9706,7 +9586,6 @@ func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) contextValidateCustomLabe } func (o *ChangeAgentParamsBodyQANMongodbMongologAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -9753,7 +9632,6 @@ ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels A wrapper for map[strin swagger:model ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels */ type ChangeAgentParamsBodyQANMongodbMongologAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -9791,7 +9669,6 @@ ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions MetricsResolution swagger:model ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions */ type ChangeAgentParamsBodyQANMongodbMongologAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -9835,7 +9712,6 @@ ChangeAgentParamsBodyQANMongodbProfilerAgent change agent params body QAN mongod swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgent */ type ChangeAgentParamsBodyQANMongodbProfilerAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -10029,7 +9905,6 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) ContextValidate(ctx conte } func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -10054,7 +9929,6 @@ func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateCustomLabe } func (o *ChangeAgentParamsBodyQANMongodbProfilerAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -10101,7 +9975,6 @@ ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels A wrapper for map[strin swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels */ type ChangeAgentParamsBodyQANMongodbProfilerAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -10139,7 +10012,6 @@ ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions MetricsResolution swagger:model ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions */ type ChangeAgentParamsBodyQANMongodbProfilerAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -10183,7 +10055,6 @@ ChangeAgentParamsBodyQANMysqlPerfschemaAgent change agent params body QAN mysql swagger:model ChangeAgentParamsBodyQANMysqlPerfschemaAgent */ type ChangeAgentParamsBodyQANMysqlPerfschemaAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -10377,7 +10248,6 @@ func (o *ChangeAgentParamsBodyQANMysqlPerfschemaAgent) ContextValidate(ctx conte } func (o *ChangeAgentParamsBodyQANMysqlPerfschemaAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -10402,7 +10272,6 @@ func (o *ChangeAgentParamsBodyQANMysqlPerfschemaAgent) contextValidateCustomLabe } func (o *ChangeAgentParamsBodyQANMysqlPerfschemaAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -10449,7 +10318,6 @@ ChangeAgentParamsBodyQANMysqlPerfschemaAgentCustomLabels A wrapper for map[strin swagger:model ChangeAgentParamsBodyQANMysqlPerfschemaAgentCustomLabels */ type ChangeAgentParamsBodyQANMysqlPerfschemaAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -10487,7 +10355,6 @@ ChangeAgentParamsBodyQANMysqlPerfschemaAgentMetricsResolutions MetricsResolution swagger:model ChangeAgentParamsBodyQANMysqlPerfschemaAgentMetricsResolutions */ type ChangeAgentParamsBodyQANMysqlPerfschemaAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -10531,7 +10398,6 @@ ChangeAgentParamsBodyQANMysqlSlowlogAgent change agent params body QAN mysql slo swagger:model ChangeAgentParamsBodyQANMysqlSlowlogAgent */ type ChangeAgentParamsBodyQANMysqlSlowlogAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -10728,7 +10594,6 @@ func (o *ChangeAgentParamsBodyQANMysqlSlowlogAgent) ContextValidate(ctx context. } func (o *ChangeAgentParamsBodyQANMysqlSlowlogAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -10753,7 +10618,6 @@ func (o *ChangeAgentParamsBodyQANMysqlSlowlogAgent) contextValidateCustomLabels( } func (o *ChangeAgentParamsBodyQANMysqlSlowlogAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -10800,7 +10664,6 @@ ChangeAgentParamsBodyQANMysqlSlowlogAgentCustomLabels A wrapper for map[string]s swagger:model ChangeAgentParamsBodyQANMysqlSlowlogAgentCustomLabels */ type ChangeAgentParamsBodyQANMysqlSlowlogAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -10838,7 +10701,6 @@ ChangeAgentParamsBodyQANMysqlSlowlogAgentMetricsResolutions MetricsResolutions r swagger:model ChangeAgentParamsBodyQANMysqlSlowlogAgentMetricsResolutions */ type ChangeAgentParamsBodyQANMysqlSlowlogAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -10882,7 +10744,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent change agent params body QAN swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent */ type ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -11073,7 +10934,6 @@ func (o *ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent) ContextValidate(ct } func (o *ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -11098,7 +10958,6 @@ func (o *ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent) contextValidateCus } func (o *ChangeAgentParamsBodyQANPostgresqlPgstatementsAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -11145,7 +11004,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentCustomLabels A wrapper for ma swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentCustomLabels */ type ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -11183,7 +11041,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentMetricsResolutions MetricsRes swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentMetricsResolutions */ type ChangeAgentParamsBodyQANPostgresqlPgstatementsAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -11227,7 +11084,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent change agent params body QA swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent */ type ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -11421,7 +11277,6 @@ func (o *ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent) ContextValidate(c } func (o *ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -11446,7 +11301,6 @@ func (o *ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent) contextValidateCu } func (o *ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgent) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -11493,7 +11347,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentCustomLabels A wrapper for m swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentCustomLabels */ type ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -11531,7 +11384,6 @@ ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentMetricsResolutions MetricsRe swagger:model ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentMetricsResolutions */ type ChangeAgentParamsBodyQANPostgresqlPgstatmonitorAgentMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -11575,7 +11427,6 @@ ChangeAgentParamsBodyRDSExporter change agent params body RDS exporter swagger:model ChangeAgentParamsBodyRDSExporter */ type ChangeAgentParamsBodyRDSExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -11748,7 +11599,6 @@ func (o *ChangeAgentParamsBodyRDSExporter) ContextValidate(ctx context.Context, } func (o *ChangeAgentParamsBodyRDSExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -11773,7 +11623,6 @@ func (o *ChangeAgentParamsBodyRDSExporter) contextValidateCustomLabels(ctx conte } func (o *ChangeAgentParamsBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -11820,7 +11669,6 @@ ChangeAgentParamsBodyRDSExporterCustomLabels A wrapper for map[string]string. Th swagger:model ChangeAgentParamsBodyRDSExporterCustomLabels */ type ChangeAgentParamsBodyRDSExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -11858,7 +11706,6 @@ ChangeAgentParamsBodyRDSExporterMetricsResolutions MetricsResolutions represents swagger:model ChangeAgentParamsBodyRDSExporterMetricsResolutions */ type ChangeAgentParamsBodyRDSExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` @@ -11902,7 +11749,6 @@ ChangeAgentParamsBodyRtaMongodbAgent change agent params body rta mongodb agent swagger:model ChangeAgentParamsBodyRtaMongodbAgent */ type ChangeAgentParamsBodyRtaMongodbAgent struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -12087,7 +11933,6 @@ func (o *ChangeAgentParamsBodyRtaMongodbAgent) ContextValidate(ctx context.Conte } func (o *ChangeAgentParamsBodyRtaMongodbAgent) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -12112,7 +11957,6 @@ func (o *ChangeAgentParamsBodyRtaMongodbAgent) contextValidateCustomLabels(ctx c } func (o *ChangeAgentParamsBodyRtaMongodbAgent) contextValidateRtaOptions(ctx context.Context, formats strfmt.Registry) error { - if o.RtaOptions != nil { if swag.IsZero(o.RtaOptions) { // not required @@ -12159,7 +12003,6 @@ ChangeAgentParamsBodyRtaMongodbAgentCustomLabels A wrapper for map[string]string swagger:model ChangeAgentParamsBodyRtaMongodbAgentCustomLabels */ type ChangeAgentParamsBodyRtaMongodbAgentCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -12197,7 +12040,6 @@ ChangeAgentParamsBodyRtaMongodbAgentRtaOptions RTAOptions holds Real-Time Query swagger:model ChangeAgentParamsBodyRtaMongodbAgentRtaOptions */ type ChangeAgentParamsBodyRtaMongodbAgentRtaOptions struct { - // Query collect interval (default 2s is set by server). CollectInterval string `json:"collect_interval,omitempty"` } @@ -12235,7 +12077,6 @@ ChangeAgentParamsBodyValkeyExporter change agent params body valkey exporter swagger:model ChangeAgentParamsBodyValkeyExporter */ type ChangeAgentParamsBodyValkeyExporter struct { - // Enable this Agent. Agents are enabled by default when they get added. Enable *bool `json:"enable,omitempty"` @@ -12432,7 +12273,6 @@ func (o *ChangeAgentParamsBodyValkeyExporter) ContextValidate(ctx context.Contex } func (o *ChangeAgentParamsBodyValkeyExporter) contextValidateCustomLabels(ctx context.Context, formats strfmt.Registry) error { - if o.CustomLabels != nil { if swag.IsZero(o.CustomLabels) { // not required @@ -12457,7 +12297,6 @@ func (o *ChangeAgentParamsBodyValkeyExporter) contextValidateCustomLabels(ctx co } func (o *ChangeAgentParamsBodyValkeyExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { - if o.MetricsResolutions != nil { if swag.IsZero(o.MetricsResolutions) { // not required @@ -12504,7 +12343,6 @@ ChangeAgentParamsBodyValkeyExporterCustomLabels A wrapper for map[string]string. swagger:model ChangeAgentParamsBodyValkeyExporterCustomLabels */ type ChangeAgentParamsBodyValkeyExporterCustomLabels struct { - // values Values map[string]string `json:"values,omitempty"` } @@ -12542,7 +12380,6 @@ ChangeAgentParamsBodyValkeyExporterMetricsResolutions MetricsResolutions represe swagger:model ChangeAgentParamsBodyValkeyExporterMetricsResolutions */ type ChangeAgentParamsBodyValkeyExporterMetricsResolutions struct { - // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. Hr string `json:"hr,omitempty"` From f8a0b7832cd7ef89a3d85e5e237a1c849e3ca2dd Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 9 Jul 2026 16:14:00 +0200 Subject: [PATCH 05/12] PMM-15130 Add CLI test for --skip-connection-check parsing --- .../change_agent_mysqld_exporter_test.go | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/admin/commands/inventory/change_agent_mysqld_exporter_test.go b/admin/commands/inventory/change_agent_mysqld_exporter_test.go index bc0bd396f98..eec6542c294 100644 --- a/admin/commands/inventory/change_agent_mysqld_exporter_test.go +++ b/admin/commands/inventory/change_agent_mysqld_exporter_test.go @@ -341,6 +341,41 @@ Configuration changes applied: assert.JSONEq(t, expectedJSON, capturedRequestBody) }) + t.Run("KongParsingWithSkipConnectionCheck", func(t *testing.T) { + agentID := "test-mysqld-skip" + + var capturedRequestBody string + + cleanup := setupChangeAgentTestServer(t, agentID, "", &capturedRequestBody) + defer cleanup() + + var cmd ChangeAgentMysqldExporterCommand + parser := kong.Must(&cmd) + + args := []string{agentID, "--skip-connection-check"} + + ctx, err := parser.Parse(args) + require.NoError(t, err) + require.NotNil(t, ctx) + + require.NotNil(t, cmd.SkipConnectionCheck) + assert.True(t, *cmd.SkipConnectionCheck) + + result, err := cmd.RunCmd() + require.NoError(t, err) + require.NotNil(t, result) + + // Positive counterpart to KongParsingWithMinimalFlags: when the flag IS passed, + // the request body must carry skip_connection_check: true (not omitted). + expectedJSON := `{ + "mysqld_exporter": { + "disable_collectors": null, + "skip_connection_check": true + } + }` + assert.JSONEq(t, expectedJSON, capturedRequestBody) + }) + t.Run("KongParsingErrorCases", func(t *testing.T) { t.Run("MissingRequiredArgument", func(t *testing.T) { var cmd ChangeAgentMysqldExporterCommand From d1f16cc20d00df03ef9a2d0705d62fb87dade1f3 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Thu, 9 Jul 2026 16:58:59 +0200 Subject: [PATCH 06/12] PMM-15130 Fix linter warnings --- managed/services/inventory/agents.go | 3 ++- managed/services/inventory/agents_test.go | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 768fddb8e81..4bae02448ec 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -2006,7 +2006,8 @@ func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, return err } - if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, updatedAgent); err != nil { + err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, updatedAgent) + if err != nil { return err } } diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 9416c9f61eb..be6db00787f 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -1092,9 +1092,9 @@ func TestChangeAgentConnectionCheck(t *testing.T) { connectionCheckCall := func(as *AgentsService, ctx context.Context) *mock.Call { return as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, - mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), - mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())) + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())) } t.Run("CheckRunsOnCredentialChange", func(t *testing.T) { From ff5e63b995bc01c69c2ce2b6b883d45d714f3bb5 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Fri, 10 Jul 2026 11:59:15 +0200 Subject: [PATCH 07/12] PMM-15130 Move `skipConnectionCheck` into `models.ChangeAgentParams` --- managed/models/agent_helpers.go | 3 + managed/services/inventory/agents.go | 231 +++++++++++++++------------ 2 files changed, 129 insertions(+), 105 deletions(-) diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 3011fd0f2ca..3059bd062c6 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -1125,6 +1125,9 @@ type ChangeAgentParams struct { TLS *bool TLSSkipVerify *bool ListenPort *uint32 // for external exporter + + // SkipConnectionCheck is a request-scoped flag, not an agent attribute + SkipConnectionCheck bool } // AffectsConnection returns true if the change modifies parameters used to connect diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 4bae02448ec..784eee81321 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -210,6 +210,8 @@ func (as *AgentsService) ChangeNodeExporter(ctx context.Context, agentID string, Enabled: p.Enable, CustomLabels: convertCustomLabels(p.CustomLabels), LogLevel: convertLogLevel(p.LogLevel), + // Always skip the connection check for node_exporter + SkipConnectionCheck: true, } // Set ExporterOptions @@ -220,7 +222,7 @@ func (as *AgentsService) ChangeNodeExporter(ctx context.Context, agentID string, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, true) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -315,14 +317,15 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, p *inventoryv1.A func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID string, p *inventoryv1.ChangeMySQLdExporterParams) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - AgentPassword: p.AgentPassword, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + AgentPassword: p.AgentPassword, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set MySQLOptions @@ -342,7 +345,7 @@ func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID strin ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -434,14 +437,15 @@ func (as *AgentsService) ChangeMongoDBExporter( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - AgentPassword: p.AgentPassword, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + AgentPassword: p.AgentPassword, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set MongoDBOptions @@ -465,7 +469,7 @@ func (as *AgentsService) ChangeMongoDBExporter( ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -551,13 +555,14 @@ func (as *AgentsService) ChangeQANMySQLPerfSchemaAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -580,7 +585,7 @@ func (as *AgentsService) ChangeQANMySQLPerfSchemaAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -668,13 +673,14 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -698,7 +704,7 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -787,14 +793,15 @@ func (as *AgentsService) ChangePostgresExporter( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - AgentPassword: p.AgentPassword, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + AgentPassword: p.AgentPassword, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set PostgreSQLOptions @@ -812,7 +819,7 @@ func (as *AgentsService) ChangePostgresExporter( ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -897,14 +904,15 @@ func (as *AgentsService) AddValkeyExporter(ctx context.Context, p *inventoryv1.A func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID string, p *inventoryv1.ChangeValkeyExporterParams) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - AgentPassword: p.AgentPassword, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + AgentPassword: p.AgentPassword, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set ValkeyOptions @@ -923,7 +931,7 @@ func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID strin ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1005,13 +1013,14 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -1034,7 +1043,7 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1116,13 +1125,14 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -1145,7 +1155,7 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1233,14 +1243,15 @@ func (as *AgentsService) ChangeProxySQLExporter( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - AgentPassword: p.AgentPassword, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + AgentPassword: p.AgentPassword, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set ExporterOptions @@ -1252,7 +1263,7 @@ func (as *AgentsService) ChangeProxySQLExporter( ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1334,13 +1345,14 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -1362,7 +1374,7 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) // Check if we're trying to modify the internal PostgreSQL QAN agent and if the environment variable is set envVar, exists := os.LookupEnv(env.EnableInternalPgQAN) if exists && envVar != "" { @@ -1461,13 +1473,14 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatMonitorAgent( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - Password: p.Password, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - CustomLabels: convertCustomLabels(p.CustomLabels), - LogLevel: convertLogLevel(p.LogLevel), + Enabled: p.Enable, + Username: p.Username, + Password: p.Password, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + CustomLabels: convertCustomLabels(p.CustomLabels), + LogLevel: convertLogLevel(p.LogLevel), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set QANOptions @@ -1490,7 +1503,7 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatMonitorAgent( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1563,6 +1576,8 @@ func (as *AgentsService) ChangeRDSExporter(ctx context.Context, agentID string, Enabled: p.Enable, CustomLabels: convertCustomLabels(p.CustomLabels), LogLevel: convertLogLevel(p.LogLevel), + // Always skip the connection check for RDS + SkipConnectionCheck: true, } // Set AWSOptions @@ -1579,7 +1594,7 @@ func (as *AgentsService) ChangeRDSExporter(ctx context.Context, agentID string, MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, true) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1654,10 +1669,11 @@ func (as *AgentsService) ChangeExternalExporter( ) (*inventoryv1.ChangeAgentResponse, error) { // Convert protobuf parameters to model parameters params := &models.ChangeAgentParams{ - Enabled: p.Enable, - Username: p.Username, - ListenPort: p.ListenPort, - CustomLabels: convertCustomLabels(p.CustomLabels), + Enabled: p.Enable, + Username: p.Username, + ListenPort: p.ListenPort, + CustomLabels: convertCustomLabels(p.CustomLabels), + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set ExporterOptions @@ -1668,7 +1684,7 @@ func (as *AgentsService) ChangeExternalExporter( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, p.GetSkipConnectionCheck()) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1739,6 +1755,8 @@ func (as *AgentsService) ChangeAzureDatabaseExporter( Enabled: p.Enable, CustomLabels: convertCustomLabels(p.CustomLabels), LogLevel: convertLogLevel(p.LogLevel), + // Always skip the connection check for Azure + SkipConnectionCheck: true, } // Set AzureOptions @@ -1756,7 +1774,7 @@ func (as *AgentsService) ChangeAzureDatabaseExporter( MetricsResolutions: convertMetricsResolutions(p.MetricsResolutions), } - agent, err := as.executeAgentChange(ctx, agentID, params, true) + agent, err := as.executeAgentChange(ctx, agentID, params) if err != nil { return nil, err } @@ -1777,9 +1795,11 @@ func (as *AgentsService) ChangeNomadAgent(ctx context.Context, agentID string, p // Convert protobuf parameters to model parameters changeParams := &models.ChangeAgentParams{ Enabled: params.Enable, + // Always skip the connection check for Nomad + SkipConnectionCheck: true, } - agent, err := as.executeAgentChange(ctx, agentID, changeParams, true) + agent, err := as.executeAgentChange(ctx, agentID, changeParams) if err != nil { return nil, err } @@ -1890,6 +1910,7 @@ func (as *AgentsService) ChangeRTAMongoDBAgent( TLSCa: p.TlsCa, AuthenticationMechanism: p.AuthenticationMechanism, }, + SkipConnectionCheck: p.GetSkipConnectionCheck(), } // Set RTA options if provided @@ -1897,7 +1918,7 @@ func (as *AgentsService) ChangeRTAMongoDBAgent( changeParams.RTAOptions = models.RTAOptionsFromRequest(p.RtaOptions) } - ag, err := as.executeAgentChange(ctx, agentID, changeParams, p.GetSkipConnectionCheck()) + ag, err := as.executeAgentChange(ctx, agentID, changeParams) if err != nil { return nil, err } @@ -1991,7 +2012,7 @@ func convertMetricsResolutions(mrs *common.MetricsResolutions) *models.ChangeMet } // Helper function to execute agent change and build response. -func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams, skipConnectionCheck bool) (inventoryv1.Agent, error) { //nolint:ireturn,lll +func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams) (inventoryv1.Agent, error) { //nolint:ireturn,lll var agent inventoryv1.Agent err := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { @@ -2000,7 +2021,7 @@ func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, return err } - if !skipConnectionCheck && params.AffectsConnection() && updatedAgent.ServiceID != nil { + if !params.SkipConnectionCheck && params.AffectsConnection() && updatedAgent.ServiceID != nil { service, err := models.FindServiceByID(tx.Querier, pointer.GetString(updatedAgent.ServiceID)) if err != nil { return err From 912b6d434d108af8ed70ac397dff46edb353305d Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Fri, 10 Jul 2026 12:16:12 +0200 Subject: [PATCH 08/12] PMM-15130 Fix err check in `ChangeQANPostgreSQLPgStatementsAgent` --- managed/services/inventory/agents.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 784eee81321..7b69893e6f6 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -1375,6 +1375,9 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent( } agent, err := as.executeAgentChange(ctx, agentID, params) + if err != nil { + return nil, err + } // Check if we're trying to modify the internal PostgreSQL QAN agent and if the environment variable is set envVar, exists := os.LookupEnv(env.EnableInternalPgQAN) if exists && envVar != "" { @@ -1391,10 +1394,6 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent( } } - if err != nil { - return nil, err - } - pgStatementsAgent := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, pgStatementsAgent.PmmAgentId) From 742d8f0f37f3f907f047da997e4288ba5d845632 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Fri, 10 Jul 2026 12:35:48 +0200 Subject: [PATCH 09/12] PMM-15130 Remove unused `lll` nolint directive --- managed/services/inventory/agents.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 7b69893e6f6..6f40c7b6c46 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -2011,7 +2011,7 @@ func convertMetricsResolutions(mrs *common.MetricsResolutions) *models.ChangeMet } // Helper function to execute agent change and build response. -func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams) (inventoryv1.Agent, error) { //nolint:ireturn,lll +func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, params *models.ChangeAgentParams) (inventoryv1.Agent, error) { //nolint:ireturn var agent inventoryv1.Agent err := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { From 2c7d7d88c9924dd7a1607465fdb1630d067031f2 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Fri, 10 Jul 2026 12:59:09 +0200 Subject: [PATCH 10/12] PMM-15130 Add docs for `--skip-connection-check` flag --- .../docs/use/commands/pmm-admin/inventory.md | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/documentation/docs/use/commands/pmm-admin/inventory.md b/documentation/docs/use/commands/pmm-admin/inventory.md index 1fb92395aff..f189051c830 100644 --- a/documentation/docs/use/commands/pmm-admin/inventory.md +++ b/documentation/docs/use/commands/pmm-admin/inventory.md @@ -66,6 +66,8 @@ Currently supports MongoDB agent types only: Only the flags you specify are updated — all other settings remain unchanged. Changes take effect immediately without restarting the agent. The command fails with a clear error if the agent ID doesn't exist or the type doesn't match. +When you change connection-affecting parameters (username, password, TLS settings, etc.), PMM verifies the new settings by connecting to the database before saving them. If the connection fails (for example, wrong credentials), the command returns an error and **no changes are applied**. Use `--skip-connection-check` to bypass this verification (see [Connection and authentication](#connection-and-authentication)). + ### When to use `change agent` vs `remove/add` **Use `change agent` for:** @@ -122,6 +124,21 @@ You can also use `pmm-admin list` to see agents alongside their services. - `--tls-certificate-key-file` : Path to combined cert/key file +- `--skip-connection-check` +: Save the new settings without verifying the database connection first + +!!! note "When to use `--skip-connection-check`" + By default, PMM verifies connection-affecting changes against the database before saving them. + Skip this check when the agent cannot reach the database at the moment you make the change, for example: + + - The database is temporarily **down or in a maintenance window**. + - You are rotating a **password that PMM does not yet have** (the current stored credentials + are already invalid, so the check would fail). + - The target instance is otherwise **temporarily unreachable**. + + PMM saves the new settings as-is. If the values are wrong, + metric collection stays broken until you correct them. + #### Collectors - `--enable-all-collectors` @@ -159,6 +176,14 @@ You can also use `pmm-admin list` to see agents alongside their services. --password=new_secret_pass ``` +- Update the password while the database is unreachable (skip the connection check): + + ```bash + pmm-admin inventory change agent mongodb-exporter 12345-67890 \ + --password=new_secret_pass \ + --skip-connection-check + ``` + - Add custom labels to an agent: ```bash @@ -223,9 +248,10 @@ The command returns a clear error message in these cases: - **Non-existent agent ID**: The specified agent ID does not exist in PMM inventory. - **Mismatched agent type**: The agent ID exists but belongs to a different agent type (e.g., using a `mysqld-exporter` ID with the `mongodb-exporter` subcommand). - **Invalid flag value**: A flag receives a value outside its allowed range (e.g., an invalid log level). +- **Connection check failure**: PMM could not validate the new connection-affecting settings (credentials, TLS) against the database. No changes are saved. If the database is intentionally unreachable (down, in maintenance, or you are setting a password PMM does not yet have), re-run the command with `--skip-connection-check`. ## See also - [pmm-admin add](../pmm-admin/add.md) - [Configuration commands](../pmm-admin/config.md) -- [Status and diagnostics](../pmm-admin/status.md) \ No newline at end of file +- [Status and diagnostics](../pmm-admin/status.md) From ae912469f31f0aa92bf8bba97366d23934010dd3 Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Mon, 13 Jul 2026 10:50:18 +0200 Subject: [PATCH 11/12] PMM-15130 Refactor: extract common helper `executeAgentAdd` --- managed/models/agent_helpers.go | 3 + managed/services/inventory/agents.go | 995 ++++++++-------------- managed/services/inventory/agents_test.go | 87 ++ 3 files changed, 450 insertions(+), 635 deletions(-) diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 3059bd062c6..f58a639855f 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -825,6 +825,9 @@ type CreateAgentParams struct { MySQLOptions MySQLOptions PostgreSQLOptions PostgreSQLOptions ValkeyOptions ValkeyOptions + + // SkipConnectionCheck is a request-scoped flag, not an agent attribute. + SkipConnectionCheck bool } func compatibleNodeAndAgent(nodeType NodeType, agentType AgentType) bool { diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 6f40c7b6c46..951443e59fc 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -241,72 +241,43 @@ func (as *AgentsService) ChangeNodeExporter(ctx context.Context, agentID string, // AddMySQLdExporter inserts mysqld_exporter Agent with given parameters and returns it and an actual table count. func (as *AgentsService) AddMySQLdExporter(ctx context.Context, p *inventoryv1.AddMySQLdExporterParams) (*inventoryv1.AddAgentResponse, error) { - var row *models.Agent - var agent *inventoryv1.MySQLdExporter - mysqlOptions, err := models.MySQLOptionsFromRequest(p) if err != nil { return nil, err } mysqlOptions.TableCountTablestatsGroupLimit = p.TablestatsGroupTableLimit - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - exporterOptions := models.ExporterOptions{ + + 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, 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: 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) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + }, + MySQLOptions: mysqlOptions, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.MySQLdExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.MySQLdExporterType, params, true) + if err != nil { + return nil, err } + mysqldExporter := agent.(*inventoryv1.MySQLdExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_MysqldExporter{ - MysqldExporter: agent, + MysqldExporter: mysqldExporter, }, } @@ -364,65 +335,38 @@ func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID strin // AddMongoDBExporter inserts mongodb_exporter Agent with given parameters. func (as *AgentsService) AddMongoDBExporter(ctx context.Context, p *inventoryv1.AddMongoDBExporterParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.MongoDBExporter - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - AgentPassword: p.AgentPassword, - CustomLabels: p.CustomLabels, - EnvironmentVariableNames: p.GetEnvironmentVariableNames(), - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - MongoDBOptions: models.MongoDBOptionsFromRequest(p), - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - DisabledCollectors: p.DisableCollectors, - ExposeExporter: p.ExposeExporter, - ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), - }, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - - row, err := models.CreateAgent(tx.Querier, models.MongoDBExporterType, params) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + AgentPassword: p.AgentPassword, + CustomLabels: p.CustomLabels, + EnvironmentVariableNames: p.GetEnvironmentVariableNames(), + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + MongoDBOptions: models.MongoDBOptionsFromRequest(p), + ExporterOptions: models.ExporterOptions{ + PushMetrics: p.PushMetrics, + DisabledCollectors: p.DisableCollectors, + ExposeExporter: p.ExposeExporter, + ConnectionTimeout: duration.OptionalFromProto(p.ConnectionTimeout), + }, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.MongoDBExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.MongoDBExporterType, params, true) + if err != nil { + return nil, err } + mongodbExporter := agent.(*inventoryv1.MongoDBExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_MongodbExporter{ - MongodbExporter: agent, + MongodbExporter: mongodbExporter, }, } @@ -488,63 +432,44 @@ func (as *AgentsService) ChangeMongoDBExporter( // AddQANMySQLPerfSchemaAgent adds MySQL PerfSchema QAN Agent. func (as *AgentsService) AddQANMySQLPerfSchemaAgent(ctx context.Context, p *inventoryv1.AddQANMySQLPerfSchemaAgentParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANMySQLPerfSchemaAgent mysqlOptions, err := models.MySQLOptionsFromRequest(p) if err != nil { return nil, err } - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - QueryExamplesDisabled: p.DisableQueryExamples, - CommentsParsingDisabled: p.DisableCommentsParsing, - }, - MySQLOptions: mysqlOptions, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANMySQLPerfSchemaAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + QueryExamplesDisabled: p.DisableQueryExamples, + CommentsParsingDisabled: p.DisableCommentsParsing, + }, + MySQLOptions: mysqlOptions, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANMySQLPerfSchemaAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANMySQLPerfSchemaAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANMySQLPerfSchemaAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanMysqlPerfschemaAgent{ - QanMysqlPerfschemaAgent: agent, + QanMysqlPerfschemaAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANMySQLPerfSchemaAgent updates MySQL PerfSchema QAN Agent with given parameters. @@ -603,67 +528,48 @@ func (as *AgentsService) ChangeQANMySQLPerfSchemaAgent( // AddQANMySQLSlowlogAgent adds MySQL Slowlog QAN Agent. func (as *AgentsService) AddQANMySQLSlowlogAgent(ctx context.Context, p *inventoryv1.AddQANMySQLSlowlogAgentParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANMySQLSlowlogAgent mysqlOptions, err := models.MySQLOptionsFromRequest(p) if err != nil { return nil, err } - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - // tweak according to API docs - maxSlowlogFileSize := max(p.MaxSlowlogFileSize, 0) - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - QueryExamplesDisabled: p.DisableQueryExamples, - CommentsParsingDisabled: p.DisableCommentsParsing, - MaxQueryLogSize: maxSlowlogFileSize, - }, - MySQLOptions: mysqlOptions, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANMySQLSlowlogAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } + // tweak according to API docs + maxSlowlogFileSize := max(p.MaxSlowlogFileSize, 0) - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + QueryExamplesDisabled: p.DisableQueryExamples, + CommentsParsingDisabled: p.DisableCommentsParsing, + MaxQueryLogSize: maxSlowlogFileSize, + }, + MySQLOptions: mysqlOptions, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANMySQLSlowlogAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANMySQLSlowlogAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANMySQLSlowlogAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanMysqlSlowlogAgent{ - QanMysqlSlowlogAgent: agent, + QanMysqlSlowlogAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANMySQLSlowlogAgent updates MySQL Slowlog QAN Agent with given parameters. @@ -722,64 +628,37 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent( // AddPostgresExporter inserts postgres_exporter Agent with given parameters. 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{ + 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, 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: exporterOptions, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), - } - row, err := models.CreateAgent(tx.Querier, models.PostgresExporterType, params) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + }, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_ERROR), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.PostgresExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.PostgresExporterType, params, true) + if err != nil { + return nil, err } + postgresExporter := agent.(*inventoryv1.PostgresExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_PostgresExporter{ - PostgresExporter: agent, + PostgresExporter: postgresExporter, }, } @@ -837,63 +716,36 @@ func (as *AgentsService) ChangePostgresExporter( // AddValkeyExporter adds a valkey exporter with the given parameters. 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{ + 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, 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: exporterOptions, - ValkeyOptions: models.ValkeyOptionsFromRequest(p), - } - row, err := models.CreateAgent(tx.Querier, models.ValkeyExporterType, params) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + }, + ValkeyOptions: models.ValkeyOptionsFromRequest(p), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.ValkeyExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.ValkeyExporterType, params, true) + if err != nil { + return nil, err } + valkeyExporter := agent.(*inventoryv1.ValkeyExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_ValkeyExporter{ - ValkeyExporter: agent, + ValkeyExporter: valkeyExporter, }, } @@ -949,59 +801,38 @@ func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID strin // AddQANMongoDBProfilerAgent adds MongoDB Profiler QAN Agent. func (as *AgentsService) AddQANMongoDBProfilerAgent(ctx context.Context, p *inventoryv1.AddQANMongoDBProfilerAgentParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANMongoDBProfilerAgent - - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 - done, but not included in params. - }, - MongoDBOptions: models.MongoDBOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANMongoDBProfilerAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 - done, but not included in params. + }, + MongoDBOptions: models.MongoDBOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANMongoDBProfilerAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANMongoDBProfilerAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANMongoDBProfilerAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanMongodbProfilerAgent{ - QanMongodbProfilerAgent: agent, + QanMongodbProfilerAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANMongoDBProfilerAgent updates MongoDB Profiler QAN Agent with given parameters. @@ -1060,60 +891,39 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent( } // AddQANMongoDBMongologAgent adds MongoDB Mongolog QAN Agent. -func (as *AgentsService) AddQANMongoDBMongologAgent(ctx context.Context, p *inventoryv1.AddQANMongoDBMongologAgentParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANMongoDBMongologAgent - - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 - done, but not included in params. - }, - MongoDBOptions: models.MongoDBOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANMongoDBMongologAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } +func (as *AgentsService) AddQANMongoDBMongologAgent(ctx context.Context, p *inventoryv1.AddQANMongoDBMongologAgentParams) (*inventoryv1.AddAgentResponse, error) { + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 - done, but not included in params. + }, + MongoDBOptions: models.MongoDBOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANMongoDBMongologAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanMongodbMongologAgent{ - QanMongodbMongologAgent: agent, + QanMongodbMongologAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANMongoDBMongologAgent updates MongoDB Mongolog QAN Agent with given parameters. @@ -1173,63 +983,36 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent( // AddProxySQLExporter inserts proxysql_exporter Agent with given parameters. 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{ + 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, 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: exporterOptions, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.ProxySQLExporterType, params) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + }, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.ProxySQLExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.ProxySQLExporterType, params, true) + if err != nil { + return nil, err } + proxysqlExporter := agent.(*inventoryv1.ProxySQLExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_ProxysqlExporter{ - ProxysqlExporter: agent, + ProxysqlExporter: proxysqlExporter, }, } @@ -1284,58 +1067,38 @@ func (as *AgentsService) AddQANPostgreSQLPgStatementsAgent( ctx context.Context, p *inventoryv1.AddQANPostgreSQLPgStatementsAgentParams, ) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANPostgreSQLPgStatementsAgent - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - CommentsParsingDisabled: p.DisableCommentsParsing, - }, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatementsAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + CommentsParsingDisabled: p.DisableCommentsParsing, + }, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANPostgreSQLPgStatementsAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANPostgreSQLPgStatementsAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanPostgresqlPgstatementsAgent{ - QanPostgresqlPgstatementsAgent: agent, + QanPostgresqlPgstatementsAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANPostgreSQLPgStatementsAgent updates PostgreSQL Pg stat statements QAN Agent with given parameters. @@ -1410,59 +1173,39 @@ func (as *AgentsService) AddQANPostgreSQLPgStatMonitorAgent( ctx context.Context, p *inventoryv1.AddQANPostgreSQLPgStatMonitorAgentParams, ) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.QANPostgreSQLPgStatMonitorAgent - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - QANOptions: models.QANOptions{ - MaxQueryLength: p.MaxQueryLength, - QueryExamplesDisabled: p.DisableQueryExamples, - CommentsParsingDisabled: p.DisableCommentsParsing, - }, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatMonitorAgentType, params) - if err != nil { - return err - } - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + QANOptions: models.QANOptions{ + MaxQueryLength: p.MaxQueryLength, + QueryExamplesDisabled: p.DisableQueryExamples, + CommentsParsingDisabled: p.DisableCommentsParsing, + }, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.QANPostgreSQLPgStatMonitorAgentType, params, false) + if err != nil { + return nil, err } + qanAgent := agent.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_QanPostgresqlPgstatmonitorAgent{ - QanPostgresqlPgstatmonitorAgent: agent, + QanPostgresqlPgstatmonitorAgent: qanAgent, }, } - return res, e + return res, nil } // ChangeQANPostgreSQLPgStatMonitorAgent updates PostgreSQL Pg stat monitor QAN Agent with given parameters. @@ -1520,48 +1263,36 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatMonitorAgent( // AddRDSExporter inserts rds_exporter Agent with given parameters. func (as *AgentsService) AddRDSExporter(ctx context.Context, p *inventoryv1.AddRDSExporterParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.RDSExporter - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - NodeID: p.NodeId, - CustomLabels: p.CustomLabels, - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - }, - AWSOptions: models.AWSOptions{ - AWSAccessKey: p.AwsAccessKey, - AWSSecretKey: p.AwsSecretKey, - RDSBasicMetricsDisabled: p.DisableBasicMetrics, - RDSEnhancedMetricsDisabled: p.DisableEnhancedMetrics, - }, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.RDSExporterType, params) - if err != nil { - return err - } - + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + NodeID: p.NodeId, + CustomLabels: p.CustomLabels, + ExporterOptions: models.ExporterOptions{ + PushMetrics: p.PushMetrics, + }, + AWSOptions: models.AWSOptions{ + AWSAccessKey: p.AwsAccessKey, + AWSSecretKey: p.AwsSecretKey, + RDSBasicMetricsDisabled: p.DisableBasicMetrics, + RDSEnhancedMetricsDisabled: p.DisableEnhancedMetrics, + }, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + // Always skip the connection check for RDS (it uses a NodeID, not a ServiceID). // TODO check connection to AWS: https://jira.percona.com/browse/PMM-5024 - // if !p.SkipConnectionCheck { - // ... - // } + SkipConnectionCheck: true, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.RDSExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.RDSExporterType, params, false) + if err != nil { + return nil, err } + rdsExporter := agent.(*inventoryv1.RDSExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_RdsExporter{ - RdsExporter: agent, + RdsExporter: rdsExporter, }, } @@ -1704,39 +1435,30 @@ func (as *AgentsService) ChangeExternalExporter( // AddAzureDatabaseExporter inserts azure_exporter Agent with given parameters. func (as *AgentsService) AddAzureDatabaseExporter(ctx context.Context, p *inventoryv1.AddAzureDatabaseExporterParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.AzureDatabaseExporter - - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - NodeID: p.NodeId, - CustomLabels: p.CustomLabels, - ExporterOptions: models.ExporterOptions{ - PushMetrics: p.PushMetrics, - }, - AzureOptions: models.AzureOptionsFromRequest(p), - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - row, err := models.CreateAgent(tx.Querier, models.AzureDatabaseExporterType, params) - if err != nil { - return err - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + NodeID: p.NodeId, + CustomLabels: p.CustomLabels, + ExporterOptions: models.ExporterOptions{ + PushMetrics: p.PushMetrics, + }, + AzureOptions: models.AzureOptionsFromRequest(p), + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + // Always skip the connection check for Azure + SkipConnectionCheck: true, + } - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } - agent = aa.(*inventoryv1.AzureDatabaseExporter) //nolint:forcetypeassert - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.AzureDatabaseExporterType, params, false) + if err != nil { + return nil, err } + azureDatabaseExporter := agent.(*inventoryv1.AzureDatabaseExporter) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) + res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_AzureDatabaseExporter{ - AzureDatabaseExporter: agent, + AzureDatabaseExporter: azureDatabaseExporter, }, } @@ -1816,78 +1538,44 @@ func (as *AgentsService) ChangeNomadAgent(ctx context.Context, agentID string, p // AddRTAMongoDBAgent adds MongoDB Real-Time Analytics Agent. func (as *AgentsService) AddRTAMongoDBAgent(ctx context.Context, p *inventoryv1.AddRTAMongoDBAgentParams) (*inventoryv1.AddAgentResponse, error) { - var agent *inventoryv1.RTAMongoDBAgent - - // Set MongoDBOptions - mdbOptions := models.MongoDBOptions{} - - mdbOptions.TLSCertificateKey = p.GetTlsCertificateKey() - mdbOptions.TLSCertificateKeyFilePassword = p.GetTlsCertificateKeyFilePassword() - mdbOptions.TLSCa = p.GetTlsCa() - mdbOptions.AuthenticationMechanism = p.GetAuthenticationMechanism() - - e := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { - params := &models.CreateAgentParams{ - PMMAgentID: p.PmmAgentId, - ServiceID: p.ServiceId, - Username: p.Username, - Password: p.Password, - CustomLabels: p.CustomLabels, - TLS: p.Tls, - TLSSkipVerify: p.TlsSkipVerify, - MongoDBOptions: mdbOptions, - LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), - } - - // Set RTA options if provided - if p.RtaOptions != nil { - params.RTAOptions = *models.RTAOptionsFromRequest(p.RtaOptions) - } - - row, err := models.CreateAgent(tx.Querier, models.RTAMongoDBAgentType, params) - if err != nil { - return err - } - - if !p.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, p.ServiceId) - if err != nil { - return err - } - - err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - - err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) - if err != nil { - return err - } - } - - aa, err := services.ToAPIAgent(tx.Querier, row) - if err != nil { - return err - } + params := &models.CreateAgentParams{ + PMMAgentID: p.PmmAgentId, + ServiceID: p.ServiceId, + Username: p.Username, + Password: p.Password, + CustomLabels: p.CustomLabels, + TLS: p.Tls, + TLSSkipVerify: p.TlsSkipVerify, + MongoDBOptions: models.MongoDBOptions{ + TLSCertificateKey: p.GetTlsCertificateKey(), + TLSCertificateKeyFilePassword: p.GetTlsCertificateKeyFilePassword(), + TLSCa: p.GetTlsCa(), + AuthenticationMechanism: p.GetAuthenticationMechanism(), + }, + LogLevel: services.SpecifyLogLevel(p.LogLevel, inventoryv1.LogLevel_LOG_LEVEL_FATAL), + SkipConnectionCheck: p.SkipConnectionCheck, + } - agent = aa.(*inventoryv1.RTAMongoDBAgent) //nolint:forcetypeassert + // Set RTA options if provided + if p.RtaOptions != nil { + params.RTAOptions = *models.RTAOptionsFromRequest(p.RtaOptions) + } - return nil - }) - if e != nil { - return nil, e + agent, err := as.executeAgentAdd(ctx, models.RTAMongoDBAgentType, params, true) + if err != nil { + return nil, err } + rtaMongoDBAgent := agent.(*inventoryv1.RTAMongoDBAgent) //nolint:forcetypeassert as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ Agent: &inventoryv1.AddAgentResponse_RtaMongodbAgent{ - RtaMongodbAgent: agent, + RtaMongodbAgent: rtaMongoDBAgent, }, } - return res, e + return res, nil } // ChangeRTAMongoDBAgent updates MongoDB Real-Time Analytics Agent with given parameters. @@ -2039,3 +1727,40 @@ func (as *AgentsService) executeAgentChange(ctx context.Context, agentID string, return agent, err } + +// executeAgentAdd creates an agent and returns the agent. +func (as *AgentsService) executeAgentAdd(ctx context.Context, agentType models.AgentType, params *models.CreateAgentParams, getServiceInfo bool) (inventoryv1.Agent, error) { //nolint:ireturn,lll + var agent inventoryv1.Agent + + err := as.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + row, err := models.CreateAgent(tx.Querier, agentType, params) + if err != nil { + return err + } + + if !params.SkipConnectionCheck && params.ServiceID != "" { + service, err := models.FindServiceByID(tx.Querier, params.ServiceID) + if err != nil { + return err + } + + err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row) + if err != nil { + return err + } + + if getServiceInfo { + err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row) + if err != nil { + return err + } + } + } + + agent, err = services.ToAPIAgent(tx.Querier, row) + + return err + }) + + return agent, err +} diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index be6db00787f..bf2287a6f2b 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -1198,3 +1198,90 @@ func TestChangeAgentConnectionCheck(t *testing.T) { assert.Equal(t, "new-username", resp.GetMysqldExporter().Username) }) } + +// TestAddAgentConnectionCheck locks in the Add-side connection-check behavior that +// executeAgentAdd centralizes: exporters run the check AND fetch service info, while +// QAN agents run only the check. The service-info broker is deliberately left +// unregistered on the QAN path so an unexpected GetInfoFromService call would fail. +func TestAddAgentConnectionCheck(t *testing.T) { + connectionCheckCall := func(as *AgentsService, ctx context.Context) *mock.Call { + return as.cc.(*mockConnectionChecker).On("CheckConnectionToService", ctx, + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())) + } + + serviceInfoCall := func(as *AgentsService, ctx context.Context) *mock.Call { + return as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeFor[*reform.TX]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Service]().Name()), + mock.AnythingOfType(reflect.TypeFor[*models.Agent]().Name())) + } + + t.Run("QANRunsCheckWithoutServiceInfo", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005").Once() + + pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ + RunsOnNodeId: models.PMMServerNodeID, + }) + require.NoError(t, err) + + ss.vc.(*mockVersionCache).On("RequestSoftwareVersionsUpdate").Once() + ms, err := ss.AddMySQL(ctx, &models.AddDBMSServiceParams{ + ServiceName: "test-mysql", + NodeID: models.PMMServerNodeID, + Address: new("127.0.0.1"), + Port: new(uint16(3306)), + }) + require.NoError(t, err) + + // Only the connection check is expected. GetInfoFromService is intentionally not + // registered, so a call to it would panic as an unexpected mock invocation. + connectionCheckCall(as, ctx).Return(nil).Once() + + _, err = as.AddQANMySQLPerfSchemaAgent(ctx, &inventoryv1.AddQANMySQLPerfSchemaAgentParams{ + PmmAgentId: pmmAgent.GetPmmAgent().AgentId, + ServiceId: ms.ServiceId, + Username: "username", + }) + require.NoError(t, err) + + as.sib.(*mockServiceInfoBroker).AssertNotCalled(t, "GetInfoFromService") + }) + + t.Run("ExporterRunsCheckWithServiceInfo", func(t *testing.T) { + ss, as, _, teardown, ctx, _ := setup(t) + t.Cleanup(func() { teardown(t) }) + + as.r.(*mockAgentsRegistry).On("IsConnected", "00000000-0000-4000-8000-000000000005").Return(true) + as.state.(*mockAgentsStateUpdater).On("RequestStateUpdate", ctx, "00000000-0000-4000-8000-000000000005").Once() + + pmmAgent, err := as.AddPMMAgent(ctx, &inventoryv1.AddPMMAgentParams{ + RunsOnNodeId: models.PMMServerNodeID, + }) + require.NoError(t, err) + + ps, err := ss.AddPostgreSQL(ctx, &models.AddDBMSServiceParams{ + ServiceName: "test-postgres", + NodeID: models.PMMServerNodeID, + Address: new("127.0.0.1"), + Port: new(uint16(5432)), + }) + require.NoError(t, err) + + // Exporters trigger both the connection check and the service-info fetch. + connectionCheckCall(as, ctx).Return(nil).Once() + serviceInfoCall(as, ctx).Return(nil).Once() + + _, err = as.AddPostgresExporter(ctx, &inventoryv1.AddPostgresExporterParams{ + PmmAgentId: pmmAgent.GetPmmAgent().AgentId, + ServiceId: ps.ServiceId, + Username: "username", + }) + require.NoError(t, err) + }) +} From 4a10d0c3e9e9b071a18a1dd1830e59e8056bdbec Mon Sep 17 00:00:00 2001 From: Ante Gulin Date: Mon, 13 Jul 2026 12:43:31 +0200 Subject: [PATCH 12/12] PMM-15130 Check type assertions gracefully instead of panicking --- managed/services/inventory/agents.go | 184 ++++++++++++++++++++++----- 1 file changed, 149 insertions(+), 35 deletions(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 951443e59fc..a8bc0a32e9e 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -74,7 +74,11 @@ func toInventoryAgent(q *reform.Querier, row *models.Agent, registry agentsRegis } if row.AgentType == models.PMMAgentType { - agent.(*inventoryv1.PMMAgent).Connected = registry.IsConnected(row.AgentID) //nolint:forcetypeassert + pmmAgent, ok := agent.(*inventoryv1.PMMAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } + pmmAgent.Connected = registry.IsConnected(row.AgentID) } return agent, nil } @@ -159,7 +163,11 @@ func (as *AgentsService) AddPMMAgent(ctx context.Context, p *inventoryv1.AddPMMA if err != nil { return err } - agent = aa.(*inventoryv1.PMMAgent) //nolint:forcetypeassert + pmmAgent, ok := aa.(*inventoryv1.PMMAgent) + if !ok { + return unexpectedAgentTypeError(aa) + } + agent = pmmAgent return nil }) @@ -186,7 +194,11 @@ func (as *AgentsService) AddNodeExporter(ctx context.Context, p *inventoryv1.Add if err != nil { return err } - agent = aa.(*inventoryv1.NodeExporter) //nolint:forcetypeassert + nodeExporter, ok := aa.(*inventoryv1.NodeExporter) + if !ok { + return unexpectedAgentTypeError(aa) + } + agent = nodeExporter return nil }) if e != nil { @@ -227,7 +239,10 @@ func (as *AgentsService) ChangeNodeExporter(ctx context.Context, agentID string, return nil, err } - nodeExporter := agent.(*inventoryv1.NodeExporter) //nolint:forcetypeassert + nodeExporter, ok := agent.(*inventoryv1.NodeExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, nodeExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -272,7 +287,10 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, p *inventoryv1.A return nil, err } - mysqldExporter := agent.(*inventoryv1.MySQLdExporter) //nolint:forcetypeassert + mysqldExporter, ok := agent.(*inventoryv1.MySQLdExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -321,7 +339,10 @@ func (as *AgentsService) ChangeMySQLdExporter(ctx context.Context, agentID strin return nil, err } - mysqldExporter := agent.(*inventoryv1.MySQLdExporter) //nolint:forcetypeassert + mysqldExporter, ok := agent.(*inventoryv1.MySQLdExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, mysqldExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -361,7 +382,10 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, p *inventoryv1. return nil, err } - mongodbExporter := agent.(*inventoryv1.MongoDBExporter) //nolint:forcetypeassert + mongodbExporter, ok := agent.(*inventoryv1.MongoDBExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -418,7 +442,10 @@ func (as *AgentsService) ChangeMongoDBExporter( return nil, err } - mongodbExporter := agent.(*inventoryv1.MongoDBExporter) //nolint:forcetypeassert + mongodbExporter, ok := agent.(*inventoryv1.MongoDBExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, mongodbExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -460,7 +487,10 @@ func (as *AgentsService) AddQANMySQLPerfSchemaAgent(ctx context.Context, p *inve return nil, err } - qanAgent := agent.(*inventoryv1.QANMySQLPerfSchemaAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMySQLPerfSchemaAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -515,7 +545,10 @@ func (as *AgentsService) ChangeQANMySQLPerfSchemaAgent( return nil, err } - qanAgent := agent.(*inventoryv1.QANMySQLPerfSchemaAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMySQLPerfSchemaAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, qanAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -560,7 +593,10 @@ func (as *AgentsService) AddQANMySQLSlowlogAgent(ctx context.Context, p *invento return nil, err } - qanAgent := agent.(*inventoryv1.QANMySQLSlowlogAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMySQLSlowlogAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -615,7 +651,10 @@ func (as *AgentsService) ChangeQANMySQLSlowlogAgent( return nil, err } - qanAgent := agent.(*inventoryv1.QANMySQLSlowlogAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMySQLSlowlogAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, qanAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -653,7 +692,10 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, p *inventoryv1 return nil, err } - postgresExporter := agent.(*inventoryv1.PostgresExporter) //nolint:forcetypeassert + postgresExporter, ok := agent.(*inventoryv1.PostgresExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -703,7 +745,10 @@ func (as *AgentsService) ChangePostgresExporter( return nil, err } - postgresExporter := agent.(*inventoryv1.PostgresExporter) //nolint:forcetypeassert + postgresExporter, ok := agent.(*inventoryv1.PostgresExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, postgresExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -740,7 +785,10 @@ func (as *AgentsService) AddValkeyExporter(ctx context.Context, p *inventoryv1.A return nil, err } - valkeyExporter := agent.(*inventoryv1.ValkeyExporter) //nolint:forcetypeassert + valkeyExporter, ok := agent.(*inventoryv1.ValkeyExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -788,7 +836,10 @@ func (as *AgentsService) ChangeValkeyExporter(ctx context.Context, agentID strin return nil, err } - valkeyExporter := agent.(*inventoryv1.ValkeyExporter) //nolint:forcetypeassert + valkeyExporter, ok := agent.(*inventoryv1.ValkeyExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, valkeyExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -823,7 +874,10 @@ func (as *AgentsService) AddQANMongoDBProfilerAgent(ctx context.Context, p *inve return nil, err } - qanAgent := agent.(*inventoryv1.QANMongoDBProfilerAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMongoDBProfilerAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -879,7 +933,10 @@ func (as *AgentsService) ChangeQANMongoDBProfilerAgent( return nil, err } - mongodbProfilerAgent := agent.(*inventoryv1.QANMongoDBProfilerAgent) //nolint:forcetypeassert + mongodbProfilerAgent, ok := agent.(*inventoryv1.QANMongoDBProfilerAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, mongodbProfilerAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -914,7 +971,10 @@ func (as *AgentsService) AddQANMongoDBMongologAgent(ctx context.Context, p *inve return nil, err } - qanAgent := agent.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANMongoDBMongologAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -970,7 +1030,10 @@ func (as *AgentsService) ChangeQANMongoDBMongologAgent( return nil, err } - mongodbMongologAgent := agent.(*inventoryv1.QANMongoDBMongologAgent) //nolint:forcetypeassert + mongodbMongologAgent, ok := agent.(*inventoryv1.QANMongoDBMongologAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, mongodbMongologAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1007,7 +1070,10 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, p *inventoryv1 return nil, err } - proxysqlExporter := agent.(*inventoryv1.ProxySQLExporter) //nolint:forcetypeassert + proxysqlExporter, ok := agent.(*inventoryv1.ProxySQLExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1051,7 +1117,10 @@ func (as *AgentsService) ChangeProxySQLExporter( return nil, err } - proxysqlExporter := agent.(*inventoryv1.ProxySQLExporter) //nolint:forcetypeassert + proxysqlExporter, ok := agent.(*inventoryv1.ProxySQLExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, proxysqlExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1089,7 +1158,10 @@ func (as *AgentsService) AddQANPostgreSQLPgStatementsAgent( return nil, err } - qanAgent := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1157,7 +1229,10 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatementsAgent( } } - pgStatementsAgent := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) //nolint:forcetypeassert + pgStatementsAgent, ok := agent.(*inventoryv1.QANPostgreSQLPgStatementsAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, pgStatementsAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1196,7 +1271,10 @@ func (as *AgentsService) AddQANPostgreSQLPgStatMonitorAgent( return nil, err } - qanAgent := agent.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) //nolint:forcetypeassert + qanAgent, ok := agent.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1250,7 +1328,10 @@ func (as *AgentsService) ChangeQANPostgreSQLPgStatMonitorAgent( return nil, err } - pgStatMonitorAgent := agent.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) //nolint:forcetypeassert + pgStatMonitorAgent, ok := agent.(*inventoryv1.QANPostgreSQLPgStatMonitorAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, pgStatMonitorAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1287,7 +1368,10 @@ func (as *AgentsService) AddRDSExporter(ctx context.Context, p *inventoryv1.AddR return nil, err } - rdsExporter := agent.(*inventoryv1.RDSExporter) //nolint:forcetypeassert + rdsExporter, ok := agent.(*inventoryv1.RDSExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1329,7 +1413,10 @@ func (as *AgentsService) ChangeRDSExporter(ctx context.Context, agentID string, return nil, err } - rdsExporter := agent.(*inventoryv1.RDSExporter) //nolint:forcetypeassert + rdsExporter, ok := agent.(*inventoryv1.RDSExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, rdsExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1368,7 +1455,11 @@ func (as *AgentsService) AddExternalExporter(ctx context.Context, p *inventoryv1 if err != nil { return err } - agent = aa.(*inventoryv1.ExternalExporter) //nolint:forcetypeassert + externalExporter, ok := aa.(*inventoryv1.ExternalExporter) + if !ok { + return unexpectedAgentTypeError(aa) + } + agent = externalExporter PMMAgentID = row.PMMAgentID return nil }) @@ -1422,7 +1513,10 @@ func (as *AgentsService) ChangeExternalExporter( // It's required to regenerate victoriametrics config file. as.vmdb.RequestConfigurationUpdate() - externalExporter := agent.(*inventoryv1.ExternalExporter) //nolint:forcetypeassert + externalExporter, ok := agent.(*inventoryv1.ExternalExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, externalExporter.RunsOnNodeId) res := &inventoryv1.ChangeAgentResponse{ @@ -1453,7 +1547,10 @@ func (as *AgentsService) AddAzureDatabaseExporter(ctx context.Context, p *invent return nil, err } - azureDatabaseExporter := agent.(*inventoryv1.AzureDatabaseExporter) //nolint:forcetypeassert + azureDatabaseExporter, ok := agent.(*inventoryv1.AzureDatabaseExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1500,7 +1597,10 @@ func (as *AgentsService) ChangeAzureDatabaseExporter( return nil, err } - azureDatabaseExporter := agent.(*inventoryv1.AzureDatabaseExporter) //nolint:forcetypeassert + azureDatabaseExporter, ok := agent.(*inventoryv1.AzureDatabaseExporter) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, azureDatabaseExporter.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1525,7 +1625,10 @@ func (as *AgentsService) ChangeNomadAgent(ctx context.Context, agentID string, p return nil, err } - nomadAgent := agent.(*inventoryv1.NomadAgent) //nolint:forcetypeassert + nomadAgent, ok := agent.(*inventoryv1.NomadAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, nomadAgent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1566,7 +1669,10 @@ func (as *AgentsService) AddRTAMongoDBAgent(ctx context.Context, p *inventoryv1. return nil, err } - rtaMongoDBAgent := agent.(*inventoryv1.RTAMongoDBAgent) //nolint:forcetypeassert + rtaMongoDBAgent, ok := agent.(*inventoryv1.RTAMongoDBAgent) + if !ok { + return nil, unexpectedAgentTypeError(agent) + } as.state.RequestStateUpdate(ctx, p.PmmAgentId) res := &inventoryv1.AddAgentResponse{ @@ -1610,7 +1716,10 @@ func (as *AgentsService) ChangeRTAMongoDBAgent( return nil, err } - agent := ag.(*inventoryv1.RTAMongoDBAgent) //nolint:forcetypeassert + agent, ok := ag.(*inventoryv1.RTAMongoDBAgent) + if !ok { + return nil, unexpectedAgentTypeError(ag) + } as.state.RequestStateUpdate(ctx, agent.PmmAgentId) res := &inventoryv1.ChangeAgentResponse{ @@ -1653,6 +1762,11 @@ func (as *AgentsService) Remove(ctx context.Context, id string, force bool) erro return nil } +// unexpectedAgentTypeError returns error for when a type assertion on the agent fails. +func unexpectedAgentTypeError(agent inventoryv1.Agent) error { + return status.Errorf(codes.Internal, "unexpected agent type %T", agent) +} + // Helper function to convert custom labels from protobuf to model format. func convertCustomLabels(customLabels *common.StringMap) *map[string]string { if customLabels != nil {