| 
									
										
										
										
											2021-03-09 04:19:21 +08:00
										 |  |  | package api | 
					
						
							| 
									
										
										
										
											2020-11-12 21:11:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-08-17 20:49:05 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-08-13 20:14:36 +08:00
										 |  |  | 	"net/url" | 
					
						
							| 
									
										
										
										
											2021-03-09 04:19:21 +08:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 21:11:30 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							| 
									
										
										
										
											2021-03-24 22:20:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/log" | 
					
						
							| 
									
										
										
										
											2023-08-16 15:04:18 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 	ac "github.com/grafana/grafana/pkg/services/accesscontrol" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/auth/identity" | 
					
						
							| 
									
										
										
										
											2021-03-24 22:20:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/datasourceproxy" | 
					
						
							| 
									
										
										
										
											2021-03-03 23:52:19 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/datasources" | 
					
						
							| 
									
										
										
										
											2022-12-14 22:44:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" | 
					
						
							| 
									
										
										
										
											2022-12-14 22:44:14 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/backtesting" | 
					
						
							| 
									
										
										
										
											2022-04-02 08:00:23 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/eval" | 
					
						
							| 
									
										
										
										
											2021-08-06 20:06:56 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/metrics" | 
					
						
							| 
									
										
										
										
											2021-12-28 07:01:17 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/models" | 
					
						
							| 
									
										
										
										
											2021-08-17 20:49:05 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/notifier" | 
					
						
							| 
									
										
										
										
											2022-04-06 05:48:51 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/provisioning" | 
					
						
							| 
									
										
										
										
											2022-07-13 03:13:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/sender" | 
					
						
							| 
									
										
										
										
											2021-08-06 20:06:56 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/state" | 
					
						
							| 
									
										
										
										
											2021-03-24 22:20:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ngalert/store" | 
					
						
							| 
									
										
										
										
											2021-08-06 20:06:56 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota" | 
					
						
							| 
									
										
										
										
											2021-03-03 23:52:19 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2020-11-12 21:11:30 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-09 04:19:21 +08:00
										 |  |  | // timeNow makes it possible to test usage of time
 | 
					
						
							|  |  |  | var timeNow = time.Now | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-13 03:13:04 +08:00
										 |  |  | type ExternalAlertmanagerProvider interface { | 
					
						
							| 
									
										
										
										
											2021-08-13 20:14:36 +08:00
										 |  |  | 	AlertmanagersFor(orgID int64) []*url.URL | 
					
						
							|  |  |  | 	DroppedAlertmanagersFor(orgID int64) []*url.URL | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-28 07:01:17 +08:00
										 |  |  | type AlertingStore interface { | 
					
						
							| 
									
										
										
										
											2023-03-28 16:34:35 +08:00
										 |  |  | 	GetLatestAlertmanagerConfiguration(ctx context.Context, query *models.GetLatestAlertmanagerConfigurationQuery) (*models.AlertConfiguration, error) | 
					
						
							| 
									
										
										
										
											2021-12-28 07:01:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | type RuleAccessControlService interface { | 
					
						
							| 
									
										
										
										
											2023-12-02 07:42:11 +08:00
										 |  |  | 	HasAccessToRuleGroup(ctx context.Context, user identity.Requester, rules models.RulesGroup) (bool, error) | 
					
						
							|  |  |  | 	AuthorizeAccessToRuleGroup(ctx context.Context, user identity.Requester, rules models.RulesGroup) error | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 	AuthorizeRuleChanges(ctx context.Context, user identity.Requester, change *store.GroupDelta) error | 
					
						
							| 
									
										
										
										
											2023-12-02 07:42:11 +08:00
										 |  |  | 	AuthorizeDatasourceAccessForRule(ctx context.Context, user identity.Requester, rule *models.AlertRule) error | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-09 04:19:21 +08:00
										 |  |  | // API handlers.
 | 
					
						
							|  |  |  | type API struct { | 
					
						
							| 
									
										
										
										
											2021-08-24 18:28:09 +08:00
										 |  |  | 	Cfg                  *setting.Cfg | 
					
						
							|  |  |  | 	DatasourceCache      datasources.CacheService | 
					
						
							| 
									
										
										
										
											2022-07-20 22:50:49 +08:00
										 |  |  | 	DatasourceService    datasources.DataSourceService | 
					
						
							| 
									
										
										
										
											2021-08-24 18:28:09 +08:00
										 |  |  | 	RouteRegister        routing.RouteRegister | 
					
						
							| 
									
										
										
										
											2022-07-16 00:06:44 +08:00
										 |  |  | 	QuotaService         quota.Service | 
					
						
							| 
									
										
										
										
											2022-04-06 05:48:51 +08:00
										 |  |  | 	TransactionManager   provisioning.TransactionManager | 
					
						
							| 
									
										
										
										
											2022-04-29 03:27:34 +08:00
										 |  |  | 	ProvenanceStore      provisioning.ProvisioningStore | 
					
						
							| 
									
										
										
										
											2022-09-27 21:56:30 +08:00
										 |  |  | 	RuleStore            RuleStore | 
					
						
							| 
									
										
										
										
											2021-12-28 07:01:17 +08:00
										 |  |  | 	AlertingStore        AlertingStore | 
					
						
							| 
									
										
										
										
											2021-08-24 18:28:09 +08:00
										 |  |  | 	AdminConfigStore     store.AdminConfigurationStore | 
					
						
							| 
									
										
										
										
											2021-08-25 21:11:22 +08:00
										 |  |  | 	DataProxy            *datasourceproxy.DataSourceProxyService | 
					
						
							| 
									
										
										
										
											2021-08-24 18:28:09 +08:00
										 |  |  | 	MultiOrgAlertmanager *notifier.MultiOrgAlertmanager | 
					
						
							|  |  |  | 	StateManager         *state.Manager | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 	AccessControl        ac.AccessControl | 
					
						
							| 
									
										
										
										
											2022-04-06 05:48:51 +08:00
										 |  |  | 	Policies             *provisioning.NotificationPolicyService | 
					
						
							| 
									
										
										
										
											2022-04-14 04:15:55 +08:00
										 |  |  | 	ContactPointService  *provisioning.ContactPointService | 
					
						
							| 
									
										
										
										
											2022-04-29 02:51:57 +08:00
										 |  |  | 	Templates            *provisioning.TemplateService | 
					
						
							| 
									
										
										
										
											2022-05-18 02:42:48 +08:00
										 |  |  | 	MuteTimings          *provisioning.MuteTimingService | 
					
						
							| 
									
										
										
										
											2022-06-02 20:48:53 +08:00
										 |  |  | 	AlertRules           *provisioning.AlertRuleService | 
					
						
							| 
									
										
										
										
											2022-07-13 03:13:04 +08:00
										 |  |  | 	AlertsRouter         *sender.AlertsRouter | 
					
						
							| 
									
										
										
										
											2022-11-02 22:13:39 +08:00
										 |  |  | 	EvaluatorFactory     eval.EvaluatorFactory | 
					
						
							| 
									
										
										
										
											2022-12-14 22:44:14 +08:00
										 |  |  | 	FeatureManager       featuremgmt.FeatureToggles | 
					
						
							| 
									
										
										
										
											2023-02-03 01:34:00 +08:00
										 |  |  | 	Historian            Historian | 
					
						
							| 
									
										
										
										
											2023-08-16 15:04:18 +08:00
										 |  |  | 	Tracer               tracing.Tracer | 
					
						
							|  |  |  | 	AppUrl               *url.URL | 
					
						
							| 
									
										
										
										
											2023-04-25 00:18:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Hooks can be used to replace API handlers for specific paths.
 | 
					
						
							|  |  |  | 	Hooks *Hooks | 
					
						
							| 
									
										
										
										
											2021-03-03 23:52:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-09 04:19:21 +08:00
										 |  |  | // RegisterAPIEndpoints registers API handlers
 | 
					
						
							| 
									
										
										
										
											2021-09-14 19:55:01 +08:00
										 |  |  | func (api *API) RegisterAPIEndpoints(m *metrics.API) { | 
					
						
							| 
									
										
										
										
											2021-03-12 03:28:00 +08:00
										 |  |  | 	logger := log.New("ngalert.api") | 
					
						
							| 
									
										
										
										
											2021-03-24 19:43:25 +08:00
										 |  |  | 	proxy := &AlertingProxy{ | 
					
						
							|  |  |  | 		DataProxy: api.DataProxy, | 
					
						
							| 
									
										
										
										
											2022-08-12 21:56:18 +08:00
										 |  |  | 		ac:        api.AccessControl, | 
					
						
							| 
									
										
										
										
											2021-03-24 19:43:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 	ruleAuthzService := accesscontrol.NewRuleService(api.AccessControl) | 
					
						
							| 
									
										
										
										
											2021-04-27 20:25:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 20:14:36 +08:00
										 |  |  | 	// Register endpoints for proxying to Alertmanager-compatible backends.
 | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterAlertmanagerApiEndpoints(NewForkingAM( | 
					
						
							| 
									
										
										
										
											2021-03-29 23:18:25 +08:00
										 |  |  | 		api.DatasourceCache, | 
					
						
							|  |  |  | 		NewLotexAM(proxy, logger), | 
					
						
							| 
									
										
										
										
											2022-04-15 02:06:21 +08:00
										 |  |  | 		&AlertmanagerSrv{crypto: api.MultiOrgAlertmanager.Crypto, log: logger, ac: api.AccessControl, mam: api.MultiOrgAlertmanager}, | 
					
						
							| 
									
										
										
										
											2021-05-01 00:28:06 +08:00
										 |  |  | 	), m) | 
					
						
							| 
									
										
										
										
											2021-08-13 20:14:36 +08:00
										 |  |  | 	// Register endpoints for proxying to Prometheus-compatible backends.
 | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterPrometheusApiEndpoints(NewForkingProm( | 
					
						
							| 
									
										
										
										
											2021-03-24 19:43:25 +08:00
										 |  |  | 		api.DatasourceCache, | 
					
						
							|  |  |  | 		NewLotexProm(proxy, logger), | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 		&PrometheusSrv{log: logger, manager: api.StateManager, store: api.RuleStore, authz: ruleAuthzService}, | 
					
						
							| 
									
										
										
										
											2021-05-01 00:28:06 +08:00
										 |  |  | 	), m) | 
					
						
							| 
									
										
										
										
											2021-08-13 20:14:36 +08:00
										 |  |  | 	// Register endpoints for proxying to Cortex Ruler-compatible backends.
 | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterRulerApiEndpoints(NewForkingRuler( | 
					
						
							| 
									
										
										
										
											2021-03-24 00:08:57 +08:00
										 |  |  | 		api.DatasourceCache, | 
					
						
							| 
									
										
										
										
											2021-03-24 19:43:25 +08:00
										 |  |  | 		NewLotexRuler(proxy, logger), | 
					
						
							| 
									
										
										
										
											2022-03-16 00:48:42 +08:00
										 |  |  | 		&RulerSrv{ | 
					
						
							| 
									
										
										
										
											2022-11-02 22:13:39 +08:00
										 |  |  | 			conditionValidator: api.EvaluatorFactory, | 
					
						
							| 
									
										
										
										
											2022-09-22 03:14:11 +08:00
										 |  |  | 			QuotaService:       api.QuotaService, | 
					
						
							|  |  |  | 			store:              api.RuleStore, | 
					
						
							|  |  |  | 			provenanceStore:    api.ProvenanceStore, | 
					
						
							|  |  |  | 			xactManager:        api.TransactionManager, | 
					
						
							|  |  |  | 			log:                logger, | 
					
						
							|  |  |  | 			cfg:                &api.Cfg.UnifiedAlerting, | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 			authz:              ruleAuthzService, | 
					
						
							| 
									
										
										
										
											2022-03-22 07:20:35 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2021-05-01 00:28:06 +08:00
										 |  |  | 	), m) | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterTestingApiEndpoints(NewTestingApi( | 
					
						
							| 
									
										
										
										
											2022-02-05 01:42:04 +08:00
										 |  |  | 		&TestingApiSrv{ | 
					
						
							| 
									
										
										
										
											2022-06-28 05:40:44 +08:00
										 |  |  | 			AlertingProxy:   proxy, | 
					
						
							|  |  |  | 			DatasourceCache: api.DatasourceCache, | 
					
						
							|  |  |  | 			log:             logger, | 
					
						
							| 
									
										
										
										
											2023-11-16 00:54:54 +08:00
										 |  |  | 			authz:           ruleAuthzService, | 
					
						
							| 
									
										
										
										
											2022-11-02 22:13:39 +08:00
										 |  |  | 			evaluator:       api.EvaluatorFactory, | 
					
						
							| 
									
										
										
										
											2022-12-14 22:44:14 +08:00
										 |  |  | 			cfg:             &api.Cfg.UnifiedAlerting, | 
					
						
							| 
									
										
										
										
											2023-08-16 15:04:18 +08:00
										 |  |  | 			backtesting:     backtesting.NewEngine(api.AppUrl, api.EvaluatorFactory, api.Tracer), | 
					
						
							| 
									
										
										
										
											2022-12-14 22:44:14 +08:00
										 |  |  | 			featureManager:  api.FeatureManager, | 
					
						
							| 
									
										
										
										
											2023-06-09 06:59:54 +08:00
										 |  |  | 			appUrl:          api.AppUrl, | 
					
						
							| 
									
										
										
										
											2023-08-16 15:04:18 +08:00
										 |  |  | 			tracer:          api.Tracer, | 
					
						
							| 
									
										
										
										
											2021-12-13 16:22:57 +08:00
										 |  |  | 		}), m) | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterConfigurationApiEndpoints(NewConfiguration( | 
					
						
							|  |  |  | 		&ConfigSrv{ | 
					
						
							| 
									
										
										
										
											2022-07-20 22:50:49 +08:00
										 |  |  | 			datasourceService:    api.DatasourceService, | 
					
						
							| 
									
										
										
										
											2022-07-13 03:13:04 +08:00
										 |  |  | 			store:                api.AdminConfigStore, | 
					
						
							|  |  |  | 			log:                  logger, | 
					
						
							|  |  |  | 			alertmanagerProvider: api.AlertsRouter, | 
					
						
							| 
									
										
										
										
											2021-12-13 16:22:57 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	), m) | 
					
						
							| 
									
										
										
										
											2022-04-06 05:48:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-18 15:08:08 +08:00
										 |  |  | 	api.RegisterProvisioningApiEndpoints(NewProvisioningApi(&ProvisioningSrv{ | 
					
						
							| 
									
										
										
										
											2022-06-05 13:45:36 +08:00
										 |  |  | 		log:                 logger, | 
					
						
							|  |  |  | 		policies:            api.Policies, | 
					
						
							|  |  |  | 		contactPointService: api.ContactPointService, | 
					
						
							|  |  |  | 		templates:           api.Templates, | 
					
						
							|  |  |  | 		muteTimings:         api.MuteTimings, | 
					
						
							|  |  |  | 		alertRules:          api.AlertRules, | 
					
						
							|  |  |  | 	}), m) | 
					
						
							| 
									
										
										
										
											2023-02-03 01:34:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	api.RegisterHistoryApiEndpoints(NewStateHistoryApi(&HistorySrv{ | 
					
						
							|  |  |  | 		logger: logger, | 
					
						
							|  |  |  | 		hist:   api.Historian, | 
					
						
							|  |  |  | 	}), m) | 
					
						
							| 
									
										
										
										
											2020-12-17 22:00:09 +08:00
										 |  |  | } |