module/apmgometrics/gatherer.go (35 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package apmgometrics // import "go.elastic.co/apm/module/apmgometrics/v2"
import (
"context"
metrics "github.com/rcrowley/go-metrics"
"go.elastic.co/apm/v2"
)
// Wrap wraps r, a go-metrics Registry, so that it can be used
// as an apm.MetricsGatherer.
func Wrap(r metrics.Registry) apm.MetricsGatherer {
return gatherer{r}
}
type gatherer struct {
r metrics.Registry
}
// GatherMEtrics gathers metrics into m.
func (g gatherer) GatherMetrics(ctx context.Context, m *apm.Metrics) error {
g.r.Each(func(name string, v interface{}) {
switch v := v.(type) {
case metrics.Counter:
m.Add(name, nil, float64(v.Count()))
case metrics.Gauge:
m.Add(name, nil, float64(v.Value()))
case metrics.GaugeFloat64:
m.Add(name, nil, v.Value())
case metrics.Histogram:
m.Add(name+".count", nil, float64(v.Count()))
m.Add(name+".total", nil, float64(v.Sum()))
m.Add(name+".min", nil, float64(v.Min()))
m.Add(name+".max", nil, float64(v.Max()))
m.Add(name+".stddev", nil, v.StdDev())
m.Add(name+".percentile.50", nil, v.Percentile(0.5))
m.Add(name+".percentile.95", nil, v.Percentile(0.95))
m.Add(name+".percentile.99", nil, v.Percentile(0.99))
default:
// TODO(axw) Meter, Timer, EWMA
}
})
return nil
}