()
| 663 | } |
| 664 | |
| 665 | func (t *Cortex) initRuler() (serv services.Service, err error) { |
| 666 | var manager *ruler.DefaultMultiTenantManager |
| 667 | if t.RulerStorage == nil { |
| 668 | level.Info(util_log.Logger).Log("msg", "RulerStorage is nil. Not starting the ruler.") |
| 669 | return nil, nil |
| 670 | } |
| 671 | |
| 672 | t.Cfg.Ruler.LookbackDelta = t.Cfg.Querier.LookbackDelta |
| 673 | t.Cfg.Ruler.FrontendTimeout = t.Cfg.Querier.Timeout |
| 674 | t.Cfg.Ruler.PrometheusHTTPPrefix = t.Cfg.API.PrometheusHTTPPrefix |
| 675 | t.Cfg.Ruler.Ring.ListenPort = t.Cfg.Server.GRPCListenPort |
| 676 | t.Cfg.Ruler.NameValidationScheme = t.Cfg.NameValidationScheme |
| 677 | metrics := ruler.NewRuleEvalMetrics(t.Cfg.Ruler, prometheus.DefaultRegisterer) |
| 678 | |
| 679 | rulerRegisterer := prometheus.WrapRegistererWith(prometheus.Labels{"engine": "ruler"}, prometheus.DefaultRegisterer) |
| 680 | |
| 681 | var ( |
| 682 | pusher ruler.Pusher |
| 683 | queryable prom_storage.Queryable |
| 684 | queryEngine promql.QueryEngine |
| 685 | ) |
| 686 | if t.Cfg.ExternalPusher != nil { |
| 687 | pusher = t.Cfg.ExternalPusher |
| 688 | } else { |
| 689 | pusher = t.Distributor |
| 690 | } |
| 691 | if t.Cfg.ExternalQueryable != nil { |
| 692 | queryable = t.Cfg.ExternalQueryable |
| 693 | |
| 694 | opts := promql.EngineOpts{ |
| 695 | Logger: util_log.SLogger, |
| 696 | Reg: rulerRegisterer, |
| 697 | ActiveQueryTracker: createActiveQueryTracker(t.Cfg.Querier, util_log.SLogger), |
| 698 | MaxSamples: t.Cfg.Querier.MaxSamples, |
| 699 | Timeout: t.Cfg.Querier.Timeout, |
| 700 | LookbackDelta: t.Cfg.Querier.LookbackDelta, |
| 701 | EnablePerStepStats: t.Cfg.Querier.EnablePerStepStats, |
| 702 | EnableAtModifier: true, |
| 703 | EnableNegativeOffset: true, |
| 704 | NoStepSubqueryIntervalFn: func(int64) int64 { |
| 705 | return t.Cfg.Querier.DefaultEvaluationInterval.Milliseconds() |
| 706 | }, |
| 707 | } |
| 708 | queryEngine = engine.New(opts, t.Cfg.Ruler.ThanosEngine, rulerRegisterer) |
| 709 | } else { |
| 710 | // TODO: Consider wrapping logger to differentiate from querier module logger |
| 711 | queryable, _, queryEngine = querier.New(t.Cfg.Querier, t.OverridesConfig, t.Distributor, t.StoreQueryables, rulerRegisterer, util_log.Logger, t.OverridesConfig.RulesPartialData) |
| 712 | } |
| 713 | |
| 714 | managerFactory := ruler.DefaultTenantManagerFactory(t.Cfg.Ruler, pusher, queryable, queryEngine, t.OverridesConfig, metrics, prometheus.DefaultRegisterer) |
| 715 | manager, err = ruler.NewDefaultMultiTenantManager(t.Cfg.Ruler, t.OverridesConfig, managerFactory, metrics, prometheus.DefaultRegisterer, util_log.Logger) |
| 716 | |
| 717 | if err != nil { |
| 718 | return nil, err |
| 719 | } |
| 720 | |
| 721 | t.Ruler, err = ruler.NewRuler( |
| 722 | t.Cfg.Ruler, |
nothing calls this directly
no test coverage detected