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  }