master
go 71 lines 1.54 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package pika
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.pdb.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 != "pika" {
34 return nil, fmt.Errorf("unsupported server app, want=pika, got=%s", c.server)
35 }
36
37 ms := make(map[string]int64)
38 c.collectInfo(ms, info)
39
40 return ms, nil
41 }
42
43 // pika_version:3.4.0
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 }