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