From e781cdd1359d23f244661109bc6c67aa22cdfb5d Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Tue, 19 Apr 2022 15:12:16 -0400 Subject: [PATCH] Ignore staleness markers (#300) * ignore staleness markers * handle stale NaN if they are integers * handle stale sum+count NaNs in histograms --- go.mod | 1 + go.sum | 2 ++ metrics_proto.go | 16 ++++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/go.mod b/go.mod index 05d9ddf..79ad052 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/google/go-cmp v0.5.6 github.com/jstemmer/go-junit-report v0.9.1 + github.com/prometheus/prometheus v2.5.0+incompatible go.opencensus.io v0.23.0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 diff --git a/go.sum b/go.sum index 5b4a312..347d632 100644 --- a/go.sum +++ b/go.sum @@ -176,6 +176,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/prometheus v2.5.0+incompatible h1:7QPitgO2kOFG8ecuRn9O/4L9+10He72rVRJvMXrE9Hg= +github.com/prometheus/prometheus v2.5.0+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= diff --git a/metrics_proto.go b/metrics_proto.go index e23c70f..426f124 100644 --- a/metrics_proto.go +++ b/metrics_proto.go @@ -23,6 +23,7 @@ import ( "context" "errors" "fmt" + "math" "path" "strings" @@ -32,6 +33,7 @@ import ( metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" timestamppb "github.com/golang/protobuf/ptypes/timestamp" + promvalue "github.com/prometheus/prometheus/pkg/value" distributionpb "google.golang.org/genproto/googleapis/api/distribution" labelpb "google.golang.org/genproto/googleapis/api/label" googlemetricpb "google.golang.org/genproto/googleapis/api/metric" @@ -481,6 +483,10 @@ func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { return nil, fmt.Errorf("protoToMetricPoint: unknown Data type: %T", value) case *metricspb.Point_Int64Value: + // drop handle stale NaNs that were cast to integers + if isStaleInt64(v.Int64Value) { + return nil, nil + } return &monitoringpb.TypedValue{ Value: &monitoringpb.TypedValue_Int64Value{ Int64Value: v.Int64Value, @@ -488,6 +494,9 @@ func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { }, nil case *metricspb.Point_DoubleValue: + if promvalue.IsStaleNaN(v.DoubleValue) { + return nil, nil + } return &monitoringpb.TypedValue{ Value: &monitoringpb.TypedValue_DoubleValue{ DoubleValue: v.DoubleValue, @@ -498,6 +507,9 @@ func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { dv := v.DistributionValue var mv *monitoringpb.TypedValue_DistributionValue if dv != nil { + if isStaleInt64(dv.Count) || promvalue.IsStaleNaN(dv.Sum) { + return nil, nil + } var mean float64 if dv.Count > 0 { mean = float64(dv.Sum) / float64(dv.Count) @@ -534,6 +546,10 @@ func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { } } +func isStaleInt64(v int64) bool { + return v == int64(math.Float64frombits(promvalue.StaleNaN)) +} + func bucketCounts(buckets []*metricspb.DistributionValue_Bucket) []int64 { bucketCounts := make([]int64, len(buckets)) for i, bucket := range buckets {