postgres_exporter/collector/pg_extensions.go
Nurlan Moldomurov a3cbe38830 v0.14.0
-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEWAMJb4o8XHIqobCDKiHP/ei1iMYFAmUKTfwACgkQKiHP/ei1
 iMbuLwv+JYvRMxVgbLbuwcOStXLXxHEK1E2Jht2pJzwtk4MRLU1vZNFHderFELva
 VGdE5DcnG1Nx2hry7fHUuXhd3KZ3MPMay2bGO/LumQ7XB6zJTCQptHUfQYIN9GrB
 rdD/wVGx5KXLMv5S+CwdhIegaPmJM1B4JTUrRwNn0rLW4oiVpEL1XH8q6Vnk2s/+
 CVnVwT431imSKQPUoucfMZgo/naBvwGD1VPMNYysz2X9Z/scFJmCqnHcrFvRiVkm
 aAVs2K9SlLHMMAF8lMCFW3fJ7a8IVRnqfEMml/nxC6Tas5wKB276pTQaQIhNzZmb
 PsNUw9xT/Rf+LW62WIulRhlVAs/NJtKQoB9PoxBM34l2XJ2RPVRn/LN1mAYQPg37
 QI22j38uYbCuU4A4yoMCOTKVotn5lOcn8DpMY7B4+yXqLQYcTHgR1WvLlPLeld4k
 k0nz9XqodigmmP5JUW0zmbvtWa0ddAByeoGZS0V+pStekQR5Hr5uwH6beWSi0N38
 WOig/tLx
 =Trbg
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE66jYSDPQNyAKJJPgu8vw0/bC9AkFAmUbN5gACgkQu8vw0/bC
 9Akrxg/+LqRAKYiiRpObRtCZi5sTwjTP+o8pEZ9p22sBEo7Fd2HG/Hpdl9Qykohl
 C5oGp4fHPpYRlnzJkahbiY8lSbDOsCtN4Ft516AyiPqVkiWixuCDO6C80st0Kg3j
 ZPoZi9KzBaFeV92MPOf20OBLyIsHjL9hCwnsesnk7N8cEo1WXFfwbuGxDwazGxEx
 /xj/3dz+xpJ6ZTebcZSNyJZsEe3u220xlvTWCJk2E89YPN3PWE83mBWt1Aq7B1Wp
 cCf9MCcSOMZF08G5sUEy3+2TBbybXY+Y4Vp5y9hVuTYnkxUprduOI2Ro6qR374iE
 1NPH9CyUsNNvqjmVTJk3hM00B4lPyFKrncth363FFHTnsWIsamqlcnUAbm3DuKis
 53reyVVKR+2ZrFzTutNid3+vdyhoU6FYxz+eQTCkSrpJlkp5UoHGyffQdnnZuG+l
 q7qKaD2JuQL3qjBL2UHVzG2RgnN1QhHPWmCrkmD8T2myZhjmoi7vsI8XfXKoOZAB
 eRHgV0mAGZI7hIOF9vJ8oZXeTRSg5dfPg5rNyMpF9G1x6WHDmy6bErNIEyNfIQQx
 qekE/UCaIWElw/XSA2hzKu3Trrhx1wPkFk0LPc/Hr2hCLOrFAWAVHJy6UFg1FdlF
 Il7QTrhsyY+itPEkHEjivvib1kCTVd1/6h5VjaL/rbRlCoooBZE=
 =7jMV
 -----END PGP SIGNATURE-----

PMM-12154 pull upstream changes.
2023-10-03 00:35:20 +03:00

118 lines
2.6 KiB
Go

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",
},
prometheus.Labels{},
),
"pg_extensions": prometheus.NewDesc(
"pg_extensions",
"Installed extensions",
[]string{
"name",
"relocatable",
"version",
},
prometheus.Labels{},
),
}
type ExtensionsCollector struct {
logger log.Logger
}
func NewExtensionsCollector(collectorConfig collectorConfig) (Collector, error) {
return &ExtensionsCollector{logger: collectorConfig.logger}, nil
}
func (e *ExtensionsCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
err := e.scrapeAvailableExtensions(ctx, instance.db, ch)
if err != nil {
return err
}
err = e.scrapeInstalledExtensions(ctx, instance.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 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
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,
)
}
return nil
}
var _ = (Collector)(&ExtensionsCollector{})