Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
github.com/dogmatiq/spruce v0.2.4
github.com/google/go-cmp v0.7.0
go.opentelemetry.io/otel v1.46.0
go.opentelemetry.io/otel/log v0.20.0
go.opentelemetry.io/otel/log v0.22.0
go.opentelemetry.io/otel/metric v1.46.0
go.opentelemetry.io/otel/trace v1.46.0
golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39
Expand All @@ -22,9 +22,6 @@ require (
require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dogmatiq/jumble v0.1.0 // indirect
github.com/go-logr/logr v1.4.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
golang.org/x/net v0.58.0 // indirect
golang.org/x/sys v0.47.0 // indirect
golang.org/x/text v0.41.0 // indirect
Expand Down
5 changes: 2 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ github.com/dogmatiq/primo v0.4.3 h1:Q6+HzBYuhLhrrwKWkgHb3MOo5JLHTneN+lgmtgGDavI=
github.com/dogmatiq/primo v0.4.3/go.mod h1:Bb1BMVwxC+adAs/Io6tACagI0OvTCGHKNQQ62YtrW1w=
github.com/dogmatiq/spruce v0.2.4 h1:32HqvqvlINlvMKzQ4eWO97+MdI+1CfLfr9RmsTvDphk=
github.com/dogmatiq/spruce v0.2.4/go.mod h1:za5ZdNvh+FRWg4B3DCn8jfNB2LVR/9Dk3fkuHVDJLrk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8=
github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
Expand All @@ -25,8 +24,8 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc=
go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE=
go.opentelemetry.io/otel/log v0.20.0 h1:/5i0vuHxCLWUfChWG41K9wkM0jafruPw9NU1/RCJirs=
go.opentelemetry.io/otel/log v0.20.0/go.mod h1:wOcMcjsZpG8x7Bak7IhSi/lg8wscV2C1VdrKCLPlt0E=
go.opentelemetry.io/otel/log v0.22.0 h1:5DBNnfvaJ6CVdkJ+Jle8Tzs50aSSv49TXGj9XRsEYw0=
go.opentelemetry.io/otel/log v0.22.0/go.mod h1:gzOt/R67vF2GniAqWu8Qv0SXy89f71muHcrkz76PCdc=
go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8=
go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o=
go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c=
Expand Down
21 changes: 10 additions & 11 deletions telemetry/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"github.com/dogmatiq/dogma"
"github.com/dogmatiq/enginekit/protobuf/uuidpb"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/log"
"golang.org/x/exp/constraints"
)

Expand Down Expand Up @@ -136,10 +135,10 @@ func (a Attr) asAttrKeyValue() (attribute.KeyValue, bool) {
}
}

func (a Attr) asLogKeyValue() (log.KeyValue, bool) {
func (a Attr) asLogKeyValue() (attribute.KeyValue, bool) {
switch a.typ {
case attrTypeNone:
return log.KeyValue{}, false
return attribute.KeyValue{}, false
case attrTypeBinary:
data := []byte(a.str)

Expand All @@ -152,21 +151,21 @@ func (a Attr) asLogKeyValue() (log.KeyValue, bool) {
if ch >= ' ' || ch <= '~' {
count++
if count > threshold {
return log.String(a.key, strconv.QuoteToASCII(a.str)), true
return attribute.String(a.key, strconv.QuoteToASCII(a.str)), true
}
}
}

return log.Bytes(a.key, data), true
return attribute.ByteSlice(a.key, data), true

case attrTypeString:
return log.String(a.key, a.str), true
return attribute.String(a.key, a.str), true
case attrTypeBool:
return log.Bool(a.key, a.num != 0), true
return attribute.Bool(a.key, a.num != 0), true
case attrTypeInt64:
return log.Int64(a.key, int64(a.num)), true
return attribute.Int64(a.key, int64(a.num)), true
case attrTypeFloat64:
return log.Float64(a.key, math.Float64frombits(a.num)), true
return attribute.Float64(a.key, math.Float64frombits(a.num)), true
default:
panic("unknown attribute type")
}
Expand Down Expand Up @@ -195,8 +194,8 @@ func asAttrKeyValues(attrs []Attr) []attribute.KeyValue {
return kvs
}

func asLogKeyValues(attrs []Attr) []log.KeyValue {
kvs := make([]log.KeyValue, 0, len(attrs))
func asLogKeyValues(attrs []Attr) []attribute.KeyValue {
kvs := make([]attribute.KeyValue, 0, len(attrs))

for _, attr := range attrs {
if attr, ok := attr.asLogKeyValue(); ok {
Expand Down
4 changes: 2 additions & 2 deletions telemetry/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ func (r *Recorder) log(
var rec log.Record
rec.SetEventName(event)
rec.SetSeverity(severity)
rec.SetBody(log.StringValue(message))
rec.SetBody(attribute.StringValue(message))

if err != nil {
rec.AddAttributes(log.String("error", err.Error()))
rec.AddAttributes(attribute.String("error", err.Error()))
}

rec.AddAttributes(r.logKVs...)
Expand Down
2 changes: 1 addition & 1 deletion telemetry/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type Recorder struct {
meter metric.Meter
logger log.Logger
attrKVs attribute.Set
logKVs []log.KeyValue
logKVs []attribute.KeyValue

errorCount Instrument[int64]
operationCount Instrument[int64]
Expand Down
55 changes: 32 additions & 23 deletions telemetry/slog.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"log/slog"
"strconv"

"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/log"
"go.opentelemetry.io/otel/log/embedded"
)
Expand Down Expand Up @@ -42,9 +43,12 @@ func (l *standardLogger) Emit(ctx context.Context, rec log.Record) {
message = "?"
)

if rec.Body().Kind() == log.KindString {
switch rec.Body().Type() {
case attribute.EMPTY:
// ignore
case attribute.STRING:
message = rec.Body().AsString()
} else if !rec.Body().Empty() {
default:
attrs = append(
attrs,
slogAttrFromLogValue("body", rec.Body()),
Expand All @@ -56,7 +60,7 @@ func (l *standardLogger) Emit(ctx context.Context, rec log.Record) {
}

rec.WalkAttributes(
func(kv log.KeyValue) bool {
func(kv attribute.KeyValue) bool {
attrs = append(
attrs,
slogAttrFromLogValue(kv.Key, kv.Value),
Expand Down Expand Up @@ -104,40 +108,45 @@ func slogLevelFromLogSeverity(sev log.Severity) slog.Level {

// slogAttrFromLogValue converts an OpenTelemetry [log.Value] to an
// [slog.Attr].
func slogAttrFromLogValue(name string, v log.Value) slog.Attr {
switch v.Kind() {
case log.KindEmpty:
return slog.Any(name, nil)
func slogAttrFromLogValue(k attribute.Key, v attribute.Value) slog.Attr {
key := string(k)

switch v.Type() {
case attribute.EMPTY:
return slog.Any(key, nil)

case log.KindBool:
return slog.Bool(name, v.AsBool())
case attribute.BOOL:
return slog.Bool(key, v.AsBool())

case log.KindFloat64:
return slog.Float64(name, v.AsFloat64())
case attribute.FLOAT64:
return slog.Float64(key, v.AsFloat64())

case log.KindInt64:
return slog.Int64(name, v.AsInt64())
case attribute.INT64:
return slog.Int64(key, v.AsInt64())

case log.KindString:
return slog.String(name, v.AsString())
case attribute.STRING:
return slog.String(key, v.AsString())

case log.KindBytes:
return slog.Any(name, v.AsBytes())
case attribute.BYTESLICE:
return slog.Any(key, v.AsByteSlice())

case log.KindSlice:
case attribute.SLICE,
attribute.INT64SLICE,
attribute.FLOAT64SLICE,
attribute.STRINGSLICE:
var attrs []slog.Attr
for i, elem := range v.AsSlice() {
attrs = append(
attrs,
slogAttrFromLogValue(
strconv.Itoa(i),
attribute.Key(strconv.Itoa(i)),
elem,
),
)
}
return slog.GroupAttrs(name, attrs...)
return slog.GroupAttrs(key, attrs...)

case log.KindMap:
case attribute.MAP:
var attrs []slog.Attr
for _, pair := range v.AsMap() {
attrs = append(
Expand All @@ -148,9 +157,9 @@ func slogAttrFromLogValue(name string, v log.Value) slog.Attr {
),
)
}
return slog.GroupAttrs(name, attrs...)
return slog.GroupAttrs(key, attrs...)

default:
return slog.String(name, v.String())
return slog.String(key, v.String())
}
}
Loading