diff --git a/internal/query/activity_test.go b/internal/query/activity_test.go index c85c2ab..609330d 100644 --- a/internal/query/activity_test.go +++ b/internal/query/activity_test.go @@ -32,7 +32,7 @@ func Test_StatActivityQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_activity/%d", version), func(t *testing.T) { tmpl, _ := SelectStatActivityQuery(version) - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/databases_test.go b/internal/query/databases_test.go index ee64c8e..66dd8ec 100644 --- a/internal/query/databases_test.go +++ b/internal/query/databases_test.go @@ -37,7 +37,7 @@ func Test_StatDatabaseQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_database/%d", version), func(t *testing.T) { tmpl, _, _ := SelectStatDatabaseQuery(version) - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/functions_test.go b/internal/query/functions_test.go index cba3124..82df7c6 100644 --- a/internal/query/functions_test.go +++ b/internal/query/functions_test.go @@ -14,7 +14,7 @@ func Test_StatFunctionsQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_user_functions/%d", version), func(t *testing.T) { tmpl := PgStatFunctionsDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/indexes_test.go b/internal/query/indexes_test.go index 8201613..429235f 100644 --- a/internal/query/indexes_test.go +++ b/internal/query/indexes_test.go @@ -14,7 +14,7 @@ func Test_StatIndexesQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_indexes/%d", version), func(t *testing.T) { tmpl := PgStatIndexesDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/progress_cluster_test.go b/internal/query/progress_cluster_test.go index 1a129de..68b18c9 100644 --- a/internal/query/progress_cluster_test.go +++ b/internal/query/progress_cluster_test.go @@ -14,7 +14,7 @@ func Test_StatProgressClusterQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_progress_cluster/%d", version), func(t *testing.T) { tmpl := PgStatProgressClusterDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/progress_create_index_test.go b/internal/query/progress_create_index_test.go index a186d5c..3c63c42 100644 --- a/internal/query/progress_create_index_test.go +++ b/internal/query/progress_create_index_test.go @@ -14,7 +14,7 @@ func Test_StatProgressCreateIndexQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_progress_create_index/%d", version), func(t *testing.T) { tmpl := PgStatProgressCreateIndexDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/progress_vacuum_test.go b/internal/query/progress_vacuum_test.go index bd675c2..4996edf 100644 --- a/internal/query/progress_vacuum_test.go +++ b/internal/query/progress_vacuum_test.go @@ -14,7 +14,7 @@ func Test_StatProgressVacuumQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_progress_vacuum/%d", version), func(t *testing.T) { tmpl := PgStatProgressVacuumDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/query.go b/internal/query/query.go index e63bddb..203df29 100644 --- a/internal/query/query.go +++ b/internal/query/query.go @@ -19,7 +19,7 @@ type Options struct { } // NewOptions creates query options used for queries customization depending on Postgres version and other important settings. -func NewOptions(version int, recovery string, querylen int, util string) Options { +func NewOptions(version int, recovery string, querylen int) Options { opts := Options{ ViewType: "user", // System tables and indexes aren't shown by default QueryAgeThresh: "00:00:00.0", // Don't filter queries by age @@ -29,20 +29,11 @@ func NewOptions(version int, recovery string, querylen int, util string) Options opts.WalFunction1, opts.WalFunction2 = selectWalFunctions(version, recovery) - // Define queries parameters specific for particular utilities. - switch util { - case "top": - // For 'pgcenter top' truncate pg_stat_statements.query length, because it make no sense - // to process full query when sizes of user's screen is limited. - opts.PgSSQueryLenFn = "left(p.query, 256)" - case "record": - // For 'pgcenter record' record full length of the pg_stat_statements.query, - // except when user doesn't specified exact length. - if opts.PgSSQueryLen > 0 { - opts.PgSSQueryLenFn = fmt.Sprintf("left(p.query, %d)", querylen) - } else { - opts.PgSSQueryLenFn = "p.query" - } + // Define length limit for pg_stat_statement.query. + if opts.PgSSQueryLen > 0 { + opts.PgSSQueryLenFn = fmt.Sprintf("left(p.query, %d)", querylen) + } else { + opts.PgSSQueryLenFn = "p.query" } return opts diff --git a/internal/query/query_test.go b/internal/query/query_test.go index 3ea06f8..caa397a 100644 --- a/internal/query/query_test.go +++ b/internal/query/query_test.go @@ -22,48 +22,52 @@ func TestFormat(t *testing.T) { assert.Error(t, err) } -func TestOptions_Configure(t *testing.T) { +func TestNewOptions(t *testing.T) { testcases := []struct { version int recovery string - program string + querylen int want Options }{ - {version: 130000, recovery: "f", program: "top", want: Options{ + {version: 130000, recovery: "f", querylen: 256, want: Options{ ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_current_wal_lsn", - QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLenFn: "left(p.query, 256)", + QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 256, PgSSQueryLenFn: "left(p.query, 256)", }}, - {version: 130000, recovery: "t", program: "top", want: Options{ + {version: 130000, recovery: "t", querylen: 256, want: Options{ ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_last_wal_receive_lsn", - QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLenFn: "left(p.query, 256)", + QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 256, PgSSQueryLenFn: "left(p.query, 256)", }}, - {version: 96000, recovery: "f", program: "top", want: Options{ + {version: 96000, recovery: "f", querylen: 256, want: Options{ ViewType: "user", WalFunction1: "pg_xlog_location_diff", WalFunction2: "pg_current_xlog_location", - QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLenFn: "left(p.query, 256)", + QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 256, PgSSQueryLenFn: "left(p.query, 256)", }}, - {version: 96000, recovery: "t", program: "top", want: Options{ + {version: 96000, recovery: "t", querylen: 256, want: Options{ ViewType: "user", WalFunction1: "pg_xlog_location_diff", WalFunction2: "pg_last_xlog_receive_location", - QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLenFn: "left(p.query, 256)", + QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 256, PgSSQueryLenFn: "left(p.query, 256)", }}, - {version: 130000, recovery: "f", program: "record", want: Options{ + {version: 130000, recovery: "f", querylen: 0, want: Options{ ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_current_wal_lsn", QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 0, PgSSQueryLenFn: "p.query", }}, + {version: 130000, recovery: "f", querylen: 123, want: Options{ + ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_current_wal_lsn", + QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 123, PgSSQueryLenFn: "left(p.query, 123)", + }}, } for _, tc := range testcases { - opts := NewOptions(tc.version, tc.recovery, 0, tc.program) + opts := NewOptions(tc.version, tc.recovery, tc.querylen) assert.Equal(t, tc.want, opts) } - opts := NewOptions(130000, "f", 123, "record") - assert.Equal( - t, Options{ - ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_current_wal_lsn", - QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 123, PgSSQueryLenFn: "left(p.query, 123)", - }, - opts, - ) + //opts := NewOptions(130000, "f", 123) + //assert.Equal( + // t, Options{ + // ViewType: "user", WalFunction1: "pg_wal_lsn_diff", WalFunction2: "pg_current_wal_lsn", + // QueryAgeThresh: "00:00:00.0", ShowNoIdle: true, PgSSQueryLen: 123, PgSSQueryLenFn: "left(p.query, 123)", + // }, + // opts, + //) } func Test_selectWalFunctions(t *testing.T) { diff --git a/internal/query/replication_test.go b/internal/query/replication_test.go index 4e3b7ce..e01cc7a 100644 --- a/internal/query/replication_test.go +++ b/internal/query/replication_test.go @@ -43,7 +43,7 @@ func Test_StatReplicationQueries(t *testing.T) { tmpl1, _ := SelectStatReplicationQuery(version, false) tmpl2, _ := SelectStatReplicationQuery(version, true) - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q1, err := Format(tmpl1, opts) assert.NoError(t, err) diff --git a/internal/query/sizes_test.go b/internal/query/sizes_test.go index 6df0bc4..614b909 100644 --- a/internal/query/sizes_test.go +++ b/internal/query/sizes_test.go @@ -14,7 +14,7 @@ func Test_StatSizesQueries(t *testing.T) { t.Run(fmt.Sprintf("sizes/%d", version), func(t *testing.T) { tmpl := PgTablesSizesDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/statements_test.go b/internal/query/statements_test.go index 0f53c59..39b6724 100644 --- a/internal/query/statements_test.go +++ b/internal/query/statements_test.go @@ -39,7 +39,7 @@ func Test_StatStatementsQueries(t *testing.T) { for _, version := range versions { t.Run(fmt.Sprintf("pg_stat_statements/%d", version), func(t *testing.T) { for _, query := range queries { - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(query, opts) assert.NoError(t, err) @@ -57,7 +57,7 @@ func Test_StatStatementsQueries(t *testing.T) { t.Run("pg_stat_statements_timing", func(t *testing.T) { for _, version := range versions { tmpl := SelectStatStatementsTimingQuery(version) - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) @@ -96,7 +96,7 @@ func Test_StatStatementsReportQueries(t *testing.T) { for _, version := range versions { tmpl := SelectQueryReportQuery(version) - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/query/tables_test.go b/internal/query/tables_test.go index c289143..5286387 100644 --- a/internal/query/tables_test.go +++ b/internal/query/tables_test.go @@ -14,7 +14,7 @@ func Test_StatTablesQueries(t *testing.T) { t.Run(fmt.Sprintf("pg_stat_tables/%d", version), func(t *testing.T) { tmpl := PgStatTablesDefault - opts := NewOptions(version, "f", 0, "top") + opts := NewOptions(version, "f", 256) q, err := Format(tmpl, opts) assert.NoError(t, err) diff --git a/internal/stat/stat_test.go b/internal/stat/stat_test.go index da5d933..6ab1d97 100644 --- a/internal/stat/stat_test.go +++ b/internal/stat/stat_test.go @@ -46,7 +46,7 @@ func TestCollector_Update(t *testing.T) { Refresh: 1 * time.Second, }, } - assert.NoError(t, views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, "top")) + assert.NoError(t, views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, 256)) c, err := NewCollector(conn) assert.NoError(t, err) diff --git a/internal/view/view.go b/internal/view/view.go index 06cebc2..a2e4b31 100644 --- a/internal/view/view.go +++ b/internal/view/view.go @@ -205,9 +205,13 @@ func New() Views { } // Configure performs adjusting of queries accordingly to Postgres version. -func (v Views) Configure(version int, recovery string, gucTrackCommitXactTimestamp string, app string) error { +// IN version int: numeric Postgres version +// IN recovery string: recovery state of Postgres (f/t) +// IN gucTrackCommitTS string: value of track_commit_timestamp GUC (on/off) +// IN querylen int: length limit for pg_stat_statement.query +func (v Views) Configure(version int, recovery string, gucTrackCommitTS string, querylen int) error { var track bool - if gucTrackCommitXactTimestamp == "on" { + if gucTrackCommitTS == "on" { track = true } for k, view := range v { @@ -227,7 +231,7 @@ func (v Views) Configure(version int, recovery string, gucTrackCommitXactTimesta } } - opts := query.NewOptions(version, recovery, 0, app) + opts := query.NewOptions(version, recovery, querylen) // Build query texts based on templates. for k, view := range v { diff --git a/internal/view/view_test.go b/internal/view/view_test.go index 71a0424..844d8ee 100644 --- a/internal/view/view_test.go +++ b/internal/view/view_test.go @@ -16,67 +16,67 @@ func TestViews_Configure(t *testing.T) { version int recovery string trackCommit string - app string + querylen int }{ // v13 matrix - {version: 130000, recovery: "f", trackCommit: "on", app: "top"}, - {version: 130000, recovery: "f", trackCommit: "on", app: "record"}, - {version: 130000, recovery: "f", trackCommit: "off", app: "top"}, - {version: 130000, recovery: "f", trackCommit: "off", app: "record"}, - {version: 130000, recovery: "t", trackCommit: "on", app: "top"}, - {version: 130000, recovery: "t", trackCommit: "on", app: "record"}, - {version: 130000, recovery: "t", trackCommit: "off", app: "top"}, - {version: 130000, recovery: "t", trackCommit: "off", app: "record"}, + {version: 130000, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 130000, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 130000, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 130000, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 130000, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 130000, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 130000, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 130000, recovery: "t", trackCommit: "off", querylen: 0}, // v12 matrix - {version: 120000, recovery: "f", trackCommit: "on", app: "top"}, - {version: 120000, recovery: "f", trackCommit: "on", app: "record"}, - {version: 120000, recovery: "f", trackCommit: "off", app: "top"}, - {version: 120000, recovery: "f", trackCommit: "off", app: "record"}, - {version: 120000, recovery: "t", trackCommit: "on", app: "top"}, - {version: 120000, recovery: "t", trackCommit: "on", app: "record"}, - {version: 120000, recovery: "t", trackCommit: "off", app: "top"}, - {version: 120000, recovery: "t", trackCommit: "off", app: "record"}, + {version: 120000, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 120000, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 120000, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 120000, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 120000, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 120000, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 120000, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 120000, recovery: "t", trackCommit: "off", querylen: 0}, // v11 matrix - {version: 110000, recovery: "f", trackCommit: "on", app: "top"}, - {version: 110000, recovery: "f", trackCommit: "on", app: "record"}, - {version: 110000, recovery: "f", trackCommit: "off", app: "top"}, - {version: 110000, recovery: "f", trackCommit: "off", app: "record"}, - {version: 110000, recovery: "t", trackCommit: "on", app: "top"}, - {version: 110000, recovery: "t", trackCommit: "on", app: "record"}, - {version: 110000, recovery: "t", trackCommit: "off", app: "top"}, - {version: 110000, recovery: "t", trackCommit: "off", app: "record"}, + {version: 110000, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 110000, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 110000, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 110000, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 110000, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 110000, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 110000, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 110000, recovery: "t", trackCommit: "off", querylen: 0}, // v9.6 matrix - {version: 90600, recovery: "f", trackCommit: "on", app: "top"}, - {version: 90600, recovery: "f", trackCommit: "on", app: "record"}, - {version: 90600, recovery: "f", trackCommit: "off", app: "top"}, - {version: 90600, recovery: "f", trackCommit: "off", app: "record"}, - {version: 90600, recovery: "t", trackCommit: "on", app: "top"}, - {version: 90600, recovery: "t", trackCommit: "on", app: "record"}, - {version: 90600, recovery: "t", trackCommit: "off", app: "top"}, - {version: 90600, recovery: "t", trackCommit: "off", app: "record"}, + {version: 90600, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 90600, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 90600, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 90600, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 90600, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 90600, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 90600, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 90600, recovery: "t", trackCommit: "off", querylen: 0}, // v9.5 matrix - {version: 90500, recovery: "f", trackCommit: "on", app: "top"}, - {version: 90500, recovery: "f", trackCommit: "on", app: "record"}, - {version: 90500, recovery: "f", trackCommit: "off", app: "top"}, - {version: 90500, recovery: "f", trackCommit: "off", app: "record"}, - {version: 90500, recovery: "t", trackCommit: "on", app: "top"}, - {version: 90500, recovery: "t", trackCommit: "on", app: "record"}, - {version: 90500, recovery: "t", trackCommit: "off", app: "top"}, - {version: 90500, recovery: "t", trackCommit: "off", app: "record"}, + {version: 90500, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 90500, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 90500, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 90500, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 90500, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 90500, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 90500, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 90500, recovery: "t", trackCommit: "off", querylen: 0}, // v9.4 matrix - {version: 90400, recovery: "f", trackCommit: "on", app: "top"}, - {version: 90400, recovery: "f", trackCommit: "on", app: "record"}, - {version: 90400, recovery: "f", trackCommit: "off", app: "top"}, - {version: 90400, recovery: "f", trackCommit: "off", app: "record"}, - {version: 90400, recovery: "t", trackCommit: "on", app: "top"}, - {version: 90400, recovery: "t", trackCommit: "on", app: "record"}, - {version: 90400, recovery: "t", trackCommit: "off", app: "top"}, - {version: 90400, recovery: "t", trackCommit: "off", app: "record"}, + {version: 90400, recovery: "f", trackCommit: "on", querylen: 256}, + {version: 90400, recovery: "f", trackCommit: "on", querylen: 0}, + {version: 90400, recovery: "f", trackCommit: "off", querylen: 256}, + {version: 90400, recovery: "f", trackCommit: "off", querylen: 0}, + {version: 90400, recovery: "t", trackCommit: "on", querylen: 256}, + {version: 90400, recovery: "t", trackCommit: "on", querylen: 0}, + {version: 90400, recovery: "t", trackCommit: "off", querylen: 256}, + {version: 90400, recovery: "t", trackCommit: "off", querylen: 0}, } for _, tc := range testcases { views := New() - err := views.Configure(tc.version, tc.recovery, tc.trackCommit, tc.app) + err := views.Configure(tc.version, tc.recovery, tc.trackCommit, tc.querylen) assert.NoError(t, err) switch tc.version { diff --git a/record/record.go b/record/record.go index c3a9662..41c069d 100644 --- a/record/record.go +++ b/record/record.go @@ -71,7 +71,7 @@ func (app *app) setup() error { // Create and configure stats views depending on running Postgres. views := view.New() - err = views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, "record") + err = views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, app.config.StringLimit) if err != nil { return err } diff --git a/record/recorder_test.go b/record/recorder_test.go index 38bc665..c9ffd04 100644 --- a/record/recorder_test.go +++ b/record/recorder_test.go @@ -33,7 +33,7 @@ func Test_tarRecorder(t *testing.T) { props, err := stat.GetPostgresProperties(db) assert.NoError(t, err) views := view.New() - assert.NoError(t, views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, "record")) + assert.NoError(t, views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, 0)) db.Close() // create postgres config diff --git a/top/top.go b/top/top.go index c3d9c3d..b7059fd 100644 --- a/top/top.go +++ b/top/top.go @@ -58,7 +58,7 @@ func (app *app) setup() error { } // Create and configure stats views depending on running Postgres. - err = app.config.views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, "top") + err = app.config.views.Configure(props.VersionNum, props.Recovery, props.GucTrackCommitTimestamp, 256) if err != nil { return err }