From 01ea48f6546855a03c26e619362fa2bd3d06dd0f Mon Sep 17 00:00:00 2001 From: Oleksii Kysil Date: Thu, 25 May 2023 16:25:46 +0300 Subject: [PATCH 01/10] PMM-12155 Use new option name for node_exporter Since the new version of exporter-toolkit used in the node exporter the new option `--web.config.file` should be used instead to pass the TLS configuration. --- managed/services/agents/agents.go | 8 ++++++-- managed/services/agents/mongodb.go | 2 +- managed/services/agents/node.go | 12 +++++++++++- managed/services/agents/postgresql.go | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/managed/services/agents/agents.go b/managed/services/agents/agents.go index 0d7ffa4853..ad827367c6 100644 --- a/managed/services/agents/agents.go +++ b/managed/services/agents/agents.go @@ -122,7 +122,7 @@ func pathsBase(agentVersion *version.Parsed, tdpLeft, tdpRight string) string { } // ensureAuthParams updates agent start parameters to contain prometheus webconfig. -func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, agentVersion *version.Parsed, minAuthVersion *version.Parsed) error { +func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool) error { if agentVersion.Less(minAuthVersion) { params.Env = append(params.Env, fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword())) } else { @@ -136,7 +136,11 @@ func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_Ag } params.TextFiles["webConfigPlaceholder"] = wcf // see https://github.com/prometheus/exporter-toolkit/tree/v0.1.0/https - params.Args = append(params.Args, "--web.config="+params.TemplateLeftDelim+" .TextFiles.webConfigPlaceholder "+params.TemplateRightDelim) + if useNewTlsConfig { + params.Args = append(params.Args, "--web.config.file="+params.TemplateLeftDelim+" .TextFiles.webConfigPlaceholder "+params.TemplateRightDelim) + } else { + params.Args = append(params.Args, "--web.config="+params.TemplateLeftDelim+" .TextFiles.webConfigPlaceholder "+params.TemplateRightDelim) + } } return nil diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index f0d14243fe..1da32464b5 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -106,7 +106,7 @@ func mongodbExporterConfig(service *models.Service, exporter *models.Agent, reda res.RedactWords = redactWords(exporter) } - if err := ensureAuthParams(exporter, res, pmmAgentVersion, v2_27_99); err != nil { + if err := ensureAuthParams(exporter, res, pmmAgentVersion, v2_27_99, false); err != nil { return nil, err } diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index ddd51efe2d..e31e4b4d4d 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -31,6 +31,7 @@ import ( // Starting with pmm 2.28, the exporter uses Prometheus Web Toolkit and needs a config file // with the basic auth users. var v2_27_99 = version.MustParse("2.27.99") +var v1_5_0 = version.MustParse("1.5.0") func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion *version.Parsed) (*agentpb.SetStateRequest_AgentProcess, error) { tdp := models.TemplateDelimsPair( @@ -140,9 +141,18 @@ func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion Args: args, } - if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99); err != nil { + if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, isNewTlsConfigSupported(exporter)); err != nil { return nil, err } return params, nil } + +func isNewTlsConfigSupported(exporter *models.Agent) bool { + if agentVersion, err := version.Parse(pointer.GetString(exporter.Version)); err == nil { + if !agentVersion.Less(v1_5_0) { + return true + } + } + return false +} diff --git a/managed/services/agents/postgresql.go b/managed/services/agents/postgresql.go index 87c1e98a32..b0382e90d0 100644 --- a/managed/services/agents/postgresql.go +++ b/managed/services/agents/postgresql.go @@ -96,7 +96,7 @@ func postgresExporterConfig(service *models.Service, exporter *models.Agent, red res.RedactWords = redactWords(exporter) } - if err := ensureAuthParams(exporter, res, pmmAgentVersion, postgresExporterWebConfigVersion); err != nil { + if err := ensureAuthParams(exporter, res, pmmAgentVersion, postgresExporterWebConfigVersion, false); err != nil { return nil, err } From adf05ebf12cfe51a5b99b17226eb2592b361f54d Mon Sep 17 00:00:00 2001 From: Oleksii Kysil Date: Thu, 25 May 2023 17:02:48 +0300 Subject: [PATCH 02/10] PMM-12155 Improve formatting Improve variable declaration formatting. --- managed/services/agents/node.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index e31e4b4d4d..e3ff5715a4 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -30,8 +30,10 @@ import ( // The node exporter prior 2.28 use exporter_shared and gets basic auth config from env. // Starting with pmm 2.28, the exporter uses Prometheus Web Toolkit and needs a config file // with the basic auth users. -var v2_27_99 = version.MustParse("2.27.99") -var v1_5_0 = version.MustParse("1.5.0") +var ( + v2_27_99 = version.MustParse("2.27.99") + v1_5_0 = version.MustParse("1.5.0") +) func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion *version.Parsed) (*agentpb.SetStateRequest_AgentProcess, error) { tdp := models.TemplateDelimsPair( From fae8f89cba5137604da2d75dc59a951077513569 Mon Sep 17 00:00:00 2001 From: Oleksii Kysil Date: Fri, 26 May 2023 14:06:57 +0300 Subject: [PATCH 03/10] PMM-12155 Add unit test for new option Add unit test to pass the new option to the exporter and add some slight fixes to the formatting and styling. --- managed/services/agents/agents.go | 3 ++- managed/services/agents/node.go | 4 ++-- managed/services/agents/node_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/managed/services/agents/agents.go b/managed/services/agents/agents.go index ad827367c6..a2d3186759 100644 --- a/managed/services/agents/agents.go +++ b/managed/services/agents/agents.go @@ -122,7 +122,8 @@ func pathsBase(agentVersion *version.Parsed, tdpLeft, tdpRight string) string { } // ensureAuthParams updates agent start parameters to contain prometheus webconfig. -func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool) error { +func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, + agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool) error { if agentVersion.Less(minAuthVersion) { params.Env = append(params.Env, fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword())) } else { diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index e3ff5715a4..398b0ccc0f 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -143,14 +143,14 @@ func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion Args: args, } - if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, isNewTlsConfigSupported(exporter)); err != nil { + if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, isNewTLSConfigSupported(exporter)); err != nil { return nil, err } return params, nil } -func isNewTlsConfigSupported(exporter *models.Agent) bool { +func isNewTLSConfigSupported(exporter *models.Agent) bool { if agentVersion, err := version.Parse(pointer.GetString(exporter.Version)); err == nil { if !agentVersion.Less(v1_5_0) { return true diff --git a/managed/services/agents/node_test.go b/managed/services/agents/node_test.go index b050f8295f..0fa866e62d 100644 --- a/managed/services/agents/node_test.go +++ b/managed/services/agents/node_test.go @@ -16,6 +16,7 @@ package agents import ( + "github.com/AlekSi/pointer" "testing" "github.com/stretchr/testify/require" @@ -75,6 +76,33 @@ func TestAuthWebConfig(t *testing.T) { require.Equal(t, expected.Env, actual.Env) require.Equal(t, expected.TextFiles, actual.TextFiles) + require.Contains(t, actual.Args, "--web.config={{ .TextFiles.webConfigPlaceholder }}") + }) + + t.Run("exporter v1.5.0", func(t *testing.T) { + t.Parallel() + + node := &models.Node{} + exporter := &models.Agent{ + AgentID: "agent-id", + AgentType: models.NodeExporterType, + Version: pointer.ToString("1.5.0"), + } + agentVersion := version.MustParse("2.28.0") + + actual, err := nodeExporterConfig(node, exporter, agentVersion) + require.NoError(t, err, "Unable to build node exporter config") + + expected := &agentpb.SetStateRequest_AgentProcess{ + Env: []string(nil), + TextFiles: map[string]string{ + "webConfigPlaceholder": "basic_auth_users:\n pmm: agent-id\n", + }, + } + + require.Equal(t, expected.Env, actual.Env) + require.Equal(t, expected.TextFiles, actual.TextFiles) + require.Contains(t, actual.Args, "--web.config.file={{ .TextFiles.webConfigPlaceholder }}") }) } From 489df07ba4990a7c9699c911795c84f1846da449 Mon Sep 17 00:00:00 2001 From: Oleksii Kysil Date: Fri, 26 May 2023 14:20:33 +0300 Subject: [PATCH 04/10] PMM-12155 Styling fixes --- managed/services/agents/agents.go | 3 ++- managed/services/agents/node_test.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/managed/services/agents/agents.go b/managed/services/agents/agents.go index a2d3186759..69a249e756 100644 --- a/managed/services/agents/agents.go +++ b/managed/services/agents/agents.go @@ -123,7 +123,8 @@ func pathsBase(agentVersion *version.Parsed, tdpLeft, tdpRight string) string { // ensureAuthParams updates agent start parameters to contain prometheus webconfig. func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, - agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool) error { + agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool, +) error { if agentVersion.Less(minAuthVersion) { params.Env = append(params.Env, fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword())) } else { diff --git a/managed/services/agents/node_test.go b/managed/services/agents/node_test.go index 0fa866e62d..73245c1c2e 100644 --- a/managed/services/agents/node_test.go +++ b/managed/services/agents/node_test.go @@ -16,9 +16,9 @@ package agents import ( - "github.com/AlekSi/pointer" "testing" + "github.com/AlekSi/pointer" "github.com/stretchr/testify/require" "github.com/percona/pmm/api/agentpb" From 9e0a37228d3b361c1255d154267a17aae9bfbcd4 Mon Sep 17 00:00:00 2001 From: Oleksii Kysil Date: Fri, 26 May 2023 14:42:45 +0300 Subject: [PATCH 05/10] PMM-12155 Styling fixes --- managed/services/agents/agents.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/services/agents/agents.go b/managed/services/agents/agents.go index 69a249e756..c29da0c9c6 100644 --- a/managed/services/agents/agents.go +++ b/managed/services/agents/agents.go @@ -123,7 +123,7 @@ func pathsBase(agentVersion *version.Parsed, tdpLeft, tdpRight string) string { // ensureAuthParams updates agent start parameters to contain prometheus webconfig. func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_AgentProcess, - agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTlsConfig bool, + agentVersion *version.Parsed, minAuthVersion *version.Parsed, useNewTLSConfig bool, ) error { if agentVersion.Less(minAuthVersion) { params.Env = append(params.Env, fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword())) @@ -138,7 +138,7 @@ func ensureAuthParams(exporter *models.Agent, params *agentpb.SetStateRequest_Ag } params.TextFiles["webConfigPlaceholder"] = wcf // see https://github.com/prometheus/exporter-toolkit/tree/v0.1.0/https - if useNewTlsConfig { + if useNewTLSConfig { params.Args = append(params.Args, "--web.config.file="+params.TemplateLeftDelim+" .TextFiles.webConfigPlaceholder "+params.TemplateRightDelim) } else { params.Args = append(params.Args, "--web.config="+params.TemplateLeftDelim+" .TextFiles.webConfigPlaceholder "+params.TemplateRightDelim) From 1f707202e1b595256f0f9d128bc4ad31b636a50f Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Thu, 10 Oct 2024 23:55:21 +0300 Subject: [PATCH 06/10] PMM-12155 refactoring. --- managed/services/agents/node.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index 1443d9bdb5..608b6b9958 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -154,9 +154,7 @@ func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion func isNewTLSConfigSupported(exporter *models.Agent) bool { if agentVersion, err := version.Parse(pointer.GetString(exporter.Version)); err == nil { - if !agentVersion.Less(v1_5_0) { - return true - } + return !agentVersion.Less(v1_5_0) } return false } From 31cbcffa5b6bab81ee9e68efed389bdf6d46e23c Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Fri, 11 Oct 2024 02:17:02 +0300 Subject: [PATCH 07/10] PMM-12155 refactoring. --- agent/client/channel/channel.go | 2 +- managed/services/agents/node.go | 9 +------- managed/services/agents/node_test.go | 8 +++---- version/features.go | 32 ++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 version/features.go diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index 0630eb8985..d59b5324c6 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -47,7 +47,7 @@ type ServerRequest struct { } // AgentResponse represents agent's response. -// It is similar to agentpb.AgentMessage except it can contain only responses, +// It is similar to agentv1.AgentMessage except it can contain only responses, // and the payload is already unwrapped (XXX instead of AgentMessage_XXX). type AgentResponse struct { ID uint32 diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index 608b6b9958..fb88ed9d95 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -145,16 +145,9 @@ func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion Args: args, } - if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, isNewTLSConfigSupported(exporter)); err != nil { + if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, agentVersion.IsFeatureSupported(version.NodeExporterNewTLSConfigVersion)); err != nil { return nil, err } return params, nil } - -func isNewTLSConfigSupported(exporter *models.Agent) bool { - if agentVersion, err := version.Parse(pointer.GetString(exporter.Version)); err == nil { - return !agentVersion.Less(v1_5_0) - } - return false -} diff --git a/managed/services/agents/node_test.go b/managed/services/agents/node_test.go index 65b956872e..01bbdaf279 100644 --- a/managed/services/agents/node_test.go +++ b/managed/services/agents/node_test.go @@ -18,7 +18,6 @@ package agents import ( "testing" - "github.com/AlekSi/pointer" "github.com/stretchr/testify/require" agentv1 "github.com/percona/pmm/api/agent/v1" @@ -79,21 +78,20 @@ func TestAuthWebConfig(t *testing.T) { require.Contains(t, actual.Args, "--web.config={{ .TextFiles.webConfigPlaceholder }}") }) - t.Run("exporter v1.5.0", func(t *testing.T) { + t.Run("v3.0.0", func(t *testing.T) { t.Parallel() node := &models.Node{} exporter := &models.Agent{ AgentID: "agent-id", AgentType: models.NodeExporterType, - Version: pointer.ToString("1.5.0"), } - agentVersion := version.MustParse("2.28.0") + agentVersion := version.MustParse("3.0.0") actual, err := nodeExporterConfig(node, exporter, agentVersion) require.NoError(t, err, "Unable to build node exporter config") - expected := &agentpb.SetStateRequest_AgentProcess{ + expected := &agentv1.SetStateRequest_AgentProcess{ Env: []string(nil), TextFiles: map[string]string{ "webConfigPlaceholder": "basic_auth_users:\n pmm: agent-id\n", diff --git a/version/features.go b/version/features.go new file mode 100644 index 0000000000..ef6116edbb --- /dev/null +++ b/version/features.go @@ -0,0 +1,32 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package version + +// versions list. +var ( + V3_0_0 = MustParse("3.0.0") +) + +type FeatureVersion *Parsed + +// features list. +var ( + NodeExporterNewTLSConfigVersion FeatureVersion = V3_0_0 +) + +func (p *Parsed) IsFeatureSupported(f FeatureVersion) bool { + return !p.Less(f) +} From f988f3a799629b6ab8ef2448bb2b49586e4d9418 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Fri, 11 Oct 2024 02:34:50 +0300 Subject: [PATCH 08/10] PMM-12155 fix linter. --- managed/services/agents/node.go | 5 ++--- version/features.go | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/managed/services/agents/node.go b/managed/services/agents/node.go index fb88ed9d95..4aac0b2422 100644 --- a/managed/services/agents/node.go +++ b/managed/services/agents/node.go @@ -31,8 +31,7 @@ import ( // Starting with pmm 2.28, the exporter uses Prometheus Web Toolkit and needs a config file // with the basic auth users. var ( - v2_27_99 = version.MustParse("2.27.99") - v1_5_0 = version.MustParse("1.5.0") + v2_28_00 = version.MustParse("2.28.0-0") ) func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion *version.Parsed) (*agentv1.SetStateRequest_AgentProcess, error) { @@ -145,7 +144,7 @@ func nodeExporterConfig(node *models.Node, exporter *models.Agent, agentVersion Args: args, } - if err := ensureAuthParams(exporter, params, agentVersion, v2_27_99, agentVersion.IsFeatureSupported(version.NodeExporterNewTLSConfigVersion)); err != nil { + if err := ensureAuthParams(exporter, params, agentVersion, v2_28_00, agentVersion.IsFeatureSupported(version.NodeExporterNewTLSConfigVersion)); err != nil { return nil, err } diff --git a/version/features.go b/version/features.go index ef6116edbb..0b3fcb34df 100644 --- a/version/features.go +++ b/version/features.go @@ -17,9 +17,10 @@ package version // versions list. var ( - V3_0_0 = MustParse("3.0.0") + V3_0_0 = MustParse("3.0.0") //nolint:revive ) +// FeatureVersion represents a minimum version feature being supported. type FeatureVersion *Parsed // features list. @@ -27,6 +28,7 @@ var ( NodeExporterNewTLSConfigVersion FeatureVersion = V3_0_0 ) +// IsFeatureSupported checks if the feature is supported by the version. func (p *Parsed) IsFeatureSupported(f FeatureVersion) bool { return !p.Less(f) } From ef5890034108c59edee7f9f1fced9509167f87c8 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Fri, 11 Oct 2024 02:56:51 +0300 Subject: [PATCH 09/10] PMM-12155 fix build. --- managed/services/agents/mongodb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index 230c05c8a5..a61d6af06d 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -78,7 +78,7 @@ func mongodbExporterConfig(node *models.Node, service *models.Service, exporter res.RedactWords = redactWords(exporter) } - if err := ensureAuthParams(exporter, res, pmmAgentVersion, v2_27_99, false); err != nil { + if err := ensureAuthParams(exporter, res, pmmAgentVersion, v2_28_00, false); err != nil { return nil, err } From 3da255864367d41b1928281fd55216b871dbe04f Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 15 Oct 2024 21:39:38 +0300 Subject: [PATCH 10/10] PMM-12155 fix linter. --- version/features.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/version/features.go b/version/features.go index 0b3fcb34df..02630cb7de 100644 --- a/version/features.go +++ b/version/features.go @@ -15,15 +15,15 @@ package version -// versions list. +// Versions list. var ( - V3_0_0 = MustParse("3.0.0") //nolint:revive + V3_0_0 = MustParse("3.0.0") //nolint:revive,stylecheck ) // FeatureVersion represents a minimum version feature being supported. type FeatureVersion *Parsed -// features list. +// Features list. var ( NodeExporterNewTLSConfigVersion FeatureVersion = V3_0_0 )