Skip to content

Commit ce2fd1e

Browse files
authored
Merge pull request #1659 from weaveworks/demo
Adding a static report file mode.
2 parents 2a8938e + 7a37577 commit ce2fd1e

File tree

9 files changed

+72
-34
lines changed

9 files changed

+72
-34
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ docker/weave:
4141
curl -L git.io/weave -o docker/weave
4242
chmod u+x docker/weave
4343

44-
$(SCOPE_EXPORT): $(SCOPE_EXE) $(DOCKER_DISTRIB) docker/weave $(RUNSVINIT) docker/Dockerfile docker/run-app docker/run-probe docker/entrypoint.sh
44+
$(SCOPE_EXPORT): $(SCOPE_EXE) $(DOCKER_DISTRIB) docker/weave $(RUNSVINIT) docker/Dockerfile docker/demo.json docker/run-app docker/run-probe docker/entrypoint.sh
4545
cp $(SCOPE_EXE) $(RUNSVINIT) docker/
4646
cp $(DOCKER_DISTRIB) docker/docker.tgz
4747
$(SUDO) docker build -t $(SCOPE_IMAGE) docker/

app/api_report_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import (
99

1010
"github.com/weaveworks/scope/app"
1111
"github.com/weaveworks/scope/report"
12+
"github.com/weaveworks/scope/test/fixture"
1213
)
1314

1415
func topologyServer() *httptest.Server {
1516
router := mux.NewRouter().SkipClean(true)
16-
app.RegisterTopologyRoutes(router, StaticReport{})
17+
app.RegisterTopologyRoutes(router, app.StaticCollector(fixture.Report))
1718
return httptest.NewServer(router)
1819
}
1920

app/benchmark_internal_test.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,17 @@ package app
22

33
import (
44
"flag"
5-
"io/ioutil"
65
"net/http"
76
"net/url"
87
"testing"
98

10-
"github.com/ugorji/go/codec"
9+
"golang.org/x/net/context"
1110

1211
"github.com/weaveworks/scope/render"
1312
"github.com/weaveworks/scope/report"
1413
"github.com/weaveworks/scope/test/fixture"
1514
)
1615

17-
// StaticReport is used as a fixture in tests. It emulates an xfer.Collector.
18-
type StaticReporter struct{ r report.Report }
19-
20-
func (s StaticReporter) Report() report.Report { return s.r }
21-
func (s StaticReporter) WaitOn(chan struct{}) {}
22-
func (s StaticReporter) UnWait(chan struct{}) {}
23-
2416
var (
2517
benchReportFile = flag.String("bench-report-file", "", "json report file to use for benchmarking (relative to this package)")
2618
)
@@ -30,14 +22,12 @@ func loadReport() (report.Report, error) {
3022
return fixture.Report, nil
3123
}
3224

33-
b, err := ioutil.ReadFile(*benchReportFile)
25+
c, err := NewFileCollector(*benchReportFile)
3426
if err != nil {
3527
return fixture.Report, err
3628
}
37-
rpt := report.MakeReport()
38-
decoder := codec.NewDecoderBytes(b, &codec.JsonHandle{})
39-
err = decoder.Decode(&rpt)
40-
return rpt, err
29+
30+
return c.Report(context.Background())
4131
}
4232

4333
func BenchmarkTopologyList(b *testing.B) {

app/collector.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package app
22

33
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
"strings"
48
"sync"
59
"time"
610

11+
"github.com/ugorji/go/codec"
712
"golang.org/x/net/context"
813

914
"github.com/weaveworks/scope/common/mtime"
@@ -131,3 +136,56 @@ func (c *collector) clean() {
131136
c.reports = cleanedReports
132137
c.timestamps = cleanedTimestamps
133138
}
139+
140+
// StaticCollector always returns the given report.
141+
type StaticCollector report.Report
142+
143+
// Report returns a merged report over all added reports. It implements
144+
// Reporter.
145+
func (c StaticCollector) Report(context.Context) (report.Report, error) { return report.Report(c), nil }
146+
147+
// Add adds a report to the collector's internal state. It implements Adder.
148+
func (c StaticCollector) Add(context.Context, report.Report) error { return nil }
149+
150+
// WaitOn lets other components wait on a new report being received. It
151+
// implements Reporter.
152+
func (c StaticCollector) WaitOn(context.Context, chan struct{}) {}
153+
154+
// UnWait lets other components stop waiting on a new report being received. It
155+
// implements Reporter.
156+
func (c StaticCollector) UnWait(context.Context, chan struct{}) {}
157+
158+
// NewFileCollector reads and parses the given path, returning a collector
159+
// which always returns that report.
160+
func NewFileCollector(path string) (Collector, error) {
161+
f, err := os.Open(path)
162+
if err != nil {
163+
return nil, err
164+
}
165+
defer f.Close()
166+
167+
var (
168+
rpt report.Report
169+
handle codec.Handle
170+
gzipped bool
171+
)
172+
fileType := filepath.Ext(path)
173+
if fileType == ".gz" {
174+
gzipped = true
175+
fileType = filepath.Ext(strings.TrimSuffix(path, fileType))
176+
}
177+
switch fileType {
178+
case ".json":
179+
handle = &codec.JsonHandle{}
180+
case ".msgpack":
181+
handle = &codec.MsgpackHandle{}
182+
default:
183+
return nil, fmt.Errorf("Unsupported file extension: %v", fileType)
184+
}
185+
186+
if err := rpt.ReadBinary(f, gzipped, handle); err != nil {
187+
return nil, err
188+
}
189+
190+
return StaticCollector(rpt), nil
191+
}

app/mock_reporter_test.go

Lines changed: 0 additions & 16 deletions
This file was deleted.

docker/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ RUN echo "http://dl-3.alpinelinux.org/alpine/edge/testing" >>/etc/apk/repositori
66
apk add --update bash runit conntrack-tools iproute2 util-linux curl && \
77
rm -rf /var/cache/apk/*
88
ADD ./docker.tgz /
9+
ADD ./demo.json /
910
ADD ./weave /usr/bin/
1011
COPY ./scope ./runsvinit ./entrypoint.sh /home/weave/
1112
COPY ./run-app /etc/service/app/run

docker/demo.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

prog/app.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ func collectorFactory(userIDer multitenant.UserIDer, collectorURL, s3URL, natsHo
9090
return nil, err
9191
}
9292

93-
if parsed.Scheme == "dynamodb" {
93+
switch parsed.Scheme {
94+
case "file":
95+
return app.NewFileCollector(parsed.Path)
96+
case "dynamodb":
9497
s3, err := url.Parse(s3URL)
9598
if err != nil {
9699
return nil, fmt.Errorf("Valid URL for s3 required: %v", err)

prog/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func main() {
186186
flag.StringVar(&flags.app.containerName, "app.container.name", app.DefaultContainerName, "Name of this container (to lookup container ID)")
187187
flag.StringVar(&flags.app.dockerEndpoint, "app.docker", app.DefaultDockerEndpoint, "Location of docker endpoint (to lookup container ID)")
188188

189-
flag.StringVar(&flags.app.collectorURL, "app.collector", "local", "Collector to use (local of dynamodb)")
189+
flag.StringVar(&flags.app.collectorURL, "app.collector", "local", "Collector to use (local, dynamodb, or file)")
190190
flag.StringVar(&flags.app.s3URL, "app.collector.s3", "local", "S3 URL to use (when collector is dynamodb)")
191191
flag.StringVar(&flags.app.controlRouterURL, "app.control.router", "local", "Control router to use (local or sqs)")
192192
flag.StringVar(&flags.app.pipeRouterURL, "app.pipe.router", "local", "Pipe router to use (local)")

0 commit comments

Comments
 (0)