github.com/uber/kraken@v0.1.4/tools/bin/visualization/server.go (about) 1 // Copyright (c) 2016-2019 Uber Technologies, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 package main 15 16 import ( 17 "bufio" 18 "encoding/json" 19 "fmt" 20 "log" 21 "net/http" 22 "os" 23 24 "github.com/gorilla/mux" 25 26 "github.com/uber/kraken/lib/torrent/networkevent" 27 ) 28 29 type server struct { 30 events []*networkevent.Event 31 } 32 33 func newServer(eventFile *os.File) *server { 34 var events []*networkevent.Event 35 36 scanner := bufio.NewScanner(eventFile) 37 for scanner.Scan() { 38 line := scanner.Bytes() 39 var event networkevent.Event 40 if err := json.Unmarshal(line, &event); err != nil { 41 log.Printf("Error unmarshalling event: %s\n", err) 42 continue 43 } 44 events = append(events, &event) 45 } 46 events = networkevent.Filter( 47 events, 48 networkevent.AddTorrent, 49 networkevent.AddActiveConn, 50 networkevent.DropActiveConn, 51 networkevent.BlacklistConn, 52 networkevent.ReceivePiece, 53 networkevent.TorrentComplete, 54 networkevent.TorrentCancelled) 55 networkevent.Sort(events) 56 57 return &server{events} 58 } 59 60 func (s *server) handler() http.Handler { 61 r := mux.NewRouter() 62 63 r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 64 http.Redirect(w, r, "/static/html/app.html", http.StatusSeeOther) 65 }) 66 67 fs := http.FileServer(http.Dir("./tools/bin/visualization/static/")) 68 r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs)) 69 70 r.HandleFunc("/events", s.getEvents) 71 72 return r 73 } 74 75 func (s *server) getEvents(w http.ResponseWriter, r *http.Request) { 76 if err := json.NewEncoder(w).Encode(s.events); err != nil { 77 log.Printf("Error encoding events: %s\n", err) 78 http.Error(w, fmt.Sprintf("encode events: %s", err), 500) 79 return 80 } 81 } 82 83 type byTime []networkevent.Event 84 85 func (s byTime) Len() int { return len(s) } 86 func (s byTime) Less(i, j int) bool { return s[i].Time.Before(s[j].Time) } 87 func (s byTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] }