Skip to content

[cmd/opampsupervisor] Emit spans for startup and message handling #38797

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

Open
wants to merge 33 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ea784b2
emit spans for opamp supervisor
bacherfl Mar 18, 2025
e8ae992
pass through context to message handling functions to emit spans
bacherfl Mar 19, 2025
f681353
Merge branch 'main' into feat/38724/emit-spans
bacherfl Mar 19, 2025
a4596a2
add e2e tests for emitting spans
bacherfl Mar 19, 2025
1123c7c
add spans for handling messages from agent
bacherfl Mar 19, 2025
3ba75fd
fix linting
bacherfl Mar 19, 2025
567ec3e
add noop telemetry provider to supervisor tests
bacherfl Mar 20, 2025
e809a47
fix linting
bacherfl Mar 20, 2025
2aff260
fix tests
bacherfl Mar 20, 2025
ed4c2de
remove ineffectual assignments
bacherfl Mar 20, 2025
b934e0d
remove ineffectual assignments
bacherfl Mar 20, 2025
7f0557a
Merge branch 'main' into feat/38724/emit-spans
bacherfl Mar 21, 2025
12eb2b4
add changelog entry
bacherfl Mar 26, 2025
0d0f410
Merge branch 'main' into feat/38724/emit-spans
bacherfl Mar 26, 2025
11683d7
adapt span names to use the same name as the functions
bacherfl Apr 1, 2025
cb53cc9
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 1, 2025
40a08e8
adapt expected span names
bacherfl Apr 1, 2025
c50a7eb
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 2, 2025
fa74b7d
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 3, 2025
e41df4d
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 4, 2025
7e1c526
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 7, 2025
d50ec25
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 8, 2025
cfeb50b
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 14, 2025
f2adf30
Merge branch 'main' into feat/38724/emit-spans
bacherfl Apr 28, 2025
6a5a4fe
Merge branch 'main' into feat/38724/emit-spans
bacherfl May 8, 2025
1934181
Merge branch 'main' into feat/38724/emit-spans
bacherfl May 22, 2025
0ad3720
reduce emitted spans to handle messages from agent and from server
bacherfl May 23, 2025
35761ce
reduce emitted spans to handle messages from agent and from server
bacherfl May 23, 2025
4959459
Merge branch 'main' into feat/38724/emit-spans
bacherfl May 26, 2025
ea01515
adapt e2e tests to removed spans
bacherfl Jun 4, 2025
4f5ba9f
Merge branch 'main' into feat/38724/emit-spans
bacherfl Jun 5, 2025
8e772b2
Merge branch 'main' into feat/38724/emit-spans
bacherfl Jun 24, 2025
0a98d04
Merge branch 'main' into feat/38724/emit-spans
bacherfl Jul 7, 2025
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
27 changes: 27 additions & 0 deletions .chloggen/opamp-supervisor-emit-spans.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
component: opampsupervisor

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Emit spans for handling the startup and the reception of messages

# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
issues: [38724]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# If your change doesn't affect end users or the exported elements of any package,
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []
51 changes: 40 additions & 11 deletions cmd/opampsupervisor/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ import (
"text/template"
"time"

"go.opentelemetry.io/collector/pdata/ptrace"

"github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed"

"github.com/google/uuid"
"github.com/knadh/koanf/parsers/yaml"
"github.com/knadh/koanf/providers/file"
Expand All @@ -44,6 +40,7 @@ import (
"github.com/open-telemetry/opamp-go/server/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/pdata/ptrace"
semconv "go.opentelemetry.io/collector/semconv/v1.21.0"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
Expand All @@ -52,6 +49,7 @@ import (
"github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor"
"github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/config"
"github.com/open-telemetry/opentelemetry-collector-contrib/cmd/opampsupervisor/supervisor/telemetry"
"github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed"
)

var _ clientTypes.Logger = testLogger{}
Expand Down Expand Up @@ -1768,9 +1766,17 @@ func TestSupervisorRemoteConfigApplyStatus(t *testing.T) {
},
})

outputPath := filepath.Join(t.TempDir(), "output.txt")
backend := testbed.NewOTLPHTTPDataReceiver(4318)
mockBackend := testbed.NewMockBackend(outputPath, backend)
mockBackend.EnableRecording()
defer mockBackend.Stop()
require.NoError(t, mockBackend.Start())

s := newSupervisor(t, "report_status", map[string]string{
"url": server.addr,
"config_apply_timeout": "3s",
"telemetryUrl": "localhost:4318",
})
require.Nil(t, s.Start())
defer s.Shutdown()
Expand Down Expand Up @@ -1879,6 +1885,20 @@ func TestSupervisorRemoteConfigApplyStatus(t *testing.T) {
status, ok := remoteConfigStatus.Load().(*protobufs.RemoteConfigStatus)
return ok && status.Status == protobufs.RemoteConfigStatuses_RemoteConfigStatuses_APPLIED
}, 5*time.Second, 10*time.Millisecond, "Remote config status was not set to APPLIED for empty config")

gotSpans := []string{}
expectedSpans := []string{"Start", "getBootstrapInfo", "startOpAMPClient", "startOpAMPServer", "onMessage", "createEffectiveConfigMsg"}
require.EventuallyWithT(t, func(collect *assert.CollectT) {
require.GreaterOrEqual(collect, len(mockBackend.ReceivedTraces), len(expectedSpans))
}, 10*time.Second, 250*time.Millisecond)

for i := 0; i < len(mockBackend.ReceivedTraces); i++ {
gotSpans = append(gotSpans, mockBackend.ReceivedTraces[i].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Name())
}

for _, expectedSpan := range expectedSpans {
require.Contains(t, gotSpans, expectedSpan)
}
}

func TestSupervisorOpAmpServerPort(t *testing.T) {
Expand Down Expand Up @@ -2006,8 +2026,6 @@ func TestSupervisorEmitBootstrapTelemetry(t *testing.T) {
})

outputPath := filepath.Join(t.TempDir(), "output.txt")
_, err = findRandomPort()
require.Nil(t, err)
backend := testbed.NewOTLPHTTPDataReceiver(4318)
mockBackend := testbed.NewMockBackend(outputPath, backend)
mockBackend.EnableRecording()
Expand Down Expand Up @@ -2050,17 +2068,28 @@ func TestSupervisorEmitBootstrapTelemetry(t *testing.T) {
return agentName == command && agentVersion == version
}, 5*time.Second, 250*time.Millisecond)

expectedSpans := []string{"Start", "getBootstrapInfo", "startOpAMPClient", "startOpAMPServer"}

require.EventuallyWithT(t, func(collect *assert.CollectT) {
require.Len(collect, mockBackend.ReceivedTraces, 1)
require.GreaterOrEqual(collect, len(mockBackend.ReceivedTraces), len(expectedSpans))
}, 10*time.Second, 250*time.Millisecond)

require.Equal(t, 1, mockBackend.ReceivedTraces[0].ResourceSpans().Len())
gotServiceName, ok := mockBackend.ReceivedTraces[0].ResourceSpans().At(0).Resource().Attributes().Get(semconv.AttributeServiceName)
require.True(t, ok)
require.Equal(t, "opamp-supervisor", gotServiceName.Str())

require.Equal(t, 1, mockBackend.ReceivedTraces[0].ResourceSpans().At(0).ScopeSpans().Len())
require.Equal(t, 1, mockBackend.ReceivedTraces[0].ResourceSpans().At(0).ScopeSpans().At(0).Spans().Len())
require.Equal(t, "GetBootstrapInfo", mockBackend.ReceivedTraces[0].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Name())
require.Equal(t, ptrace.StatusCodeOk, mockBackend.ReceivedTraces[0].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Status().Code())
for _, expectedSpan := range expectedSpans {
gotSpan := false
for i := 0; i < len(mockBackend.ReceivedTraces); i++ {
require.Equal(t, 1, mockBackend.ReceivedTraces[i].ResourceSpans().At(0).ScopeSpans().Len())
require.Equal(t, 1, mockBackend.ReceivedTraces[i].ResourceSpans().At(0).ScopeSpans().At(0).Spans().Len())
if mockBackend.ReceivedTraces[i].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Name() != expectedSpan {
continue
}
gotSpan = true
require.Equal(t, ptrace.StatusCodeOk, mockBackend.ReceivedTraces[i].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Status().Code())
}
require.True(t, gotSpan)
}
}
Loading
Loading