github.com/netdata/go.d.plugin@v0.58.1/modules/redis/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package redis 4 5 import ( 6 "bufio" 7 "context" 8 "errors" 9 "fmt" 10 "github.com/blang/semver/v4" 11 "regexp" 12 "strings" 13 ) 14 15 const precision = 1000 // float values multiplier and dimensions divisor 16 17 func (r *Redis) collect() (map[string]int64, error) { 18 info, err := r.rdb.Info(context.Background(), "all").Result() 19 if err != nil { 20 return nil, err 21 } 22 23 if r.server == "" { 24 s, v, err := extractServerVersion(info) 25 if err != nil { 26 return nil, fmt.Errorf("can not extract server app and version: %v", err) 27 } 28 r.server, r.version = s, v 29 r.Debugf(`server="%s",version="%s"`, s, v) 30 } 31 32 if r.server != "redis" { 33 return nil, fmt.Errorf("unsupported server app, want=redis, got=%s", r.server) 34 } 35 36 mx := make(map[string]int64) 37 r.collectInfo(mx, info) 38 r.collectPingLatency(mx) 39 40 return mx, nil 41 } 42 43 // redis_version:6.0.9 44 var reVersion = regexp.MustCompile(`([a-z]+)_version:(\d+\.\d+\.\d+)`) 45 46 func extractServerVersion(info string) (string, *semver.Version, error) { 47 var versionLine string 48 for sc := bufio.NewScanner(strings.NewReader(info)); sc.Scan(); { 49 line := sc.Text() 50 if strings.Contains(line, "_version") { 51 versionLine = strings.TrimSpace(line) 52 break 53 } 54 } 55 if versionLine == "" { 56 return "", nil, errors.New("no version property") 57 } 58 59 match := reVersion.FindStringSubmatch(versionLine) 60 if match == nil { 61 return "", nil, fmt.Errorf("can not parse version property '%s'", versionLine) 62 } 63 64 server, version := match[1], match[2] 65 ver, err := semver.New(version) 66 if err != nil { 67 return "", nil, err 68 } 69 70 return server, ver, nil 71 }