Skip to content

Commit c42035a

Browse files
committed
missing files
Signed-off-by: Sandor Szücs <[email protected]>
1 parent 083bc5e commit c42035a

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed

filters/diag/trace.go

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package diag
2+
3+
import (
4+
"time"
5+
6+
log "github.com/sirupsen/logrus"
7+
"github.com/zalando/skipper/filters"
8+
)
9+
10+
func getDurationArg(a interface{}) (time.Duration, error) {
11+
if s, ok := a.(string); ok {
12+
return time.ParseDuration(s)
13+
}
14+
return 0, filters.ErrInvalidFilterParameters
15+
}
16+
17+
type traceSpec struct{}
18+
19+
type trace struct {
20+
d time.Duration
21+
}
22+
23+
// NewTrace creates a filter specification for the trace() filter
24+
func NewTrace() filters.Spec {
25+
return &traceSpec{}
26+
}
27+
28+
func (*traceSpec) Name() string {
29+
return filters.TraceName
30+
}
31+
32+
func (ts *traceSpec) CreateFilter(args []interface{}) (filters.Filter, error) {
33+
if len(args) != 1 {
34+
return nil, filters.ErrInvalidFilterParameters
35+
}
36+
37+
d, err := getDurationArg(args[0])
38+
if err != nil {
39+
log.Warnf("d failed on creation of trace(): %v", err)
40+
return nil, filters.ErrInvalidFilterParameters
41+
}
42+
43+
return &trace{
44+
d: d,
45+
}, nil
46+
}
47+
48+
func (tr *trace) Request(ctx filters.FilterContext) {
49+
ctx.StateBag()[filters.TraceName] = tr.d
50+
}
51+
52+
func (*trace) Response(filters.FilterContext) {}

proxy/flightrecorder_test.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package proxy_test
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
"net/http"
8+
"net/http/httptest"
9+
"testing"
10+
11+
"github.com/zalando/skipper/eskip"
12+
"github.com/zalando/skipper/filters"
13+
"github.com/zalando/skipper/filters/diag"
14+
"github.com/zalando/skipper/proxy"
15+
"github.com/zalando/skipper/proxy/proxytest"
16+
xtrace "golang.org/x/exp/trace"
17+
)
18+
19+
func TestFlightRecorder(t *testing.T) {
20+
service := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
21+
if r.Method != "PUT" {
22+
w.WriteHeader(http.StatusMethodNotAllowed)
23+
w.Write([]byte(http.StatusText(http.StatusMethodNotAllowed)))
24+
return
25+
}
26+
27+
var buf bytes.Buffer
28+
n, err := io.Copy(&buf, r.Body)
29+
if err != nil {
30+
t.Fatalf("Failed to copy data: %v", err)
31+
}
32+
if n < 100 {
33+
t.Fatalf("Failed to write enough data: %d bytes", n)
34+
}
35+
w.WriteHeader(http.StatusCreated)
36+
w.Write([]byte(http.StatusText(http.StatusCreated)))
37+
38+
}))
39+
defer service.Close()
40+
41+
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
42+
defer backend.Close()
43+
44+
flightRecorder := xtrace.NewFlightRecorder()
45+
flightRecorder.Start()
46+
47+
spec := diag.NewTrace()
48+
fr := make(filters.Registry)
49+
fr.Register(spec)
50+
51+
doc := fmt.Sprintf(`r: * -> trace("20µs") -> "%s"`, backend.URL)
52+
rr := eskip.MustParse(doc)
53+
54+
pr := proxytest.WithParams(fr, proxy.Params{
55+
FlightRecorder: flightRecorder,
56+
}, rr...)
57+
_ = pr
58+
pr.Client().Get(pr.URL)
59+
}

0 commit comments

Comments
 (0)