@@ -28,16 +28,9 @@ func DBExecRead(ctx context.Context, conn db.PgxIface, sql string, args ...any)
2828 return nil , err
2929}
3030
31- func GetConnByUniqueName (dbUnique string ) db.PgxIface {
32- if md , err := GetMonitoredDatabaseByUniqueName (dbUnique ); err == nil {
33- return md .Conn
34- }
35- return nil
36- }
37-
3831func DBExecReadByDbUniqueName (ctx context.Context , dbUnique string , sql string , args ... any ) (metrics.Measurements , error ) {
3932 var conn db.PgxIface
40- var md * sources.MonitoredDatabase
33+ var md * sources.SourceConn
4134 var err error
4235 var tx pgx.Tx
4336 if strings .TrimSpace (sql ) == "" {
@@ -112,35 +105,6 @@ func DBGetSizeMB(ctx context.Context, dbUnique string) (int64, error) {
112105 return lastDBSize , nil
113106}
114107
115- func TryDiscoverExecutionEnv (ctx context.Context , dbUnique string ) (execEnv string ) {
116- sql := `select /* pgwatch_generated */
117- case
118- when exists (select * from pg_settings where name = 'pg_qs.host_database' and setting = 'azure_sys') and version() ~* 'compiled by Visual C' then 'AZURE_SINGLE'
119- when exists (select * from pg_settings where name = 'pg_qs.host_database' and setting = 'azure_sys') and version() ~* 'compiled by gcc' then 'AZURE_FLEXIBLE'
120- when exists (select * from pg_settings where name = 'cloudsql.supported_extensions') then 'GOOGLE'
121- else
122- 'UNKNOWN'
123- end as exec_env`
124- _ = GetConnByUniqueName (dbUnique ).QueryRow (ctx , sql ).Scan (& execEnv )
125- return
126- }
127-
128- func GetDBTotalApproxSize (ctx context.Context , dbUnique string ) (int64 , error ) {
129- sqlApproxDBSize := `
130- select /* pgwatch_generated */
131- current_setting('block_size')::int8 * sum(relpages) as db_size_approx
132- from
133- pg_class c
134- where /* works only for v9.1+*/
135- c.relpersistence != 't';
136- `
137- data , err := DBExecReadByDbUniqueName (ctx , dbUnique , sqlApproxDBSize )
138- if err != nil {
139- return 0 , err
140- }
141- return data [0 ]["db_size_approx" ].(int64 ), nil
142- }
143-
144108// VersionToInt parses a given version and returns an integer or
145109// an error if unable to parse the version. Only parses valid semantic versions.
146110// Performs checking that can find errors within the version.
@@ -158,7 +122,7 @@ func VersionToInt(version string) (v int) {
158122
159123var rBouncerAndPgpoolVerMatch = regexp .MustCompile (`\d+\.+\d+` ) // extract $major.minor from "4.1.2 (karasukiboshi)" or "PgBouncer 1.12.0"
160124
161- func GetMonitoredDatabaseSettings (ctx context.Context , md * sources.MonitoredDatabase , noCache bool ) (MonitoredDatabaseSettings , error ) {
125+ func GetMonitoredDatabaseSettings (ctx context.Context , md * sources.SourceConn , noCache bool ) (MonitoredDatabaseSettings , error ) {
162126 var dbSettings MonitoredDatabaseSettings
163127 var dbNewSettings MonitoredDatabaseSettings
164128 var ok bool
@@ -233,12 +197,12 @@ FROM
233197 dbNewSettings .ExecEnv = dbSettings .ExecEnv // carry over as not likely to change ever
234198 } else {
235199 l .Debugf ("determining the execution env..." )
236- dbNewSettings .ExecEnv = TryDiscoverExecutionEnv ( ctx , md .Name )
200+ dbNewSettings .ExecEnv = md .DiscoverPlatform ( ctx )
237201 }
238202
239203 // to work around poor Azure Single Server FS functions performance for some metrics + the --min-db-size-mb filter
240204 if dbNewSettings .ExecEnv == execEnvAzureSingle {
241- if approxSize , err := GetDBTotalApproxSize ( ctx , md .Name ); err == nil {
205+ if approxSize , err := md .GetApproxSize ( ctx ); err == nil {
242206 dbNewSettings .ApproxDBSizeB = approxSize
243207 } else {
244208 dbNewSettings .ApproxDBSizeB = dbSettings .ApproxDBSizeB
@@ -811,21 +775,6 @@ func FetchMetricsPgpool(ctx context.Context, msg MetricFetchConfig, vme Monitore
811775 return retData , nil
812776}
813777
814- func DoesFunctionExists (ctx context.Context , dbUnique , functionName string ) bool {
815- log .GetLogger (ctx ).Debug ("Checking for function existence" , dbUnique , functionName )
816- sql := fmt .Sprintf ("select /* pgwatch_generated */ 1 from pg_proc join pg_namespace n on pronamespace = n.oid where proname = '%s' and n.nspname = 'public'" , functionName )
817- data , err := DBExecReadByDbUniqueName (ctx , dbUnique , sql )
818- if err != nil {
819- log .GetLogger (ctx ).Error ("Failed to check for function existence" , dbUnique , functionName , err )
820- return false
821- }
822- if len (data ) > 0 {
823- log .GetLogger (ctx ).Debugf ("Function %s exists on %s" , functionName , dbUnique )
824- return true
825- }
826- return false
827- }
828-
829778// Called once on daemon startup if some commonly wanted extension (most notably pg_stat_statements) is missing.
830779// With newer Postgres version can even succeed if the user is not a real superuser due to some cloud-specific
831780// whitelisting or "trusted extensions" (a feature from v13). Ignores errors.
@@ -866,7 +815,7 @@ func TryCreateMissingExtensions(ctx context.Context, dbUnique string, extensionN
866815}
867816
868817// Called once on daemon startup to try to create "metric fething helper" functions automatically
869- func TryCreateMetricsFetchingHelpers (ctx context.Context , md * sources.MonitoredDatabase ) (err error ) {
818+ func TryCreateMetricsFetchingHelpers (ctx context.Context , md * sources.SourceConn ) (err error ) {
870819 metricConfig := func () map [string ]float64 {
871820 if len (md .Metrics ) > 0 {
872821 return md .Metrics
@@ -919,7 +868,7 @@ func GetGoPsutilDiskPG(ctx context.Context, dbUnique string) (metrics.Measuremen
919868 return psutil .GetGoPsutilDiskPG (data , dataTblsp )
920869}
921870
922- func CloseResourcesForRemovedMonitoredDBs (metricsWriter sinks.Writer , currentDBs , prevLoopDBs sources.MonitoredDatabases , shutDownDueToRoleChange map [string ]bool ) {
871+ func CloseResourcesForRemovedMonitoredDBs (metricsWriter sinks.Writer , currentDBs , prevLoopDBs sources.SourceConns , shutDownDueToRoleChange map [string ]bool ) {
923872 var curDBsMap = make (map [string ]bool )
924873
925874 for _ , curDB := range currentDBs {
0 commit comments