main.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "os"
  6. "os/signal"
  7. "runtime"
  8. "runtime/trace"
  9. "strconv"
  10. "syscall"
  11. "time"
  12. "net/http"
  13. _ "net/http/pprof"
  14. "github.com/grafana/grafana/pkg/log"
  15. "github.com/grafana/grafana/pkg/metrics"
  16. "github.com/grafana/grafana/pkg/setting"
  17. _ "github.com/grafana/grafana/pkg/extensions"
  18. _ "github.com/grafana/grafana/pkg/services/alerting/conditions"
  19. _ "github.com/grafana/grafana/pkg/services/alerting/notifiers"
  20. _ "github.com/grafana/grafana/pkg/tsdb/cloudwatch"
  21. _ "github.com/grafana/grafana/pkg/tsdb/graphite"
  22. _ "github.com/grafana/grafana/pkg/tsdb/influxdb"
  23. _ "github.com/grafana/grafana/pkg/tsdb/mysql"
  24. _ "github.com/grafana/grafana/pkg/tsdb/opentsdb"
  25. _ "github.com/grafana/grafana/pkg/tsdb/postgres"
  26. _ "github.com/grafana/grafana/pkg/tsdb/prometheus"
  27. _ "github.com/grafana/grafana/pkg/tsdb/testdata"
  28. )
  29. var version = "5.0.0"
  30. var commit = "NA"
  31. var buildstamp string
  32. var enterprise string
  33. var configFile = flag.String("config", "", "path to config file")
  34. var homePath = flag.String("homepath", "", "path to grafana install/home path, defaults to working directory")
  35. var pidFile = flag.String("pidfile", "", "path to pid file")
  36. var exitChan = make(chan int)
  37. func main() {
  38. v := flag.Bool("v", false, "prints current version and exits")
  39. profile := flag.Bool("profile", false, "Turn on pprof profiling")
  40. profilePort := flag.Int("profile-port", 6060, "Define custom port for profiling")
  41. flag.Parse()
  42. if *v {
  43. fmt.Printf("Version %s (commit: %s)\n", version, commit)
  44. os.Exit(0)
  45. }
  46. if *profile {
  47. runtime.SetBlockProfileRate(1)
  48. go func() {
  49. http.ListenAndServe(fmt.Sprintf("localhost:%d", *profilePort), nil)
  50. }()
  51. f, err := os.Create("trace.out")
  52. if err != nil {
  53. panic(err)
  54. }
  55. defer f.Close()
  56. err = trace.Start(f)
  57. if err != nil {
  58. panic(err)
  59. }
  60. defer trace.Stop()
  61. }
  62. buildstampInt64, _ := strconv.ParseInt(buildstamp, 10, 64)
  63. if buildstampInt64 == 0 {
  64. buildstampInt64 = time.Now().Unix()
  65. }
  66. setting.BuildVersion = version
  67. setting.BuildCommit = commit
  68. setting.BuildStamp = buildstampInt64
  69. setting.Enterprise, _ = strconv.ParseBool(enterprise)
  70. metrics.M_Grafana_Version.WithLabelValues(version).Set(1)
  71. shutdownCompleted := make(chan int)
  72. server := NewGrafanaServer()
  73. go listenToSystemSignals(server, shutdownCompleted)
  74. go func() {
  75. code := 0
  76. if err := server.Start(); err != nil {
  77. log.Error2("Startup failed", "error", err)
  78. code = 1
  79. }
  80. exitChan <- code
  81. }()
  82. code := <-shutdownCompleted
  83. log.Info2("Grafana shutdown completed.", "code", code)
  84. log.Close()
  85. os.Exit(code)
  86. }
  87. func listenToSystemSignals(server *GrafanaServerImpl, shutdownCompleted chan int) {
  88. var code int
  89. signalChan := make(chan os.Signal, 1)
  90. ignoreChan := make(chan os.Signal, 1)
  91. signal.Notify(ignoreChan, syscall.SIGHUP)
  92. signal.Notify(signalChan, os.Interrupt, os.Kill, syscall.SIGTERM)
  93. select {
  94. case sig := <-signalChan:
  95. trace.Stop() // Stops trace if profiling has been enabled
  96. server.Shutdown(0, fmt.Sprintf("system signal: %s", sig))
  97. shutdownCompleted <- 0
  98. case code = <-exitChan:
  99. trace.Stop() // Stops trace if profiling has been enabled
  100. server.Shutdown(code, "startup error")
  101. shutdownCompleted <- code
  102. }
  103. }