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

Feat version specific individual query #29

Merged
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import (
"fmt"
"regexp"
"strconv"

"github.com/newrelic/infra-integrations-sdk/v3/log"
performancedbconnection "github.com/newrelic/nri-postgresql/src/connection"
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/queries"
"regexp"
"strconv"
)

func FetchVersion(conn *performancedbconnection.PGSQLConnection) (int, error) {
Expand Down Expand Up @@ -69,3 +70,18 @@
return "", fmt.Errorf("unsupported PostgreSQL version: %d", version)
}
}

func FetchVersionSpecificIndividualQuieries(conn *performancedbconnection.PGSQLConnection) (string, error) {
version, err := FetchVersion(conn)
if err != nil {
return "", err
}
switch {
case version == 12:

Check failure on line 80 in src/query-performance-monitoring/common-utils/query-fetch-helpers.go

View workflow job for this annotation

GitHub Actions / push-pr / static-analysis / Run all static analysis checks

Magic number: 12, in <case> detected (mnd)
return queries.IndividualQuerySearchV12, nil
case version >= 13:

Check failure on line 82 in src/query-performance-monitoring/common-utils/query-fetch-helpers.go

View workflow job for this annotation

GitHub Actions / push-pr / static-analysis / Run all static analysis checks

Magic number: 13, in <case> detected (mnd)
return queries.IndividualQuerySearchV13AndAbove, nil
default:
return "", fmt.Errorf("unsupported PostgreSQL version %d", version)

Check failure on line 85 in src/query-performance-monitoring/common-utils/query-fetch-helpers.go

View workflow job for this annotation

GitHub Actions / push-pr / static-analysis / Run all static analysis checks

do not define dynamic errors, use wrapped static errors instead: "fmt.Errorf(\"unsupported PostgreSQL version %d\", version)" (err113)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
performancedbconnection "github.com/newrelic/nri-postgresql/src/connection"
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/datamodels"
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/queries"
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/validations"
)

Expand All @@ -33,8 +32,9 @@ func PopulateIndividualQueryMetrics(conn *performancedbconnection.PGSQLConnectio
return individualQueriesForExecPlan
}

func ConstructIndividualQuery(slowRunningQueries datamodels.SlowRunningQueryMetrics, args args.ArgumentList, databaseNames string) string {
query := fmt.Sprintf(queries.IndividualQuerySearch, *slowRunningQueries.QueryID, databaseNames, args.QueryResponseTimeThreshold, min(args.QueryCountThreshold, commonutils.MAX_INDIVIDUAL_QUERY_THRESHOLD))
func ConstructIndividualQuery(slowRunningQueries datamodels.SlowRunningQueryMetrics, conn *performancedbconnection.PGSQLConnection, args args.ArgumentList, databaseNames string) string {
versionSpecificIndividualQuery, _ := commonutils.FetchVersionSpecificIndividualQuieries(conn)
query := fmt.Sprintf(versionSpecificIndividualQuery, *slowRunningQueries.QueryID, databaseNames, args.QueryResponseTimeThreshold, min(args.QueryCountThreshold, commonutils.MAX_INDIVIDUAL_QUERY_THRESHOLD))
return query
}

Expand All @@ -54,7 +54,7 @@ func GetIndividualQueryMetrics(conn *performancedbconnection.PGSQLConnection, sl

func getIndividualQueriesByGroupedQuery(conn *performancedbconnection.PGSQLConnection, slowRunningQueries datamodels.SlowRunningQueryMetrics, args args.ArgumentList, databaseNames string, anonymizedQueriesByDB map[string]map[int64]string, individualQueryMetricsForExecPlanList *[]datamodels.IndividualQueryMetrics, individualQueryMetricsListInterface *[]interface{}) {

query := ConstructIndividualQuery(slowRunningQueries, args, databaseNames)
query := ConstructIndividualQuery(slowRunningQueries, conn, args, databaseNames)
rows, err := conn.Queryx(query)
if err != nil {
log.Debug("Error executing query in individual query: %v", err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
func GetSlowRunningMetrics(conn *performancedbconnection.PGSQLConnection, args args.ArgumentList, databaseNames string) ([]datamodels.SlowRunningQueryMetrics, []interface{}, error) {
var slowQueryMetricsList []datamodels.SlowRunningQueryMetrics
var slowQueryMetricsListInterface []interface{}
versionSpecificQuery, err := commonutils.FetchVersionSpecificSlowQueries(conn)
var query = fmt.Sprintf(versionSpecificQuery, databaseNames, min(args.QueryCountThreshold, commonutils.MAX_QUERY_THRESHOLD))
versionSpecificSlowQuery, err := commonutils.FetchVersionSpecificSlowQueries(conn)

Check failure on line 18 in src/query-performance-monitoring/performance-metrics/slow_query_metrics.go

View workflow job for this annotation

GitHub Actions / push-pr / static-analysis / Run all static analysis checks

ineffectual assignment to err (ineffassign)
var query = fmt.Sprintf(versionSpecificSlowQuery, databaseNames, min(args.QueryCountThreshold, commonutils.MAX_QUERY_THRESHOLD))
rows, err := conn.Queryx(query)
if err != nil {
return nil, nil, err
Expand Down
21 changes: 20 additions & 1 deletion src/query-performance-monitoring/queries/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ const (
AND blocking_activity.query NOT LIKE 'EXPLAIN (FORMAT JSON) %%'
LIMIT %d;`

IndividualQuerySearch = `SELECT 'newrelic' as newrelic,
IndividualQuerySearchV13AndAbove = `SELECT 'newrelic' as newrelic,
LEFT(query,4095) as query,
queryid,
datname,
Expand All @@ -198,4 +198,23 @@ const (
query, queryid, datname, planid, cpu_user_time, cpu_sys_time, calls, total_exec_time
ORDER BY
avg_exec_time_ms DESC LIMIT %d;`

IndividualQuerySearchV12 = `SELECT 'newrelic' as newrelic,
LEFT(query,4095) as query,
queryid,
datname,
planid,
ROUND(((cpu_user_time + cpu_sys_time) / NULLIF(calls, 0))::numeric, 3) AS avg_cpu_time_ms,
total_time / NULLIF(calls, 0) AS avg_exec_time_ms
FROM
pg_stat_monitor
WHERE
queryid = %d
AND datname IN (%s)
AND (total_time / NULLIF(calls, 0)) > %d
AND bucket_start_time >= NOW() - INTERVAL '60 seconds'
GROUP BY
query, queryid, datname, planid, cpu_user_time, cpu_sys_time, calls, total_time
ORDER BY
avg_exec_time_ms DESC LIMIT %d;`
)
Loading