| // 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") | |
| } |