Skip to content
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

Remove URL-rewriting hack #1519

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
53 changes: 16 additions & 37 deletions pkg/extension/opampextension/opamp_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,10 @@ import (
"context"
"fmt"
"net/http"
"net/url"
"os"
"path/filepath"
"reflect"
"runtime"
"strings"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/confmap"
Expand All @@ -46,6 +44,8 @@ import (
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension"
)

const DefaultSumoLogicOpAmpURL = "wss://opamp-events.sumologic.com/v1/opamp"

type opampAgent struct {
cfg *Config
host component.Host
Expand Down Expand Up @@ -103,13 +103,9 @@ func (o *opampAgent) Start(ctx context.Context, host component.Host) error {
return err
}

var baseURL string
if o.authExtension != nil {
baseURL = o.authExtension.BaseURL()
}

if err := o.setEndpoint(baseURL); err != nil {
return err
o.endpoint = o.cfg.Endpoint
if o.endpoint == "" {
o.endpoint = DefaultSumoLogicOpAmpURL
}

if o.authExtension == nil {
Expand Down Expand Up @@ -156,7 +152,7 @@ func (o *opampAgent) Reload(ctx context.Context) error {
return o.Start(ctx, o.host)
}

func (o *opampAgent) startClient(ctx context.Context) error {
func (o *opampAgent) startSettings() types.StartSettings {
settings := types.StartSettings{
Header: o.authHeader,
OpAMPServerURL: o.endpoint,
Expand Down Expand Up @@ -184,6 +180,16 @@ func (o *opampAgent) startClient(ctx context.Context) error {
Capabilities: o.getAgentCapabilities(),
}

if settings.OpAMPServerURL == "" {
settings.OpAMPServerURL = DefaultSumoLogicOpAmpURL
}

return settings
}

func (o *opampAgent) startClient(ctx context.Context) error {
settings := o.startSettings()

o.logger.Debug("Starting OpAMP client...")

if err := o.opampClient.Start(ctx, settings); err != nil {
Expand Down Expand Up @@ -252,33 +258,6 @@ func (o *opampAgent) watchCredentials(ctx context.Context, callback func(ctx con
return nil
}

// setEndpoint sets the OpAMP endpoint based on the collector endpoint.
// This is a hack, and it should be removed when the backend is able to
// correctly redirect our OpAMP client to the correct URL.
func (o *opampAgent) setEndpoint(baseURL string) error {
if baseURL == "" {
o.endpoint = o.cfg.Endpoint
return nil
}
u, err := url.Parse(baseURL)
if err != nil {
return fmt.Errorf("url error, cannot set opamp endpoint: %s", err)
}

u.Scheme = "wss"
u.Path = "/v1/opamp"

// These replacements are specific to Sumo Logic's current domain naming,
// and are made provisionally for the OTRM beta. In the future, the backend
// will inform the agent of the correct OpAMP URL to use.
u.Host = strings.Replace(u.Host, "open-events", "opamp-events", 1)
u.Host = strings.Replace(u.Host, "open-collectors", "opamp-collectors", 1)

o.endpoint = u.String()

return nil
}

func newOpampAgent(cfg *Config, logger *zap.Logger, build component.BuildInfo, res pcommon.Resource) (*opampAgent, error) {
agentType := build.Command

Expand Down
71 changes: 9 additions & 62 deletions pkg/extension/opampextension/opamp_agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config/confighttp"
"go.opentelemetry.io/collector/extension/extensiontest"
semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
)
Expand Down Expand Up @@ -527,67 +526,15 @@ func TestReload(t *testing.T) {
assert.NoError(t, o.Reload(ctx))
}

// To be removed when the OpAMP backend correctly advertises its URL.
// This test is badly written, it reaches into unexported fields to test
// their contents, but given that it will be removed in a few months, that
// shouldn't matter too much from a big picture perspective.
func TestHackSetEndpoint(t *testing.T) {
tests := []struct {
name string
url string
wantEndpoint string
}{
{
name: "empty url defaults to config endpoint",
wantEndpoint: "wss://example.com",
},
{
name: "url variant a",
url: "https://sumo-open-events.example.com",
wantEndpoint: "wss://sumo-opamp-events.example.com/v1/opamp",
},
{
name: "url variant b",
url: "https://sumo-open-collectors.example.com",
wantEndpoint: "wss://sumo-opamp-collectors.example.com/v1/opamp",
},
{
name: "url variant c",
url: "https://example.com",
wantEndpoint: "wss://example.com/v1/opamp",
},
{
name: "dev sumologic url",
url: "https://long-open-events.sumologic.net/api/v1",
wantEndpoint: "wss://long-opamp-events.sumologic.net/v1/opamp",
},
{
name: "prod sumologic url",
url: "https://open-collectors.sumologic.com/api/v1",
wantEndpoint: "wss://opamp-collectors.sumologic.com/v1/opamp",
},
{
name: "prod sumologic url with region",
url: "https://open-collectors.au.sumologic.com/api/v1/",
wantEndpoint: "wss://opamp-collectors.au.sumologic.com/v1/opamp",
},
func TestDefaultEndpointSetOnStart(t *testing.T) {
cfg := createDefaultConfig().(*Config)
set := extensiontest.NewNopCreateSettings()
o, err := newOpampAgent(cfg, set.Logger, set.BuildInfo, set.Resource)
if err != nil {
t.Fatal(err)
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
agent := &opampAgent{cfg: &Config{
ClientConfig: confighttp.ClientConfig{
Endpoint: "wss://example.com",
},
}}
if err := agent.setEndpoint(test.url); err != nil {
// can only happen with an invalid URL, which is quite hard
// to even come up with for Go's URL package
t.Fatal(err)
}
if got, want := agent.endpoint, test.wantEndpoint; got != want {
t.Errorf("didn't get expected endpoint: got %q, want %q", got, want)
}
})
settings := o.startSettings()
if settings.OpAMPServerURL != DefaultSumoLogicOpAmpURL {
t.Error("expected unconfigured opamp endpoint to result in default sumo opamp url setting")
}
}
Loading