in exporter/collector/integrationtest/testcases/testcase.go [476:528]
func normalizeSelfObs(t testing.TB, selfObs *protos.SelfObservabilityMetric) {
if selfObs == nil {
return
}
for _, req := range selfObs.CreateTimeSeriesRequests {
normalizeTimeSeriesReqs(t, req)
tss := req.TimeSeries
for _, ts := range tss {
if _, ok := selfObsMetricsToNormalize[ts.Metric.Type]; ok {
// zero out the specific value type
switch value := ts.Points[0].Value.Value.(type) {
case *monitoringpb.TypedValue_Int64Value:
value.Int64Value = 0
case *monitoringpb.TypedValue_DoubleValue:
value.DoubleValue = 0
case *monitoringpb.TypedValue_DistributionValue:
// Only preserve the bucket options and zeroed out counts
for i := range value.DistributionValue.BucketCounts {
value.DistributionValue.BucketCounts[i] = 0
}
value.DistributionValue = &distributionpb.Distribution{
BucketOptions: value.DistributionValue.BucketOptions,
BucketCounts: value.DistributionValue.BucketCounts,
}
default:
t.Logf("Do not know how to normalize typed value type %T", value)
}
}
for k, v := range selfObsLabelsToNormalize {
if _, ok := ts.Metric.Labels[k]; ok {
ts.Metric.Labels[k] = v
}
}
}
// sort time series by (type, labelset)
sort.Slice(tss, func(i, j int) bool {
iMetric := tss[i].Metric
jMetric := tss[j].Metric
if iMetric.Type == jMetric.Type {
// Doesn't need to sorted correctly, just consistently
return fmt.Sprint(iMetric.Labels) < fmt.Sprint(jMetric.Labels)
}
return iMetric.Type < jMetric.Type
})
}
normalizeMetricDescriptorReqs(t, selfObs.CreateMetricDescriptorRequests...)
// sort descriptors by type
sort.Slice(selfObs.CreateMetricDescriptorRequests, func(i, j int) bool {
return selfObs.CreateMetricDescriptorRequests[i].MetricDescriptor.Type <
selfObs.CreateMetricDescriptorRequests[j].MetricDescriptor.Type
})
}