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