1
0

main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "os"
  7. "os/signal"
  8. "runtime"
  9. "syscall"
  10. "time"
  11. )
  12. const version = "2.16.3"
  13. type ctxKey string
  14. func initialize() error {
  15. log.SetOutput(os.Stdout)
  16. if err := initLog(); err != nil {
  17. return err
  18. }
  19. if err := configure(); err != nil {
  20. return err
  21. }
  22. if err := initNewrelic(); err != nil {
  23. return err
  24. }
  25. initDataDog()
  26. initPrometheus()
  27. if err := initDownloading(); err != nil {
  28. return err
  29. }
  30. initErrorsReporting()
  31. if err := initVips(); err != nil {
  32. return err
  33. }
  34. if err := checkPresets(conf.Presets); err != nil {
  35. shutdownVips()
  36. return err
  37. }
  38. return nil
  39. }
  40. func run() error {
  41. if err := initialize(); err != nil {
  42. return err
  43. }
  44. defer shutdownVips()
  45. defer closeErrorsReporting()
  46. defer stopDataDog()
  47. go func() {
  48. var logMemStats = len(os.Getenv("IMGPROXY_LOG_MEM_STATS")) > 0
  49. for range time.Tick(time.Duration(conf.FreeMemoryInterval) * time.Second) {
  50. freeMemory()
  51. if logMemStats {
  52. var m runtime.MemStats
  53. runtime.ReadMemStats(&m)
  54. logDebug("MEMORY USAGE: Sys=%d HeapIdle=%d HeapInuse=%d", m.Sys/1024/1024, m.HeapIdle/1024/1024, m.HeapInuse/1024/1024)
  55. }
  56. }
  57. }()
  58. ctx, cancel := context.WithCancel(context.Background())
  59. if err := startPrometheusServer(cancel); err != nil {
  60. return err
  61. }
  62. s, err := startServer(cancel)
  63. if err != nil {
  64. return err
  65. }
  66. defer shutdownServer(s)
  67. stop := make(chan os.Signal, 1)
  68. signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
  69. select {
  70. case <-ctx.Done():
  71. case <-stop:
  72. }
  73. return nil
  74. }
  75. func main() {
  76. if len(os.Args) > 1 {
  77. switch os.Args[1] {
  78. case "health":
  79. os.Exit(healthcheck())
  80. case "version":
  81. fmt.Println(version)
  82. os.Exit(0)
  83. }
  84. }
  85. if err := run(); err != nil {
  86. logFatal(err.Error())
  87. }
  88. }