コード例 #1
0
ファイル: zabbix.py プロジェクト: mrfroggg/elastalert2
 def send_metric(self, hostname, key, data):
     zm = ZabbixMetric(hostname, key, data)
     if self.send_aggregated_metrics:
         self.aggregated_metrics.append(zm)
         if len(self.aggregated_metrics) > self.metrics_chunk_size:
             elastalert_logger.info("Sending: %s metrics" %
                                    (len(self.aggregated_metrics)))
             try:
                 ZabbixSender(zabbix_server=self.sender_host, zabbix_port=self.sender_port) \
                     .send(self.aggregated_metrics)
                 self.aggregated_metrics = []
             except Exception as e:
                 elastalert_logger.exception(e)
     else:
         try:
             ZabbixSender(zabbix_server=self.sender_host,
                          zabbix_port=self.sender_port).send([zm])
         except Exception as e:
             elastalert_logger.exception(e)
コード例 #2
0
ファイル: jira.py プロジェクト: mrfroggg/elastalert2
    def find_existing_ticket(self, matches):
        # Default title, get stripped search version
        if 'alert_subject' not in self.rule:
            title = self.create_default_title(matches, True)
        else:
            title = self.create_title(matches)

        if 'jira_ignore_in_title' in self.rule:
            title = title.replace(
                matches[0].get(self.rule['jira_ignore_in_title'], ''), '')

        # This is necessary for search to work. Other special characters and dashes
        # directly adjacent to words appear to be ok
        title = title.replace(' - ', ' ')
        title = title.replace('\\', '\\\\')

        date = (datetime.datetime.now() -
                datetime.timedelta(days=self.max_age)).strftime('%Y-%m-%d')
        jql = 'project=%s AND summary~"%s" and created >= "%s"' % (
            self.project, title, date)
        if self.bump_in_statuses:
            jql = '%s and status in (%s)' % (jql, ','.join([
                "\"%s\"" % status if ' ' in status else status
                for status in self.bump_in_statuses
            ]))
        if self.bump_not_in_statuses:
            jql = '%s and status not in (%s)' % (jql, ','.join([
                "\"%s\"" % status if ' ' in status else status
                for status in self.bump_not_in_statuses
            ]))
        try:
            issues = self.client.search_issues(jql)
        except JIRAError as e:
            elastalert_logger.exception(
                "Error while searching for JIRA ticket using jql '%s': %s" %
                (jql, e))
            return None

        if len(issues):
            return issues[0]
コード例 #3
0
ファイル: jira.py プロジェクト: mrfroggg/elastalert2
    def alert(self, matches):
        # Reset arbitrary fields to pick up changes
        self.get_arbitrary_fields()
        if len(self.deferred_settings) > 0:
            fields = self.client.fields()
            for jira_field in self.deferred_settings:
                value = lookup_es_key(matches[0], self.rule[jira_field][1:])
                self.set_jira_arg(jira_field, value, fields)

        title = self.create_title(matches)

        if self.bump_tickets:
            ticket = self.find_existing_ticket(matches)
            if ticket:
                inactivity_datetime = ts_now() - datetime.timedelta(
                    days=self.bump_after_inactivity)
                if ts_to_dt(ticket.fields.updated) >= inactivity_datetime:
                    if self.pipeline is not None:
                        self.pipeline['jira_ticket'] = None
                        self.pipeline['jira_server'] = self.server
                    return None
                elastalert_logger.info('Commenting on existing ticket %s' %
                                       (ticket.key))
                for match in matches:
                    try:
                        self.comment_on_ticket(ticket, match)
                    except JIRAError as e:
                        elastalert_logger.exception(
                            "Error while commenting on ticket %s: %s" %
                            (ticket, e))
                    if self.labels:
                        for label in self.labels:
                            try:
                                ticket.fields.labels.append(label)
                            except JIRAError as e:
                                elastalert_logger.exception(
                                    "Error while appending labels to ticket %s: %s"
                                    % (ticket, e))
                if self.transition:
                    elastalert_logger.info('Transitioning existing ticket %s' %
                                           (ticket.key))
                    try:
                        self.transition_ticket(ticket)
                    except JIRAError as e:
                        elastalert_logger.exception(
                            "Error while transitioning ticket %s: %s" %
                            (ticket, e))

                if self.pipeline is not None:
                    self.pipeline['jira_ticket'] = ticket
                    self.pipeline['jira_server'] = self.server
                return None
        if self.bump_only:
            return None

        self.jira_args['summary'] = title
        self.jira_args['description'] = self.create_alert_body(matches)

        try:
            self.issue = self.client.create_issue(**self.jira_args)

            # You can not add watchers on initial creation. Only as a follow-up action
            if self.watchers:
                for watcher in self.watchers:
                    try:
                        self.client.add_watcher(self.issue.key, watcher)
                    except Exception as ex:
                        # Re-raise the exception, preserve the stack-trace, and give some
                        # context as to which watcher failed to be added
                        raise Exception(
                            "Exception encountered when trying to add '{0}' as a watcher. Does the user exist?\n{1}"
                            .format(watcher,
                                    ex)).with_traceback(sys.exc_info()[2])

        except JIRAError as e:
            raise EAException(
                "Error creating JIRA ticket using jira_args (%s): %s" %
                (self.jira_args, e))
        elastalert_logger.info("Opened Jira ticket: %s" % (self.issue))

        if self.pipeline is not None:
            self.pipeline['jira_ticket'] = self.issue
            self.pipeline['jira_server'] = self.server