From 7c580b40518ddc4e9e9807cb35efcccb402680fe Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 27 Aug 2024 16:28:52 +0600 Subject: [PATCH] PMM-13288 Honour max-query-length parameter for pg_stat_statements. (#3119) Co-authored-by: Alex Demidoff --- .../agents/postgres/pgstatstatements/pgstatstatements.go | 9 +++++---- agent/agents/postgres/pgstatstatements/utils.go | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements.go b/agent/agents/postgres/pgstatstatements/pgstatstatements.go index facecab62e..35b6df8845 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements.go @@ -287,7 +287,7 @@ func (m *PGStatStatementsQAN) getNewBuckets(ctx context.Context, periodStart tim return nil, err } - buckets := makeBuckets(current, prev, m.disableCommentsParsing, m.l) + buckets := m.makeBuckets(current, prev) startS := uint32(periodStart.Unix()) m.l.Debugf("Made %d buckets out of %d stat statements in %s+%d interval.", len(buckets), len(current), periodStart.Format("15:04:05"), periodLengthSecs) @@ -312,8 +312,9 @@ func (m *PGStatStatementsQAN) getNewBuckets(ctx context.Context, periodStart tim // makeBuckets uses current state of pg_stat_statements table and accumulated previous state // to make metrics buckets. It's a pure function for easier testing. -func makeBuckets(current, prev statementsMap, disableCommentsParsing bool, l *logrus.Entry) []*agentpb.MetricsBucket { +func (m *PGStatStatementsQAN) makeBuckets(current, prev statementsMap) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(current)) + l := m.l for queryID, currentPSS := range current { prevPSS := prev[queryID] @@ -339,10 +340,10 @@ func makeBuckets(current, prev statementsMap, disableCommentsParsing bool, l *lo } if len(currentPSS.Tables) == 0 { - currentPSS.Tables = extractTables(currentPSS.Query, l) + currentPSS.Tables = extractTables(currentPSS.Query, m.maxQueryLength, l) } - if !disableCommentsParsing { + if !m.disableCommentsParsing { comments, err := queryparser.PostgreSQLComments(currentPSS.Query) if err != nil { l.Errorf("failed to parse comments for query: %s", currentPSS.Query) diff --git a/agent/agents/postgres/pgstatstatements/utils.go b/agent/agents/postgres/pgstatstatements/utils.go index 7c175d9547..0f739df4bf 100644 --- a/agent/agents/postgres/pgstatstatements/utils.go +++ b/agent/agents/postgres/pgstatstatements/utils.go @@ -72,9 +72,9 @@ func queryUsernames(q *reform.Querier) map[int64]string { return res } -func extractTables(query string, l *logrus.Entry) []string { +func extractTables(query string, maxQueryLength int32, l *logrus.Entry) []string { start := time.Now() - t, _ := truncate.Query(query, truncate.GetDefaultMaxQueryLength()) + t, _ := truncate.Query(query, maxQueryLength) tables, err := parser.ExtractTables(query) if err != nil { // log full query and error stack on debug level or more