Skip to content
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

[+] add "prerequisite extensions" support for metric definitions #643

Merged
merged 1 commit into from
Jun 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions pgwatch2/metrics/stat_statements/metric_attrs.yaml
@@ -0,0 +1,3 @@
---
prerequisite_extensions:
- pg_stat_statements
3 changes: 3 additions & 0 deletions pgwatch2/metrics/stat_statements_calls/metric_attrs.yaml
@@ -0,0 +1,3 @@
---
prerequisite_extensions:
- pg_stat_statements
@@ -1,2 +1,4 @@
---
metric_storage_name: stat_statements
prerequisite_extensions:
- pg_stat_statements
12 changes: 12 additions & 0 deletions pgwatch2/pgwatch2.go
Expand Up @@ -123,6 +123,7 @@ type MetricAttrs struct {
IsInstanceLevel bool `yaml:"is_instance_level"`
MetricStorageName string `yaml:"metric_storage_name"`
ExtensionVersionOverrides []ExtensionOverrides `yaml:"extension_version_based_overrides"`
PrerequisiteExtensions []string `yaml:"prerequisite_extensions"`
IsPrivate bool `yaml:"is_private"` // used only for extension overrides currently and ignored otherwise
DisabledDays string `yaml:"disabled_days"` // Cron style, 0 = Sunday. Ranges allowed: 0,2-4
DisableTimes []string `yaml:"disabled_times"` // "11:00-13:00"
Expand Down Expand Up @@ -3098,6 +3099,17 @@ func FetchMetrics(msg MetricFetchMessage, host_state map[string]map[string]strin
return nil, err
}

for _, prereqExt := range mvp.MetricAttrs.PrerequisiteExtensions {
if _, ok := vme.Extensions[prereqExt]; !ok {
epoch, ok2 := last_sql_fetch_error.Load(msg.MetricName + DB_METRIC_JOIN_STR + "prereq")
if !ok2 || ((time.Now().Unix() - epoch.(int64)) > 3600) { // complain only 1x per hour instead of 10m
log.Warningf("[%s:%s] Skipping actual fetch as prerequisite extension '%s' not present", msg.DBUniqueName, msg.MetricName, prereqExt)
last_sql_fetch_error.Store(msg.MetricName+DB_METRIC_JOIN_STR+"prereq", time.Now().Unix())
}
return nil, nil
}
}

isCacheable = IsCacheableMetric(msg, mvp)
if isCacheable && opts.InstanceLevelCacheMaxSeconds > 0 && msg.Interval.Seconds() > float64(opts.InstanceLevelCacheMaxSeconds) {
cachedData = GetFromInstanceCacheIfNotOlderThanSeconds(msg, opts.InstanceLevelCacheMaxSeconds)
Expand Down
14 changes: 12 additions & 2 deletions pgwatch2/sql/config_store/metric_definitions.sql
Expand Up @@ -8072,9 +8072,19 @@ do update set ma_metric_attrs = pgwatch2.metric_attribute.ma_metric_attrs || '{"

-- dynamic re-routing of metric names
insert into pgwatch2.metric_attribute (ma_metric_name, ma_metric_attrs)
select 'stat_statements_no_query_text', '{"metric_storage_name": "stat_statements"}'
select 'stat_statements_no_query_text', '{"metric_storage_name": "stat_statements", "prerequisite_extensions": ["pg_stat_statements"]}'
on conflict (ma_metric_name)
do update set ma_metric_attrs = pgwatch2.metric_attribute.ma_metric_attrs || '{"metric_storage_name": "stat_statements"}', ma_last_modified_on = now();
do update set ma_metric_attrs = pgwatch2.metric_attribute.ma_metric_attrs || '{"metric_storage_name": "stat_statements", "prerequisite_extensions": ["pg_stat_statements"]}', ma_last_modified_on = now();

insert into pgwatch2.metric_attribute (ma_metric_name, ma_metric_attrs)
select 'stat_statements', '{"prerequisite_extensions": ["pg_stat_statements"]}'
on conflict (ma_metric_name)
do update set ma_metric_attrs = pgwatch2.metric_attribute.ma_metric_attrs || '{"prerequisite_extensions": ["pg_stat_statements"]}', ma_last_modified_on = now();

insert into pgwatch2.metric_attribute (ma_metric_name, ma_metric_attrs)
select 'stat_statements_calls', '{"prerequisite_extensions": ["pg_stat_statements"]}'
on conflict (ma_metric_name)
do update set ma_metric_attrs = pgwatch2.metric_attribute.ma_metric_attrs || '{"prerequisite_extensions": ["pg_stat_statements"]}', ma_last_modified_on = now();

insert into pgwatch2.metric_attribute (ma_metric_name, ma_metric_attrs)
select 'db_stats_aurora', '{"metric_storage_name": "db_stats"}'
Expand Down