Skip to content

Commit

Permalink
Adds the ability to provide a tripperware to Promtail client. (#3654)
Browse files Browse the repository at this point in the history
Fixes #3608

Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com>
  • Loading branch information
cyriltovena authored Apr 29, 2021
1 parent 806d6a5 commit 04f4f82
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
21 changes: 21 additions & 0 deletions clients/pkg/promtail/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,15 @@ type client struct {
cancel context.CancelFunc
}

// Tripperware can wrap a roundtripper.
type Tripperware func(http.RoundTripper) http.RoundTripper

// New makes a new Client.
func New(reg prometheus.Registerer, cfg Config, logger log.Logger) (Client, error) {
return newClient(reg, cfg, logger)
}

func newClient(reg prometheus.Registerer, cfg Config, logger log.Logger) (*client, error) {
if cfg.URL.URL == nil {
return nil, errors.New("client needs target URL")
}
Expand Down Expand Up @@ -199,6 +206,20 @@ func New(reg prometheus.Registerer, cfg Config, logger log.Logger) (Client, erro
return c, nil
}

// NewWithTripperware creates a new Loki client with a custom tripperware.
func NewWithTripperware(reg prometheus.Registerer, cfg Config, logger log.Logger, tp Tripperware) (Client, error) {
c, err := newClient(reg, cfg, logger)
if err != nil {
return nil, err
}

if tp != nil {
c.client.Transport = tp(c.client.Transport)
}

return c, nil
}

func (c *client) run() {
batches := map[string]*batch{}

Expand Down
34 changes: 34 additions & 0 deletions clients/pkg/promtail/client/client_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package client

import (
"io"
"math"
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -459,3 +461,35 @@ func createServerHandler(receivedReqsChan chan receivedReq, status int) http.Han
rw.WriteHeader(status)
})
}

type RoundTripperFunc func(*http.Request) (*http.Response, error)

func (r RoundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) {
return r(req)
}

func Test_Tripperware(t *testing.T) {
url, err := url.Parse("http://foo.com")
require.NoError(t, err)
var called bool
c, err := NewWithTripperware(nil, Config{
URL: flagext.URLValue{URL: url},
}, log.NewNopLogger(), func(rt http.RoundTripper) http.RoundTripper {
return RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
require.Equal(t, r.URL.String(), "http://foo.com")
called = true
return &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(strings.NewReader("ok")),
}, nil
})
})
require.NoError(t, err)

c.Chan() <- api.Entry{
Labels: model.LabelSet{"foo": "bar"},
Entry: logproto.Entry{Timestamp: time.Now(), Line: "foo"},
}
c.Stop()
require.True(t, called)
}

0 comments on commit 04f4f82

Please sign in to comment.