From 5f094d25c44c47e4492f4f47ca0b1d69f92e922c Mon Sep 17 00:00:00 2001 From: Dmytro Liakhov Date: Fri, 21 Apr 2023 16:47:31 +0300 Subject: [PATCH 1/4] PMM-11984: Add new metrics `pg_available_extensions` and `pg_extensions` to expose info about available extensions and installed extensions accordingly --- collector/pg_extensions.go | 115 +++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 collector/pg_extensions.go diff --git a/collector/pg_extensions.go b/collector/pg_extensions.go new file mode 100644 index 000000000..5b768823b --- /dev/null +++ b/collector/pg_extensions.go @@ -0,0 +1,115 @@ +package collector + +import ( + "context" + "database/sql" + "github.com/go-kit/log" + "github.com/prometheus/client_golang/prometheus" + "strconv" +) + +func init() { + registerCollector("extensions", defaultEnabled, NewExtensionsCollector) +} + +var pgExtensions = map[string]*prometheus.Desc{ + "pg_available_extensions": prometheus.NewDesc( + "pg_available_extensions", + "Extensions that are available for installation", + []string{ + "name", + "default_version", + "installed_version", + "comment", + }, + prometheus.Labels{}, + ), + "pg_extensions": prometheus.NewDesc( + "pg_extensions", + "Installed extensions", + []string{ + "extname", + "extrelocatable", + "extversion", + }, + prometheus.Labels{}, + ), +} + +type ExtensionsCollector struct { + logger log.Logger +} + +func NewExtensionsCollector(logger log.Logger) (Collector, error) { + return &ExtensionsCollector{logger: logger}, nil +} + +func (e *ExtensionsCollector) Update(ctx context.Context, server *server, ch chan<- prometheus.Metric) error { + db, err := server.GetDB() + if err != nil { + return err + } + + err = e.scrapeAvailableExtensions(ctx, db, ch) + if err != nil { + return err + } + + err = e.scrapeInstalledExtensions(ctx, db, ch) + if err != nil { + return err + } + + return nil +} + +func (e *ExtensionsCollector) scrapeInstalledExtensions(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric) error { + rowsExtensions, err := db.QueryContext(ctx, `SELECT extname, extrelocatable, extversion FROM pg_extension`) + + if err != nil { + return err + } + defer rowsExtensions.Close() + + for rowsExtensions.Next() { + var extname string + var extrelocatable bool + var extversion string + if err := rowsExtensions.Scan(&extname, &extrelocatable, &extversion); err != nil { + return err + } + + ch <- prometheus.MustNewConstMetric( + pgExtensions["pg_extensions"], + prometheus.GaugeValue, 1, + extname, strconv.FormatBool(extrelocatable), extversion, + ) + } + return nil +} + +func (e *ExtensionsCollector) scrapeAvailableExtensions(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric) error { + rows, err := db.QueryContext(ctx, `SELECT name, default_version, installed_version, comment FROM pg_available_extensions`) + if err != nil { + return err + } + defer rows.Close() + + for rows.Next() { + var name sql.NullString + var defaultVersion sql.NullString + var installedVersion sql.NullString + var comment sql.NullString + + if err := rows.Scan(&name, &defaultVersion, &installedVersion, &comment); err != nil { + return err + } + + ch <- prometheus.MustNewConstMetric( + pgExtensions["pg_available_extensions"], + prometheus.GaugeValue, 1, + name.String, defaultVersion.String, installedVersion.String, comment.String, + ) + } + return nil +} From 44c5308ecd77a376bb0560ba6294556490ab9462 Mon Sep 17 00:00:00 2001 From: Dmytro Liakhov Date: Fri, 5 May 2023 15:08:55 +0300 Subject: [PATCH 2/4] PMM-11984: Exclude comment from the metric --- collector/pg_extensions.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/collector/pg_extensions.go b/collector/pg_extensions.go index 5b768823b..e1f2acfc7 100644 --- a/collector/pg_extensions.go +++ b/collector/pg_extensions.go @@ -20,7 +20,6 @@ var pgExtensions = map[string]*prometheus.Desc{ "name", "default_version", "installed_version", - "comment", }, prometheus.Labels{}, ), @@ -89,7 +88,7 @@ func (e *ExtensionsCollector) scrapeInstalledExtensions(ctx context.Context, db } func (e *ExtensionsCollector) scrapeAvailableExtensions(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric) error { - rows, err := db.QueryContext(ctx, `SELECT name, default_version, installed_version, comment FROM pg_available_extensions`) + rows, err := db.QueryContext(ctx, `SELECT name, default_version, installed_version FROM pg_available_extensions`) if err != nil { return err } @@ -99,16 +98,14 @@ func (e *ExtensionsCollector) scrapeAvailableExtensions(ctx context.Context, db var name sql.NullString var defaultVersion sql.NullString var installedVersion sql.NullString - var comment sql.NullString - - if err := rows.Scan(&name, &defaultVersion, &installedVersion, &comment); err != nil { + if err := rows.Scan(&name, &defaultVersion, &installedVersion); err != nil { return err } ch <- prometheus.MustNewConstMetric( pgExtensions["pg_available_extensions"], prometheus.GaugeValue, 1, - name.String, defaultVersion.String, installedVersion.String, comment.String, + name.String, defaultVersion.String, installedVersion.String, ) } return nil From e5538d447c09f9e9ca0c0ef5cdb5f97d1b5c0664 Mon Sep 17 00:00:00 2001 From: Dmytro Liakhov Date: Mon, 8 May 2023 16:04:56 +0300 Subject: [PATCH 3/4] PMM-11984: Fix small issues --- collector/pg_extensions.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/collector/pg_extensions.go b/collector/pg_extensions.go index e1f2acfc7..34dbf6ccc 100644 --- a/collector/pg_extensions.go +++ b/collector/pg_extensions.go @@ -80,10 +80,14 @@ func (e *ExtensionsCollector) scrapeInstalledExtensions(ctx context.Context, db ch <- prometheus.MustNewConstMetric( pgExtensions["pg_extensions"], - prometheus.GaugeValue, 1, - extname, strconv.FormatBool(extrelocatable), extversion, + prometheus.GaugeValue, + 1, + extname, + strconv.FormatBool(extrelocatable), + extversion, ) } + return nil } @@ -104,9 +108,15 @@ func (e *ExtensionsCollector) scrapeAvailableExtensions(ctx context.Context, db ch <- prometheus.MustNewConstMetric( pgExtensions["pg_available_extensions"], - prometheus.GaugeValue, 1, - name.String, defaultVersion.String, installedVersion.String, + prometheus.GaugeValue, + 1, + name.String, + defaultVersion.String, + installedVersion.String, ) } + return nil } + +var _ = (Collector)(&ExtensionsCollector{}) From 6785609d7bd9db240f9205d22596d974e6fcebb4 Mon Sep 17 00:00:00 2001 From: Dmytro Liakhov Date: Mon, 8 May 2023 16:07:34 +0300 Subject: [PATCH 4/4] PMM-11984: Update label values --- collector/pg_extensions.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/collector/pg_extensions.go b/collector/pg_extensions.go index 34dbf6ccc..b7c196f65 100644 --- a/collector/pg_extensions.go +++ b/collector/pg_extensions.go @@ -27,9 +27,9 @@ var pgExtensions = map[string]*prometheus.Desc{ "pg_extensions", "Installed extensions", []string{ - "extname", - "extrelocatable", - "extversion", + "name", + "relocatable", + "version", }, prometheus.Labels{}, ),