| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | package modules | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"errors" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/dskit/modules" | 
					
						
							|  |  |  | 	"github.com/grafana/dskit/services" | 
					
						
							| 
									
										
										
										
											2023-08-31 21:12:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/log" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var _ services.ManagerListener = (*serviceListener)(nil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type serviceListener struct { | 
					
						
							|  |  |  | 	log     log.Logger | 
					
						
							|  |  |  | 	service *service | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func newServiceListener(logger log.Logger, s *service) *serviceListener { | 
					
						
							|  |  |  | 	return &serviceListener{log: logger, service: s} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (l *serviceListener) Healthy() { | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 	l.log.Info("All modules healthy") | 
					
						
							| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (l *serviceListener) Stopped() { | 
					
						
							| 
									
										
										
										
											2023-08-03 21:19:01 +08:00
										 |  |  | 	l.log.Info("All modules stopped") | 
					
						
							| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (l *serviceListener) Failure(service services.Service) { | 
					
						
							|  |  |  | 	// if any service fails, stop all services
 | 
					
						
							| 
									
										
										
										
											2023-08-31 21:12:01 +08:00
										 |  |  | 	if err := l.service.Shutdown(context.Background(), service.FailureCase().Error()); err != nil { | 
					
						
							| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | 		l.log.Error("Failed to stop all modules", "err", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// log which module failed
 | 
					
						
							| 
									
										
										
										
											2023-08-31 21:12:01 +08:00
										 |  |  | 	for module, s := range l.service.serviceMap { | 
					
						
							| 
									
										
										
										
											2023-03-07 03:06:52 +08:00
										 |  |  | 		if s == service { | 
					
						
							|  |  |  | 			if errors.Is(service.FailureCase(), modules.ErrStopProcess) { | 
					
						
							|  |  |  | 				l.log.Info("Received stop signal via return error", "module", module, "err", service.FailureCase()) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				l.log.Error("Module failed", "module", module, "err", service.FailureCase()) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	l.log.Error("Module failed", "module", "unknown", "err", service.FailureCase()) | 
					
						
							|  |  |  | } |