service.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package metrics
  2. import (
  3. "context"
  4. "time"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/metrics/graphitebridge"
  7. "github.com/grafana/grafana/pkg/registry"
  8. "github.com/grafana/grafana/pkg/setting"
  9. )
  10. var metricsLogger log.Logger = log.New("metrics")
  11. type logWrapper struct {
  12. logger log.Logger
  13. }
  14. func (lw *logWrapper) Println(v ...interface{}) {
  15. lw.logger.Info("graphite metric bridge", v...)
  16. }
  17. func init() {
  18. registry.RegisterService(&InternalMetricsService{})
  19. initMetricVars()
  20. }
  21. type InternalMetricsService struct {
  22. Cfg *setting.Cfg `inject:""`
  23. intervalSeconds int64
  24. graphiteCfg *graphitebridge.Config
  25. oauthProviders map[string]bool
  26. }
  27. func (im *InternalMetricsService) Init() error {
  28. return im.readSettings()
  29. }
  30. func (im *InternalMetricsService) Run(ctx context.Context) error {
  31. // Start Graphite Bridge
  32. if im.graphiteCfg != nil {
  33. bridge, err := graphitebridge.NewBridge(im.graphiteCfg)
  34. if err != nil {
  35. metricsLogger.Error("failed to create graphite bridge", "error", err)
  36. } else {
  37. go bridge.Run(ctx)
  38. }
  39. }
  40. M_Instance_Start.Inc()
  41. // set the total stats gauges before we publishing metrics
  42. updateTotalStats()
  43. onceEveryDayTick := time.NewTicker(time.Hour * 24)
  44. everyMinuteTicker := time.NewTicker(time.Minute)
  45. defer onceEveryDayTick.Stop()
  46. defer everyMinuteTicker.Stop()
  47. for {
  48. select {
  49. case <-onceEveryDayTick.C:
  50. sendUsageStats(im.oauthProviders)
  51. case <-everyMinuteTicker.C:
  52. updateTotalStats()
  53. case <-ctx.Done():
  54. return ctx.Err()
  55. }
  56. }
  57. }