Skip to content

PMM-13837 valkey on pmm agent #4014

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 6 commits into
base: PMM-13836-valkey-inventory-api
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions agent/agents/supervisor/deps.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var (
proxysqlExporterRegexp = regexp.MustCompile("proxysql_exporter, version ([!-~]*).*")
rdsExporterRegexp = regexp.MustCompile("rds_exporter, version ([!-~]*).*")
azureMetricsExporterRegexp = regexp.MustCompile("azure_metrics_exporter, version ([!-~]*).*")
valkeyExporterRegexp = regexp.MustCompile("valkey_exporter, version ([!-~]*).*")
mongodbExporterRegexp = regexp.MustCompile("Version: ([!-~]*).*")
)

Expand Down
5 changes: 5 additions & 0 deletions agent/agents/supervisor/supervisor.go
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,9 @@ func (s *Supervisor) processParams(agentID string, agentProcess *agentv1.SetStat
processParams.Path = cfg.Paths.RDSExporter
case inventoryv1.AgentType_AGENT_TYPE_AZURE_DATABASE_EXPORTER:
processParams.Path = cfg.Paths.AzureExporter
case inventoryv1.AgentType_AGENT_TYPE_VALKEY_EXPORTER:
templateParams["paths_base"] = cfg.Paths.PathsBase
processParams.Path = cfg.Paths.ValkeyExporter
case type_TEST_SLEEP:
processParams.Path = "sleep"
case inventoryv1.AgentType_AGENT_TYPE_VM_AGENT:
Expand Down Expand Up @@ -786,6 +789,8 @@ func (s *Supervisor) version(agentType inventoryv1.AgentType, path string) (stri
return s.agentVersioner.BinaryVersion(path, 0, rdsExporterRegexp, "--version")
case inventoryv1.AgentType_AGENT_TYPE_AZURE_DATABASE_EXPORTER:
return s.agentVersioner.BinaryVersion(path, 0, azureMetricsExporterRegexp, "--version")
case inventoryv1.AgentType_AGENT_TYPE_VALKEY_EXPORTER:
return s.agentVersioner.BinaryVersion(path, 0, valkeyExporterRegexp, "--version")
default:
return "", nil
}
Expand Down
7 changes: 6 additions & 1 deletion agent/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (s *Server) FilteredURL() string {
return strings.ReplaceAll(u.String(), ":%2A%2A%2A@", ":***@")
}

// Paths represents binaries paths configuration.
// Paths represent binaries paths configuration.
type Paths struct {
PathsBase string `yaml:"paths_base"`
ExportersBase string `yaml:"exporters_base"`
Expand All @@ -100,6 +100,7 @@ type Paths struct {
ProxySQLExporter string `yaml:"proxysql_exporter"`
RDSExporter string `yaml:"rds_exporter"`
AzureExporter string `yaml:"azure_exporter"`
ValkeyExporter string `yaml:"valkey_exporter"`

VMAgent string `yaml:"vmagent"`
Nomad string `yaml:"nomad"`
Expand Down Expand Up @@ -225,6 +226,7 @@ func get(args []string, cfg *Config, l *logrus.Entry) (string, error) { //nolint
&cfg.Paths.MySQLdExporter: "mysqld_exporter",
&cfg.Paths.MongoDBExporter: "mongodb_exporter",
&cfg.Paths.PostgresExporter: "postgres_exporter",
&cfg.Paths.ValkeyExporter: "valkey_exporter",
&cfg.Paths.ProxySQLExporter: "proxysql_exporter",
&cfg.Paths.RDSExporter: "rds_exporter",
&cfg.Paths.AzureExporter: "azure_exporter",
Expand Down Expand Up @@ -287,6 +289,7 @@ func get(args []string, cfg *Config, l *logrus.Entry) (string, error) { //nolint
"mysqld_exporter": &cfg.Paths.MySQLdExporter,
"mongodb_exporter": &cfg.Paths.MongoDBExporter,
"postgres_exporter": &cfg.Paths.PostgresExporter,
"valkey_exporter": &cfg.Paths.ValkeyExporter,
"proxysql_exporter": &cfg.Paths.ProxySQLExporter,
"rds_exporter": &cfg.Paths.RDSExporter,
"azure_exporter": &cfg.Paths.AzureExporter,
Expand Down Expand Up @@ -396,6 +399,8 @@ func Application(cfg *Config) (*kingpin.Application, *string) {
Envar("PMM_AGENT_PATHS_PROXYSQL_EXPORTER").StringVar(&cfg.Paths.ProxySQLExporter)
app.Flag("paths-azure_exporter", "Path to azure_exporter to use [PMM_AGENT_PATHS_AZURE_EXPORTER]").
Envar("PMM_AGENT_PATHS_AZURE_EXPORTER").StringVar(&cfg.Paths.AzureExporter)
app.Flag("paths-valkey-exporter", "Path to valkey_exporter to use [PMM_AGENT_PATHS_VALKEY_EXPORTER]").
Envar("PMM_AGENT_PATHS_VALKEY_EXPORTER").StringVar(&cfg.Paths.ValkeyExporter)
app.Flag("paths-pt-summary", "Path to pt summary to use [PMM_AGENT_PATHS_PT_SUMMARY]").
Envar("PMM_AGENT_PATHS_PT_SUMMARY").StringVar(&cfg.Paths.PTSummary)
app.Flag("paths-pt-pg-summary", "Path to pt-pg-summary to use [PMM_AGENT_PATHS_PT_PG_SUMMARY]").
Expand Down
7 changes: 7 additions & 0 deletions agent/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/usr/local/percona/pmm/exporters/proxysql_exporter",
RDSExporter: "/usr/local/percona/pmm/exporters/rds_exporter",
AzureExporter: "/usr/local/percona/pmm/exporters/azure_exporter",
ValkeyExporter: "/usr/local/percona/pmm/exporters/valkey_exporter",
VMAgent: "/usr/local/percona/pmm/exporters/vmagent",
TempDir: "/usr/local/percona/pmm/tmp",
NomadDataDir: "/usr/local/percona/pmm/data/nomad",
Expand Down Expand Up @@ -176,6 +177,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/usr/local/percona/pmm/exporters/proxysql_exporter",
RDSExporter: "/usr/local/percona/pmm/exporters/rds_exporter",
AzureExporter: "/usr/local/percona/pmm/exporters/azure_exporter",
ValkeyExporter: "/usr/local/percona/pmm/exporters/valkey_exporter",
VMAgent: "/usr/local/percona/pmm/exporters/vmagent",
TempDir: "/usr/local/percona/pmm/tmp",
NomadDataDir: "/usr/local/percona/pmm/data/nomad",
Expand Down Expand Up @@ -237,6 +239,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/usr/local/percona/pmm/exporters/proxysql_exporter",
RDSExporter: "/usr/local/percona/pmm/exporters/rds_exporter",
AzureExporter: "/usr/local/percona/pmm/exporters/azure_exporter",
ValkeyExporter: "/usr/local/percona/pmm/exporters/valkey_exporter",
VMAgent: "/usr/local/percona/pmm/exporters/vmagent",
TempDir: "/foo/bar/tmp",
NomadDataDir: "/usr/local/percona/pmm/data/nomad",
Expand Down Expand Up @@ -306,6 +309,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/base/pro_exporter", // respect relative value from config file
RDSExporter: "/base/rds_exporter", // default value
AzureExporter: "/base/azure_exporter", // default value
ValkeyExporter: "/base/valkey_exporter", // default value
VMAgent: "/base/vmagent", // default value
TempDir: "/usr/local/percona/pmm/tmp",
NomadDataDir: "/usr/local/percona/pmm/data/nomad",
Expand Down Expand Up @@ -373,6 +377,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/base/exporters/pro_exporter", // respect relative value from config file
RDSExporter: "/base/exporters/rds_exporter", // default value
AzureExporter: "/base/exporters/azure_exporter", // default value
ValkeyExporter: "/base/exporters/valkey_exporter", // default value
VMAgent: "/base/exporters/vmagent", // default value
TempDir: "/base/tmp",
NomadDataDir: "/base/data/nomad",
Expand Down Expand Up @@ -438,6 +443,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/foo/exporters/proxysql_exporter", // default value
RDSExporter: "/foo/exporters/rds_exporter", // default value
AzureExporter: "/foo/exporters/azure_exporter", // default value
ValkeyExporter: "/foo/exporters/valkey_exporter", // default value
VMAgent: "/foo/exporters/vmagent", // default value
TempDir: "/foo/tmp",
NomadDataDir: "/base/data/nomad",
Expand Down Expand Up @@ -488,6 +494,7 @@ func TestGet(t *testing.T) {
ProxySQLExporter: "/usr/local/percona/pmm/exporters/proxysql_exporter",
RDSExporter: "/usr/local/percona/pmm/exporters/rds_exporter",
AzureExporter: "/usr/local/percona/pmm/exporters/azure_exporter",
ValkeyExporter: "/usr/local/percona/pmm/exporters/valkey_exporter",
VMAgent: "/usr/local/percona/pmm/exporters/vmagent",
TempDir: "/usr/local/percona/pmm/tmp",
NomadDataDir: "/usr/local/percona/pmm/data/nomad",
Expand Down
13 changes: 12 additions & 1 deletion agent/tlshelpers/valkey.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import (
// GetValkeyTLSConfig returns TLS config for Valkey connections.
func GetValkeyTLSConfig(files *agentv1.TextFiles, tlsSkipVerify bool) ([]redis.DialOption, error) {
var opts []redis.DialOption
if files != nil {
if !isEmptyTLSFiles(files) {
ca := x509.NewCertPool()
cert, err := tls.X509KeyPair([]byte(files.Files["tlsCert"]), []byte(files.Files["tlsKey"]))
if err != nil {
Expand All @@ -49,3 +49,14 @@ func GetValkeyTLSConfig(files *agentv1.TextFiles, tlsSkipVerify bool) ([]redis.D
}
return opts, nil
}

// isEmptyTLSFiles checks if the TLS files are empty.
func isEmptyTLSFiles(files *agentv1.TextFiles) bool {
if files == nil || len(files.Files) == 0 {
return true
}
if files.Files["tlsCert"] == "" && files.Files["tlsKey"] == "" && files.Files["tlsCa"] == "" {
return true
}
return false
}
1 change: 1 addition & 0 deletions managed/models/agent_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -895,8 +895,9 @@
AzureOptions: params.AzureOptions,
MongoDBOptions: params.MongoDBOptions,
MySQLOptions: params.MySQLOptions,
ValkeyOptions: params.ValkeyOptions,
PostgreSQLOptions: params.PostgreSQLOptions,
ValkeyOptions: params.ValkeyOptions,

Check failure on line 900 in managed/models/agent_helpers.go

View workflow job for this annotation

GitHub Actions / Checks

duplicate field name ValkeyOptions in struct literal
LogLevel: pointer.ToStringOrNil(params.LogLevel),
}
if err := row.SetCustomLabels(params.CustomLabels); err != nil {
Expand Down
10 changes: 5 additions & 5 deletions managed/models/agent_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -823,13 +823,13 @@ func (s Agent) Files() map[string]string {
files := make(map[string]string)

if s.ValkeyOptions.SSLCa != "" {
files[caFilePlaceholder] = s.ValkeyOptions.SSLCa
files["tlsCa"] = s.ValkeyOptions.SSLCa
}
if s.PostgreSQLOptions.SSLCert != "" {
files[certificateFilePlaceholder] = s.ValkeyOptions.SSLCert
if s.ValkeyOptions.SSLCert != "" {
files["tlsCert"] = s.ValkeyOptions.SSLCert
}
if s.PostgreSQLOptions.SSLKey != "" {
files[certificateKeyFilePlaceholder] = s.ValkeyOptions.SSLKey
if s.ValkeyOptions.SSLKey != "" {
files["tlsKey"] = s.ValkeyOptions.SSLKey
}

if len(files) != 0 {
Expand Down
7 changes: 3 additions & 4 deletions managed/services/agents/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI
continue
}

// Ordered the same as AgentType consts
switch row.AgentType {
case models.PMMAgentType:
continue
Expand Down Expand Up @@ -240,9 +239,9 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI

// Agents with exactly one Service
case models.MySQLdExporterType, models.MongoDBExporterType, models.PostgresExporterType, models.ProxySQLExporterType,
models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType, models.QANMongoDBProfilerAgentType, models.QANPostgreSQLPgStatementsAgentType,
models.QANMySQLPerfSchemaAgentType, models.ValkeyExporterType, models.QANMySQLSlowlogAgentType,
models.QANMongoDBProfilerAgentType, models.QANPostgreSQLPgStatementsAgentType,
models.QANPostgreSQLPgStatMonitorAgentType:

service, err := models.FindServiceByID(u.db.Querier, pointer.GetString(row.ServiceID))
if err != nil {
return err
Expand Down Expand Up @@ -284,7 +283,7 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI
}

default:
return errors.Errorf("unhandled Agent type %s", row.AgentType)
return errors.Errorf("cannot send request for unknown agent type %s", row.AgentType)
}
}

Expand Down
29 changes: 24 additions & 5 deletions managed/services/agents/valkey.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,45 @@
package agents

import (
"sort"
"time"

agentv1 "github.com/percona/pmm/api/agent/v1"
inventoryv1 "github.com/percona/pmm/api/inventory/v1"
"github.com/percona/pmm/managed/models"
"github.com/percona/pmm/version"
)

// valkeyExporterConfig returns desired configuration of valkey_exporter process.
// todo: to be implemented in PMM-13837
func valkeyExporterConfig(_ *models.Node, service *models.Service, exporter *models.Agent, _ redactMode,
// valkeyExporterConfig returns the desired configuration of the valkey_exporter process.
func valkeyExporterConfig(node *models.Node, service *models.Service, exporter *models.Agent, redactMode redactMode,
pmmAgentVersion *version.Parsed,
) *agentv1.SetStateRequest_AgentProcess {
listenAddress := getExporterListenAddress(node, exporter)
tdp := exporter.TemplateDelimiters(service)
var args []string
args := []string{
"--web.listen-address=" + listenAddress + ":" + tdp.Left + " .listen_port " + tdp.Right,
}

if exporter.ExporterOptions.MetricsPath != "" {
args = append(args, "--web.telemetry-path="+exporter.ExporterOptions.MetricsPath)
}

dnsParams := models.DSNParams{
DialTimeout: 3 * time.Second,
}
args = withLogLevel(args, exporter.LogLevel, pmmAgentVersion, true)
args = append(args, "--redis.addr="+exporter.DSN(service, dnsParams, nil, pmmAgentVersion))
sort.Strings(args)

return &agentv1.SetStateRequest_AgentProcess{
res := &agentv1.SetStateRequest_AgentProcess{
Type: inventoryv1.AgentType_AGENT_TYPE_VALKEY_EXPORTER,
TemplateLeftDelim: tdp.Left,
TemplateRightDelim: tdp.Right,
Args: args,
TextFiles: exporter.Files(),
}
if redactMode != exposeSecrets {
res.RedactWords = redactWords(exporter)
}
return res
}
4 changes: 1 addition & 3 deletions managed/services/converters.go
Original file line number Diff line number Diff line change
Expand Up @@ -536,11 +536,9 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventoryv1.Agent, erro
MetricsResolutions: ConvertMetricsResolutions(agent.ExporterOptions.MetricsResolutions),
UseRedisScheme: agent.ValkeyOptions.UseRedisScheme,
}

return exporter, nil

default:
panic(fmt.Errorf("unhandled Agent type %s", agent.AgentType))
panic(fmt.Errorf("cannot convert unknown agent type %s", agent.AgentType))
}
}

Expand Down
1 change: 1 addition & 0 deletions managed/services/management/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ func (s *ManagementService) ListServices(ctx context.Context, req *managementv1.
or mongodb_up{job=~".*_hr$"}
or proxysql_up{job=~".*_hr$"}
or haproxy_backend_status{state="UP"}
or redis_up{job=~".*_hr$"}
`
result, _, err := s.vmClient.Query(ctx, query, time.Now())
if err != nil {
Expand Down
10 changes: 10 additions & 0 deletions managed/services/victoriametrics/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,16 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, //
metricsResolution: &mr,
})

case models.ValkeyExporterType:
scfgs, err = scrapeConfigForValkeyExporter(&scrapeConfigParams{
host: paramsHost,
node: paramsNode,
service: paramsService,
agent: agent,
streamParse: true,
metricsResolution: &mr,
})

case models.ProxySQLExporterType:
scfgs, err = scrapeConfigsForProxySQLExporter(&scrapeConfigParams{
host: paramsHost,
Expand Down
13 changes: 13 additions & 0 deletions managed/services/victoriametrics/scrape_configs.go
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,19 @@ func scrapeConfigsForPostgresExporter(params *scrapeConfigParams) ([]*config.Scr
return r, nil
}

func scrapeConfigForValkeyExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) {
hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, nil)
if err != nil {
return nil, err
}

var r []*config.ScrapeConfig
if hr != nil {
r = append(r, hr)
}
return r, nil
}

func scrapeConfigsForProxySQLExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) {
hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, nil) // TODO https://jira.percona.com/browse/PMM-4619
if err != nil {
Expand Down
47 changes: 46 additions & 1 deletion managed/services/victoriametrics/victoriametrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func TestVictoriaMetrics(t *testing.T) {
Version: pointer.ToString("2.26.0"),
},

// listen port not known
// listen port is not known
&models.Agent{
AgentID: "711674c2-36e6-42d5-8e63-5d7c84c9053a",
AgentType: models.NodeExporterType,
Expand Down Expand Up @@ -149,6 +149,16 @@ func TestVictoriaMetrics(t *testing.T) {
CustomLabels: []byte(`{"_service_label": "bam"}`),
},

&models.Service{
ServiceID: "a04c391a-b3d0-40c2-95c5-3cfec462c8e5",
ServiceType: models.ValkeyServiceType,
ServiceName: "test-valkey",
NodeID: "cc663f36-18ca-40a1-aea9-c6310bb4738d",
Address: pointer.ToString("1.3.5.7"),
Port: pointer.ToUint16(6379),
CustomLabels: []byte(`{"_service_label": "bam"}`),
},

&models.Agent{
AgentID: "ecd8995a-d479-4b4d-bfb7-865bac4ac2fb",
AgentType: models.MongoDBExporterType,
Expand Down Expand Up @@ -196,6 +206,15 @@ func TestVictoriaMetrics(t *testing.T) {
ListenPort: pointer.ToUint16(12345),
},

&models.Agent{
AgentID: "fd2dcf41-0718-4319-9fa9-b7a509787c98",
AgentType: models.ValkeyExporterType,
PMMAgentID: pointer.ToString("217907dc-d34d-4e2e-aa84-a1b765d49853"),
ServiceID: pointer.ToString("a04c391a-b3d0-40c2-95c5-3cfec462c8e5"),
CustomLabels: []byte(`{"_agent_label": "valkey-baz"}`),
ListenPort: pointer.ToUint16(12345),
},

// disabled
&models.Agent{
AgentID: "4226ddb5-8197-443c-9891-7772b38324a7",
Expand Down Expand Up @@ -743,6 +762,32 @@ scrape_configs:
password: 29e14468-d479-4b4d-bfb7-4ac2fb865bac
follow_redirects: false
stream_parse: true
- job_name: valkey_exporter_fd2dcf41-0718-4319-9fa9-b7a509787c98_hr
honor_timestamps: false
scrape_interval: 5s
scrape_timeout: 4500ms
metrics_path: /metrics
static_configs:
- targets:
- 1.2.3.4:12345
labels:
_agent_label: valkey-baz
_node_label: foo
_service_label: bam
agent_id: fd2dcf41-0718-4319-9fa9-b7a509787c98
agent_type: valkey_exporter
instance: fd2dcf41-0718-4319-9fa9-b7a509787c98
node_id: cc663f36-18ca-40a1-aea9-c6310bb4738d
node_name: test-generic-node
node_type: generic
service_id: a04c391a-b3d0-40c2-95c5-3cfec462c8e5
service_name: test-valkey
service_type: valkey
basic_auth:
username: pmm
password: fd2dcf41-0718-4319-9fa9-b7a509787c98
follow_redirects: false
stream_parse: true
`) + "\n"
actual, err := os.ReadFile(configPath)
check.NoError(err)
Expand Down
Loading