diff --git a/experimental/example/client/Dockerfile b/experimental/example/client/Dockerfile index 14ebf86e8..06300e91f 100644 --- a/experimental/example/client/Dockerfile +++ b/experimental/example/client/Dockerfile @@ -1,6 +1,7 @@ FROM gliderlabs/alpine MAINTAINER Weaveworks Inc WORKDIR /home/weave +RUN apk add --update curl ADD ./client /home/weave/ RUN chmod u+x /home/weave/client ENTRYPOINT ["/home/weave/client"] diff --git a/experimental/example/client/client b/experimental/example/client/client index faf333c72..84b92a82f 100755 --- a/experimental/example/client/client +++ b/experimental/example/client/client @@ -1,3 +1,6 @@ #!/bin/sh -while true; do echo "foo" | nc qotd 4446; sleep 1; done +while true; do + curl http://pyapp:5000/ + sleep 1 +done diff --git a/experimental/example/docker-compose.yml b/experimental/example/docker-compose.yml index 17d7aa9ee..8a7b5c13e 100644 --- a/experimental/example/docker-compose.yml +++ b/experimental/example/docker-compose.yml @@ -2,21 +2,25 @@ client: build: client links: - qotd + - pyapp +pyapp: + build: pyapp + ports: + - "5000" + links: + - qotd + - redis + - goapp qotd: build: qotd expose: - "4446" -pyapp: - build: pyapp - ports: - - "5000:5000" - links: - - redis - - qotd redis: image: redis goapp: build: goapp + ports: + - "8080" links: - elasticsearch1 - elasticsearch2 diff --git a/experimental/example/goapp/app.go b/experimental/example/goapp/app.go index d86b94c10..fb30a15e0 100644 --- a/experimental/example/goapp/app.go +++ b/experimental/example/goapp/app.go @@ -15,13 +15,11 @@ import ( "sync" "sync/atomic" "syscall" - "time" ) func main() { var ( addr = flag.String("addr", ":8080", "HTTP listen address") - rate = flag.Duration("rate", 3*time.Second, "request rate") ) flag.Parse() @@ -45,7 +43,9 @@ func main() { var reads uint64 - http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + log.Printf("Handling %v", r) + read(targets, &reads) fmt.Fprintf(w, "%s %d", hostname, atomic.LoadUint64(&reads)) }) @@ -56,31 +56,24 @@ func main() { errc <- http.ListenAndServe(*addr, nil) }() - go func() { - errc <- read(targets, *rate, &reads) - }() - go func() { errc <- interrupt() }() - log.Printf("%s", <-errc) + log.Printf("%v", <-errc) } -func read(targets []string, rate time.Duration, reads *uint64) error { - for range time.Tick(rate) { - var wg sync.WaitGroup - wg.Add(len(targets)) - for _, target := range targets { - go func(target string) { - get(target) - atomic.AddUint64(reads, 1) - wg.Done() - }(target) - } - wg.Wait() +func read(targets []string, reads *uint64) { + var wg sync.WaitGroup + wg.Add(len(targets)) + for _, target := range targets { + go func(target string) { + get(target) + atomic.AddUint64(reads, 1) + wg.Done() + }(target) } - return nil + wg.Wait() } func get(target string) { diff --git a/experimental/example/goapp/entrypoint.sh b/experimental/example/goapp/entrypoint.sh index 81df8f066..71bf2b93c 100755 --- a/experimental/example/goapp/entrypoint.sh +++ b/experimental/example/goapp/entrypoint.sh @@ -1,2 +1,2 @@ #!/bin/sh -/home/weave/app elasticsearch1 elasticsearch2 +exec /home/weave/app elasticsearch1 elasticsearch2 diff --git a/experimental/example/pyapp/Dockerfile b/experimental/example/pyapp/Dockerfile index 82e3238ea..850621079 100644 --- a/experimental/example/pyapp/Dockerfile +++ b/experimental/example/pyapp/Dockerfile @@ -1,6 +1,7 @@ FROM python:2.7 MAINTAINER Weaveworks Inc -ADD . /home/weave WORKDIR /home/weave +ADD requirements.txt /home/weave/ RUN pip install -r /home/weave/requirements.txt +ADD app.py /home/weave/ ENTRYPOINT ["python", "/home/weave/app.py"] diff --git a/experimental/example/pyapp/app.py b/experimental/example/pyapp/app.py index 3776fd45b..4e01e8647 100644 --- a/experimental/example/pyapp/app.py +++ b/experimental/example/pyapp/app.py @@ -1,15 +1,41 @@ import os - +import socket +import requests +from concurrent.futures import ThreadPoolExecutor from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) +pool = ThreadPoolExecutor(max_workers=10) + +def do_redis(): + redis.incr('hits') + return redis.get('hits') + +def do_qotd(): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect(("qotd", 4446)) + s.send("Hello") + return s.recv(1024) + finally: + s.close() + +def do_search(): + r = requests.get('http://goapp:8080/') + return r.text + @app.route('/') def hello(): - redis.incr('hits') - return 'Hello World! I have been seen %s times.' % redis.get('hits') + counter_future = pool.submit(do_redis) + search_future = pool.submit(do_search) + qotd_future = pool.submit(do_qotd) + result = 'Hello World! I have been seen %s times.' % counter_future.result() + result += search_future.result() + result += qotd_future.result() + return result if __name__ == "__main__": app.run(host="0.0.0.0", debug=True) diff --git a/experimental/example/pyapp/requirements.txt b/experimental/example/pyapp/requirements.txt index 4dbe5d710..e8e000d40 100644 --- a/experimental/example/pyapp/requirements.txt +++ b/experimental/example/pyapp/requirements.txt @@ -2,4 +2,3 @@ flask redis requests futures -requests-futures diff --git a/experimental/example/qotd/qotd.c b/experimental/example/qotd/qotd.c index 3bcd91ff0..533a7eee3 100644 --- a/experimental/example/qotd/qotd.c +++ b/experimental/example/qotd/qotd.c @@ -14,11 +14,13 @@ void *thread_func(void *sock) { printf("I'm thread %d\n", syscall(SYS_gettid)); - if (read(sockfd, buffer, sizeof(buffer), 0) < 0) { + if (read(sockfd, buffer, sizeof(buffer)) < 0) { perror("ERROR reading from socket"); return; } + sleep(1); + clientfd = socket(AF_INET, SOCK_STREAM, 0); if (clientfd < 0) { perror("ERROR opening socket");