golang example_test 代码
文件路径:/src/runtime/metrics/example_test.go
/ Copyright 2020 The Go Authors. All rights reserved.
/ Use of this source code is governed by a BSD-style
/ license that can be found in the LICENSE file.
package metrics_test
import (
"fmt"
"runtime/metrics"
)
func ExampleRead_readingOneMetric() {
/ Name of the metric we want to read.
const myMetric = "/memory/classes/heap/free:bytes"
/ Create a sample for the metric.
sample := make([]metrics.Sample, 1)
sample[0].Name = myMetric
/ Sample the metric.
metrics.Read(sample)
/ Check if the metric is actually supported.
/ If it's not, the resulting value will always have
/ kind KindBad.
if sample[0].Value.Kind() == metrics.KindBad {
panic(fmt.Sprintf("metric %q no longer supported", myMetric))
}
/ Handle the result.
/
/ It's OK to assume a particular Kind for a metric;
/ they're guaranteed not to change.
freeBytes := sample[0].Value.Uint64()
fmt.Printf("free but not released memory: %d\n", freeBytes)
}
func ExampleRead_readingAllMetrics() {
/ Get descriptions for all supported metrics.
descs := metrics.All()
/ Create a sample for each metric.
samples := make([]metrics.Sample, len(descs))
for i := range samples {
samples[i].Name = descs[i].Name
}
/ Sample the metrics. Re-use the samples slice if you can!
metrics.Read(samples)
/ Iterate over all results.
for _, sample := range samples {
/ Pull out the name and value.
name, value := sample.Name, sample.Value
/ Handle each sample.
switch value.Kind() {
case metrics.KindUint64:
fmt.Printf("%s: %d\n", name, value.Uint64())
case metrics.KindFloat64:
fmt.Printf("%s: %f\n", name, value.Float64())
case metrics.KindFloat64Histogram:
/ The histogram may be quite large, so let's just pull out
/ a crude estimate for the median for the sake of this example.
fmt.Printf("%s: %f\n", name, medianBucket(value.Float64Histogram()))
case metrics.KindBad:
/ This should never happen because all metrics are supported
/ by construction.
panic("bug in runtime/metrics package!")
default:
/ This may happen as new metrics get added.
/
/ The safest thing to do here is to simply log it somewhere
/ as something to look into, but ignore it for now.
/ In the worst case, you might temporarily miss out on a new metric.
fmt.Printf("%s: unexpected metric Kind: %v\n", name, value.Kind())
}
}
}
func medianBucket(h *metrics.Float64Histogram) float64 {
total := uint64(0)
for _, count := range h.Counts {
total += count
}
thresh := total / 2
total = 0
for i, count := range h.Counts {
total += count
if total >= thresh {
return h.Buckets[i]
}
}
panic("should not happen")
}