Skip to content

Commit 9167fd4

Browse files
committed
bug: address parsing wavefront urls with a path component
1 parent 1f64f7f commit 9167fd4

File tree

4 files changed

+70
-8
lines changed

4 files changed

+70
-8
lines changed

internal/reporter.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,38 @@ func (reporter reporter) Report(format string, pointLines string) (*http.Respons
3232
return nil, formatError
3333
}
3434

35-
// compress
35+
buf, err := linesToBuffer(pointLines)
36+
if err != nil {
37+
return &http.Response{}, err
38+
}
39+
40+
req, err := reporter.buildRequest(format, buf)
41+
if err != nil {
42+
return &http.Response{}, err
43+
}
44+
45+
return reporter.execute(req)
46+
}
47+
48+
func linesToBuffer(pointLines string) (bytes.Buffer, error) {
3649
var buf bytes.Buffer
3750
zw := gzip.NewWriter(&buf)
3851
_, err := zw.Write([]byte(pointLines))
3952
if err != nil {
4053
zw.Close()
41-
return nil, err
54+
return bytes.Buffer{}, err
4255
}
4356
if err = zw.Close(); err != nil {
44-
return nil, err
57+
return bytes.Buffer{}, err
4558
}
59+
return buf, err
60+
}
4661

62+
func (reporter reporter) buildRequest(format string, buf bytes.Buffer) (*http.Request, error) {
4763
apiURL := reporter.serverURL + reportEndpoint
4864
req, err := http.NewRequest("POST", apiURL, &buf)
4965
if err != nil {
50-
return &http.Response{}, err
66+
return nil, err
5167
}
5268

5369
req.Header.Set(contentType, octetStream)
@@ -59,8 +75,7 @@ func (reporter reporter) Report(format string, pointLines string) (*http.Respons
5975
q := req.URL.Query()
6076
q.Add(formatKey, format)
6177
req.URL.RawQuery = q.Encode()
62-
63-
return reporter.execute(req)
78+
return req, nil
6479
}
6580

6681
func (reporter reporter) ReportEvent(event string) (*http.Response, error) {

internal/reporter_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package internal
2+
3+
import (
4+
"bytes"
5+
"github.com/stretchr/testify/assert"
6+
"github.com/stretchr/testify/require"
7+
"testing"
8+
)
9+
10+
func TestBuildRequest(t *testing.T) {
11+
var r *reporter
12+
var buf bytes.Buffer
13+
r = NewReporter("http://localhost:8010/wavefront", "").(*reporter)
14+
request, err := r.buildRequest("wavefront", buf)
15+
require.NoError(t, err)
16+
assert.Equal(t, "http://localhost:8010/wavefront/report?f=wavefront", request.URL.String())
17+
}

senders/client_factory.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type configuration struct {
4444
// together with batch size controls the max theoretical throughput of the sender.
4545
FlushIntervalSeconds int
4646
SDKMetricsTags map[string]string
47+
Path string
4748
}
4849

4950
func (c *configuration) Direct() bool {
@@ -106,6 +107,11 @@ func CreateConfig(wfURL string, setters ...Option) (*configuration, error) {
106107
return nil, fmt.Errorf("invalid scheme '%s' in '%s', only 'http' is supported", u.Scheme, u)
107108
}
108109

110+
if u.Path != "" {
111+
cfg.Path = u.Path
112+
u.Path = ""
113+
}
114+
109115
if u.Port() != "" {
110116
port, err := strconv.Atoi(u.Port())
111117
if err != nil {
@@ -124,8 +130,8 @@ func CreateConfig(wfURL string, setters ...Option) (*configuration, error) {
124130

125131
// newWavefrontClient creates a Wavefront sender
126132
func newWavefrontClient(cfg *configuration) (Sender, error) {
127-
metricsReporter := internal.NewReporter(fmt.Sprintf("%s:%d", cfg.Server, cfg.MetricsPort), cfg.Token)
128-
tracesReporter := internal.NewReporter(fmt.Sprintf("%s:%d", cfg.Server, cfg.TracesPort), cfg.Token)
133+
metricsReporter := internal.NewReporter(MetricsURL(cfg), cfg.Token)
134+
tracesReporter := internal.NewReporter(TracesURL(cfg), cfg.Token)
129135

130136
sender := &wavefrontSender{
131137
defaultSource: internal.GetHostname("wavefront_direct_sender"),
@@ -142,6 +148,14 @@ func newWavefrontClient(cfg *configuration) (Sender, error) {
142148
return sender, nil
143149
}
144150

151+
func TracesURL(cfg *configuration) string {
152+
return fmt.Sprintf("%s:%d%s", cfg.Server, cfg.TracesPort, cfg.Path)
153+
}
154+
155+
func MetricsURL(cfg *configuration) string {
156+
return fmt.Sprintf("%s:%d%s", cfg.Server, cfg.MetricsPort, cfg.Path)
157+
}
158+
145159
func (sender *wavefrontSender) initializeInternalMetrics(cfg *configuration) {
146160

147161
var setters []internal.RegistryOption

senders/client_factory_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,22 @@ func TestPortExtractedFromURL(t *testing.T) {
6565
assert.Equal(t, 1234, cfg.TracesPort)
6666
}
6767

68+
func TestUrlWithPortAndPath(t *testing.T) {
69+
cfg, err := senders.CreateConfig("http://localhost:8071/wavefront")
70+
require.NoError(t, err)
71+
assert.Equal(t, 8071, cfg.MetricsPort)
72+
assert.Equal(t, 8071, cfg.TracesPort)
73+
assert.Equal(t, "http://localhost", cfg.Server)
74+
assert.Equal(t, "/wavefront", cfg.Path)
75+
}
76+
77+
func TestMetricsURLWithPortAndPath(t *testing.T) {
78+
cfg, err := senders.CreateConfig("http://localhost:8071/wavefront")
79+
require.NoError(t, err)
80+
assert.Equal(t, "http://localhost:8071/wavefront", senders.MetricsURL(cfg))
81+
assert.Equal(t, "http://localhost:8071/wavefront", senders.TracesURL(cfg))
82+
}
83+
6884
func TestToken(t *testing.T) {
6985
cfg, err := senders.CreateConfig("https://my-api-token@localhost")
7086
require.NoError(t, err)

0 commit comments

Comments
 (0)