github.com/netdata/go.d.plugin@v0.58.1/modules/pika/collect.go (about) 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 (p *Pika) collect() (map[string]int64, error) { 19 info, err := p.pdb.Info(context.Background(), "all").Result() 20 if err != nil { 21 return nil, err 22 } 23 24 if p.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 p.server, p.version = s, v 30 p.Debugf(`server="%s",version="%s"`, s, v) 31 } 32 33 if p.server != "pika" { 34 return nil, fmt.Errorf("unsupported server app, want=pika, got=%s", p.server) 35 } 36 37 ms := make(map[string]int64) 38 p.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 }