@@ -159,9 +159,6 @@ func (s *oxideScraper) Scrape(ctx context.Context) (pmetric.Metrics, error) {
159159 s .scrapeDuration .Record (ctx , elapsed .Seconds ())
160160 s .scrapeCount .Add (ctx , 1 , metric .WithAttributes (attribute .String ("status" , "success" )))
161161
162- // Cargo-culted from https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/googlecloudmonitoringreceiver.
163- // TODO(jmcarp): Can we skip this map?
164- resourceMetricsMap := make (map [string ]pmetric.ResourceMetrics )
165162 for _ , result := range results {
166163 for _ , table := range result .Tables {
167164 for _ , series := range table .Timeseries {
@@ -173,38 +170,23 @@ func (s *oxideScraper) Scrape(ctx context.Context) (pmetric.Metrics, error) {
173170 sort .Strings (labels )
174171 key = fmt .Sprintf ("%s_%s" , key , strings .Join (labels , "::" ))
175172
176- rm , exists := resourceMetricsMap [key ]
177- if ! exists {
178- rm = metrics .ResourceMetrics ().AppendEmpty ()
179- resource := rm .Resource ()
180- for key , value := range series .Fields {
181- switch value .Type {
182- case oxide .FieldValueTypeString :
183- resource .Attributes ().PutStr (key , value .Value .(string ))
184- case oxide .FieldValueTypeI8 , oxide .FieldValueTypeI16 , oxide .FieldValueTypeI32 , oxide .FieldValueTypeI64 ,
185- oxide .FieldValueTypeU8 , oxide .FieldValueTypeU16 , oxide .FieldValueTypeU32 , oxide .FieldValueTypeU64 :
186- intValue , ok := value .Value .(float64 )
187- if ! ok {
188- s .logger .Warn ("couldn't cast label to float" , zap .String ("metric" , table .Name ), zap .String ("field" , key ), zap .Any ("value" , value ))
189- }
190- resource .Attributes ().PutInt (key , int64 (intValue ))
191- default :
192- resource .Attributes ().PutStr (key , fmt .Sprintf ("%v" , value .Value ))
193- }
194- }
195- resourceMetricsMap [key ] = rm
173+ rm := metrics .ResourceMetrics ().AppendEmpty ()
174+ resource := rm .Resource ()
175+
176+ if err := addLabels (series , table , resource ); err != nil {
177+ s .logger .Warn ("failed to parse field labels" , zap .String ("metric" , table .Name ), zap .Error (err ))
178+ s .metricParseErrors .Add (ctx , 1 , metric .WithAttributes (
179+ attribute .String ("metric_name" , table .Name ),
180+ ))
196181 }
197182
198- // Ensure we have a ScopeMetrics to append the metric to
199183 var sm pmetric.ScopeMetrics
200184 if rm .ScopeMetrics ().Len () == 0 {
201185 sm = rm .ScopeMetrics ().AppendEmpty ()
202186 } else {
203- // For simplicity, let's assume all metrics will share the same ScopeMetrics
204187 sm = rm .ScopeMetrics ().At (0 )
205188 }
206189
207- // Create a new Metric
208190 m := sm .Metrics ().AppendEmpty ()
209191
210192 m .SetName (table .Name )
@@ -287,6 +269,29 @@ func (s *oxideScraper) Scrape(ctx context.Context) (pmetric.Metrics, error) {
287269 return metrics , nil
288270}
289271
272+ func addLabels (series oxide.Timeseries , table oxide.OxqlTable , resource pcommon.Resource ) error {
273+ for key , value := range series .Fields {
274+ switch value .Type {
275+ case oxide .FieldValueTypeString :
276+ strValue , ok := value .Value .(string )
277+ if ! ok {
278+ return fmt .Errorf ("couldn't cast label %+v for metric %s to string; got unexpected type %T" , value .Value , table .Name , value .Value )
279+ }
280+ resource .Attributes ().PutStr (key , strValue )
281+ case oxide .FieldValueTypeI8 , oxide .FieldValueTypeI16 , oxide .FieldValueTypeI32 , oxide .FieldValueTypeI64 ,
282+ oxide .FieldValueTypeU8 , oxide .FieldValueTypeU16 , oxide .FieldValueTypeU32 , oxide .FieldValueTypeU64 :
283+ intValue , ok := value .Value .(float64 )
284+ if ! ok {
285+ return fmt .Errorf ("couldn't cast label%+v for metric %s to float64; got unexpected type %T" , value .Value , table .Name , value .Value )
286+ }
287+ resource .Attributes ().PutInt (key , int64 (intValue ))
288+ default :
289+ resource .Attributes ().PutStr (key , fmt .Sprintf ("%v" , value .Value ))
290+ }
291+ }
292+ return nil
293+ }
294+
290295func addHistogram (dataPoints pmetric.HistogramDataPointSlice , quantileGauge pmetric.Gauge , table oxide.OxqlTable , series oxide.Timeseries ) error {
291296 timestamps := series .Points .Timestamps
292297 for idx , point := range series .Points .Values {
0 commit comments