master
go 131 lines 3.12 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package yugabytedb
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/pkg/prometheus"
10 )
11
12 const (
13 srvTypeMaster = "master"
14 srvTypeTServer = "tserver"
15 srvTypeCQL = "ycql"
16 srvTypeSQL = "ysql"
17 )
18
19 func (c *Collector) collect() (map[string]int64, error) {
20 mfs, err := c.prom.Scrape()
21 if err != nil {
22 return nil, err
23 }
24
25 if c.srvType == "" {
26 if c.srvType = c.getSrvType(mfs); c.srvType == "" {
27 return nil, fmt.Errorf("could not determine server type")
28 }
29 c.addBaseCharts()
30 }
31
32 mx := make(map[string]int64)
33
34 c.collectMetrics(mx, mfs)
35
36 return mx, nil
37 }
38
39 func (c *Collector) getSrvType(mfs prometheus.MetricFamilies) string {
40 for _, mf := range mfs {
41 for _, m := range mf.Metrics() {
42 switch m.Labels().Get("metric_id") {
43 case "yb.master":
44 return srvTypeMaster
45 case "yb.tabletserver":
46 return srvTypeTServer
47 case "yb.cqlserver":
48 return srvTypeCQL
49 case "yb.ysqlserver":
50 return srvTypeSQL
51 }
52 }
53 }
54 return ""
55 }
56
57 func (c *Collector) collectMetrics(mx map[string]int64, mfs prometheus.MetricFamilies) {
58 var maxConn float64
59 var usedConn float64
60
61 for _, mf := range mfs {
62 if len(mf.Metrics()) > 1 {
63 continue
64 }
65
66 if v, ok := strings.CutSuffix(mf.Name(), "_count"); ok {
67 if v, ok = strings.CutPrefix(v, metricPxMasterLatencyMasterClient+"_"); ok {
68 if !c.cacheHasp("MasterClient", v) {
69 c.addMasterClientOpCharts(v)
70 }
71 } else if v, ok = strings.CutPrefix(v, metricPxMasterLatencyMasterDdl+"_"); ok {
72 if !c.cacheHasp("MasterDDL", v) {
73 c.addMasterDDLOpCharts(v)
74 }
75 } else if v, ok = strings.CutPrefix(v, metricPxServerLatencyConsensusService+"_"); ok {
76 if !c.cacheHasp("ConsensusService", v) {
77 c.addConsensusServiceOpCharts(v)
78 }
79 } else if v, ok = strings.CutPrefix(v, metricPxTserverHandlerLatency+"_"); ok {
80 if svc, op, ok := strings.Cut(v, "_"); ok {
81 if !c.cacheHasp(svc, op) {
82 c.addServiceOpCharts(svc, op)
83 }
84 }
85 } else if v, ok = strings.CutPrefix(v, metricPxYCQLLatencySQLProcessor+"_"); ok {
86 if strings.HasSuffix(v, "Stmt") || strings.HasSuffix(v, "Stmts") {
87 if !c.cacheHasp("SQLProcessor", v) {
88 c.addCQLStatementCharts(v)
89 }
90 }
91 } else if v, ok = strings.CutPrefix(v, metricPxYSQLLatencySQLProcessor+"_"); ok {
92 if strings.HasSuffix(v, "Stmt") || strings.HasSuffix(v, "Stmts") {
93 if !c.cacheHasp("SQLProcessor", v) {
94 c.addSQLStatementCharts(v)
95 }
96 }
97 }
98 }
99
100 m := mf.Metrics()[0]
101
102 switch {
103 case mf.Name() == metricSqlConnTotal && m.Gauge() != nil:
104 usedConn = m.Gauge().Value()
105 case mf.Name() == metricSqlMaxConnTotal && m.Gauge() != nil:
106 maxConn = m.Gauge().Value()
107 }
108
109 if m.Counter() != nil {
110 mx[mf.Name()] += int64(m.Counter().Value())
111 }
112 if m.Gauge() != nil {
113 mx[mf.Name()] += int64(m.Gauge().Value())
114 }
115 }
116
117 if maxConn > 0 {
118 mx["yb_ysqlserver_connection_available"] = int64(maxConn - usedConn)
119 }
120 }
121
122 func (c *Collector) cacheHasp(key, subkey string) bool {
123 if _, ok := c.cache[key]; !ok {
124 c.cache[key] = make(map[string]bool)
125 }
126 _, ok := c.cache[key][subkey]
127 if !ok {
128 c.cache[key][subkey] = true
129 }
130 return ok
131 }