Skip to content

Commit bc3f840

Browse files
Implementation of awslambdareceiver (#44198)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description Follow up of #43898 This is the implementation of the new awslambdareceiver. For better PR readability, the new components functionality will be split in different PRs. Current PR adds support for receiving logs and metrics from S3 <!-- Issue number (e.g. #1234) or full URL to issue, if applicable. --> #### Link to tracking issue Fixes #43504 <!--Describe what testing was performed and which tests were added.--> #### Testing <!--Describe the documentation added.--> #### Documentation <!--Please delete paragraphs that you did not use before submitting.--> --------- Co-authored-by: Andrew Wilkins <axwalk@gmail.com>
1 parent f63b4d3 commit bc3f840

20 files changed

Lines changed: 1951 additions & 46 deletions
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: new_component
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. receiver/filelog)
7+
component: receiver/awslambda
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Implementation of the AWS Lambda Receiver.
11+
12+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
13+
issues: [43504]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# If your change doesn't affect end users or the exported elements of any package,
21+
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
22+
# Optional: The change log or logs in which this entry should be included.
23+
# e.g. '[user]' or '[user, api]'
24+
# Include 'user' if the change is relevant to end users.
25+
# Include 'api' if there is a change to a library API.
26+
# Default: '[user]'
27+
change_logs: []

receiver/awslambdareceiver/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<!-- status autogenerated section -->
33
| Status | |
44
| ------------- |-----------|
5-
| Stability | [development]: logs |
5+
| Stability | [development]: logs, metrics |
66
| Distributions | [] |
77
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Areceiver%2Fawslambda%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Areceiver%2Fawslambda) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Areceiver%2Fawslambda%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Areceiver%2Fawslambda) |
88
| Code coverage | [![codecov](https://codecov.io/github/open-telemetry/opentelemetry-collector-contrib/graph/main/badge.svg?component=receiver_awslambda)](https://app.codecov.io/gh/open-telemetry/opentelemetry-collector-contrib/tree/main/?components%5B0%5D=receiver_awslambda&displayType=list) |
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package awslambdareceiver
5+
6+
import (
7+
"context"
8+
"encoding/json"
9+
"testing"
10+
11+
"github.com/aws/aws-lambda-go/events"
12+
"github.com/stretchr/testify/require"
13+
"go.opentelemetry.io/collector/pdata/plog"
14+
"go.uber.org/mock/gomock"
15+
"go.uber.org/zap"
16+
17+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awslambdareceiver/internal"
18+
)
19+
20+
func BenchmarkHandleS3Notification(b *testing.B) {
21+
bucket := "test-bucket"
22+
object := "test-file.txt"
23+
24+
event := events.S3Event{
25+
Records: []events.S3EventRecord{
26+
{
27+
EventSource: "aws:s3",
28+
S3: events.S3Entity{
29+
Bucket: events.S3Bucket{Name: bucket, Arn: "arn:aws:s3:::test-bucket"},
30+
Object: events.S3Object{Key: object},
31+
},
32+
},
33+
},
34+
}
35+
data, err := json.Marshal(event)
36+
require.NoError(b, err)
37+
38+
service := internal.NewMockS3Service(gomock.NewController(b))
39+
service.EXPECT().ReadObject(gomock.Any(), bucket, object).Return([]byte(mockContent), nil).AnyTimes()
40+
41+
consumer := noOpLogsConsumer{}
42+
// Wrap the consumer to match the new s3EventConsumerFunc signature
43+
logsConsumer := func(ctx context.Context, event events.S3EventRecord, logs plog.Logs) error {
44+
setObservedTimestampForAllLogs(logs, event.EventTime)
45+
return consumer.ConsumeLogs(ctx, logs)
46+
}
47+
handler := newS3Handler(service, zap.NewNop(), mockS3LogUnmarshaler{}.UnmarshalLogs, logsConsumer)
48+
49+
b.Run("HandleS3Event", func(b *testing.B) {
50+
b.ReportAllocs()
51+
for i := 0; i < b.N; i++ {
52+
err = handler.handle(b.Context(), data)
53+
require.NoError(b, err)
54+
}
55+
})
56+
}

receiver/awslambdareceiver/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ import (
77
"go.opentelemetry.io/collector/component"
88
)
99

10+
const (
11+
awsLogsEncoding = "awslogs_encoding"
12+
s3ARNPrefix = "arn:aws:s3:::"
13+
)
14+
1015
type Config struct {
1116
// S3Encoding identifies the encoding of the S3 objects that trigger the Lambda.
1217
//

receiver/awslambdareceiver/config_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ func TestLoadConfig(t *testing.T) {
2828
expectError string
2929
}{
3030
{
31-
id: component.NewIDWithName(metadata.Type, "awslogs_encoding"),
31+
id: component.NewIDWithName(metadata.Type, awsLogsEncoding),
3232
expected: &Config{
33-
S3Encoding: "awslogs_encoding",
33+
S3Encoding: awsLogsEncoding,
3434
},
3535
},
3636
{

receiver/awslambdareceiver/factory.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ func NewFactory() receiver.Factory {
1717
return receiver.NewFactory(
1818
metadata.Type,
1919
createDefaultConfig,
20-
receiver.WithLogs(createLogsReceiver, metadata.LogsStability))
20+
receiver.WithLogs(createLogsReceiver, metadata.LogsStability),
21+
receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability),
22+
)
2123
}
2224

2325
func createLogsReceiver(
@@ -26,5 +28,14 @@ func createLogsReceiver(
2628
cfg component.Config,
2729
consumer consumer.Logs,
2830
) (receiver.Logs, error) {
29-
return newAWSLambdaReceiver(cfg.(*Config), &settings, consumer), nil
31+
return newLogsReceiver(cfg.(*Config), settings, consumer)
32+
}
33+
34+
func createMetricsReceiver(
35+
_ context.Context,
36+
settings receiver.Settings,
37+
cfg component.Config,
38+
consumer consumer.Metrics,
39+
) (receiver.Metrics, error) {
40+
return newMetricsReceiver(cfg.(*Config), settings, consumer)
3041
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
package awslambdareceiver
4+
5+
import (
6+
"testing"
7+
8+
"github.com/stretchr/testify/require"
9+
"go.opentelemetry.io/collector/consumer/consumertest"
10+
"go.opentelemetry.io/collector/receiver/receivertest"
11+
12+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awslambdareceiver/internal/metadata"
13+
)
14+
15+
func TestCreateLogsReceiver(t *testing.T) {
16+
cfg := createDefaultConfig()
17+
18+
r, err := createLogsReceiver(t.Context(), receivertest.NewNopSettings(metadata.Type), cfg, consumertest.NewNop())
19+
require.NoError(t, err)
20+
require.NotNil(t, r)
21+
}

receiver/awslambdareceiver/generated_component_test.go

Lines changed: 7 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/awslambdareceiver/go.mod

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,46 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awslam
33
go 1.24.0
44

55
require (
6+
github.com/aws/aws-lambda-go v1.50.0
7+
github.com/aws/aws-sdk-go-v2/config v1.31.19
8+
github.com/aws/aws-sdk-go-v2/service/s3 v1.90.1
9+
github.com/goccy/go-json v0.10.5
610
github.com/stretchr/testify v1.11.1
711
go.opentelemetry.io/collector/component v1.46.0
812
go.opentelemetry.io/collector/component/componenttest v0.140.0
913
go.opentelemetry.io/collector/confmap v1.46.0
1014
go.opentelemetry.io/collector/confmap/xconfmap v0.140.0
1115
go.opentelemetry.io/collector/consumer v1.46.0
16+
go.opentelemetry.io/collector/consumer/consumererror v0.140.0
1217
go.opentelemetry.io/collector/consumer/consumertest v0.140.0
18+
go.opentelemetry.io/collector/extension v1.46.0
1319
go.opentelemetry.io/collector/pdata v1.46.0
1420
go.opentelemetry.io/collector/receiver v1.46.0
1521
go.opentelemetry.io/collector/receiver/receivertest v0.140.0
22+
go.opentelemetry.io/otel v1.38.0
1623
go.uber.org/goleak v1.3.0
24+
go.uber.org/mock v0.6.0
1725
go.uber.org/zap v1.27.0
1826
)
1927

2028
require (
21-
github.com/davecgh/go-spew v1.1.1 // indirect
29+
github.com/aws/aws-sdk-go-v2 v1.39.6 // indirect
30+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect
31+
github.com/aws/aws-sdk-go-v2/credentials v1.18.23 // indirect
32+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 // indirect
33+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect
34+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect
35+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
36+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.13 // indirect
37+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect
38+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.4 // indirect
39+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 // indirect
40+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.13 // indirect
41+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.2 // indirect
42+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.6 // indirect
43+
github.com/aws/aws-sdk-go-v2/service/sts v1.40.1 // indirect
44+
github.com/aws/smithy-go v1.23.2 // indirect
45+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2246
github.com/go-logr/logr v1.4.3 // indirect
2347
github.com/go-logr/stdr v1.2.2 // indirect
2448
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
@@ -33,15 +57,13 @@ require (
3357
github.com/mitchellh/reflectwalk v1.0.2 // indirect
3458
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3559
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
36-
github.com/pmezard/go-difflib v1.0.0 // indirect
60+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
3761
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
38-
go.opentelemetry.io/collector/consumer/consumererror v0.140.0 // indirect
3962
go.opentelemetry.io/collector/consumer/xconsumer v0.140.0 // indirect
4063
go.opentelemetry.io/collector/featuregate v1.46.0 // indirect
4164
go.opentelemetry.io/collector/pdata/pprofile v0.140.0 // indirect
4265
go.opentelemetry.io/collector/pipeline v1.46.0 // indirect
4366
go.opentelemetry.io/collector/receiver/xreceiver v0.140.0 // indirect
44-
go.opentelemetry.io/otel v1.38.0 // indirect
4567
go.opentelemetry.io/otel/metric v1.38.0 // indirect
4668
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
4769
go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect

receiver/awslambdareceiver/go.sum

Lines changed: 48 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)