monasca-notification/monasca_notification/plugins/pagerduty_notifier.py

102 lines
3.2 KiB
Python

# (C) Copyright 2015,2016 Hewlett Packard Enterprise Development LP
# Copyright 2017 Fujitsu LIMITED
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import requests
import ujson as json
from debtcollector import removals
from oslo_config import cfg
from monasca_notification.plugins import abstract_notifier
CONF = cfg.CONF
VALID_HTTP_CODES = [200, 201, 204]
class PagerdutyNotifier(abstract_notifier.AbstractNotifier):
type = 'pagerduty'
def __init__(self, log):
super(PagerdutyNotifier, self).__init__()
self._log = log
@removals.remove(
message='Configuration of notifier is available through oslo.cfg',
version='1.9.0',
removal_version='3.0.0'
)
def config(self, config):
pass
@property
def statsd_name(self):
return 'sent_pagerduty_count'
def send_notification(self, notification):
"""Send pagerduty notification
"""
url = CONF.pagerduty_notifier.url
headers = {"content-type": "application/json"}
body = {"service_key": notification.address,
"event_type": "trigger",
"description": notification.message,
"client": "Monasca",
"client_url": "",
"details": {"alarm_id": notification.alarm_id,
"alarm_name": notification.alarm_name,
"current": notification.state,
"message": notification.message}}
try:
result = requests.post(url=url,
data=json.dumps(body),
headers=headers,
timeout=CONF.pagerduty_notifier.timeout)
if result.status_code in VALID_HTTP_CODES:
return True
self._log.error("Error with pagerduty request. key=<{}> response={}"
.format(notification.address, result.status_code))
return False
except Exception:
self._log.exception("Exception on pagerduty request. key=<{}>"
.format(notification.address))
return False
pagerduty_notifier_group = cfg.OptGroup(name='%s_notifier' % PagerdutyNotifier.type)
pagerduty_notifier_opts = [
cfg.IntOpt(name='timeout', default=5, min=1),
cfg.StrOpt(name='url',
default='https://events.pagerduty.com/'
'generic/2010-04-15/create_event.json')
]
def register_opts(conf):
conf.register_group(pagerduty_notifier_group)
conf.register_opts(pagerduty_notifier_opts, group=pagerduty_notifier_group)
def list_opts():
return {
pagerduty_notifier_group: pagerduty_notifier_opts
}