Files
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>javiermolinar
bd5b95a1f3 Bump OTEL collector and opentelemetry-contrib to version 0.123.0 (#4950)
* Bump the opentelemetry-contrib group with 8 updates

Bumps the opentelemetry-contrib group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |
| [github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver](https://github.com/open-telemetry/opentelemetry-collector-contrib) | `0.122.0` | `0.123.0` |


Updates `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

Updates `github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver` from 0.122.0 to 0.123.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector-contrib/compare/v0.122.0...v0.123.0)

---
updated-dependencies:
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
- dependency-name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver
  dependency-version: 0.123.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry-contrib
...

Signed-off-by: dependabot[bot] <[email protected]>

* update other OTEL dependencies

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: javiermolinar <[email protected]>
2025-04-07 11:05:31 +02:00

207 lines
5.7 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package pdatautil // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil"
import (
"encoding/binary"
"math"
"sort"
"sync"
"github.com/cespare/xxhash/v2"
"go.opentelemetry.io/collector/pdata/pcommon"
)
var (
extraByte = []byte{'\xf3'}
keyPrefix = []byte{'\xf4'}
valEmpty = []byte{'\xf5'}
valBytesPrefix = []byte{'\xf6'}
valStrPrefix = []byte{'\xf7'}
valBoolTrue = []byte{'\xf8'}
valBoolFalse = []byte{'\xf9'}
valIntPrefix = []byte{'\xfa'}
valDoublePrefix = []byte{'\xfb'}
valMapPrefix = []byte{'\xfc'}
valMapSuffix = []byte{'\xfd'}
valSlicePrefix = []byte{'\xfe'}
valSliceSuffix = []byte{'\xff'}
emptyHash = [16]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
)
// HashOption is a function that sets an option on the hash calculation.
type HashOption func(*hashWriter)
// WithMap adds a map to the hash calculation.
func WithMap(m pcommon.Map) HashOption {
return func(hw *hashWriter) {
hw.writeMapHash(m)
}
}
// WithValue adds a value to the hash calculation.
func WithValue(v pcommon.Value) HashOption {
return func(hw *hashWriter) {
hw.writeValueHash(v)
}
}
// WithString adds a string to the hash calculation.
func WithString(s string) HashOption {
return func(hw *hashWriter) {
hw.byteBuf = append(hw.byteBuf, valStrPrefix...)
hw.byteBuf = append(hw.byteBuf, s...)
}
}
type hashWriter struct {
byteBuf []byte
keysBuf []string
}
func newHashWriter() *hashWriter {
return &hashWriter{
byteBuf: make([]byte, 0, 512),
keysBuf: make([]string, 0, 16),
}
}
var hashWriterPool = &sync.Pool{
New: func() any { return newHashWriter() },
}
// Hash generates a hash for the provided options and returns the computed hash as a [16]byte.
func Hash(opts ...HashOption) [16]byte {
if len(opts) == 0 {
return emptyHash
}
hw := hashWriterPool.Get().(*hashWriter)
defer hashWriterPool.Put(hw)
hw.byteBuf = hw.byteBuf[:0]
for _, o := range opts {
o(hw)
}
return hw.hashSum128()
}
// Hash64 generates a hash for the provided options and returns the computed hash as a uint64.
func Hash64(opts ...HashOption) uint64 {
hash := Hash(opts...)
return xxhash.Sum64(hash[:])
}
// MapHash return a hash for the provided map.
// Maps with the same underlying key/value pairs in different order produce the same deterministic hash value.
func MapHash(m pcommon.Map) [16]byte {
if m.Len() == 0 {
return emptyHash
}
hw := hashWriterPool.Get().(*hashWriter)
defer hashWriterPool.Put(hw)
hw.byteBuf = hw.byteBuf[:0]
hw.writeMapHash(m)
return hw.hashSum128()
}
// ValueHash return a hash for the provided pcommon.Value.
func ValueHash(v pcommon.Value) [16]byte {
hw := hashWriterPool.Get().(*hashWriter)
defer hashWriterPool.Put(hw)
hw.byteBuf = hw.byteBuf[:0]
hw.writeValueHash(v)
return hw.hashSum128()
}
func (hw *hashWriter) writeMapHash(m pcommon.Map) {
// For each recursive call into this function we want to preserve the previous buffer state
// while also adding new keys to the buffer. nextIndex is the index of the first new key
// added to the buffer for this call of the function.
// This also works for the first non-recursive call of this function because the buffer is always empty
// on the first call due to it being cleared of any added keys at then end of the function.
nextIndex := len(hw.keysBuf)
for k := range m.All() {
hw.keysBuf = append(hw.keysBuf, k)
}
// Get only the newly added keys from the buffer by slicing the buffer from nextIndex to the end
workingKeySet := hw.keysBuf[nextIndex:]
sort.Strings(workingKeySet)
for _, k := range workingKeySet {
v, _ := m.Get(k)
hw.byteBuf = append(hw.byteBuf, keyPrefix...)
hw.byteBuf = append(hw.byteBuf, k...)
hw.writeValueHash(v)
}
// Remove all keys that were added to the buffer during this call of the function
hw.keysBuf = hw.keysBuf[:nextIndex]
}
func (hw *hashWriter) writeValueHash(v pcommon.Value) {
switch v.Type() {
case pcommon.ValueTypeStr:
hw.writeString(v.Str())
case pcommon.ValueTypeBool:
if v.Bool() {
hw.byteBuf = append(hw.byteBuf, valBoolTrue...)
} else {
hw.byteBuf = append(hw.byteBuf, valBoolFalse...)
}
case pcommon.ValueTypeInt:
hw.byteBuf = append(hw.byteBuf, valIntPrefix...)
hw.byteBuf = binary.LittleEndian.AppendUint64(hw.byteBuf, uint64(v.Int()))
case pcommon.ValueTypeDouble:
hw.byteBuf = append(hw.byteBuf, valDoublePrefix...)
hw.byteBuf = binary.LittleEndian.AppendUint64(hw.byteBuf, math.Float64bits(v.Double()))
case pcommon.ValueTypeMap:
hw.byteBuf = append(hw.byteBuf, valMapPrefix...)
hw.writeMapHash(v.Map())
hw.byteBuf = append(hw.byteBuf, valMapSuffix...)
case pcommon.ValueTypeSlice:
sl := v.Slice()
hw.byteBuf = append(hw.byteBuf, valSlicePrefix...)
for i := 0; i < sl.Len(); i++ {
hw.writeValueHash(sl.At(i))
}
hw.byteBuf = append(hw.byteBuf, valSliceSuffix...)
case pcommon.ValueTypeBytes:
hw.byteBuf = append(hw.byteBuf, valBytesPrefix...)
hw.byteBuf = append(hw.byteBuf, v.Bytes().AsRaw()...)
case pcommon.ValueTypeEmpty:
hw.byteBuf = append(hw.byteBuf, valEmpty...)
}
}
func (hw *hashWriter) writeString(s string) {
hw.byteBuf = append(hw.byteBuf, valStrPrefix...)
hw.byteBuf = append(hw.byteBuf, s...)
}
// hashSum128 returns a [16]byte hash sum.
func (hw *hashWriter) hashSum128() [16]byte {
r := [16]byte{}
res := r[:]
h := xxhash.Sum64(hw.byteBuf)
res = binary.LittleEndian.AppendUint64(res[:0], h)
// Append an extra byte to generate another part of the hash sum
hw.byteBuf = append(hw.byteBuf, extraByte...)
h = xxhash.Sum64(hw.byteBuf)
_ = binary.LittleEndian.AppendUint64(res[8:], h)
return r
}