1515package web
1616
1717import (
18+ "bytes"
1819 "context"
1920 "fmt"
2021 "log"
2122 "net/http"
2223 "os"
2324 "os/signal"
24- "path/filepath"
2525 "text/template"
2626 "time"
2727
2828 "strings"
2929
3030 "github.com/gorilla/handlers"
3131 "github.com/gorilla/mux"
32- "github.com/kardianos/osext"
32+ "github.com/prometheus/client_golang/prometheus"
33+ "github.com/prometheus/client_golang/prometheus/promhttp"
3334 "github.com/spf13/viper"
35+
36+ "github.com/rakyll/statik/fs"
37+
38+ _ "github.com/sascha-andres/go-logsink/web/statik" // get access to data
39+ )
40+
41+ var (
42+ statikFS http.FileSystem
43+ jsTemplate * template.Template
44+ numberOfLines = prometheus .NewCounter (prometheus.CounterOpts {
45+ Name : "log_lines" ,
46+ Help : "Number of lines received" ,
47+ })
3448)
3549
3650type templateData struct {
@@ -49,12 +63,6 @@ func serveMainjs(w http.ResponseWriter, r *http.Request) {
4963 return
5064 }
5165 w .Header ().Set ("Content-Type" , "text/javascript; charset=utf-8" )
52- dir , err := osext .ExecutableFolder ()
53- if err != nil {
54- http .Error (w , "Web data not found" , 417 )
55- return
56- }
57- jsTemplate := template .Must (template .ParseFiles (filepath .Join (dir , "www/js/main.js" )))
5866 jsTemplate .Execute (w , templateData {Host : r .Host , Limit : int32 (viper .GetInt ("web.limit" )), Scheme : getScheme (r )})
5967}
6068
@@ -83,16 +91,15 @@ func Start() {
8391 srv := & server {}
8492 go srv .run ()
8593
94+ prometheus .MustRegister (numberOfLines )
95+
8696 r := mux .NewRouter ()
8797 r .HandleFunc ("/js/main.js" , serveMainjs ) // js template
8898 r .HandleFunc ("/api/go-logsink/ws" , func (w http.ResponseWriter , r * http.Request ) {
8999 serveWs (srv .hub , w , r )
90100 })
91- dir , err := osext .ExecutableFolder ()
92- if err != nil {
93- log .Fatal ("Could not locate directory" )
94- }
95- r .PathPrefix ("/" ).Handler (handlers .CombinedLoggingHandler (os .Stdout , http .FileServer (http .Dir (filepath .Join (dir , "www" ))))) // static files
101+ r .Handle ("/metrics" , promhttp .Handler ())
102+ r .PathPrefix ("/" ).Handler (handlers .CombinedLoggingHandler (os .Stdout , http .FileServer (statikFS ))) // static files
96103 http .Handle ("/" , r )
97104 stop := make (chan os.Signal )
98105 signal .Notify (stop , os .Interrupt )
@@ -110,3 +117,22 @@ func Start() {
110117 h .Shutdown (ctx )
111118 log .Println ("Server gracefully stopped" )
112119}
120+
121+ func init () {
122+ files , err := fs .New ()
123+ if err != nil {
124+ log .Fatal ("Error initializing filesystem: " , err )
125+ }
126+ statikFS = files
127+ file , err := statikFS .Open ("/js/main.js" )
128+ if err != nil {
129+ log .Fatal ("Error reading js template: " , err )
130+ }
131+ buf := new (bytes.Buffer )
132+ buf .ReadFrom (file )
133+ tmpl , err := template .New ("jsTemplate" ).Parse (buf .String ())
134+ if err != nil {
135+ log .Fatal ("Error parsing template: " , err )
136+ }
137+ jsTemplate = tmpl
138+ }
0 commit comments