Skip to content

Commit

Permalink
Feat version specific individual query (#29)
Browse files Browse the repository at this point in the history
* version specific indivual query
  • Loading branch information
sjyothi54 authored Jan 6, 2025
1 parent f9b867d commit 95821c4
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ package commonutils

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 @@ func FetchVersionSpecificBlockingQueries(conn *performancedbconnection.PGSQLConn
return "", fmt.Errorf("unsupported PostgreSQL version: %d", version)

Check failure on line 70 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)
}
}

func FetchVersionSpecificIndividualQuieries(conn *performancedbconnection.PGSQLConnection) (string, error) {
version, err := FetchVersion(conn)
if err != nil {
return "", err
}
switch {
case version == 12:
return queries.IndividualQuerySearchV12, nil
case version >= 13:
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 @@ import (
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;`
)

0 comments on commit 95821c4

Please sign in to comment.