def on_post(self, req, resp): ''' This endpoint is compatible with the webhook post from Grafana. Simply configure Grafana with a new notification channel with type 'webhook' and a plan parameter pointing to your iris plan. Name: 'iris-team1' Url: http://iris:16649/v0/webhooks/grafana?application=test-app&key=sdffdssdf&plan=team1 ''' alert_params = ujson.loads(req.context['body']) self.validate_post(alert_params) with db.guarded_session() as session: plan = req.get_param('plan', True) plan_id = session.execute('SELECT `plan_id` FROM `plan_active` WHERE `name` = :plan', {'plan': plan}).scalar() if not plan_id: logger.warn('No active plan "%s" found', plan) raise HTTPInvalidParam('plan does not exist or is not active') app = req.context['app'] context_json_str = self.create_context(alert_params) app_template_count = session.execute(''' SELECT EXISTS ( SELECT 1 FROM `plan_notification` JOIN `template` ON `template`.`name` = `plan_notification`.`template` JOIN `template_content` ON `template_content`.`template_id` = `template`.`id` WHERE `plan_notification`.`plan_id` = :plan_id AND `template_content`.`application_id` = :app_id ) ''', {'app_id': app['id'], 'plan_id': plan_id}).scalar() if not app_template_count: logger.warn('no plan template exists for this app') raise HTTPBadRequest('No plan template actions exist for this app') data = { 'plan_id': plan_id, 'created': datetime.datetime.utcnow(), 'application_id': app['id'], 'context': context_json_str, 'current_step': 0, 'active': True, } session.execute( '''INSERT INTO `incident` (`plan_id`, `created`, `context`, `current_step`, `active`, `application_id`) VALUES (:plan_id, :created, :context, 0, :active, :application_id)''', data).lastrowid session.commit() session.close() resp.status = HTTP_201
def on_post(self, req, resp): ''' This endpoint is compatible with the webhook post from Alertmanager. Simply configure alertmanager with a receiver pointing to iris, like so: receivers: - name: 'iris-team1' webhook_configs: - url: http://iris:16649/v0/webhooks/alertmanager?application=test-app&key=sdffdssdf Where application points to an application and key in Iris. For every POST from alertmanager, a new incident will be created, if the iris_plan label is attached to an alert. ''' alert_params = ujson.loads(req.context['body']) self.validate_post(alert_params) with db.guarded_session() as session: plan = alert_params['groupLabels']['iris_plan'] plan_id = session.execute( 'SELECT `plan_id` FROM `plan_active` WHERE `name` = :plan', { 'plan': plan }).scalar() if not plan_id: raise HTTPNotFound() app = req.context['app'] context_json_str = self.create_context(alert_params) app_template_count = session.execute( ''' SELECT EXISTS ( SELECT 1 FROM `plan_notification` JOIN `template` ON `template`.`name` = `plan_notification`.`template` JOIN `template_content` ON `template_content`.`template_id` = `template`.`id` WHERE `plan_notification`.`plan_id` = :plan_id AND `template_content`.`application_id` = :app_id ) ''', { 'app_id': app['id'], 'plan_id': plan_id }).scalar() if not app_template_count: logger.warning('no plan template exists for this app') raise HTTPBadRequest( 'No plan template actions exist for this app') data = { 'plan_id': plan_id, 'created': datetime.datetime.utcnow(), 'application_id': app['id'], 'context': context_json_str, 'current_step': 0, 'active': True, } incident_id = session.execute( '''INSERT INTO `incident` (`plan_id`, `created`, `context`, `current_step`, `active`, `application_id`) VALUES (:plan_id, :created, :context, 0, :active, :application_id)''', data).lastrowid session.commit() session.close() resp.status = HTTP_201 resp.set_header('Location', '/incidents/%s' % incident_id) resp.body = ujson.dumps(incident_id)
def on_post(self, req, resp, plan): ''' For every POST, a new incident will be created, if the plan label is attached to an alert. The iris application and key should be provided in the url params. The plan id can be taken from the post body or url params passed by the webhook subclass. ''' alert_params = ujson.loads(req.context['body']) self.validate_post(alert_params) with db.guarded_session() as session: plan_id = session.execute( 'SELECT `plan_id` FROM `plan_active` WHERE `name` = :plan', { 'plan': plan }).scalar() if not plan_id: raise HTTPNotFound() app = req.context['app'] context_json_str = self.create_context(alert_params) app_template_count = session.execute( ''' SELECT EXISTS ( SELECT 1 FROM `plan_notification` JOIN `template` ON `template`.`name` = `plan_notification`.`template` JOIN `template_content` ON `template_content`.`template_id` = `template`.`id` WHERE `plan_notification`.`plan_id` = :plan_id AND `template_content`.`application_id` = :app_id ) ''', { 'app_id': app['id'], 'plan_id': plan_id }).scalar() if not app_template_count: logger.warn('no plan template exists for this app') raise HTTPBadRequest( 'No plan template actions exist for this app') data = { 'plan_id': plan_id, 'created': datetime.datetime.utcnow(), 'application_id': app['id'], 'context': context_json_str, 'current_step': 0, 'active': True, } incident_id = session.execute( '''INSERT INTO `incident` (`plan_id`, `created`, `context`, `current_step`, `active`, `application_id`) VALUES (:plan_id, :created, :context, 0, :active, :application_id)''', data).lastrowid session.commit() session.close() resp.status = HTTP_201 resp.set_header('Location', '/incidents/%s' % incident_id) resp.body = ujson.dumps(incident_id)