From c6493628447c34a9e36a91258afa29214576ad3d Mon Sep 17 00:00:00 2001 From: jsurampudi Date: Mon, 6 Jan 2025 16:36:31 +0530 Subject: [PATCH 1/3] version specific indivual query --- .../common-utils/query-fetch-helpers.go | 20 ++++++++++++++++-- .../individual_query_metrics.go | 8 +++---- .../performance-metrics/slow_query_metrics.go | 4 ++-- .../queries/queries.go | 21 ++++++++++++++++++- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/query-performance-monitoring/common-utils/query-fetch-helpers.go b/src/query-performance-monitoring/common-utils/query-fetch-helpers.go index a159042c..0677b9cf 100644 --- a/src/query-performance-monitoring/common-utils/query-fetch-helpers.go +++ b/src/query-performance-monitoring/common-utils/query-fetch-helpers.go @@ -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) { @@ -69,3 +70,18 @@ func FetchVersionSpecificBlockingQueries(conn *performancedbconnection.PGSQLConn 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: + return queries.SlowQueriesForV12, nil + case version >= 13: + return queries.SlowQueriesForV13AndAbove, nil + default: + return "", fmt.Errorf("unsupported PostgreSQL version %d", version) + } +} diff --git a/src/query-performance-monitoring/performance-metrics/individual_query_metrics.go b/src/query-performance-monitoring/performance-metrics/individual_query_metrics.go index a09e7763..cb00c3ef 100644 --- a/src/query-performance-monitoring/performance-metrics/individual_query_metrics.go +++ b/src/query-performance-monitoring/performance-metrics/individual_query_metrics.go @@ -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" ) @@ -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 } @@ -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) diff --git a/src/query-performance-monitoring/performance-metrics/slow_query_metrics.go b/src/query-performance-monitoring/performance-metrics/slow_query_metrics.go index 82b9b2d4..f2d5467d 100644 --- a/src/query-performance-monitoring/performance-metrics/slow_query_metrics.go +++ b/src/query-performance-monitoring/performance-metrics/slow_query_metrics.go @@ -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) + 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 diff --git a/src/query-performance-monitoring/queries/queries.go b/src/query-performance-monitoring/queries/queries.go index 69676d6a..382cc88b 100644 --- a/src/query-performance-monitoring/queries/queries.go +++ b/src/query-performance-monitoring/queries/queries.go @@ -180,7 +180,7 @@ const ( AND blocking_activity.query NOT LIKE 'EXPLAIN (FORMAT JSON) %%' LIMIT %d;` - IndividualQuerySearch = `SELECT 'newrelic' as newrelic, + IndividualQuerySearchV12 = `SELECT 'newrelic' as newrelic, LEFT(query,4095) as query, queryid, datname, @@ -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;` + + IndividualQuerySearchV13AndAbove = `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;` ) From 6f99e5898686d2cb6a4027358b6415c1651f5b01 Mon Sep 17 00:00:00 2001 From: jsurampudi Date: Mon, 6 Jan 2025 16:39:48 +0530 Subject: [PATCH 2/3] fix --- .../common-utils/query-fetch-helpers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/query-performance-monitoring/common-utils/query-fetch-helpers.go b/src/query-performance-monitoring/common-utils/query-fetch-helpers.go index 0677b9cf..5b45509e 100644 --- a/src/query-performance-monitoring/common-utils/query-fetch-helpers.go +++ b/src/query-performance-monitoring/common-utils/query-fetch-helpers.go @@ -78,9 +78,9 @@ func FetchVersionSpecificIndividualQuieries(conn *performancedbconnection.PGSQLC } switch { case version == 12: - return queries.SlowQueriesForV12, nil + return queries.IndividualQuerySearchV12, nil case version >= 13: - return queries.SlowQueriesForV13AndAbove, nil + return queries.IndividualQuerySearchV13AndAbove, nil default: return "", fmt.Errorf("unsupported PostgreSQL version %d", version) } From dfb9a71b2845794605b960b4ee88a1034af2a1dd Mon Sep 17 00:00:00 2001 From: jsurampudi Date: Mon, 6 Jan 2025 16:40:54 +0530 Subject: [PATCH 3/3] fix --- src/query-performance-monitoring/queries/queries.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/query-performance-monitoring/queries/queries.go b/src/query-performance-monitoring/queries/queries.go index 382cc88b..5964985c 100644 --- a/src/query-performance-monitoring/queries/queries.go +++ b/src/query-performance-monitoring/queries/queries.go @@ -180,7 +180,7 @@ const ( AND blocking_activity.query NOT LIKE 'EXPLAIN (FORMAT JSON) %%' LIMIT %d;` - IndividualQuerySearchV12 = `SELECT 'newrelic' as newrelic, + IndividualQuerySearchV13AndAbove = `SELECT 'newrelic' as newrelic, LEFT(query,4095) as query, queryid, datname, @@ -199,7 +199,7 @@ const ( ORDER BY avg_exec_time_ms DESC LIMIT %d;` - IndividualQuerySearchV13AndAbove = `SELECT 'newrelic' as newrelic, + IndividualQuerySearchV12 = `SELECT 'newrelic' as newrelic, LEFT(query,4095) as query, queryid, datname,