Files
MarioandGitHub e0354d1bed Update Prometheus to v0.307.2, OTel collector contrib to v0.138.0, OTel to v1.44.0 (#5810)
* Update Prometheus to v0.307.2

* Update otel collector

* Update OTel collector
2025-10-28 11:30:17 +01:00

274 lines
7.4 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package otelzap // import "go.opentelemetry.io/contrib/bridges/otelzap"
import (
"time"
"go.opentelemetry.io/otel/log"
"go.uber.org/zap/zapcore"
)
var (
_ zapcore.ObjectEncoder = (*objectEncoder)(nil)
_ zapcore.ArrayEncoder = (*arrayEncoder)(nil)
)
type namespace struct {
name string
attrs []log.KeyValue
next *namespace
}
// objectEncoder implements zapcore.ObjectEncoder.
// It encodes given fields to OTel key-values.
type objectEncoder struct {
// root is a pointer to the default namespace
root *namespace
// cur is a pointer to the namespace we're currently writing to.
cur *namespace
}
func newObjectEncoder(n int) *objectEncoder {
keyval := make([]log.KeyValue, 0, n)
m := &namespace{
attrs: keyval,
}
return &objectEncoder{
root: m,
cur: m,
}
}
// It iterates to the end of the linked list and appends namespace data.
// Run this function before accessing complete result.
func (m *objectEncoder) calculate(o *namespace) {
if o.next == nil {
return
}
m.calculate(o.next)
o.attrs = append(o.attrs, log.Map(o.next.name, o.next.attrs...))
}
func (m *objectEncoder) AddArray(key string, v zapcore.ArrayMarshaler) error {
arr := newArrayEncoder()
err := v.MarshalLogArray(arr)
m.cur.attrs = append(m.cur.attrs, log.Slice(key, arr.elems...))
return err
}
func (m *objectEncoder) AddObject(k string, v zapcore.ObjectMarshaler) error {
// Similar to console_encoder which uses capacity of 2:
// https://github.com/uber-go/zap/blob/bd0cf0447951b77aa98dcfc1ac19e6f58d3ee64f/zapcore/console_encoder.go#L33.
newobj := newObjectEncoder(2)
err := v.MarshalLogObject(newobj)
newobj.calculate(newobj.root)
m.cur.attrs = append(m.cur.attrs, log.Map(k, newobj.root.attrs...))
return err
}
func (m *objectEncoder) AddBinary(k string, v []byte) {
m.cur.attrs = append(m.cur.attrs, log.Bytes(k, v))
}
func (m *objectEncoder) AddByteString(k string, v []byte) {
m.cur.attrs = append(m.cur.attrs, log.String(k, string(v)))
}
func (m *objectEncoder) AddBool(k string, v bool) {
m.cur.attrs = append(m.cur.attrs, log.Bool(k, v))
}
func (m *objectEncoder) AddDuration(k string, v time.Duration) {
m.AddInt64(k, v.Nanoseconds())
}
func (m *objectEncoder) AddComplex128(k string, v complex128) {
r := log.Float64("r", real(v))
i := log.Float64("i", imag(v))
m.cur.attrs = append(m.cur.attrs, log.Map(k, r, i))
}
func (m *objectEncoder) AddFloat64(k string, v float64) {
m.cur.attrs = append(m.cur.attrs, log.Float64(k, v))
}
func (m *objectEncoder) AddInt64(k string, v int64) {
m.cur.attrs = append(m.cur.attrs, log.Int64(k, v))
}
func (m *objectEncoder) AddInt(k string, v int) {
m.cur.attrs = append(m.cur.attrs, log.Int(k, v))
}
func (m *objectEncoder) AddString(k, v string) {
m.cur.attrs = append(m.cur.attrs, log.String(k, v))
}
func (m *objectEncoder) AddUint64(k string, v uint64) {
m.cur.attrs = append(m.cur.attrs,
log.KeyValue{
Key: k,
Value: assignUintValue(v),
})
}
func (m *objectEncoder) AddReflected(k string, v any) error {
m.cur.attrs = append(m.cur.attrs,
log.KeyValue{
Key: k,
Value: convertValue(v),
})
return nil
}
// OpenNamespace opens an isolated namespace where all subsequent fields will
// be added.
func (m *objectEncoder) OpenNamespace(k string) {
keyValue := make([]log.KeyValue, 0, 5)
s := &namespace{
name: k,
attrs: keyValue,
}
m.cur.next = s
m.cur = s
}
func (m *objectEncoder) AddComplex64(k string, v complex64) {
m.AddComplex128(k, complex128(v))
}
func (m *objectEncoder) AddTime(k string, v time.Time) {
m.AddInt64(k, v.UnixNano())
}
func (m *objectEncoder) AddFloat32(k string, v float32) {
m.AddFloat64(k, float64(v))
}
func (m *objectEncoder) AddInt32(k string, v int32) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddInt16(k string, v int16) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddInt8(k string, v int8) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddUint(k string, v uint) {
m.AddUint64(k, uint64(v))
}
func (m *objectEncoder) AddUint32(k string, v uint32) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddUint16(k string, v uint16) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddUint8(k string, v uint8) {
m.AddInt64(k, int64(v))
}
func (m *objectEncoder) AddUintptr(k string, v uintptr) {
m.AddUint64(k, uint64(v))
}
func assignUintValue(v uint64) log.Value {
const maxInt64 = ^uint64(0) >> 1
if v > maxInt64 {
return log.Float64Value(float64(v))
}
return log.Int64Value(int64(v))
}
// arrayEncoder implements [zapcore.ArrayEncoder].
type arrayEncoder struct {
elems []log.Value
}
func newArrayEncoder() *arrayEncoder {
return &arrayEncoder{
// Similar to console_encoder which uses capacity of 2:
// https://github.com/uber-go/zap/blob/bd0cf0447951b77aa98dcfc1ac19e6f58d3ee64f/zapcore/console_encoder.go#L33.
elems: make([]log.Value, 0, 2),
}
}
func (a *arrayEncoder) AppendArray(v zapcore.ArrayMarshaler) error {
arr := newArrayEncoder()
err := v.MarshalLogArray(arr)
a.elems = append(a.elems, log.SliceValue(arr.elems...))
return err
}
func (a *arrayEncoder) AppendObject(v zapcore.ObjectMarshaler) error {
// Similar to console_encoder which uses capacity of 2:
// https://github.com/uber-go/zap/blob/bd0cf0447951b77aa98dcfc1ac19e6f58d3ee64f/zapcore/console_encoder.go#L33.
m := newObjectEncoder(2)
err := v.MarshalLogObject(m)
m.calculate(m.root)
a.elems = append(a.elems, log.MapValue(m.root.attrs...))
return err
}
func (a *arrayEncoder) AppendReflected(v any) error {
a.elems = append(a.elems, convertValue(v))
return nil
}
func (a *arrayEncoder) AppendByteString(v []byte) {
a.elems = append(a.elems, log.StringValue(string(v)))
}
func (a *arrayEncoder) AppendBool(v bool) {
a.elems = append(a.elems, log.BoolValue(v))
}
func (a *arrayEncoder) AppendFloat64(v float64) {
a.elems = append(a.elems, log.Float64Value(v))
}
func (a *arrayEncoder) AppendFloat32(v float32) {
a.AppendFloat64(float64(v))
}
func (a *arrayEncoder) AppendInt(v int) {
a.elems = append(a.elems, log.IntValue(v))
}
func (a *arrayEncoder) AppendInt64(v int64) {
a.elems = append(a.elems, log.Int64Value(v))
}
func (a *arrayEncoder) AppendString(v string) {
a.elems = append(a.elems, log.StringValue(v))
}
func (a *arrayEncoder) AppendComplex128(v complex128) {
r := log.Float64("r", real(v))
i := log.Float64("i", imag(v))
a.elems = append(a.elems, log.MapValue(r, i))
}
func (a *arrayEncoder) AppendUint64(v uint64) {
a.elems = append(a.elems, assignUintValue(v))
}
func (a *arrayEncoder) AppendComplex64(v complex64) { a.AppendComplex128(complex128(v)) }
func (a *arrayEncoder) AppendDuration(v time.Duration) { a.AppendInt64(v.Nanoseconds()) }
func (a *arrayEncoder) AppendInt32(v int32) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendInt16(v int16) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendInt8(v int8) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendTime(v time.Time) { a.AppendInt64(v.UnixNano()) }
func (a *arrayEncoder) AppendUint(v uint) { a.AppendUint64(uint64(v)) }
func (a *arrayEncoder) AppendUint32(v uint32) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendUint16(v uint16) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendUint8(v uint8) { a.AppendInt64(int64(v)) }
func (a *arrayEncoder) AppendUintptr(v uintptr) { a.AppendUint64(uint64(v)) }