AnyValue is used to represent any type of attribute value. AnyValue may contain a
primitive value such as a string or integer or it may contain an arbitrary nested
object containing arrays, key-value lists and primitives.
ArrayValue is a list of AnyValue messages. We need ArrayValue as a message
since oneof in AnyValue does not allow repeated fields.
InstrumentationScope is a message representing the instrumentation scope information
such as the fully qualified name and version.
KeyValue is a key-value pair that is used to store Span attributes, Link
attributes, etc.
KeyValueList is a list of KeyValue messages. We need KeyValueList as a message
since oneof
in AnyValue does not allow repeated fields. Everywhere else where we need
a list of KeyValue messages (e.g. in Span) we use repeated KeyValue
directly to
avoid unnecessary extra wrapping (which slows down the protocol). The 2 approaches
are semantically equivalent.