Skip to content

Commit

Permalink
fix&refactor: fix bugs and refactor keyMatchParser
Browse files Browse the repository at this point in the history
- fix bug: Some metrics value has \r in the end
- refactor: refactor keyMatchParser
  • Loading branch information
pourer committed Jul 23, 2020
1 parent 27dd0c4 commit a3812e2
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 41 deletions.
2 changes: 1 addition & 1 deletion exporter/metrics/binlog.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ var collectBinlogMetrics = map[string]MetricConfig{
verC: mustNewVersionConstraint(`>=3.1.0`),
Parser: &regexParser{
name: "binlog_>=3.1.0",
reg: regexp.MustCompile(`(?P<db>db[\d]+)\s*binlog_offset=(?P<binlog_offset_filenum>[^\s]*)\s*(?P<binlog_offset>[\d]*),*safety_purge=(?P<safety_purge>[^\s\n]*)`),
reg: regexp.MustCompile(`(?P<db>db[\d]+)\s*binlog_offset=(?P<binlog_offset_filenum>[^\s]*)\s*(?P<binlog_offset>[\d]*),*safety_purge=(?P<safety_purge>[^\s\r\n]*)`),
},
},
MetricMeta: MetaDatas{
Expand Down
42 changes: 39 additions & 3 deletions exporter/metrics/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,50 @@ func (p *versionMatchParser) Parse(m MetricMeta, c Collector, opt ParseOption) {
p.Parser.Parse(m, c, opt)
}

type Matcher interface {
Match(v string) bool
}

type equalMatcher struct {
v string
}

func (m *equalMatcher) Match(v string) bool {
return strings.ToLower(v) == strings.ToLower(m.v)
}

type intMatcher struct {
condition string
v int
}

func (m *intMatcher) Match(v string) bool {
nv, err := strconv.Atoi(v)
if err != nil {
return false
}

switch m.condition {
case ">":
return nv > m.v
case "<":
return nv < m.v
case ">=":
return nv >= m.v
case "<=":
return nv <= m.v
}
return false
}

type keyMatchParser struct {
matches map[string]string
matchers map[string]Matcher
Parser
}

func (p *keyMatchParser) Parse(m MetricMeta, c Collector, opt ParseOption) {
for key, matchValue := range p.matches {
if v, _ := opt.Extracts[key]; strings.ToLower(v) != strings.ToLower(matchValue) {
for key, matcher := range p.matchers {
if v, _ := opt.Extracts[key]; !matcher.Match(v) {
return
}
}
Expand Down
33 changes: 17 additions & 16 deletions exporter/metrics/replication.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ func init() {
var collectReplicationMetrics = map[string]MetricConfig{
"master_connected_slaves": {
Parser: &keyMatchParser{
matches: map[string]string{
"role": "master",
matchers: map[string]Matcher{
"role": &equalMatcher{v: "master"},
},
Parser: Parsers{
&normalParser{},
Expand All @@ -27,8 +27,9 @@ var collectReplicationMetrics = map[string]MetricConfig{

"master_slave_info": {
Parser: &keyMatchParser{
matches: map[string]string{
"role": "master",
matchers: map[string]Matcher{
"role": &equalMatcher{v: "master"},
"connected_slaves": &intMatcher{condition: ">", v: 0},
},
Parser: Parsers{
&regexParser{
Expand Down Expand Up @@ -58,8 +59,8 @@ var collectReplicationMetrics = map[string]MetricConfig{

"slave_info": {
Parser: &keyMatchParser{
matches: map[string]string{
"role": "slave",
matchers: map[string]Matcher{
"role": &equalMatcher{v: "slave"},
},
Parser: Parsers{
&normalParser{},
Expand Down Expand Up @@ -94,8 +95,8 @@ var collectReplicationMetrics = map[string]MetricConfig{

"slave_info>=3.0.0": {
Parser: &keyMatchParser{
matches: map[string]string{
"role": "slave",
matchers: map[string]Matcher{
"role": &equalMatcher{v: "slave"},
},
Parser: &versionMatchParser{
verC: mustNewVersionConstraint(`>=3.0.0`),
Expand All @@ -113,18 +114,18 @@ var collectReplicationMetrics = map[string]MetricConfig{

"double_master_info": {
Parser: &keyMatchParser{
matches: map[string]string{
"role": "master",
"double_master_mode": "true",
matchers: map[string]Matcher{
"role": &equalMatcher{v: "master"},
"double_master_mode": &equalMatcher{v: "true"},
},
Parser: &regexParser{
name: "double_master_info",
reg: regexp.MustCompile(`the peer-master host:(?P<the_peer_master_host>[^\n]*)[\s\S]*` +
`the peer-master port:(?P<the_peer_master_port>[^\n]*)[\s\S]*` +
`the peer-master server_id:(?P<the_peer_master_server_id>[^\n]*)[\s\S]*` +
`repl_state:(?P<double_master_repl_state>[^\n]*)[\s\S]*` +
reg: regexp.MustCompile(`the peer-master host:(?P<the_peer_master_host>[^\r\n]*)[\s\S]*` +
`the peer-master port:(?P<the_peer_master_port>[^\r\n]*)[\s\S]*` +
`the peer-master server_id:(?P<the_peer_master_server_id>[^\r\n]*)[\s\S]*` +
`repl_state:(?P<double_master_repl_state>[^\r\n]*)[\s\S]*` +
`double_master_recv_info:\s*filenum\s*(?P<double_master_recv_info_binlog_filenum>[^\s]*)` +
`\s*offset\s*(?P<double_master_recv_info_binlog_offset>[^\n]*)`),
`\s*offset\s*(?P<double_master_recv_info_binlog_offset>[^\r\n]*)`),
},
},
MetricMeta: MetaDatas{
Expand Down
20 changes: 2 additions & 18 deletions exporter/metrics/server.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
package metrics

import "regexp"

func init() {
Register(collectServerMetrics)
}

var collectServerMetrics = map[string]MetricConfig{
"build_info": {
Parser: &regexParser{
name: "build_info",
reg: regexp.MustCompile(`pika_version:(?P<pika_version>[^\n]*)[\s\S]*` +
`pika_git_sha:(?P<pika_git_sha>[^\n]*)[\s\S]*` +
`pika_build_compile_date:(?P<pika_build_compile_date>[^\n]*)[\s\S]*` +
`os:(?P<os>[^\n]*)[\s\S]*` +
`arch_bits:(?P<arch_bits>[^\n]*)`),
},
Parser: &normalParser{},
MetricMeta: &MetaData{
Name: "build_info",
Help: "pika binary file build info",
Expand All @@ -24,14 +15,7 @@ var collectServerMetrics = map[string]MetricConfig{
},
},
"server_info": {
Parser: &regexParser{
name: "server_info",
reg: regexp.MustCompile(`process_id:(?P<process_id>[^\n]*)[\s\S]*` +
`tcp_port:(?P<tcp_port>[^\n]*)[\s\S]*` +
`config_file:(?P<config_file>[^\n]*)[\s\S]*` +
`server_id:(?P<server_id>[^\n]*)[\s\S]*` +
`role:(?P<role>[^\n]*)`),
},
Parser: &normalParser{},
MetricMeta: &MetaData{
Name: "server_info",
Help: "pika serve instance info",
Expand Down
6 changes: 3 additions & 3 deletions exporter/metrics/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ var collectStatsMetrics = map[string]MetricConfig{
"is_bgsaving": {
Parser: &regexParser{
name: "is_bgsaving",
reg: regexp.MustCompile(`is_bgsaving:(?P<is_bgsaving>(No|Yes)),?(?P<bgsave_name>[^,\n]*)`),
reg: regexp.MustCompile(`is_bgsaving:(?P<is_bgsaving>(No|Yes)),?(?P<bgsave_name>[^,\r\n]*)`),
},
MetricMeta: &MetaData{
Name: "is_bgsaving",
Expand All @@ -53,7 +53,7 @@ var collectStatsMetrics = map[string]MetricConfig{
"is_scaning_keyspace": {
Parser: &regexParser{
name: "is_scaning_keyspace",
reg: regexp.MustCompile(`is_scaning_keyspace:(?P<is_scaning_keyspace>(No|Yes))[\s\S]*#\s*Time:(?P<keyspace_time>[^\n]*)`),
reg: regexp.MustCompile(`is_scaning_keyspace:(?P<is_scaning_keyspace>(No|Yes))[\s\S]*#\s*Time:(?P<keyspace_time>[^\r\n]*)`),
},
MetricMeta: &MetaData{
Name: "is_scaning_keyspace",
Expand All @@ -66,7 +66,7 @@ var collectStatsMetrics = map[string]MetricConfig{
"is_compact": {
Parser: &regexParser{
name: "is_compact",
reg: regexp.MustCompile(`is_compact:(?P<is_compact>(No|Yes))[\s\S]*compact_cron:(?P<compact_cron>[^\n]*)[\s\S]*compact_interval:(?P<compact_interval>[^\n]*)`),
reg: regexp.MustCompile(`is_compact:(?P<is_compact>(No|Yes))[\s\S]*compact_cron:(?P<compact_cron>[^\r\n]*)[\s\S]*compact_interval:(?P<compact_interval>[^\r\n]*)`),
},
MetricMeta: &MetaData{
Name: "is_compact",
Expand Down

0 comments on commit a3812e2

Please sign in to comment.