Skip to content

Commit

Permalink
Recover from prometheus multiple handler panic
Browse files Browse the repository at this point in the history
closes #1339
  • Loading branch information
sparrc committed Jun 10, 2016
1 parent ea2521b commit f05e410
Showing 1 changed file with 22 additions and 18 deletions.
40 changes: 22 additions & 18 deletions plugins/outputs/prometheus_client/prometheus_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ var (
)

type PrometheusClient struct {
Listen string
metrics map[string]*prometheus.UntypedVec
Listen string
}

var sampleConfig = `
Expand All @@ -35,6 +34,10 @@ var sampleConfig = `
`

func (p *PrometheusClient) Start() error {
defer func() {
if r := recover(); r != nil {
}
}()
if p.Listen == "" {
p.Listen = "localhost:9126"
}
Expand All @@ -44,7 +47,6 @@ func (p *PrometheusClient) Start() error {
Addr: p.Listen,
}

p.metrics = make(map[string]*prometheus.UntypedVec)
go server.ListenAndServe()
return nil
}
Expand Down Expand Up @@ -118,24 +120,26 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error {
continue
}

// Create a new metric if it hasn't been created yet.
if _, ok := p.metrics[mname]; !ok {
p.metrics[mname] = prometheus.NewUntypedVec(
prometheus.UntypedOpts{
Name: mname,
Help: "Telegraf collected metric",
},
labels,
)
if err := prometheus.Register(p.metrics[mname]); err != nil {
log.Printf("prometheus_client: Metric failed to register with prometheus, %s", err)
continue
}
mVec := prometheus.NewUntypedVec(
prometheus.UntypedOpts{
Name: mname,
Help: "Telegraf collected metric",
},
labels,
)
collector, err := prometheus.RegisterOrGet(mVec)
if err != nil {
log.Printf("prometheus_client: Metric failed to register with prometheus, %s", err)
continue
}
mVec, ok := collector.(*prometheus.UntypedVec)
if !ok {
continue
}

switch val := val.(type) {
case int64:
m, err := p.metrics[mname].GetMetricWith(l)
m, err := mVec.GetMetricWith(l)
if err != nil {
log.Printf("ERROR Getting metric in Prometheus output, "+
"key: %s, labels: %v,\nerr: %s\n",
Expand All @@ -144,7 +148,7 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error {
}
m.Set(float64(val))
case float64:
m, err := p.metrics[mname].GetMetricWith(l)
m, err := mVec.GetMetricWith(l)
if err != nil {
log.Printf("ERROR Getting metric in Prometheus output, "+
"key: %s, labels: %v,\nerr: %s\n",
Expand Down

0 comments on commit f05e410

Please sign in to comment.