github.com/netdata/go.d.plugin@v0.58.1/modules/mysql/collect_version.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package mysql
     4  
     5  import (
     6  	"fmt"
     7  	"regexp"
     8  	"strings"
     9  
    10  	"github.com/blang/semver/v4"
    11  )
    12  
    13  const queryShowVersion = `
    14  SHOW GLOBAL VARIABLES 
    15  WHERE 
    16    Variable_name LIKE 'version'
    17    OR Variable_name LIKE 'version_comment';`
    18  
    19  var reVersionCore = regexp.MustCompile(`^\d+\.\d+\.\d+`)
    20  
    21  func (m *MySQL) collectVersion() error {
    22  	// https://mariadb.com/kb/en/version/
    23  	q := queryShowVersion
    24  	m.Debugf("executing query: '%s'", queryShowVersion)
    25  
    26  	var name, version, versionComment string
    27  	_, err := m.collectQuery(q, func(column, value string, _ bool) {
    28  		switch column {
    29  		case "Variable_name":
    30  			name = value
    31  		case "Value":
    32  			switch name {
    33  			case "version":
    34  				version = value
    35  			case "version_comment":
    36  				versionComment = value
    37  			}
    38  		}
    39  	})
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	m.Infof("application version: '%s', version_comment: '%s'", version, versionComment)
    45  
    46  	// version string is not always valid semver (ex.: 8.0.22-0ubuntu0.20.04.2)
    47  	s := reVersionCore.FindString(version)
    48  	if s == "" {
    49  		return fmt.Errorf("couldn't parse version string '%s'", version)
    50  	}
    51  
    52  	ver, err := semver.New(s)
    53  	if err != nil {
    54  		return fmt.Errorf("couldn't parse version string '%s': %v", s, err)
    55  	}
    56  
    57  	m.version = ver
    58  	m.isMariaDB = strings.Contains(version, "MariaDB") || strings.Contains(versionComment, "mariadb")
    59  	m.isPercona = strings.Contains(versionComment, "Percona")
    60  
    61  	return nil
    62  }