|
- // Copyright 2013 The Prometheus Authors
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package model
-
- import (
- "encoding/json"
- "fmt"
- "math"
- "strconv"
- )
-
- var (
- // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a
- // non-existing sample pair. It is a SamplePair with timestamp Earliest and
- // value 0.0. Note that the natural zero value of SamplePair has a timestamp
- // of 0, which is possible to appear in a real SamplePair and thus not
- // suitable to signal a non-existing SamplePair.
- ZeroSamplePair = SamplePair{Timestamp: Earliest}
- )
-
- // A SampleValue is a representation of a value for a given sample at a given
- // time.
- type SampleValue float64
-
- // MarshalJSON implements json.Marshaler.
- func (v SampleValue) MarshalJSON() ([]byte, error) {
- return json.Marshal(v.String())
- }
-
- // UnmarshalJSON implements json.Unmarshaler.
- func (v *SampleValue) UnmarshalJSON(b []byte) error {
- if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
- return fmt.Errorf("sample value must be a quoted string")
- }
- f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
- if err != nil {
- return err
- }
- *v = SampleValue(f)
- return nil
- }
-
- // Equal returns true if the value of v and o is equal or if both are NaN. Note
- // that v==o is false if both are NaN. If you want the conventional float
- // behavior, use == to compare two SampleValues.
- func (v SampleValue) Equal(o SampleValue) bool {
- if v == o {
- return true
- }
- return math.IsNaN(float64(v)) && math.IsNaN(float64(o))
- }
-
- func (v SampleValue) String() string {
- return strconv.FormatFloat(float64(v), 'f', -1, 64)
- }
-
- // SamplePair pairs a SampleValue with a Timestamp.
- type SamplePair struct {
- Timestamp Time
- Value SampleValue
- }
-
- func (s SamplePair) MarshalJSON() ([]byte, error) {
- t, err := json.Marshal(s.Timestamp)
- if err != nil {
- return nil, err
- }
- v, err := json.Marshal(s.Value)
- if err != nil {
- return nil, err
- }
- return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil
- }
-
- // UnmarshalJSON implements json.Unmarshaler.
- func (s *SamplePair) UnmarshalJSON(b []byte) error {
- v := [...]json.Unmarshaler{&s.Timestamp, &s.Value}
- return json.Unmarshal(b, &v)
- }
-
- // Equal returns true if this SamplePair and o have equal Values and equal
- // Timestamps. The semantics of Value equality is defined by SampleValue.Equal.
- func (s *SamplePair) Equal(o *SamplePair) bool {
- return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp))
- }
-
- func (s SamplePair) String() string {
- return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp)
- }
|