Skip to content
This repository was archived by the owner on Aug 2, 2021. It is now read-only.

cmd/swarm/swarm-smoke: timeout flag #1041

Closed
wants to merge 45 commits into from
Closed
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
0e53c59
cmd/swarm/swarm-smoke: timeout flag
nonsense Dec 3, 2018
53905cb
added influxdb flags
acud Dec 4, 2018
ad3aef7
correct metrics flags and add metrics init on smoke run
acud Dec 4, 2018
ea987e4
add metrics to upload and sync test
acud Dec 4, 2018
84a5fcf
add feed smoke metrics
acud Dec 4, 2018
7058760
cmd/swarm/swarm-smoke: fix metrics collection
nonsense Dec 4, 2018
0313009
cmd/swarm: use correct import
nonsense Dec 4, 2018
c05de65
add git commit
nonsense Dec 4, 2018
acb3149
cmd/swarm: fix wait for reporter
nonsense Dec 4, 2018
d6ecdfe
measure upload time
nonsense Dec 4, 2018
99a1c30
emit metrics only once
nonsense Dec 4, 2018
cb72c57
address PR comments
acud Dec 5, 2018
1569d4f
return nil on no error
acud Dec 5, 2018
0edb2bb
fix linter errors
acud Dec 5, 2018
eac3fdb
cmd/swarm/swarm-smoke: timeout flag
nonsense Dec 3, 2018
e176fe5
added influxdb flags
acud Dec 4, 2018
8be02fa
correct metrics flags and add metrics init on smoke run
acud Dec 4, 2018
238195a
add metrics to upload and sync test
acud Dec 4, 2018
5f93226
add feed smoke metrics
acud Dec 4, 2018
f9c231c
cmd/swarm/swarm-smoke: fix metrics collection
nonsense Dec 4, 2018
fe3da49
cmd/swarm: use correct import
nonsense Dec 4, 2018
f7b0db6
add git commit
nonsense Dec 4, 2018
f6cd823
cmd/swarm: fix wait for reporter
nonsense Dec 4, 2018
77cc885
measure upload time
nonsense Dec 4, 2018
891f92b
emit metrics only once
nonsense Dec 4, 2018
24b6b95
address PR comments
acud Dec 5, 2018
a2dfa31
return nil on no error
acud Dec 5, 2018
de8a8af
fix linter errors
acud Dec 5, 2018
972e699
cmd/swarm-smoke: inline metrics
nonsense Dec 5, 2018
72a9953
swarm/storage: measure lazy chunk reader chunk get time
nonsense Dec 5, 2018
159d9af
swarm/api: log and measure the same value for request time
nonsense Dec 5, 2018
4f589df
added loglines to http get requests
acud Dec 6, 2018
008ecab
Merge branch 'swarm-smoke-timeout' of github.com:ethersphere/go-ether…
acud Dec 6, 2018
637444c
fix goimports
acud Dec 6, 2018
36d7c2f
added resetting counters
acud Dec 6, 2018
ac8b6d5
added opentracing span injection and extraction over the wire for htt…
acud Dec 6, 2018
c38d250
cleanup and address PR comments
acud Dec 6, 2018
73fc234
add sync-delay and single configurations to swarm smoke tests
nonsense Dec 6, 2018
964ce76
add missing rand seed
nonsense Dec 6, 2018
4dbb41b
replaced upload from swarm binary by upload from swarm client
acud Dec 7, 2018
b38fd0c
moved http client tracer to api/client. added tracing on uploads
acud Dec 7, 2018
a43801c
cmd/swarm/swarm-smoke: metrics for each run (#1049)
holisticode Dec 7, 2018
aef8672
swarm/api/client: address pr comments
acud Dec 10, 2018
07b1092
swarm/api/client: address pr comments
acud Dec 10, 2018
7336446
swarm/api/http: remove opentracing
nonsense Dec 10, 2018
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
102 changes: 99 additions & 3 deletions cmd/swarm/swarm-smoke/feed_upload_and_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package main

import (
"bytes"
"context"
"crypto/md5"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/http/httptrace"
"os"
"os/exec"
"strings"
Expand All @@ -16,8 +18,11 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/swarm/spancontext"
"github.com/ethereum/go-ethereum/swarm/storage/feed"
colorable "github.com/mattn/go-colorable"
opentracing "github.com/opentracing/opentracing-go"
"github.com/pborman/uuid"
cli "gopkg.in/urfave/cli.v1"
)
Expand All @@ -26,11 +31,29 @@ const (
feedRandomDataLength = 8
)

// TODO: retrieve with manifest + extract repeating code
func cliFeedUploadAndSync(c *cli.Context) error {

metrics.GetOrRegisterCounter("feed-and-sync", nil).Inc(1)
log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(verbosity), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))))

errc := make(chan error)
go func() {
errc <- feedUploadAndSync(c)
}()

select {
case err := <-errc:
if err != nil {
metrics.GetOrRegisterCounter("feed-and-sync.fail", nil).Inc(1)
}
return err
case <-time.After(time.Duration(timeout) * time.Second):
metrics.GetOrRegisterCounter("feed-and-sync.timeout", nil).Inc(1)
return fmt.Errorf("timeout after %v sec", timeout)
}
}

// TODO: retrieve with manifest + extract repeating code
func feedUploadAndSync(c *cli.Context) error {
defer func(now time.Time) { log.Info("total time", "time", time.Since(now), "size (kb)", filesize) }(time.Now())

generateEndpoints(scheme, cluster, appName, from, to)
Expand Down Expand Up @@ -284,14 +307,87 @@ func cliFeedUploadAndSync(c *cli.Context) error {
}

func fetchFeed(topic string, user string, endpoint string, original []byte, ruid string) error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ctx, sp := spancontext.StartSpan(ctx, "feed-and-sync.fetch")
defer sp.Finish()

log.Trace("sleeping", "ruid", ruid)
time.Sleep(3 * time.Second)

log.Trace("http get request (feed)", "ruid", ruid, "api", endpoint, "topic", topic, "user", user)
res, err := http.Get(endpoint + "/bzz-feed:/?topic=" + topic + "&user=" + user)

tn := time.Now()
reqUri := endpoint + "/bzz-feed:/?topic=" + topic + "&user=" + user
req, _ := http.NewRequest("GET", reqUri, nil)

opentracing.GlobalTracer().Inject(
sp.Context(),
opentracing.HTTPHeaders,
opentracing.HTTPHeadersCarrier(req.Header))

trace := &httptrace.ClientTrace{
GetConn: func(_ string) {
log.Trace("http get request (feed) - GetConn")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.getconn", nil).Update(time.Since(tn))
},
GotConn: func(_ httptrace.GotConnInfo) {
log.Trace("http get request (feed) - GotConn")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.gotconn", nil).Update(time.Since(tn))
},
PutIdleConn: func(err error) {
log.Trace("http get request (feed) - PutIdleConn", "err", err)
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.putidle", nil).Update(time.Since(tn))
},
GotFirstResponseByte: func() {
log.Trace("http get request (feed) - GotFirstResponseByte")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.firstbyte", nil).Update(time.Since(tn))
},
Got100Continue: func() {
log.Trace("http get request (feed) - Got100Continue")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.got100continue", nil).Update(time.Since(tn))
},
DNSStart: func(_ httptrace.DNSStartInfo) {
log.Trace("http get request (feed) - DNSStart")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.dnsstart", nil).Update(time.Since(tn))
},
DNSDone: func(_ httptrace.DNSDoneInfo) {
log.Trace("http get request (feed) - DNSDone")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.dnsdone", nil).Update(time.Since(tn))
},
ConnectStart: func(network, addr string) {
log.Trace("http get request (feed) - ConnectStart", "network", network, "addr", addr)
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.connectstart", nil).Update(time.Since(tn))
},
ConnectDone: func(network, addr string, err error) {
log.Trace("http get request (feed) - ConnectDone", "network", network, "addr", addr, "err", err)
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.connectdone", nil).Update(time.Since(tn))
},
WroteHeaders: func() {
log.Trace("http get request (feed) - WroteHeaders(request)")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.wroteheaders", nil).Update(time.Since(tn))
},
Wait100Continue: func() {
log.Trace("http get request (feed) - Wait100Continue")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.wait100continue", nil).Update(time.Since(tn))
},

WroteRequest: func(_ httptrace.WroteRequestInfo) {
log.Trace("http get request (feed) - WroteRequest")
metrics.GetOrRegisterResettingTimer("feed-and-sync.fetch.clienttrace.wroterequest", nil).Update(time.Since(tn))
},
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
transport := http.DefaultTransport

//transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

res, err := transport.RoundTrip(req)
if err != nil {
log.Error(err.Error(), "ruid", ruid)
return err
}

log.Trace("http get response (feed)", "ruid", ruid, "api", endpoint, "topic", topic, "user", user, "code", res.StatusCode, "len", res.ContentLength)

if res.StatusCode != 200 {
Expand Down
49 changes: 49 additions & 0 deletions cmd/swarm/swarm-smoke/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,24 @@
package main

import (
"fmt"
"os"
"sort"

"github.com/ethereum/go-ethereum/cmd/utils"
gethmetrics "github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/metrics/influxdb"
swarmmetrics "github.com/ethereum/go-ethereum/swarm/metrics"

"github.com/ethereum/go-ethereum/log"

cli "gopkg.in/urfave/cli.v1"
)

var (
gitCommit string // Git SHA1 commit hash of the release (set via linker flags)
)

var (
endpoints []string
includeLocalhost bool
Expand All @@ -35,6 +45,7 @@ var (
from int
to int
verbosity int
timeout int
)

func main() {
Expand Down Expand Up @@ -91,8 +102,23 @@ func main() {
Usage: "verbosity",
Destination: &verbosity,
},
cli.IntFlag{
Name: "timeout",
Value: 120,
Usage: "timeout in seconds after which kill the process",
Destination: &timeout,
},
}

app.Flags = append(app.Flags, []cli.Flag{
utils.MetricsEnabledFlag,
swarmmetrics.MetricsInfluxDBEndpointFlag,
swarmmetrics.MetricsInfluxDBDatabaseFlag,
swarmmetrics.MetricsInfluxDBUsernameFlag,
swarmmetrics.MetricsInfluxDBPasswordFlag,
swarmmetrics.MetricsInfluxDBHostTagFlag,
}...)

app.Commands = []cli.Command{
{
Name: "upload_and_sync",
Expand All @@ -110,10 +136,33 @@ func main() {

sort.Sort(cli.FlagsByName(app.Flags))
sort.Sort(cli.CommandsByName(app.Commands))
app.After = func(ctx *cli.Context) error {
return emitMetrics(ctx)
}

err := app.Run(os.Args)
if err != nil {
log.Error(err.Error())

os.Exit(1)
}
}

func emitMetrics(ctx *cli.Context) error {
if gethmetrics.Enabled {
var (
endpoint = ctx.GlobalString(swarmmetrics.MetricsInfluxDBEndpointFlag.Name)
database = ctx.GlobalString(swarmmetrics.MetricsInfluxDBDatabaseFlag.Name)
username = ctx.GlobalString(swarmmetrics.MetricsInfluxDBUsernameFlag.Name)
password = ctx.GlobalString(swarmmetrics.MetricsInfluxDBPasswordFlag.Name)
hosttag = ctx.GlobalString(swarmmetrics.MetricsInfluxDBHostTagFlag.Name)
)
return influxdb.InfluxDBWithTagsOnce(gethmetrics.DefaultRegistry, endpoint, database, username, password, "swarm-smoke.", map[string]string{
"host": hosttag,
"version": gitCommit,
"filesize": fmt.Sprintf("%v", filesize),
})
}

return nil
}
Loading