From e9ad4bcf4103a8cc5654f7c37c136177ead1ae51 Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Fri, 17 Jun 2022 23:34:58 +0900 Subject: [PATCH 1/4] Support Ubuntu MariaDB package version --- main.go | 2 +- main_test.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 5d7d815..866c990 100644 --- a/main.go +++ b/main.go @@ -344,7 +344,7 @@ func parseHeader(scanner *bufio.Scanner, meta *outputs.ServerInfo) error { scanner.Scan() // Parse server information - versionre := regexp.MustCompile(`^([^,]+),\s+Version:\s+([0-9\.]+)([A-Za-z0-9-]+)\s+\((.*)\)\. started`) + versionre := regexp.MustCompile(`^([^,]+),\s+Version:\s+([0-9\.]+)([A-Za-z0-9-.]+)\s+\((.*)\)\. started`) matches := versionre.FindStringSubmatch(version) if len(matches) != 5 { diff --git a/main_test.go b/main_test.go index b3f3994..d4d56f9 100644 --- a/main_test.go +++ b/main_test.go @@ -122,6 +122,21 @@ Time Id Command Argument`, UnixSocket: "/var/run/mysqld/mysqld.sock", }, }, + { + label: "ubuntu-20.04 mariadb header", + hasErr: false, + header: `/usr/sbin/mysqld, Version: 10.3.34-MariaDB-0ubuntu0.20.04.1-log (Ubuntu 20.04). started with: +Tcp port: 3306 Unix socket: /run/mysqld/mysqld.sock +Time Id Command Argument`, + out: outputs.ServerInfo{ + Binary: "/usr/sbin/mysqld", + VersionShort: "10.3.34", + Version: "10.3.34-MariaDB-0ubuntu0.20.04.1-log", + VersionDescription: "Ubuntu 20.04", + TCPPort: 3306, + UnixSocket: "/run/mysqld/mysqld.sock", + }, + }, { label: "bad header", hasErr: true, From 20d6c3e3e8a027f492df1f503ebf35410160290c Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Fri, 17 Jun 2022 23:38:13 +0900 Subject: [PATCH 2/4] Ignore prefix '# Time ' for datetime --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 866c990..be24690 100644 --- a/main.go +++ b/main.go @@ -496,7 +496,7 @@ func worker(wg *sync.WaitGroup, lines <-chan logentry, entries chan<- query) { if err != nil { splitted := strings.Split(line, " ") if len(splitted) > 2 { - datetime := strings.Join(splitted, " ") + datetime := strings.Join(splitted[2:], " ") qry.Time, err = time.Parse("060102 15:04:05", datetime) if err != nil { log.Errorf("worker: error parsing time '%s': %v", datetime, err) From 96e8fa376ffc8c5c2414429a739bef63539520e6 Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Sat, 18 Jun 2022 00:21:00 +0900 Subject: [PATCH 3/4] Support MariaDB comment format --- main.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index be24690..694d8dd 100644 --- a/main.go +++ b/main.go @@ -525,13 +525,22 @@ func worker(wg *sync.WaitGroup, lines <-chan logentry, entries chan<- query) { case "# QU": // "#Q" // # Query_time: 0.000030 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 Rows_affected: 0 - fmt.Sscanf(line, "# Query_time: %f Lock_time: %f Rows_sent: %d Rows_examined: %d Rows_affected: %d", - &qry.QueryTime, &qry.LockTime, &qry.RowsSent, &qry.RowsExamined, &qry.RowsAffected) + _, err := fmt.Sscanf(line, "# Query_time: %f Lock_time: %f Rows_sent: %d Rows_examined: %d Rows_affected: %d", &qry.QueryTime, &qry.LockTime, &qry.RowsSent, &qry.RowsExamined, &qry.RowsAffected) + if err != nil { + // mariadb + // # Query_time: 0.002718 Lock_time: 0.000139 Rows_sent: 25 Rows_examined: 35 + fmt.Sscanf(line, "# Query_time: %f Lock_time: %f Rows_sent: %d Rows_examined: %d", &qry.QueryTime, &qry.LockTime, &qry.RowsSent, &qry.RowsExamined) + } case "# BY": // # Bytes_sent: 561 fmt.Sscanf(line, "# Bytes_sent: %d", &qry.BytesSent) + case "# RO": + // mariadb + // # Rows_affected: 0 Bytes_sent: 252 + fmt.Sscanf(line, "# Rows_affected: %d Bytes_sent: %d", &qry.RowsAffected, &qry.BytesSent) + case "SET ": case "USE ": case "# AD": From 793da42bb3c654d1ceb4afdc8335fa9c3032aedd Mon Sep 17 00:00:00 2001 From: MATSUU Takuto Date: Sat, 18 Jun 2022 00:41:44 +0900 Subject: [PATCH 4/4] Time may not appear if a slow query is recorded in a short time --- main.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 694d8dd..07d119a 100644 --- a/main.go +++ b/main.go @@ -408,6 +408,7 @@ func fileReader(wg *sync.WaitGroup, r io.Reader, lines chan<- logentry, count in read := 0 curline := 0 foldnext := false + hasQuery := false for scanner.Scan() { line = scanner.Text() @@ -416,13 +417,15 @@ func fileReader(wg *sync.WaitGroup, r io.Reader, lines chan<- logentry, count in bar.Increment() } - // If we have `# Time`, send current entry and wipe clean and go on - if strings.HasPrefix(line, "# Time") { + // If we have `# ...`, send current entry and wipe clean and go on + if hasQuery && strings.HasPrefix(line, "# ") { lines <- curentry curline = -1 for i := range curentry.lines { curentry.lines[i] = "" } + hasQuery = false + foldnext = false } // Skip duplicated header @@ -450,9 +453,12 @@ func fileReader(wg *sync.WaitGroup, r io.Reader, lines chan<- logentry, count in firstchar := curentry.lines[curline][:1] lastchar := curentry.lines[curline][len(curentry.lines[curline])-1:] - if lastchar != ";" && firstchar != "#" { - log.Debugf("line (%d) will fold after %s\n", read+1, firstword) - foldnext = true + if firstchar != "#" { + hasQuery = true + if lastchar != ";" { + log.Debugf("line (%d) will fold after %s\n", read+1, firstword) + foldnext = true + } } } else { log.Warningf(`request to add element %d for line "%s" exceeds capacity`, curline, line)