-
Notifications
You must be signed in to change notification settings - Fork 176
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature: Generate function and extension logs via Telemetry API receiver #1347
Merged
tylerbenson
merged 22 commits into
open-telemetry:main
from
solarwinds:feature/telemetryapireceiver-configuration
Sep 4, 2024
Merged
Changes from 5 commits
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
bd5dd05
Added WithLogs and its handling
jerrytfleung 63558a8
nits
jerrytfleung 1ae4fdd
Added extensions
jerrytfleung 0f74cbe
Fixed unit tests
jerrytfleung 0c54292
Added unit test cases
jerrytfleung dd2e317
Added config (#26)
jerrytfleung 13a99af
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung 4ff5876
Added severityTextToNumber function
jerrytfleung 730cfc9
Corrected README.md
jerrytfleung 999a7ce
Handled empty types array
jerrytfleung 1190cb5
Added CRITICAL & ALL
jerrytfleung 165cdda
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung 26a3c68
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung 16f92d1
Removed invalid test case
jerrytfleung 2575871
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung a297035
Fixed code after rebase
jerrytfleung 2d33076
Updated README.md
jerrytfleung cdea000
Used time.RFC3339 format
jerrytfleung 166628a
Applied review comments
jerrytfleung 2e03ffe
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung 3b7cda5
Added WARNING, Updated test cases, Added String.ToUpper
jerrytfleung 1bc05fb
Merge branch 'main' into feature/telemetryapireceiver-configuration
jerrytfleung File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
collector/receiver/telemetryapireceiver/internal/sharedcomponent/sharedcomponent.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// Package sharedcomponent exposes util functionality for receivers and exporters | ||
// that need to share state between different signal types instances such as net.Listener or os.File. | ||
package sharedcomponent // import "github.com/open-telemetry/opentelemetry-lambda/collector/receiver/telemetryapireceiver/internal/sharedcomponent" | ||
|
||
import ( | ||
"context" | ||
"sync" | ||
|
||
"go.opentelemetry.io/collector/component" | ||
) | ||
|
||
// SharedComponents a map that keeps reference of all created instances for a given configuration, | ||
// and ensures that the shared state is started and stopped only once. | ||
type SharedComponents struct { | ||
comps map[any]*SharedComponent | ||
} | ||
|
||
// NewSharedComponents returns a new empty SharedComponents. | ||
func NewSharedComponents() *SharedComponents { | ||
return &SharedComponents{ | ||
comps: make(map[any]*SharedComponent), | ||
} | ||
} | ||
|
||
// GetOrAdd returns the already created instance if exists, otherwise creates a new instance | ||
// and adds it to the map of references. | ||
func (scs *SharedComponents) GetOrAdd(key any, create func() component.Component) *SharedComponent { | ||
if c, ok := scs.comps[key]; ok { | ||
return c | ||
} | ||
newComp := &SharedComponent{ | ||
Component: create(), | ||
removeFunc: func() { | ||
delete(scs.comps, key) | ||
}, | ||
} | ||
scs.comps[key] = newComp | ||
return newComp | ||
} | ||
|
||
// SharedComponent ensures that the wrapped component is started and stopped only once. | ||
// When stopped it is removed from the SharedComponents map. | ||
type SharedComponent struct { | ||
component.Component | ||
|
||
startOnce sync.Once | ||
stopOnce sync.Once | ||
removeFunc func() | ||
} | ||
|
||
// Unwrap returns the original component. | ||
func (r *SharedComponent) Unwrap() component.Component { | ||
return r.Component | ||
} | ||
|
||
// Start implements component.Component. | ||
func (r *SharedComponent) Start(ctx context.Context, host component.Host) error { | ||
var err error | ||
r.startOnce.Do(func() { | ||
err = r.Component.Start(ctx, host) | ||
}) | ||
return err | ||
} | ||
|
||
// Shutdown implements component.Component. | ||
func (r *SharedComponent) Shutdown(ctx context.Context) error { | ||
var err error | ||
r.stopOnce.Do(func() { | ||
err = r.Component.Shutdown(ctx) | ||
r.removeFunc() | ||
}) | ||
return err | ||
} |
72 changes: 72 additions & 0 deletions
72
collector/receiver/telemetryapireceiver/internal/sharedcomponent/sharedcomponent_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package sharedcomponent | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
"go.opentelemetry.io/collector/component" | ||
"go.opentelemetry.io/collector/component/componenttest" | ||
) | ||
|
||
var id = component.MustNewID("test") | ||
|
||
func TestNewSharedComponents(t *testing.T) { | ||
comps := NewSharedComponents() | ||
assert.Len(t, comps.comps, 0) | ||
} | ||
|
||
type mockComponent struct { | ||
component.StartFunc | ||
component.ShutdownFunc | ||
} | ||
|
||
func TestSharedComponents_GetOrAdd(t *testing.T) { | ||
nop := &mockComponent{} | ||
createNop := func() component.Component { return nop } | ||
|
||
comps := NewSharedComponents() | ||
got := comps.GetOrAdd(id, createNop) | ||
assert.Len(t, comps.comps, 1) | ||
assert.Same(t, nop, got.Unwrap()) | ||
assert.Same(t, got, comps.GetOrAdd(id, createNop)) | ||
|
||
// Shutdown nop will remove | ||
assert.NoError(t, got.Shutdown(context.Background())) | ||
assert.Len(t, comps.comps, 0) | ||
assert.NotSame(t, got, comps.GetOrAdd(id, createNop)) | ||
} | ||
|
||
func TestSharedComponent(t *testing.T) { | ||
wantErr := errors.New("my error") | ||
calledStart := 0 | ||
calledStop := 0 | ||
comp := &mockComponent{ | ||
StartFunc: func(_ context.Context, _ component.Host) error { | ||
calledStart++ | ||
return wantErr | ||
}, | ||
ShutdownFunc: func(_ context.Context) error { | ||
calledStop++ | ||
return wantErr | ||
}, | ||
} | ||
createComp := func() component.Component { return comp } | ||
|
||
comps := NewSharedComponents() | ||
got := comps.GetOrAdd(id, createComp) | ||
assert.Equal(t, wantErr, got.Start(context.Background(), componenttest.NewNopHost())) | ||
assert.Equal(t, 1, calledStart) | ||
// Second time is not called anymore. | ||
assert.NoError(t, got.Start(context.Background(), componenttest.NewNopHost())) | ||
assert.Equal(t, 1, calledStart) | ||
assert.Equal(t, wantErr, got.Shutdown(context.Background())) | ||
assert.Equal(t, 1, calledStop) | ||
// Second time is not called anymore. | ||
assert.NoError(t, got.Shutdown(context.Background())) | ||
assert.Equal(t, 1, calledStop) | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would want more data protection in this file than I see in the top-level variable for
receivers
, but it looks like the code doesn't read fromreceivers
. As I traced my steps through this code, I started thinking we wouldn't get a benefit from the call toGetOrAdd
receivers. What if we changed that to the following?And if that works we don't have to rely on copying
internal/sharedcomponent
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and actually this is a bit fragile. this means that you cannot use this receiver in lets say, more than one pipeline.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking to reuse the http server.
internal/sharedcomponent
can help to reuse the http server by looking up the receiver using cfg as a key.I was assuming we could have configuration for
telemetryapi
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think
sharedcomponent
could play a role so as to reuse http server and to support multiple instances of telemetry api receiver.Can you take a look to the updated change and let me know your feedback? Thanks!