mirror of
https://github.com/prometheus/statsd_exporter.git
synced 2025-04-28 09:04:47 +00:00
Merge pull request #579 from prometheus/mr/issue-572/fix-panic
Fix panic when parsing invalid lines
This commit is contained in:
commit
a20db6eec6
4 changed files with 21 additions and 6 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
## 0.27.2-pr579 / 2024-09-16
|
||||||
|
|
||||||
|
* [BUGFIX] Fix panic on certain invalid lines ([#579](https://github.com/prometheus/statsd_exporter/pull/579))
|
||||||
|
|
||||||
## 0.27.1 / 2024-08-18
|
## 0.27.1 / 2024-08-18
|
||||||
|
|
||||||
* [FEATURE] Support [dogstatsd extended aggregation](https://github.com/DataDog/datadog-go/blob/master/README.md#extended-aggregation) ([#558](https://github.com/prometheus/statsd_exporter/pull/558))
|
* [FEATURE] Support [dogstatsd extended aggregation](https://github.com/DataDog/datadog-go/blob/master/README.md#extended-aggregation) ([#558](https://github.com/prometheus/statsd_exporter/pull/558))
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
0.27.1
|
0.27.2-pr579
|
||||||
|
|
|
@ -211,7 +211,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s
|
||||||
elements := strings.SplitN(line, ":", 2)
|
elements := strings.SplitN(line, ":", 2)
|
||||||
if len(elements) < 2 || len(elements[0]) == 0 || !utf8.ValidString(line) {
|
if len(elements) < 2 || len(elements[0]) == 0 || !utf8.ValidString(line) {
|
||||||
sampleErrors.WithLabelValues("malformed_line").Inc()
|
sampleErrors.WithLabelValues("malformed_line").Inc()
|
||||||
level.Debug(logger).Log("msg", "Bad line from StatsD", "line", line)
|
level.Debug(logger).Log("msg", "bad line", "line", line)
|
||||||
return events
|
return events
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,12 +223,17 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s
|
||||||
|
|
||||||
// don't allow mixed tagging styles
|
// don't allow mixed tagging styles
|
||||||
sampleErrors.WithLabelValues("mixed_tagging_styles").Inc()
|
sampleErrors.WithLabelValues("mixed_tagging_styles").Inc()
|
||||||
level.Debug(logger).Log("msg", "Bad line (multiple tagging styles) from StatsD", "line", line)
|
level.Debug(logger).Log("msg", "bad line: multiple tagging styles", "line", line)
|
||||||
return events
|
return events
|
||||||
}
|
}
|
||||||
|
|
||||||
var samples []string
|
var samples []string
|
||||||
lineParts := strings.SplitN(elements[1], "|", 3)
|
lineParts := strings.SplitN(elements[1], "|", 3)
|
||||||
|
if len(lineParts) < 2 {
|
||||||
|
sampleErrors.WithLabelValues("not_enough_parts_after_colon").Inc()
|
||||||
|
level.Debug(logger).Log("msg", "bad line: not enough '|'-delimited parts after first ':'", "line", line)
|
||||||
|
return events
|
||||||
|
}
|
||||||
if strings.Contains(lineParts[0], ":") {
|
if strings.Contains(lineParts[0], ":") {
|
||||||
// handle DogStatsD extended aggregation
|
// handle DogStatsD extended aggregation
|
||||||
isValidAggType := false
|
isValidAggType := false
|
||||||
|
@ -251,7 +256,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s
|
||||||
samples = aggLines
|
samples = aggLines
|
||||||
} else {
|
} else {
|
||||||
sampleErrors.WithLabelValues("invalid_extended_aggregate_type").Inc()
|
sampleErrors.WithLabelValues("invalid_extended_aggregate_type").Inc()
|
||||||
level.Debug(logger).Log("msg", "Bad line (invalid extended aggregate type) from StatsD", "line", line)
|
level.Debug(logger).Log("msg", "bad line: invalid extended aggregate type", "line", line)
|
||||||
return events
|
return events
|
||||||
}
|
}
|
||||||
} else if usingDogStatsDTags {
|
} else if usingDogStatsDTags {
|
||||||
|
@ -267,7 +272,7 @@ samples:
|
||||||
components := strings.Split(sample, "|")
|
components := strings.Split(sample, "|")
|
||||||
if len(components) < 2 || len(components) > 4 {
|
if len(components) < 2 || len(components) > 4 {
|
||||||
sampleErrors.WithLabelValues("malformed_component").Inc()
|
sampleErrors.WithLabelValues("malformed_component").Inc()
|
||||||
level.Debug(logger).Log("msg", "Bad component", "line", line)
|
level.Debug(logger).Log("msg", "bad component", "line", line)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
valueStr, statType := components[0], components[1]
|
valueStr, statType := components[0], components[1]
|
||||||
|
@ -279,7 +284,7 @@ samples:
|
||||||
|
|
||||||
value, err := strconv.ParseFloat(valueStr, 64)
|
value, err := strconv.ParseFloat(valueStr, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
level.Debug(logger).Log("msg", "Bad value", "value", valueStr, "line", line)
|
level.Debug(logger).Log("msg", "bad value", "value", valueStr, "line", line)
|
||||||
sampleErrors.WithLabelValues("malformed_value").Inc()
|
sampleErrors.WithLabelValues("malformed_value").Inc()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -823,6 +823,12 @@ func TestLineToEvents(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"invalid event split over lines part 1": {
|
||||||
|
in: "karafka.consumer.consume.cpu_idle_second: 0.111090 -0.055903 -0.195390 ( 2.419002)",
|
||||||
|
},
|
||||||
|
"invalid event split over lines part 2": {
|
||||||
|
in: "|h|#consumer:Kafka::SharedConfigurationConsumer,topic:shared_configuration_update,partition:1,consumer_group:tc_rc_us",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
parser := NewParser()
|
parser := NewParser()
|
||||||
|
|
Loading…
Reference in a new issue