mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	task: add kill-switch for edge bulk metrics (#5758)
If the kill switch is enabled unleash returns 404 and a json body explaining why a 404 was given, encouraging users to upgrade to the most recent version of Edge.
This commit is contained in:
		
							parent
							
								
									795aa18bca
								
							
						
					
					
						commit
						4c574a1e50
					
				| @ -81,6 +81,7 @@ exports[`should create default config 1`] = ` | ||||
|       "disableBulkToggle": false, | ||||
|       "disableMetrics": false, | ||||
|       "disableNotifications": false, | ||||
|       "edgeBulkMetricsKillSwitch": false, | ||||
|       "embedProxy": true, | ||||
|       "embedProxyFrontend": true, | ||||
|       "enableLicense": false, | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { Response } from 'express'; | ||||
| import Controller from '../controller'; | ||||
| import { IUnleashConfig, IUnleashServices } from '../../types'; | ||||
| import { IFlagResolver, IUnleashConfig, IUnleashServices } from '../../types'; | ||||
| import { Logger } from '../../logger'; | ||||
| import { NONE } from '../../types/permissions'; | ||||
| import { createResponseSchema } from '../../openapi/util/create-response-schema'; | ||||
| @ -33,6 +33,8 @@ export default class EdgeController extends Controller { | ||||
| 
 | ||||
|     private clientInstanceService: ClientInstanceService; | ||||
| 
 | ||||
|     private flagResolver: IFlagResolver; | ||||
| 
 | ||||
|     constructor( | ||||
|         config: IUnleashConfig, | ||||
|         { | ||||
| @ -54,6 +56,7 @@ export default class EdgeController extends Controller { | ||||
|         this.openApiService = openApiService; | ||||
|         this.metricsV2 = clientMetricsServiceV2; | ||||
|         this.clientInstanceService = clientInstanceService; | ||||
|         this.flagResolver = config.flagResolver; | ||||
| 
 | ||||
|         this.route({ | ||||
|             method: 'post', | ||||
| @ -115,25 +118,37 @@ export default class EdgeController extends Controller { | ||||
|         req: IAuthRequest<void, void, BulkMetricsSchema>, | ||||
|         res: Response<void>, | ||||
|     ): Promise<void> { | ||||
|         const { body, ip: clientIp } = req; | ||||
|         const { metrics, applications } = body; | ||||
|         if (!this.flagResolver.isEnabled('edgeBulkMetricsKillSwitch')) { | ||||
|             const { body, ip: clientIp } = req; | ||||
|             const { metrics, applications } = body; | ||||
| 
 | ||||
|         try { | ||||
|             const promises: Promise<void>[] = []; | ||||
|             for (const app of applications) { | ||||
|                 promises.push( | ||||
|                     this.clientInstanceService.registerClient(app, clientIp), | ||||
|                 ); | ||||
|             try { | ||||
|                 const promises: Promise<void>[] = []; | ||||
|                 for (const app of applications) { | ||||
|                     promises.push( | ||||
|                         this.clientInstanceService.registerClient( | ||||
|                             app, | ||||
|                             clientIp, | ||||
|                         ), | ||||
|                     ); | ||||
|                 } | ||||
|                 if (metrics && metrics.length > 0) { | ||||
|                     const data = | ||||
|                         await clientMetricsEnvBulkSchema.validateAsync(metrics); | ||||
|                     promises.push(this.metricsV2.registerBulkMetrics(data)); | ||||
|                 } | ||||
|                 await Promise.all(promises); | ||||
|                 res.status(202).end(); | ||||
|             } catch (e) { | ||||
|                 res.status(400).end(); | ||||
|             } | ||||
|             if (metrics && metrics.length > 0) { | ||||
|                 const data = | ||||
|                     await clientMetricsEnvBulkSchema.validateAsync(metrics); | ||||
|                 promises.push(this.metricsV2.registerBulkMetrics(data)); | ||||
|             } | ||||
|             await Promise.all(promises); | ||||
|             res.status(202).end(); | ||||
|         } catch (e) { | ||||
|             res.status(400).end(); | ||||
|         } else { | ||||
|             // @ts-expect-error Expected result here is void, but since we want to communicate extra information in our 404, we allow this to avoid type-checking
 | ||||
|             res.status(404).json({ | ||||
|                 status: 'disabled', | ||||
|                 reason: 'disabled by killswitch', | ||||
|                 help: 'You should upgrade Edge to the most recent version to not lose metrics', | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -37,7 +37,8 @@ export type IFlagKey = | ||||
|     | 'increaseUnleashWidth' | ||||
|     | 'featureSearchFeedback' | ||||
|     | 'featureSearchFeedbackPosting' | ||||
|     | 'newStrategyConfigurationFeedback'; | ||||
|     | 'newStrategyConfigurationFeedback' | ||||
|     | 'edgeBulkMetricsKillSwitch'; | ||||
| 
 | ||||
| export type IFlags = Partial<{ [key in IFlagKey]: boolean | Variant }>; | ||||
| 
 | ||||
| @ -168,6 +169,10 @@ const flags: IFlags = { | ||||
|         process.env.UNLEASH_EXPERIMENTAL_NEW_STRATEGY_CONFIGURATION_FEEDBACK, | ||||
|         false, | ||||
|     ), | ||||
|     edgeBulkMetricsKillSwitch: parseEnvVarBoolean( | ||||
|         process.env.UNLEASH_EXPERIMENTAL_EDGE_BULK_METRICS_KILL_SWITCH, | ||||
|         false, | ||||
|     ), | ||||
| }; | ||||
| 
 | ||||
| export const defaultExperimentalOptions: IExperimentalOptions = { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user