Skip to content

Commit

Permalink
New immutable type for LogRecordFlags structs (#5996)
Browse files Browse the repository at this point in the history
This is not a breaking change since the LogRecordFlags were not yet released

Signed-off-by: Bogdan <[email protected]>

Signed-off-by: Bogdan <[email protected]>
  • Loading branch information
bogdandrutu authored Aug 30, 2022
1 parent 9ba35cd commit 5772e58
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 122 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
### 🚩 Deprecations 🚩

- Deprecate `processorhelper.New[Traces|Metrics|Logs]ProcessorWithCreateSettings` in favor of `processorhelper.New[Traces|Metrics|Logs]Exporter` (#5915)
- Deprecates `LogRecord.Flags()` and `LogRecord.SetFlags()` in favor of `LogRecord.FlagsStruct()`. (#5866)
- Deprecates `LogRecord.Flags()` and `LogRecord.SetFlags()` in favor of `LogRecord.FlagsStruct()` and `LogRecord.SetFlagsStruct()`. (#5972)
- Deprecate `exporterhelper.New[Traces|Metrics|Logs]ExporterWithContext` in favor of `exporterhelper.New[Traces|Metrics|Logs]Exporter` (#5914)
- Deprecate `component.NewExtensionFactoryWithStabilityLevel` in favor of `component.NewExtensionFactory` (#5917)
- Deprecate `plog.SeverityNumber[UPPERCASE]` constants (#5927)
Expand Down
2 changes: 1 addition & 1 deletion exporter/loggingexporter/internal/otlptext/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (textLogsMarshaler) MarshalLogs(ld plog.Logs) ([]byte, error) {
buf.logAttributes("Attributes", lr.Attributes())
buf.logEntry("Trace ID: %s", lr.TraceID().HexString())
buf.logEntry("Span ID: %s", lr.SpanID().HexString())
buf.logEntry("Flags: %d", lr.FlagsStruct().AsRaw())
buf.logEntry("Flags: %d", lr.FlagsStruct())
}
}
}
Expand Down
10 changes: 6 additions & 4 deletions pdata/internal/cmd/pdatagen/internal/log_structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,14 @@ var logRecord = &messageValueStruct{
},
traceIDField,
spanIDField,
&messageValueField{
&primitiveTypedField{
fieldName: "FlagsStruct",
originFieldName: "Flags",
returnMessage: &messageValueStruct{
structName: "LogRecordFlags",
originFullName: "uint32",
returnType: &primitiveType{
structName: "LogRecordFlags",
rawType: "uint32",
defaultVal: "0",
testVal: "1",
},
},
&primitiveField{
Expand Down
2 changes: 1 addition & 1 deletion pdata/internal/generated_wrapper_logs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 0 additions & 23 deletions pdata/internal/wrapper_logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,3 @@ func LogsFromProto(orig otlplogs.LogsData) Logs {
ResourceLogs: orig.ResourceLogs,
}}
}

type LogRecordFlags struct {
orig *uint32
}

func GetOrigLogRecordFlags(ms LogRecordFlags) *uint32 {
return ms.orig
}

func NewLogRecordFlags(orig *uint32) LogRecordFlags {
return LogRecordFlags{orig: orig}
}

func FillTestLogRecordFlags(tv LogRecordFlags) {
*tv.orig = uint32(1)
}

func GenerateTestLogRecordFlags() LogRecordFlags {
var orig uint32
tv := NewLogRecordFlags(&orig)
FillTestLogRecordFlags(tv)
return tv
}
9 changes: 7 additions & 2 deletions pdata/plog/generated_logs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions pdata/plog/generated_logs_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 39 additions & 0 deletions pdata/plog/log_record_flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package plog // import "go.opentelemetry.io/collector/pdata/plog"

const isSampledMask = uint32(1)

var DefaultLogRecordFlags = LogRecordFlags(0)

// LogRecordFlags defines flags for the LogRecord. The 8 least significant bits are the trace flags as
// defined in W3C Trace Context specification. 24 most significant bits are reserved and must be set to 0.
type LogRecordFlags uint32

// IsSampled returns true if the LogRecordFlags contains the TraceFlags.IsSampled flag.
func (ms LogRecordFlags) IsSampled() bool {
return uint32(ms)&isSampledMask != 0
}

// WithIsSampled returns a new LogRecordFlags, with the IsSampled flag set to the given value.
func (ms LogRecordFlags) WithIsSampled(b bool) LogRecordFlags {
orig := uint32(ms)
if b {
orig |= isSampledMask
} else {
orig &^= isSampledMask
}
return LogRecordFlags(orig)
}
41 changes: 41 additions & 0 deletions pdata/plog/log_record_flags_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package plog

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestLogRecordFlags(t *testing.T) {
flags := LogRecordFlags(1)
assert.True(t, flags.IsSampled())
assert.EqualValues(t, uint32(1), flags)

flags = flags.WithIsSampled(false)
assert.False(t, flags.IsSampled())
assert.EqualValues(t, uint32(0), flags)

flags = flags.WithIsSampled(true)
assert.True(t, flags.IsSampled())
assert.EqualValues(t, uint32(1), flags)
}

func TestDefaultLogRecordFlags(t *testing.T) {
flags := DefaultLogRecordFlags
assert.False(t, flags.IsSampled())
assert.EqualValues(t, uint32(0), flags)
}
61 changes: 0 additions & 61 deletions pdata/plog/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,64 +191,3 @@ func (ms LogRecord) Flags() uint32 {
func (ms LogRecord) SetFlags(v uint32) {
ms.getOrig().Flags = v
}

const (
traceFlagsNone = uint32(0)
isSampledMask = uint32(1)
)

// LogRecordFlags defines flags for the LogRecord. 8 least significant bits are the trace flags as
// defined in W3C Trace Context specification. 24 most significant bits are reserved and must be set to 0.
//
// This is a reference type, if passed by value and callee modifies it the caller will see the modification.
//
// Must use NewLogRecordFlags function to create new instances.
// Important: zero-initialized instance is not valid for use.
type LogRecordFlags internal.LogRecordFlags

func newLogRecordFlags(orig *uint32) LogRecordFlags {
return LogRecordFlags(internal.NewLogRecordFlags(orig))
}

func (ms LogRecordFlags) getOrig() *uint32 {
return internal.GetOrigLogRecordFlags(internal.LogRecordFlags(ms))
}

// NewLogRecordFlags creates a new empty LogRecordFlags.
//
// This must be used only in testing code. Users should use "AppendEmpty" when part of a Slice,
// OR directly access the member if this is embedded in another struct.
func NewLogRecordFlags() LogRecordFlags {
return newLogRecordFlags(new(uint32))
}

// MoveTo moves all properties from the current struct to dest resetting the current instance to its zero value
func (ms LogRecordFlags) MoveTo(dest LogRecordFlags) {
*dest.getOrig() = *ms.getOrig()
*ms.getOrig() = traceFlagsNone
}

// CopyTo copies all properties from the current struct to the dest.
func (ms LogRecordFlags) CopyTo(dest LogRecordFlags) {
*dest.getOrig() = *ms.getOrig()
}

// IsSampled returns true if the LogRecordFlags contains the IsSampled flag.
func (ms LogRecordFlags) IsSampled() bool {
return *ms.getOrig()&isSampledMask != 0
}

// SetIsSampled sets the IsSampled flag if true and removes it if false.
// Setting this Flag when it is already set is a no-op.
func (ms LogRecordFlags) SetIsSampled(b bool) {
if b {
*ms.getOrig() |= isSampledMask
} else {
*ms.getOrig() &^= isSampledMask
}
}

// AsRaw converts LogRecordFlags to the OTLP uint32 representation.
func (ms LogRecordFlags) AsRaw() uint32 {
return *ms.getOrig()
}
27 changes: 0 additions & 27 deletions pdata/plog/logs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,33 +132,6 @@ func TestLogsClone(t *testing.T) {
assert.EqualValues(t, logs, logs.Clone())
}

func TestLogRecordFlags(t *testing.T) {
flags := LogRecordFlags(internal.GenerateTestLogRecordFlags())
assert.True(t, flags.IsSampled())
assert.Equal(t, uint32(1), flags.AsRaw())

flags.SetIsSampled(false)
flags.SetIsSampled(false)
assert.False(t, flags.IsSampled())
assert.Equal(t, uint32(0), flags.AsRaw())

flags.SetIsSampled(true)
flags.SetIsSampled(true)
assert.True(t, flags.IsSampled())
assert.Equal(t, uint32(1), flags.AsRaw())

moveFlags := NewLogRecordFlags()
assert.False(t, moveFlags.IsSampled())

flags.MoveTo(moveFlags)
assert.False(t, flags.IsSampled())
assert.True(t, moveFlags.IsSampled())

moveFlags.CopyTo(flags)
assert.True(t, flags.IsSampled())
assert.True(t, moveFlags.IsSampled())
}

func BenchmarkLogsClone(b *testing.B) {
logs := NewLogs()
internal.FillTestResourceLogsSlice(internal.ResourceLogsSlice(logs.ResourceLogs()))
Expand Down

0 comments on commit 5772e58

Please sign in to comment.