1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // Copyright (c) 2015 Arista Networks, Inc.
- // Use of this source code is governed by the Apache License 2.0
- // that can be found in the COPYING file.
- // Package monitor provides an embedded HTTP server to expose
- // metrics for monitoring
- package monitor
- import (
- "expvar"
- "fmt"
- "net"
- "net/http"
- _ "net/http/pprof" // Go documentation recommended usage
- "notabug.org/themusicgod1/goarista/netns"
- "notabug.org/themusicgod1/glog"
- )
- // Server represents a monitoring server
- type Server interface {
- Run(serveMux *http.ServeMux)
- }
- // server contains information for the monitoring server
- type server struct {
- vrfName string
- // Server name e.g. host[:port]
- serverName string
- }
- // NewServer creates a new server struct
- func NewServer(address string) Server {
- vrfName, addr, err := netns.ParseAddress(address)
- if err != nil {
- glog.Errorf("Failed to parse address: %s", err)
- }
- return &server{
- vrfName: vrfName,
- serverName: addr,
- }
- }
- func debugHandler(w http.ResponseWriter, r *http.Request) {
- indexTmpl := `<html>
- <head>
- <title>/debug</title>
- </head>
- <body>
- <p>/debug</p>
- <div><a href="/debug/vars">vars</a></div>
- <div><a href="/debug/pprof">pprof</a></div>
- </body>
- </html>
- `
- fmt.Fprintf(w, indexTmpl)
- }
- // PrintableHistogram represents a Histogram that can be printed as
- // a chart.
- type PrintableHistogram interface {
- Print() string
- }
- // Pretty prints the latency histograms
- func histogramHandler(w http.ResponseWriter, r *http.Request) {
- expvar.Do(func(kv expvar.KeyValue) {
- if hist, ok := kv.Value.(PrintableHistogram); ok {
- w.Write([]byte(hist.Print()))
- }
- })
- }
- // Run sets up the HTTP server and any handlers
- func (s *server) Run(serveMux *http.ServeMux) {
- serveMux.HandleFunc("/debug", debugHandler)
- serveMux.HandleFunc("/debug/histograms", histogramHandler)
- var listener net.Listener
- err := netns.Do(s.vrfName, func() error {
- var err error
- listener, err = net.Listen("tcp", s.serverName)
- return err
- })
- if err != nil {
- glog.Fatalf("Could not start monitor server in VRF %q: %s", s.vrfName, err)
- }
- err = http.Serve(listener, serveMux)
- if err != nil {
- glog.Fatal("http serve returned with error:", err)
- }
- }
|