github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/metrics/example_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package metrics_test 6 7 import ( 8 "github.com/shogo82148/std/fmt" 9 "github.com/shogo82148/std/runtime/metrics" 10 ) 11 12 func ExampleRead_readingOneMetric() { 13 // 読み取りたいメトリックの名前。 14 const myMetric = "/memory/classes/heap/free:bytes" 15 16 // メトリクスのサンプルを作成します。 17 sample := make([]metrics.Sample, 1) 18 sample[0].Name = myMetric 19 20 // メトリックをサンプリングする。 21 metrics.Read(sample) 22 23 // メトリックが実際にサポートされているか確認します。 24 // もしサポートされていなければ、結果の値は常にKindBadになります。 25 if sample[0].Value.Kind() == metrics.KindBad { 26 panic(fmt.Sprintf("metric %q no longer supported", myMetric)) 27 } 28 29 // 結果を処理する。 30 // 31 // メトリックに特定の Kind を想定することは問題ありません。 32 // それらは変更されないことが保証されています。 33 freeBytes := sample[0].Value.Uint64() 34 35 fmt.Printf("free but not released memory: %d\n", freeBytes) 36 } 37 38 func ExampleRead_readingAllMetrics() { 39 // すべてのサポートされているメトリクスの説明を取得する。 40 descs := metrics.All() 41 42 // 各メトリックのサンプルを作成します。 43 samples := make([]metrics.Sample, len(descs)) 44 for i := range samples { 45 samples[i].Name = descs[i].Name 46 } 47 48 // メトリクスをサンプリングします。可能な場合、サンプルスライスを再利用してください! 49 metrics.Read(samples) 50 51 // すべての結果を繰り返す。 52 for _, sample := range samples { 53 // 名前と値を取り出す。 54 name, value := sample.Name, sample.Value 55 56 // 各サンプルを処理する。 57 switch value.Kind() { 58 case metrics.KindUint64: 59 fmt.Printf("%s: %d\n", name, value.Uint64()) 60 case metrics.KindFloat64: 61 fmt.Printf("%s: %f\n", name, value.Float64()) 62 case metrics.KindFloat64Histogram: 63 // ヒストグラムはかなり大きくなるかもしれませんので、この例のために 64 // 中央値のざっくりした推定値を取り出しましょう。 65 fmt.Printf("%s: %f\n", name, medianBucket(value.Float64Histogram())) 66 case metrics.KindBad: 67 // これは起きてはいけないはずです。なぜなら、すべてのメトリクスは構築されているからです。 68 panic("bug in runtime/metrics package!") 69 default: 70 71 // 新しいメトリクスが追加されると、これが発生する可能性があります。 72 // 73 // ここでは、安全策として、単にそれをログに記録しておくことで、 74 // 現時点では無視します。 75 // 最悪の場合、一時的に新しいメトリクスの情報を見逃すかもしれませんが、 76 fmt.Printf("%s: unexpected metric Kind: %v\n", name, value.Kind()) 77 } 78 } 79 }