mirror of
https://github.com/hanzoai/telemetry.git
synced 2026-10-30 20:01:49 +00:00
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue.
Ex. Adding a feature - Explain what this achieves.-->
### Description
This PR introduces the foundational changes necessary for supporting
`logs` data in the `mdatagen` tool.
#### mdatagen files for logs
This update includes the generation of `generated_logs.go` and
`generated_logs_test.go`. These files are specifically for receiver and
scraper components that support `logs` data, enabling initial log
handling capabilities.
#### Introducing LogsBuilder
This PR introduced a `LogsBuilder` similar to the existing
`MetricsBuilder`. It provides a structured way to manage log data with
the following functions:
1. `Emit(...ResourceLogsOption)`
Similar to `Emit` function in MetricsBuilder
2. `EmitForResource(...ResourceLogsOption)`
Similar to `EmitForResource` function in MetricsBuilder
3. `AppendLogRecord(plog.LogRecord)`
This function appends a log record to an internal buffer. The buffered
log records are used to construct a `ScopeLog` when the `Emit()` or
`EmitForResource()` functions are called. Scope name and version are
automatically generated.
#### Next steps
* Add more test cases to LogsBuilder (e.g. reading test configs)
* Add LogsBuilderConfig to read logs property in `metadata.yml` to send
structured logs
* Update receivers in contrib to use LogsBuilder.
#### Example usage:
```
lb := NewLogsBuilder(settings)
res := pcommon.NewResource()
res.Attributes().PutStr("region", "us-west-1")
// append the first log record
lr := plog.NewLogRecord()
lr.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
lr.Attributes().PutStr("type", "log")
lr.Body().SetStr("the first log record")
// append the second log record
lr2 := plog.NewLogRecord()
lr2.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
lr2.Attributes().PutStr("type", "event")
lr2.Body().SetStr("the second log record")
lb.AppendLogRecord(lr)
lb.AppendLogRecord(lr2)
logs := lb.Emit(WithLogsResource(res))
```
#### Example output:
```
resourceLogs:
- resource:
attributes:
- key: region
value:
stringValue: us-west-1
scopeLogs:
- logRecords:
- attributes:
- key: type
value:
stringValue: log
body:
stringValue: the first log record
spanId: ""
timeUnixNano: "1742291226022739000"
traceId: ""
- attributes:
- key: type
value:
stringValue: event
body:
stringValue: the second log record
spanId: ""
timeUnixNano: "1742291226022739000"
traceId: ""
scope:
name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscloudwatchreceiver
version: latest
```
<!-- Issue number if applicable -->
### Link to tracking issue
Part of #12571
<!--Describe what testing was performed and which tests were added.-->
### Testing
Added
<!--Describe the documentation added.-->
### Documentation
Added
<!--Please delete paragraphs that you did not use before submitting.-->
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
// Code generated by mdatagen. DO NOT EDIT.
|
|
|
|
package metadata
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zaptest/observer"
|
|
|
|
"go.opentelemetry.io/collector/pdata/pcommon"
|
|
"go.opentelemetry.io/collector/pdata/plog"
|
|
"go.opentelemetry.io/collector/receiver/receivertest"
|
|
)
|
|
|
|
func TestLogsBuilderAppendLogRecord(t *testing.T) {
|
|
observedZapCore, _ := observer.New(zap.WarnLevel)
|
|
settings := receivertest.NewNopSettings(receivertest.NopType)
|
|
settings.Logger = zap.New(observedZapCore)
|
|
lb := NewLogsBuilder(settings)
|
|
|
|
res := pcommon.NewResource()
|
|
|
|
// append the first log record
|
|
lr := plog.NewLogRecord()
|
|
lr.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
|
|
lr.Attributes().PutStr("type", "log")
|
|
lr.Body().SetStr("the first log record")
|
|
|
|
// append the second log record
|
|
lr2 := plog.NewLogRecord()
|
|
lr2.SetTimestamp(pcommon.NewTimestampFromTime(time.Now()))
|
|
lr2.Attributes().PutStr("type", "event")
|
|
lr2.Body().SetStr("the second log record")
|
|
|
|
lb.AppendLogRecord(lr)
|
|
lb.AppendLogRecord(lr2)
|
|
|
|
logs := lb.Emit(WithLogsResource(res))
|
|
assert.Equal(t, 1, logs.ResourceLogs().Len())
|
|
|
|
rl := logs.ResourceLogs().At(0)
|
|
assert.Equal(t, 1, rl.ScopeLogs().Len())
|
|
|
|
sl := rl.ScopeLogs().At(0)
|
|
assert.Equal(t, ScopeName, sl.Scope().Name())
|
|
assert.Equal(t, lb.buildInfo.Version, sl.Scope().Version())
|
|
|
|
assert.Equal(t, 2, sl.LogRecords().Len())
|
|
|
|
attrVal, ok := sl.LogRecords().At(0).Attributes().Get("type")
|
|
assert.True(t, ok)
|
|
assert.Equal(t, "log", attrVal.Str())
|
|
|
|
assert.Equal(t, pcommon.ValueTypeStr, sl.LogRecords().At(0).Body().Type())
|
|
assert.Equal(t, "the first log record", sl.LogRecords().At(0).Body().Str())
|
|
|
|
attrVal, ok = sl.LogRecords().At(1).Attributes().Get("type")
|
|
assert.True(t, ok)
|
|
assert.Equal(t, "event", attrVal.Str())
|
|
|
|
assert.Equal(t, pcommon.ValueTypeStr, sl.LogRecords().At(1).Body().Type())
|
|
assert.Equal(t, "the second log record", sl.LogRecords().At(1).Body().Str())
|
|
}
|