def report_incident(user_id: str, channel_id: str, submission: Any, response_url: str, state: Any): report = submission["report"] summary = submission["summary"] impact = submission["impact"] lead_id = submission["lead"] severity = submission["severity"] if "incident_type" in submission: report_only = submission["incident_type"] == "report" else: report_only = False name = get_user_profile(user_id)["name"] reporter, _ = ExternalUser.objects.get_or_create_slack(external_id=user_id, display_name=name) lead = None if lead_id: lead_name = get_user_profile(lead_id)["name"] lead, _ = ExternalUser.objects.get_or_create_slack( external_id=lead_id, display_name=lead_name) new_incident = Incident.objects.create_incident( report=report, reporter=reporter, report_time=datetime.now(), report_only=report_only, summary=summary, impact=impact, lead=lead, severity=severity, ) timeline_event = TimelineEvent( incident=new_incident, timestamp=new_incident.report_time, text="Incident Reported by " + reporter.full_name, event_type="metadata", ) timeline_event.save() if report_only and hasattr(settings, "INCIDENT_REPORT_CHANNEL_ID"): incidents_channel_ref = channel_reference( settings.INCIDENT_REPORT_CHANNEL_ID) else: incidents_channel_ref = channel_reference(settings.INCIDENT_CHANNEL_ID) text = f"Thanks for raising the incident 🙏" settings.SLACK_CLIENT.send_ephemeral_message(channel_id, user_id, text)
def report_incident(user_id: str, channel_id: str, submission: Any, response_url: str, state: Any): report = submission["report"] summary = submission["summary"] environment = submission["environment"] impact = submission["impact"] lead_id = submission["lead"] severity = submission["severity"] incident_platform = submission["incident_platform"] if "incident_type" in submission: report_only = submission["incident_type"] == "report" else: report_only = False name = get_user_profile(user_id)["name"] reporter, _ = ExternalUser.objects.get_or_create_slack(external_id=user_id, display_name=name) lead = None if lead_id: lead_name = get_user_profile(lead_id)["name"] lead, _ = ExternalUser.objects.get_or_create_slack( external_id=lead_id, display_name=lead_name) Incident.objects.create_incident( report=report, reporter=reporter, report_time=datetime.now(), report_only=report_only, summary=summary, incident_platform=incident_platform, environment=environment, impact=impact, lead=lead, severity=severity, ) if report_only and hasattr(settings, "INCIDENT_REPORT_CHANNEL_ID"): incidents_channel_ref = channel_reference( settings.INCIDENT_REPORT_CHANNEL_ID) else: incidents_channel_ref = channel_reference(settings.INCIDENT_CHANNEL_ID) text = ( f"Thanks for raising the incident 🙏\n\nHead over to {incidents_channel_ref} " f"to complete the report and/or help deal with the issue") settings.SLACK_CLIENT.send_ephemeral_message(channel_id, user_id, text)
def update_in_slack(self): "Creates/updates the slack headline post with the latest incident info" logging.info( f"Updating headline post in Slack for incident {self.incident.pk}") msg = Message() # Set the fallback text so notifications look nice msg.set_fallback_text( f"{self.incident.report} reported by {user_reference(self.incident.reporter)}" ) # Add report/people msg.add_block( Section(block_id="report", text=Text(f"*{self.incident.report}*"))) msg.add_block( Section( block_id="reporter", text=Text( f"🙋🏻♂️ Reporter: {user_reference(self.incident.reporter.external_id)}" ), )) incident_lead_text = (user_reference(self.incident.lead.external_id) if self.incident.lead else "-") msg.add_block( Section(block_id="lead", text=Text(f"👩🚒 Incident Lead: {incident_lead_text}"))) msg.add_block(Divider()) # Add additional info msg.add_block( Section( block_id="status", text=Text( f"{self.incident.status_emoji()} Status: {self.incident.status_text().capitalize()}" ), )) severity_text = (self.incident.severity_text().capitalize() if self.incident.severity_text() else "-") msg.add_block( Section( block_id="severity", text=Text( f"{self.incident.severity_emoji()} Severity: {severity_text}" ), )) doc_url = urljoin( settings.SITE_URL, reverse("incident_doc", kwargs={"incident_id": self.incident.pk}), ) msg.add_block( Section( block_id="incident_doc", text=Text( f"📄 Details: <{doc_url}|Incident {self.incident.pk}>"), )) if not self.incident.report_only: channel_ref = (channel_reference(self.comms_channel.channel_id) if self.comms_channel else None) if channel_ref: msg.add_block( Section( block_id="comms_channel", text=Text( f":slack: Incident Room: {channel_ref or '-'}"), )) if not self.incident.report_only: zoom_ref = self.zoom_meeting.weblink if self.zoom_meeting else None if zoom_ref: msg.add_block( Section( block_id="zoom_meeting", text=Text( f":telephone_receiver: Zoom Meeting: {zoom_ref or '-'}" ), )) # Add buttons (if the incident is open) if not self.incident.is_closed(): msg.add_block(Section(text=Text("Need something else?"))) actions = Actions(block_id="actions") # Add all actions mapped by @headline_post_action decorators for key in sorted(SLACK_HEADLINE_POST_ACTION_MAPPINGS.keys()): funclist = SLACK_HEADLINE_POST_ACTION_MAPPINGS[key] for f in funclist: action = f(self) if action: actions.add_element(action) msg.add_block(actions) # Post / update the slack message if self.incident.report_only and hasattr(settings, "INCIDENT_REPORT_CHANNEL_ID"): channel_id = settings.INCIDENT_REPORT_CHANNEL_ID else: channel_id = settings.INCIDENT_CHANNEL_ID try: response = msg.send(channel_id, self.message_ts) logger.info( f"Got response back from Slack after updating headline post: {response}" ) # Save the message ts identifier if not already set if not self.message_ts: self.message_ts = response["ts"] self.save() except SlackError as e: logger.error( f"Failed to update headline post in {channel_id} with ts {self.message_ts}. Error: {e}" )