Skip to content

Commit 8e78c0c

Browse files
author
Alfonso Acosta
authored
Merge pull request #2094 from weaveworks/maybe-old-master
Fix force-push to master
2 parents ffeeabd + 5ed63de commit 8e78c0c

File tree

14 files changed

+269
-147
lines changed

14 files changed

+269
-147
lines changed

extras/dialer/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bin/

extras/dialer/Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
FROM golang:1.7
2+
ADD ./bin/dialer /go/bin

extras/dialer/README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
## Overview
2+
3+
The dialer scripts can be used to test Scope with a high number of
4+
containers and connections.
5+
6+
The dialer server is a TCP server that holds incoming connections
7+
forever.
8+
9+
The dialer client is a TCP client that opens n connection to a server
10+
and holds them forever.
11+
12+
The `listener` script starts a dialer server and prints its address for
13+
usage with the `dialer` script. The `dialer` scripts starts up to n
14+
(default 50) client containers, each opening a random (1-20) number of
15+
connections.
16+
17+
`time-scope-probe` then can be used to measure the scheduled time
18+
(utime + stime) of the scope-probe process on the host. The results
19+
can be used to compare performance under different scenarios/branches.
20+
21+
## Usage example
22+
23+
```
24+
# Start a listener
25+
./tools/dialer/listener
26+
Listening on :8082
27+
IP addr + port: 172.17.0.2:8082
28+
29+
30+
# Start the dialer script with a maximum of 10 dialer containers
31+
# (default 50)
32+
./tools/dialer/dialer 172.17.0.2:8082 10
33+
34+
35+
# Start time-scope-probe to measure the scheduled time of scope-probe
36+
# every 3 seconds (default 10 seconds) for 3 times (default 60 times)
37+
sudo ./tools/dialer/time-scope-probe 3 3
38+
...
39+
```
40+
41+
## Build dialer container
42+
43+
```
44+
go build -o bin/dialer
45+
docker build -t dialer .
46+
```

extras/dialer/dialer

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/bin/bash
2+
set -eu
3+
if [ $# -lt 1 ]; then
4+
echo "Usage: $0 <ip:port> [<max_dialer>]" >&2
5+
exit 1
6+
fi
7+
8+
readonly addr=$1
9+
readonly max_dialer=${2:-50}
10+
11+
dialer=()
12+
trap 'echo -n "stopping ... "; for c in "${dialer[@]}"; do docker rm -f "$c" >/dev/null; done; echo "done"' EXIT
13+
14+
while true; do
15+
rand=$(( ( RANDOM % max_dialer ) + 1 ))
16+
dialer+=("$(docker run -d dialer /go/bin/dialer connect "$addr" "$rand")")
17+
18+
if [ ${#dialer[@]} -gt "$max_dialer" ]; then
19+
container=${dialer[$rand]}
20+
docker rm -f "$container" >/dev/null &
21+
unset dialer[$rand]
22+
dialer=("${dialer[@]}")
23+
fi
24+
25+
sleep $(( rand % 3 ))
26+
done

extras/dialer/dialer.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"os"
7+
"strconv"
8+
)
9+
10+
func connect(url string, numConn int) {
11+
fmt.Printf("Establishing %d TCP connections to %s\n", numConn, url)
12+
for x := 0; x < numConn; x++ {
13+
_, err := net.Dial("tcp", url)
14+
15+
if err != nil {
16+
fmt.Printf("Error: %v\n", err)
17+
os.Exit(1)
18+
}
19+
}
20+
21+
// wait forever
22+
select {}
23+
}
24+
25+
func listen(url string) {
26+
l, err := net.Listen("tcp", url)
27+
if err != nil {
28+
fmt.Println("Error listening:", err.Error())
29+
os.Exit(1)
30+
}
31+
defer l.Close()
32+
fmt.Println("Listening on " + url)
33+
for {
34+
_, err := l.Accept()
35+
if err != nil {
36+
fmt.Println("Error accepting: ", err.Error())
37+
os.Exit(1)
38+
}
39+
}
40+
41+
}
42+
43+
func main() {
44+
if len(os.Args) < 2 {
45+
fmt.Println("Not enough arguments")
46+
os.Exit(1)
47+
}
48+
49+
verb := os.Args[1]
50+
51+
if verb == "connect" {
52+
if len(os.Args) != 4 {
53+
fmt.Println("Not enough arguments")
54+
os.Exit(1)
55+
}
56+
57+
url := os.Args[2]
58+
numConn, err := strconv.Atoi(os.Args[3])
59+
if err != nil {
60+
fmt.Printf("Error with second argument\n")
61+
os.Exit(1)
62+
}
63+
64+
connect(url, numConn)
65+
}
66+
if verb == "listen" {
67+
if len(os.Args) != 3 {
68+
fmt.Println("Not enough arguments")
69+
os.Exit(1)
70+
}
71+
72+
port := os.Args[2]
73+
listen(":" + port)
74+
}
75+
76+
}

extras/dialer/listener

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
set -eu
3+
readonly port=${1:-8082}
4+
(
5+
sleep 5 # wait for dialerserver to start
6+
echo "IP addr + port: $(docker inspect -f '{{ .NetworkSettings.IPAddress }}' dialerserver):$port"
7+
) &
8+
docker run --rm --name dialerserver dialer /go/bin/dialer listen "$port"

extras/dialer/time-scope-probe

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/bin/bash
2+
set -eu
3+
if [ $EUID -ne 0 ]; then
4+
echo "You must be root!" >&2
5+
exit 1
6+
fi
7+
8+
readonly interval_num=${1:-60}
9+
readonly interval_sleep=${2:-10}
10+
11+
TIME_U1=0
12+
TIME_K1=0
13+
TIME_T1=0
14+
TIME_U2=0
15+
TIME_K2=0
16+
TIME_T2=0
17+
18+
if [ "$(pidof scope-probe)" == "" ]; then
19+
echo "No scope-probe process running - aborting" >&2
20+
exit 1
21+
fi
22+
23+
for ((i=0; i<"$interval_num"; i++)); do
24+
sleep "$interval_sleep"
25+
TIME_U1=$TIME_U2
26+
TIME_K1=$TIME_K2
27+
TIME_T1=$TIME_T2
28+
29+
TIME_U2=$(gawk '{print $14"*10"}'<"/proc/$(pidof scope-probe)/stat" | bc)
30+
TIME_K2=$(gawk '{print $15"*10"}'<"/proc/$(pidof scope-probe)/stat" | bc)
31+
TIME_T2=$(( TIME_U2 + TIME_K2 ))
32+
echo "utime $(( TIME_U2 - TIME_U1)) + stime $(( TIME_K2 - TIME_K1 )) = $(( TIME_T2 - TIME_T1 ))"
33+
done

probe/awsecs/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (c ecsClient) getServices() map[string]*ecs.Service {
7373
}
7474

7575
for _, failure := range resp.Failures {
76-
log.Warnf("Failed to describe ECS service %s, ECS service report may be incomplete: %s", failure.Arn, failure.Reason)
76+
log.Warnf("Failed to describe ECS service %s, ECS service report may be incomplete: %s", *failure.Arn, *failure.Reason)
7777
}
7878

7979
lock.Lock()
@@ -110,7 +110,7 @@ func (c ecsClient) getTasks(taskArns []string) (map[string]*ecs.Task, error) {
110110
}
111111

112112
for _, failure := range resp.Failures {
113-
log.Warnf("Failed to describe ECS task %s, ECS service report may be incomplete: %s", failure.Arn, failure.Reason)
113+
log.Warnf("Failed to describe ECS task %s, ECS service report may be incomplete: %s", *failure.Arn, *failure.Reason)
114114
}
115115

116116
results := make(map[string]*ecs.Task, len(resp.Tasks))

prog/app.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,10 @@ func appMain(flags appFlags) {
270270

271271
handler := router(collector, controlRouter, pipeRouter, flags.externalUI)
272272
if flags.logHTTP {
273-
handler = middleware.LogFailed.Wrap(handler)
273+
handler = middleware.Log{
274+
LogRequestHeaders: flags.logHTTPHeaders,
275+
LogSuccess: false,
276+
}.Wrap(handler)
274277
}
275278

276279
server := &graceful.Server{

prog/main.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,13 @@ type probeFlags struct {
112112
}
113113

114114
type appFlags struct {
115-
window time.Duration
116-
listen string
117-
stopTimeout time.Duration
118-
logLevel string
119-
logPrefix string
120-
logHTTP bool
115+
window time.Duration
116+
listen string
117+
stopTimeout time.Duration
118+
logLevel string
119+
logPrefix string
120+
logHTTP bool
121+
logHTTPHeaders bool
121122

122123
weaveEnabled bool
123124
weaveAddr string
@@ -298,6 +299,7 @@ func main() {
298299
flag.StringVar(&flags.app.logLevel, "app.log.level", "info", "logging threshold level: debug|info|warn|error|fatal|panic")
299300
flag.StringVar(&flags.app.logPrefix, "app.log.prefix", "<app>", "prefix for each log line")
300301
flag.BoolVar(&flags.app.logHTTP, "app.log.http", false, "Log individual HTTP requests")
302+
flag.BoolVar(&flags.app.logHTTPHeaders, "app.log.httpHeaders", false, "Log HTTP headers. Needs app.log.http to be enabled.")
301303

302304
flag.StringVar(&flags.app.weaveAddr, "app.weave.addr", app.DefaultWeaveURL, "Address on which to contact WeaveDNS")
303305
flag.StringVar(&flags.app.weaveHostname, "app.weave.hostname", app.DefaultHostname, "Hostname to advertise in WeaveDNS")

0 commit comments

Comments
 (0)