Skip to content

Commit

Permalink
Remove 'util' argument in query.NewOptions; fix unused StringLimit op…
Browse files Browse the repository at this point in the history
…tion in record.
  • Loading branch information
lesovsky committed Jan 31, 2021
1 parent e1e18eb commit c5f7a8b
Show file tree
Hide file tree
Showing 19 changed files with 104 additions and 105 deletions.
2 changes: 1 addition & 1 deletion internal/query/activity_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/databases_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/functions_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/indexes_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/progress_cluster_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/progress_create_index_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/progress_vacuum_test.go
Expand Up @@ -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)

Expand Down
21 changes: 6 additions & 15 deletions internal/query/query.go
Expand Up @@ -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
Expand All @@ -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
Expand Down
44 changes: 24 additions & 20 deletions internal/query/query_test.go
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion internal/query/replication_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/sizes_test.go
Expand Up @@ -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)

Expand Down
6 changes: 3 additions & 3 deletions internal/query/statements_test.go
Expand Up @@ -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)

Expand All @@ -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)

Expand Down Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/query/tables_test.go
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion internal/stat/stat_test.go
Expand Up @@ -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)
Expand Down
10 changes: 7 additions & 3 deletions internal/view/view.go
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
100 changes: 50 additions & 50 deletions internal/view/view_test.go
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion record/record.go
Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion record/recorder_test.go
Expand Up @@ -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
Expand Down

0 comments on commit c5f7a8b

Please sign in to comment.