-
Notifications
You must be signed in to change notification settings - Fork 227
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge changes from pre-release branch.
- Loading branch information
Showing
13 changed files
with
291 additions
and
186 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import {flags} from '@heroku-cli/command' | ||
import {Args} from '@oclif/core' | ||
import heredoc from 'tsheredoc' | ||
import {booleanConverter, PGSettingsCommand, type Setting, type SettingKey} from '../../../lib/pg/setter' | ||
|
||
// ref: https://www.postgresql.org/docs/current/auto-explain.html | ||
export default class AutoExplain extends PGSettingsCommand { | ||
static topic = 'pg'; | ||
static description = heredoc(` | ||
Automatically log execution plans of queries without running EXPLAIN by hand. | ||
The auto_explain module is loaded at session-time so existing connections will not be logged. | ||
Restart your Heroku app and/or restart existing connections for logging to start taking place.' | ||
`) | ||
|
||
static flags = { | ||
app: flags.app({required: true}), | ||
remote: flags.remote(), | ||
} | ||
|
||
static args = { | ||
database: Args.string(), | ||
value: Args.string(), | ||
} | ||
|
||
static strict = false | ||
|
||
protected settingKey: SettingKey = 'auto_explain' | ||
|
||
protected convertValue(val: boolean): boolean { | ||
return booleanConverter(val) | ||
} | ||
|
||
protected explain(setting: Setting): string { | ||
if (setting.value) { | ||
return 'Execution plans of queries will be logged for future connections.' | ||
} | ||
|
||
return 'Execution plans of queries will not be logged for future connections.' | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
packages/cli/src/commands/pg/settings/auto-explain/log-buffers.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import {Args} from '@oclif/core' | ||
import heredoc from 'tsheredoc' | ||
import {PGSettingsCommand, type Setting, type SettingKey, booleanConverter} from '../../../../lib/pg/setter' | ||
|
||
export default class LogBuffersWaits extends PGSettingsCommand { | ||
static topic = 'pg' | ||
static description = heredoc(` | ||
Includes buffer usage statistics when execution plans are logged. | ||
This is equivalent to calling EXPLAIN BUFFERS and can only be used in conjunction with pg:settings:auto-explain:log-analyze turned on. | ||
`) | ||
|
||
static args = { | ||
database: Args.string(), | ||
value: Args.string(), | ||
} | ||
|
||
protected settingKey: SettingKey = 'auto_explain.log_buffers' | ||
|
||
protected convertValue(val: boolean): boolean { | ||
return booleanConverter(val) | ||
} | ||
|
||
protected explain(setting: Setting) { | ||
if (setting.value) { | ||
return 'Buffer statistics have been enabled for auto_explain.' | ||
} | ||
|
||
return 'Buffer statistics have been disabled for auto_explain.' | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
packages/cli/src/commands/pg/settings/auto-explain/log-min-duration.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import {Args} from '@oclif/core' | ||
import heredoc from 'tsheredoc' | ||
import {PGSettingsCommand, type Setting, type SettingKey} from '../../../../lib/pg/setter' | ||
|
||
export default class LogMinDuration extends PGSettingsCommand { | ||
static topic = 'pg' | ||
static description = heredoc(` | ||
Sets the minimum execution time in milliseconds for a statement's plan to be logged. | ||
Setting this value to 0 will log all queries. Setting this value to -1 will disable logging entirely. | ||
`) | ||
|
||
static args = { | ||
database: Args.string(), | ||
value: Args.integer(), | ||
} | ||
|
||
protected settingKey:SettingKey = 'auto_explain.log_min_duration' | ||
|
||
protected convertValue(val: number): number { | ||
return val | ||
} | ||
|
||
protected explain(setting: Setting) { | ||
if (setting.value === -1) { | ||
return 'Execution plan logging has been disabled.' | ||
} | ||
|
||
if (setting.value === 0) { | ||
return 'All queries will have their execution plans logged.' | ||
} | ||
|
||
return `All execution plans will be logged for queries taking up to ${setting.value} milliseconds or more.` | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
packages/cli/test/unit/commands/pg/settings/auto-explain.unit.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import {expect} from '@oclif/test' | ||
import * as nock from 'nock' | ||
import {stdout} from 'stdout-stderr' | ||
import heredoc from 'tsheredoc' | ||
import runCommand from '../../../../helpers/runCommand' | ||
import Cmd from '../../../../../src/commands/pg/settings/auto-explain' | ||
|
||
describe('pg:settings:auto-explain', () => { | ||
let api: nock.Scope | ||
let pg: nock.Scope | ||
|
||
beforeEach(() => { | ||
const addon = { | ||
id: 1, | ||
name: 'postgres-1', | ||
app: {name: 'myapp'}, | ||
config_vars: ['READONLY_URL', 'DATABASE_URL', 'HEROKU_POSTGRESQL_RED_URL'], | ||
plan: {name: 'heroku-postgresql:standard-0'}, | ||
} | ||
|
||
api = nock('https://api.heroku.com') | ||
api.post('/actions/addons/resolve', { | ||
app: 'myapp', | ||
addon: 'test-database', | ||
}).reply(200, [addon]) | ||
|
||
pg = nock('https://api.data.heroku.com') | ||
}) | ||
|
||
afterEach(() => { | ||
api.done() | ||
pg.done() | ||
}) | ||
|
||
it('shows settings for auto_explain with value', async () => { | ||
pg.get('/postgres/v0/databases/1/config').reply(200, {auto_explain: {value: 'test_value'}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain is set to test_value for postgres-1. | ||
Execution plans of queries will be logged for future connections. | ||
`)) | ||
}) | ||
|
||
it('shows settings for auto_explain with no value', async () => { | ||
pg.get('/postgres/v0/databases/1/config').reply(200, {auto_explain: {value: ''}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain is set to for postgres-1. | ||
Execution plans of queries will not be logged for future connections. | ||
`)) | ||
}) | ||
}) |
43 changes: 43 additions & 0 deletions
43
packages/cli/test/unit/commands/pg/settings/auto-explain/log-buffers.unit.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import {expect} from '@oclif/test' | ||
import * as nock from 'nock' | ||
import {stdout} from 'stdout-stderr' | ||
import heredoc from 'tsheredoc' | ||
import runCommand from '../../../../../helpers/runCommand' | ||
import Cmd from '../../../../../../src/commands/pg/settings/auto-explain/log-buffers' | ||
import * as fixtures from '../../../../../fixtures/addons/fixtures' | ||
|
||
describe('pg:settings:auto-explain:log-buffers', () => { | ||
const addon = fixtures.addons['dwh-db'] | ||
|
||
beforeEach(() => { | ||
nock('https://api.heroku.com') | ||
.post('/actions/addons/resolve', { | ||
app: 'myapp', | ||
addon: 'test-database', | ||
}).reply(200, [addon]) | ||
}) | ||
|
||
afterEach(() => { | ||
nock.cleanAll() | ||
}) | ||
|
||
it('shows settings for auto_explain with value', async () => { | ||
nock('https://api.data.heroku.com') | ||
.get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {'auto_explain.log_buffers': {value: 'test_value'}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain.log-buffers is set to test_value for ${addon.name}. | ||
Buffer statistics have been enabled for auto_explain. | ||
`)) | ||
}) | ||
|
||
it('shows settings for auto_explain with no value', async () => { | ||
nock('https://api.data.heroku.com') | ||
.get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {'auto_explain.log_buffers': {value: ''}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain.log-buffers is set to for ${addon.name}. | ||
Buffer statistics have been disabled for auto_explain. | ||
`)) | ||
}) | ||
}) |
53 changes: 53 additions & 0 deletions
53
packages/cli/test/unit/commands/pg/settings/auto-explain/log-min-duration.unit.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import {expect} from '@oclif/test' | ||
import * as nock from 'nock' | ||
import {stdout} from 'stdout-stderr' | ||
import heredoc from 'tsheredoc' | ||
import runCommand from '../../../../../helpers/runCommand' | ||
import Cmd from '../../../../../../src/commands/pg/settings/auto-explain/log-min-duration' | ||
import * as fixtures from '../../../../../fixtures/addons/fixtures' | ||
|
||
describe('pg:settings:auto-explain:log-min-duration', () => { | ||
const addon = fixtures.addons['dwh-db'] | ||
|
||
beforeEach(() => { | ||
nock('https://api.heroku.com') | ||
.post('/actions/addons/resolve', { | ||
app: 'myapp', | ||
addon: 'test-database', | ||
}).reply(200, [addon]) | ||
}) | ||
|
||
afterEach(() => { | ||
nock.cleanAll() | ||
}) | ||
|
||
it('shows settings for auto_explain with value', async () => { | ||
nock('https://api.data.heroku.com') | ||
.get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {'auto_explain.log_min_duration': {value: 'test_value'}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain.log-min-duration is set to test_value for ${addon.name}. | ||
All execution plans will be logged for queries taking up to test_value milliseconds or more. | ||
`)) | ||
}) | ||
|
||
it('shows settings for auto_explain with no value', async () => { | ||
nock('https://api.data.heroku.com') | ||
.get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {'auto_explain.log_min_duration': {value: -1}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain.log-min-duration is set to -1 for ${addon.name}. | ||
Execution plan logging has been disabled. | ||
`)) | ||
}) | ||
|
||
it('shows settings for auto_explain with no value', async () => { | ||
nock('https://api.data.heroku.com') | ||
.get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {'auto_explain.log_min_duration': {value: 0}}) | ||
await runCommand(Cmd, ['--app', 'myapp', 'test-database']) | ||
expect(stdout.output).to.equal(heredoc(` | ||
auto-explain.log-min-duration is set to 0 for ${addon.name}. | ||
All queries will have their execution plans logged. | ||
`)) | ||
}) | ||
}) |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.