2015-02-02 17:14:36 +03:00
|
|
|
// Copyright 2014 The Prometheus Authors
|
2014-05-07 22:08:33 +04:00
|
|
|
// Licensed 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 prometheus_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"expvar"
|
|
|
|
"fmt"
|
|
|
|
"sort"
|
|
|
|
"strings"
|
|
|
|
|
2015-02-27 18:12:59 +03:00
|
|
|
dto "github.com/prometheus/client_model/go"
|
|
|
|
|
2014-05-07 22:08:33 +04:00
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
|
)
|
|
|
|
|
2016-09-16 20:59:04 +03:00
|
|
|
func ExampleNewExpvarCollector() {
|
2014-05-07 22:08:33 +04:00
|
|
|
expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{
|
|
|
|
"memstats": prometheus.NewDesc(
|
|
|
|
"expvar_memstats",
|
|
|
|
"All numeric memstats as one metric family. Not a good role-model, actually... ;-)",
|
|
|
|
[]string{"type"}, nil,
|
|
|
|
),
|
|
|
|
"lone-int": prometheus.NewDesc(
|
|
|
|
"expvar_lone_int",
|
|
|
|
"Just an expvar int as an example.",
|
|
|
|
nil, nil,
|
|
|
|
),
|
|
|
|
"http-request-map": prometheus.NewDesc(
|
|
|
|
"expvar_http_request_total",
|
|
|
|
"How many http requests processed, partitioned by status code and http method.",
|
|
|
|
[]string{"code", "method"}, nil,
|
|
|
|
),
|
|
|
|
})
|
|
|
|
prometheus.MustRegister(expvarCollector)
|
|
|
|
|
|
|
|
// The Prometheus part is done here. But to show that this example is
|
|
|
|
// doing anything, we have to manually export something via expvar. In
|
|
|
|
// real-life use-cases, some library would already have exported via
|
|
|
|
// expvar what we want to re-export as Prometheus metrics.
|
|
|
|
expvar.NewInt("lone-int").Set(42)
|
|
|
|
expvarMap := expvar.NewMap("http-request-map")
|
|
|
|
var (
|
|
|
|
expvarMap1, expvarMap2 expvar.Map
|
|
|
|
expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int
|
|
|
|
)
|
|
|
|
expvarMap1.Init()
|
|
|
|
expvarMap2.Init()
|
|
|
|
expvarInt11.Set(3)
|
|
|
|
expvarInt12.Set(13)
|
|
|
|
expvarInt21.Set(11)
|
|
|
|
expvarInt22.Set(212)
|
|
|
|
expvarMap1.Set("POST", &expvarInt11)
|
|
|
|
expvarMap1.Set("GET", &expvarInt12)
|
|
|
|
expvarMap2.Set("POST", &expvarInt21)
|
|
|
|
expvarMap2.Set("GET", &expvarInt22)
|
|
|
|
expvarMap.Set("404", &expvarMap1)
|
|
|
|
expvarMap.Set("200", &expvarMap2)
|
|
|
|
// Results in the following expvar map:
|
|
|
|
// "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}}
|
|
|
|
|
|
|
|
// Let's see what the scrape would yield, but exclude the memstats metrics.
|
|
|
|
metricStrings := []string{}
|
|
|
|
metric := dto.Metric{}
|
|
|
|
metricChan := make(chan prometheus.Metric)
|
|
|
|
go func() {
|
|
|
|
expvarCollector.Collect(metricChan)
|
|
|
|
close(metricChan)
|
|
|
|
}()
|
|
|
|
for m := range metricChan {
|
2018-04-13 23:28:16 +03:00
|
|
|
if !strings.Contains(m.Desc().String(), "expvar_memstats") {
|
2014-05-07 22:08:33 +04:00
|
|
|
metric.Reset()
|
|
|
|
m.Write(&metric)
|
2023-09-21 12:46:54 +03:00
|
|
|
metricStrings = append(metricStrings, toNormalizedJSON(&metric))
|
2014-05-07 22:08:33 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
sort.Strings(metricStrings)
|
|
|
|
for _, s := range metricStrings {
|
2023-08-11 22:17:55 +03:00
|
|
|
fmt.Println(s)
|
2014-05-07 22:08:33 +04:00
|
|
|
}
|
|
|
|
// Output:
|
2023-08-11 22:17:55 +03:00
|
|
|
// {"label":[{"name":"code","value":"200"},{"name":"method","value":"GET"}],"untyped":{"value":212}}
|
|
|
|
// {"label":[{"name":"code","value":"200"},{"name":"method","value":"POST"}],"untyped":{"value":11}}
|
|
|
|
// {"label":[{"name":"code","value":"404"},{"name":"method","value":"GET"}],"untyped":{"value":13}}
|
|
|
|
// {"label":[{"name":"code","value":"404"},{"name":"method","value":"POST"}],"untyped":{"value":3}}
|
|
|
|
// {"untyped":{"value":42}}
|
2014-05-07 22:08:33 +04:00
|
|
|
}
|