Source file src/runtime/metrics/value.go

     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
     6  
     7  import (
     8  	"math"
     9  	"unsafe"
    10  )
    11  
    12  // ValueKind is a tag for a metric [Value] which indicates its type.
    13  type ValueKind int
    14  
    15  const (
    16  	// KindBad indicates that the Value has no type and should not be used.
    17  	KindBad ValueKind = iota
    18  
    19  	// KindUint64 indicates that the type of the Value is a uint64.
    20  	KindUint64
    21  
    22  	// KindFloat64 indicates that the type of the Value is a float64.
    23  	KindFloat64
    24  
    25  	// KindFloat64Histogram indicates that the type of the Value is a *Float64Histogram.
    26  	KindFloat64Histogram
    27  )
    28  
    29  // Value represents a metric value returned by the runtime.
    30  type Value struct {
    31  	kind    ValueKind
    32  	scalar  uint64         // contains scalar values for scalar Kinds.
    33  	pointer unsafe.Pointer // contains non-scalar values.
    34  }
    35  
    36  // Kind returns the tag representing the kind of value this is.
    37  func (v Value) Kind() ValueKind {
    38  	return v.kind
    39  }
    40  
    41  // Uint64 returns the internal uint64 value for the metric.
    42  //
    43  // If v.Kind() != KindUint64, this method panics.
    44  func (v Value) Uint64() uint64 {
    45  	if v.kind != KindUint64 {
    46  		panic("called Uint64 on non-uint64 metric value")
    47  	}
    48  	return v.scalar
    49  }
    50  
    51  // Float64 returns the internal float64 value for the metric.
    52  //
    53  // If v.Kind() != KindFloat64, this method panics.
    54  func (v Value) Float64() float64 {
    55  	if v.kind != KindFloat64 {
    56  		panic("called Float64 on non-float64 metric value")
    57  	}
    58  	return math.Float64frombits(v.scalar)
    59  }
    60  
    61  // Float64Histogram returns the internal *Float64Histogram value for the metric.
    62  //
    63  // If v.Kind() != KindFloat64Histogram, this method panics.
    64  func (v Value) Float64Histogram() *Float64Histogram {
    65  	if v.kind != KindFloat64Histogram {
    66  		panic("called Float64Histogram on non-Float64Histogram metric value")
    67  	}
    68  	return (*Float64Histogram)(v.pointer)
    69  }
    70  

View as plain text