mirror of https://github.com/prometheus/prometheus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
// Copyright 2022 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 jsonutil |
|
|
|
import ( |
|
"math" |
|
"strconv" |
|
|
|
jsoniter "github.com/json-iterator/go" |
|
) |
|
|
|
// MarshalTimestamp marshals a point timestamp using the passed jsoniter stream. |
|
func MarshalTimestamp(t int64, stream *jsoniter.Stream) { |
|
// Write out the timestamp as a float divided by 1000. |
|
// This is ~3x faster than converting to a float. |
|
if t < 0 { |
|
stream.WriteRaw(`-`) |
|
t = -t |
|
} |
|
stream.WriteInt64(t / 1000) |
|
fraction := t % 1000 |
|
if fraction != 0 { |
|
stream.WriteRaw(`.`) |
|
if fraction < 100 { |
|
stream.WriteRaw(`0`) |
|
} |
|
if fraction < 10 { |
|
stream.WriteRaw(`0`) |
|
} |
|
stream.WriteInt64(fraction) |
|
} |
|
} |
|
|
|
// MarshalValue marshals a point value using the passed jsoniter stream. |
|
func MarshalValue(v float64, stream *jsoniter.Stream) { |
|
stream.WriteRaw(`"`) |
|
// Taken from https://github.com/json-iterator/go/blob/master/stream_float.go#L71 as a workaround |
|
// to https://github.com/json-iterator/go/issues/365 (jsoniter, to follow json standard, doesn't allow inf/nan). |
|
buf := stream.Buffer() |
|
abs := math.Abs(v) |
|
fmt := byte('f') |
|
// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. |
|
if abs != 0 { |
|
if abs < 1e-6 || abs >= 1e21 { |
|
fmt = 'e' |
|
} |
|
} |
|
buf = strconv.AppendFloat(buf, v, fmt, -1, 64) |
|
stream.SetBuffer(buf) |
|
stream.WriteRaw(`"`) |
|
}
|
|
|