Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
    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}"
            )