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] }