Skip to content

Commit

Permalink
support MySQL 8.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
shunki-fujita committed Jun 17, 2024
1 parent 6b776e8 commit 6afcf24
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 1 deletion.
1 change: 1 addition & 0 deletions containers/mysqld_exporter/.dockerignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*
!mysql84.patch
3 changes: 3 additions & 0 deletions containers/mysqld_exporter/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ FROM ghcr.io/cybozu/golang:1.22-jammy AS build

ARG MYSQLD_EXPORTER_VERSION=v0.15.1

COPY mysql84.patch .

RUN git clone -b ${MYSQLD_EXPORTER_VERSION} --depth 1 https://github.com/prometheus/mysqld_exporter \
&& patch -d mysqld_exporter -Np1 < mysql84.patch \
&& make -C mysqld_exporter build

# Stage2: setup runtime container
Expand Down
2 changes: 1 addition & 1 deletion containers/mysqld_exporter/TAG
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.15.1.1
0.15.1.2
63 changes: 63 additions & 0 deletions containers/mysqld_exporter/mysql84.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
patch for MySQL 8.4
https://github.com/prometheus/mysqld_exporter/commit/f6a64d768c6d0e182ab70733c07f6d8781d4fa0c?diff=split&w=0

diff --git a/collector/slave_hosts.go b/collector/slave_hosts.go
index d473c3c..b95110e 100644
--- a/collector/slave_hosts.go
+++ b/collector/slave_hosts.go
@@ -31,7 +31,8 @@ const (
// timestamps. %s will be replaced by the database and table name.
// The second column allows gets the server timestamp at the exact same
// time the query is run.
- slaveHostsQuery = "SHOW SLAVE HOSTS"
+ slaveHostsQuery = "SHOW SLAVE HOSTS"
+ showReplicasQuery = "SHOW REPLICAS"
)

// Metric descriptors.
@@ -63,9 +64,15 @@ func (ScrapeSlaveHosts) Version() float64 {

// Scrape collects data from database connection and sends it over channel as prometheus metric.
func (ScrapeSlaveHosts) Scrape(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric, logger log.Logger) error {
- slaveHostsRows, err := db.QueryContext(ctx, slaveHostsQuery)
- if err != nil {
- return err
+ var (
+ slaveHostsRows *sql.Rows
+ err error
+ )
+ // Try the both syntax for MySQL 8.0 and MySQL 8.4
+ if slaveHostsRows, err = db.QueryContext(ctx, slaveHostsQuery); err != nil {
+ if slaveHostsRows, err = db.QueryContext(ctx, showReplicasQuery); err != nil {
+ return err
+ }
}
defer slaveHostsRows.Close()

diff --git a/collector/slave_status.go b/collector/slave_status.go
index 36dda33..b798465 100644
--- a/collector/slave_status.go
+++ b/collector/slave_status.go
@@ -30,7 +30,7 @@ const (
slaveStatus = "slave_status"
)

-var slaveStatusQueries = [2]string{"SHOW ALL SLAVES STATUS", "SHOW SLAVE STATUS"}
+var slaveStatusQueries = [3]string{"SHOW ALL SLAVES STATUS", "SHOW SLAVE STATUS", "SHOW REPLICA STATUS"}
var slaveStatusQuerySuffixes = [3]string{" NONBLOCKING", " NOLOCK", ""}

func columnIndex(slaveCols []string, colName string) int {
@@ -113,7 +113,13 @@ func (ScrapeSlaveStatus) Scrape(ctx context.Context, db *sql.DB, ch chan<- prome
}

masterUUID := columnValue(scanArgs, slaveCols, "Master_UUID")
+ if masterUUID == "" {
+ masterUUID = columnValue(scanArgs, slaveCols, "Source_UUID")
+ }
masterHost := columnValue(scanArgs, slaveCols, "Master_Host")
+ if masterHost == "" {
+ masterHost = columnValue(scanArgs, slaveCols, "Source_Host")
+ }
channelName := columnValue(scanArgs, slaveCols, "Channel_Name") // MySQL & Percona
connectionName := columnValue(scanArgs, slaveCols, "Connection_name") // MariaDB

0 comments on commit 6afcf24

Please sign in to comment.