From f2ef922e55d9f10a6963ba8e819a366e79d1c899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Tue, 26 Jul 2022 13:34:11 +0200 Subject: [PATCH] mailserver: add DB query metrics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Useful for debugging spikes in I/O caused by SQL queries. Signed-off-by: Jakub SokoĊ‚owski --- mailserver/mailserver_db_leveldb.go | 2 ++ mailserver/mailserver_db_postgres.go | 9 +++++++++ mailserver/metrics.go | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/mailserver/mailserver_db_leveldb.go b/mailserver/mailserver_db_leveldb.go index 627f434de..4c481d87d 100644 --- a/mailserver/mailserver_db_leveldb.go +++ b/mailserver/mailserver_db_leveldb.go @@ -128,6 +128,8 @@ func (db *LevelDB) BuildIterator(query CursorQuery) (Iterator, error) { defer recoverLevelDBPanics("BuildIterator") i := db.ldb.NewIterator(&util.Range{Start: query.start, Limit: query.end}, nil) + + envelopeQueriesCounter.WithLabelValues("unknown", "unknown").Inc() // seek to the end as we want to return envelopes in a descending order if len(query.cursor) == CursorLength { i.Seek(query.cursor) diff --git a/mailserver/mailserver_db_postgres.go b/mailserver/mailserver_db_postgres.go index 54182eee2..d17c28f97 100644 --- a/mailserver/mailserver_db_postgres.go +++ b/mailserver/mailserver_db_postgres.go @@ -130,20 +130,26 @@ func (i *PostgresDB) BuildIterator(query CursorQuery) (Iterator, error) { stmtString := "SELECT id, data FROM envelopes" + var historyRange string if len(query.cursor) > 0 { args = append(args, query.start, query.cursor) // If we have a cursor, we don't want to include that envelope in the result set stmtString += " " + "WHERE id >= $1 AND id < $2" + historyRange = "partial" //nolint: goconst } else { args = append(args, query.start, query.end) stmtString += " " + "WHERE id >= $1 AND id <= $2" + historyRange = "full" //nolint: goconst } + var filterRange string if len(query.topics) > 0 { args = append(args, pq.Array(query.topics)) stmtString += " " + "AND topic = any($3)" + filterRange = "partial" //nolint: goconst } else { stmtString += " " + fmt.Sprintf("AND bloom & b'%s'::bit(512) = bloom", toBitString(query.bloom)) + filterRange = "full" //nolint: goconst } // Positional argument depends on the fact whether the query uses topics or bloom filter. @@ -156,10 +162,13 @@ func (i *PostgresDB) BuildIterator(query CursorQuery) (Iterator, error) { if err != nil { return nil, err } + + envelopeQueriesCounter.WithLabelValues(filterRange, historyRange).Inc() rows, err := stmt.Query(args...) if err != nil { return nil, err } + return &postgresIterator{rows}, nil } diff --git a/mailserver/metrics.go b/mailserver/metrics.go index 8cfa342e4..a7e713114 100644 --- a/mailserver/metrics.go +++ b/mailserver/metrics.go @@ -60,6 +60,10 @@ var ( Help: "Size of envelopes saved.", Buckets: prom.ExponentialBuckets(1024, 2, 11), }, []string{"db"}) + envelopeQueriesCounter = prom.NewCounterVec(prom.CounterOpts{ + Name: "mailserver_envelope_queries_total", + Help: "Number of queries for envelopes in the DB.", + }, []string{"filter", "history"}) ) func init() { @@ -76,4 +80,5 @@ func init() { prom.MustRegister(archivedErrorsCounter) prom.MustRegister(archivedEnvelopesGauge) prom.MustRegister(archivedEnvelopeSizeMeter) + prom.MustRegister(envelopeQueriesCounter) }