resource.go raw

   1  // Copyright The OpenTelemetry Authors
   2  // SPDX-License-Identifier: Apache-2.0
   3  
   4  package telemetry // import "go.opentelemetry.io/otel/trace/internal/telemetry"
   5  
   6  import (
   7  	"bytes"
   8  	"encoding/json"
   9  	"errors"
  10  	"fmt"
  11  	"io"
  12  )
  13  
  14  // Resource information.
  15  type Resource struct {
  16  	// Attrs are the set of attributes that describe the resource. Attribute
  17  	// keys MUST be unique (it is not allowed to have more than one attribute
  18  	// with the same key).
  19  	Attrs []Attr `json:"attributes,omitempty"`
  20  	// DroppedAttrs is the number of dropped attributes. If the value
  21  	// is 0, then no attributes were dropped.
  22  	DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
  23  }
  24  
  25  // UnmarshalJSON decodes the OTLP formatted JSON contained in data into r.
  26  func (r *Resource) UnmarshalJSON(data []byte) error {
  27  	decoder := json.NewDecoder(bytes.NewReader(data))
  28  
  29  	t, err := decoder.Token()
  30  	if err != nil {
  31  		return err
  32  	}
  33  	if t != json.Delim('{') {
  34  		return errors.New("invalid Resource type")
  35  	}
  36  
  37  	for decoder.More() {
  38  		keyIface, err := decoder.Token()
  39  		if err != nil {
  40  			if errors.Is(err, io.EOF) {
  41  				// Empty.
  42  				return nil
  43  			}
  44  			return err
  45  		}
  46  
  47  		key, ok := keyIface.(string)
  48  		if !ok {
  49  			return fmt.Errorf("invalid Resource field: %#v", keyIface)
  50  		}
  51  
  52  		switch key {
  53  		case "attributes":
  54  			err = decoder.Decode(&r.Attrs)
  55  		case "droppedAttributesCount", "dropped_attributes_count":
  56  			err = decoder.Decode(&r.DroppedAttrs)
  57  		default:
  58  			// Skip unknown.
  59  		}
  60  
  61  		if err != nil {
  62  			return err
  63  		}
  64  	}
  65  	return nil
  66  }
  67