Skip to content

Commit

Permalink
Cherry-pick #15712 to 7.6: [Metricbeat]Log prometheus errors instead …
Browse files Browse the repository at this point in the history
…of parsing families (#16231)

(cherry picked from commit edc17b3)

Co-authored-by: Pablo Mercado <pablo.mercado@elastic.co>
  • Loading branch information
jsoriano and Pablo Mercado authored Feb 12, 2020
1 parent 190ca17 commit ed5fd7f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.next.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d

*Metricbeat*

- Avoid parsing errors returned from prometheus endpoints. {pull}15712[15712]

*Packetbeat*

Expand Down
14 changes: 13 additions & 1 deletion metricbeat/helper/prometheus/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ package prometheus
import (
"fmt"
"io"
"io/ioutil"
"net/http"

"github.com/pkg/errors"
dto "github.com/prometheus/client_model/go"
"github.com/prometheus/common/expfmt"

"github.com/elastic/beats/libbeat/common"
"github.com/elastic/beats/libbeat/logp"
"github.com/elastic/beats/metricbeat/helper"
"github.com/elastic/beats/metricbeat/mb"
)
Expand All @@ -43,6 +45,7 @@ type Prometheus interface {

type prometheus struct {
httpfetcher
logger *logp.Logger
}

type httpfetcher interface {
Expand All @@ -52,10 +55,11 @@ type httpfetcher interface {
// NewPrometheusClient creates new prometheus helper
func NewPrometheusClient(base mb.BaseMetricSet) (Prometheus, error) {
http, err := helper.NewHTTP(base)

if err != nil {
return nil, err
}
return &prometheus{http}, nil
return &prometheus{http, base.Logger()}, nil
}

// GetFamilies requests metric families from prometheus endpoint and returns them
Expand All @@ -66,6 +70,14 @@ func (p *prometheus) GetFamilies() ([]*dto.MetricFamily, error) {
}
defer resp.Body.Close()

if resp.StatusCode > 399 {
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err == nil {
p.logger.Debug("error received from prometheus endpoint: ", string(bodyBytes))
}
return nil, fmt.Errorf("unexpected status code %d from server", resp.StatusCode)
}

format := expfmt.ResponseFormat(resp.Header)
if format == "" {
return nil, fmt.Errorf("Invalid format for response of response")
Expand Down
10 changes: 6 additions & 4 deletions metricbeat/helper/prometheus/prometheus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/stretchr/testify/assert"

"github.com/elastic/beats/libbeat/common"
"github.com/elastic/beats/libbeat/logp"
mbtest "github.com/elastic/beats/metricbeat/mb/testing"
)

Expand Down Expand Up @@ -185,14 +186,15 @@ var _ = httpfetcher(&mockFetcher{})
// returns the mockFetcher.Response contents
func (m mockFetcher) FetchResponse() (*http.Response, error) {
return &http.Response{
Header: make(http.Header),
Body: ioutil.NopCloser(bytes.NewReader([]byte(m.response))),
StatusCode: 200,
Header: make(http.Header),
Body: ioutil.NopCloser(bytes.NewReader([]byte(m.response))),
}, nil
}

func TestPrometheus(t *testing.T) {

p := &prometheus{mockFetcher{response: promMetrics}}
p := &prometheus{mockFetcher{response: promMetrics}, logp.NewLogger("test")}

tests := []struct {
mapping *MetricsMapping
Expand Down Expand Up @@ -933,7 +935,7 @@ func TestPrometheusKeyLabels(t *testing.T) {

for _, tc := range testCases {
r := &mbtest.CapturingReporterV2{}
p := &prometheus{mockFetcher{response: tc.prometheusResponse}}
p := &prometheus{mockFetcher{response: tc.prometheusResponse}, logp.NewLogger("test")}
p.ReportProcessedMetrics(tc.mapping, r)
if !assert.Nil(t, r.GetErrors(),
"error reporting/processing metrics, at %q", tc.testName) {
Expand Down

0 comments on commit ed5fd7f

Please sign in to comment.