diff --git a/collector/collector.go b/collector/collector.go index 47fac992..5bb6b6ef 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -175,7 +175,6 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) { ch <- e.error e.scrapeErrors.Collect(ch) for _, db := range e.databases { - ch <- db.DBTypeMetric(e.constLabels()) ch <- db.UpMetric(e.constLabels()) } } diff --git a/collector/database.go b/collector/database.go index 52b25ece..7b2cde7a 100644 --- a/collector/database.go +++ b/collector/database.go @@ -34,19 +34,6 @@ func (d *Database) UpMetric(exporterLabels map[string]string) prometheus.Metric ) } -func (d *Database) DBTypeMetric(exporterLabels map[string]string) prometheus.Metric { - desc := prometheus.NewDesc( - prometheus.BuildFQName(namespace, "", "dbtype"), - "Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).", - nil, - d.constLabels(exporterLabels), - ) - return prometheus.MustNewConstMetric(desc, - prometheus.GaugeValue, - d.Type, - ) -} - // ping the database. If the database is disconnected, try to reconnect. // If the database type is unknown, try to reload it. func (d *Database) ping(logger *slog.Logger) error { @@ -61,16 +48,10 @@ func (d *Database) ping(logger *slog.Logger) error { } // If database is closed, try to reconnect if strings.Contains(err.Error(), "sql: database is closed") { - db, dbtype := connect(logger, d.Name, d.Config) - d.Session = db - d.Type = dbtype + d.Session = connect(logger, d.Name, d.Config) } return err } - // if connected but database type is unknown, try to reload it - if d.Type == -1 { - d.Type = getDBtype(ctx, d.Session, logger, d.Name) - } d.Up = 1 return nil } @@ -86,12 +67,11 @@ func (d *Database) constLabels(labels map[string]string) map[string]string { } func NewDatabase(logger *slog.Logger, dbname string, dbconfig DatabaseConfig) *Database { - db, dbtype := connect(logger, dbname, dbconfig) + db := connect(logger, dbname, dbconfig) return &Database{ Name: dbname, Up: 0, Session: db, - Type: dbtype, Config: dbconfig, Valid: true, } @@ -158,7 +138,7 @@ func isInvalidCredentialsError(err error) bool { return oraErr.Code() == ora01017code || oraErr.Code() == ora28000code } -func connect(logger *slog.Logger, dbname string, dbconfig DatabaseConfig) (*sql.DB, float64) { +func connect(logger *slog.Logger, dbname string, dbconfig DatabaseConfig) *sql.DB { logger.Debug("Launching connection to "+maskDsn(dbconfig.URL), "database", dbname) var P godror.ConnectionParams @@ -241,15 +221,5 @@ func connect(logger *slog.Logger, dbname string, dbconfig DatabaseConfig) (*sql. } logger.Info("Connected as SYSDBA? "+sysdba, "database", dbname) - dbtype := getDBtype(ctx, db, logger, dbname) - return db, dbtype -} - -func getDBtype(ctx context.Context, db *sql.DB, logger *slog.Logger, dbname string) float64 { - var dbtype int - if err := db.QueryRowContext(ctx, "select sys_context('USERENV', 'CON_ID') from dual").Scan(&dbtype); err != nil { - logger.Info("dbtype err", "error", err, "database", dbname) - return -1 - } - return float64(dbtype) + return db } diff --git a/collector/default_metrics.toml b/collector/default_metrics.toml index d340a2fe..21dc6b13 100644 --- a/collector/default_metrics.toml +++ b/collector/default_metrics.toml @@ -1,3 +1,11 @@ +[[metric]] +context = "" +metricsdesc = { dbtype="Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB)." } +request = ''' +select sys_context('USERENV', 'CON_ID') as dbtype +from dual +''' + [[metric]] context = "sessions" labels = [ "inst_id", "status", "type" ] diff --git a/collector/types.go b/collector/types.go index 721a040c..b86f2259 100644 --- a/collector/types.go +++ b/collector/types.go @@ -29,7 +29,6 @@ type Database struct { Name string Up float64 Session *sql.DB - Type float64 Config DatabaseConfig // MetricsCache holds computed metrics for a database, so these metrics are available on each scrape. // Given a metric's scrape configuration, it may not be computed on the same interval as other metrics. diff --git a/default-metrics.toml b/default-metrics.toml index d340a2fe..21dc6b13 100644 --- a/default-metrics.toml +++ b/default-metrics.toml @@ -1,3 +1,11 @@ +[[metric]] +context = "" +metricsdesc = { dbtype="Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB)." } +request = ''' +select sys_context('USERENV', 'CON_ID') as dbtype +from dual +''' + [[metric]] context = "sessions" labels = [ "inst_id", "status", "type" ] diff --git a/default-metrics.yaml b/default-metrics.yaml index 5569ae5e..d9c9a442 100644 --- a/default-metrics.yaml +++ b/default-metrics.yaml @@ -1,4 +1,11 @@ metrics: + - context: "" + metricsdesc: + dbtype: "Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB)." + request: | + select sys_context('USERENV', 'CON_ID') as dbtype + from dual + - context: "sessions" labels: [ "inst_id", "status", "type" ] metricsdesc: diff --git a/site/docs/releases/changelog.md b/site/docs/releases/changelog.md index f485d7ed..8dde1f55 100644 --- a/site/docs/releases/changelog.md +++ b/site/docs/releases/changelog.md @@ -11,6 +11,11 @@ List of upcoming and historic changes to the exporter. Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack. +- Move `oracledb_dbtype` metric to the default metrics. You may now disable or override this metric like any other database metric. + +Thank you to the following people for their suggestions and contributions: +- [@MansuyDavid](https://github.com/MansuyDavid) + ### Version 2.1.0, September 29, 2025 - Updated project dependencies.