From b86740e1fd5251793d5f171c8e52b63bb526bd84 Mon Sep 17 00:00:00 2001 From: Arturas Slajus Date: Fri, 14 Jun 2013 18:36:14 +0300 Subject: [PATCH] datadog_event module: submit your events to DataDog service. --- library/monitoring/datadog_event | 155 +++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 library/monitoring/datadog_event diff --git a/library/monitoring/datadog_event b/library/monitoring/datadog_event new file mode 100644 index 00000000000..9b2b059284b --- /dev/null +++ b/library/monitoring/datadog_event @@ -0,0 +1,155 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Author: Artūras 'arturaz' Šlajus +# +# This module is proudly sponsored by iGeolise (www.igeolise.com) and +# Tiny Lab Productions (www.tinylabproductions.com). + +DOCUMENTATION = ''' +--- +module: datadog_event +short_description: Posts events to DataDog service +description: +- "Allows to post events to DataDog (www.datadoghq.com) service." +- "Uses http://docs.datadoghq.com/api/#events API." +version_added: "1.3" +author: Artūras 'arturaz' Šlajus +notes: [] +requirements: [httplib2] +options: + api_key: + description: ["Your DataDog API key."] + required: true + default: null + title: + description: ["The event title."] + required: true + default: null + text: + description: ["The body of the event."] + required: true + default: null + date_happened: + description: + - POSIX timestamp of the event. + - Default value is now. + required: false + default: now + priority: + description: ["The priority of the event."] + required: false + default: normal + choices: [normal, low] + tags: + description: ["Comma separated list of tags to apply to the event."] + required: false + default: null + alert_type: + description: ["Type of alert."] + required: false + default: info + choices: ['error', 'warning', 'info', 'success'] + aggregation_key: + description: ["An arbitrary string to use for aggregation."] + required: false + default: null + source_type_name: + description: ["The type of event being posted."] + required: false + default: null + choices: + - 'nagios' + - 'hudson' + - 'jenkins' + - 'user' + - 'my apps' + - 'feed' + - 'chef' + - 'puppet' + - 'git' + - 'bitbucket' + - 'fabric' + - 'capistrano' +''' + +EXAMPLES = ''' +# Post an event with low priority +datadog_event: title="Testing from ansible" text="Test!" priority="low" + api_key="6873258723457823548234234234" +# Post an event with several tags +datadog_event: title="Testing from ansible" text="Test!" + api_key="6873258723457823548234234234" + tags=aa,bb,cc +''' + +import socket +from urllib2 import urlopen, Request, URLError + +def main(): + module = AnsibleModule( + argument_spec=dict( + api_key=dict(required=True), + title=dict(required=True), + text=dict(required=True), + date_happened=dict(required=False, default=None, type='int'), + priority=dict( + required=False, default='normal', choices=['normal', 'low'] + ), + tags=dict(required=False, default=None), + alert_type=dict( + required=False, default='info', + choices=['error', 'warning', 'info', 'success'] + ), + aggregation_key=dict(required=False, default=None), + source_type_name=dict( + required=False, default=None, + choices=['nagios', 'hudson', 'jenkins', 'user', 'my apps', + 'feed', 'chef', 'puppet', 'git', 'bitbucket', 'fabric', + 'capistrano'] + ) + ) + ) + + post_event(module) + +def post_event(module): + uri = "https://app.datadoghq.com/api/v1/events?api_key=" + \ + module.params['api_key'] + + body = dict( + title=module.params['title'], + text=module.params['text'], + priority=module.params['priority'], + alert_type=module.params['alert_type'] + ) + if module.params['date_happened'] != None: + body['date_happened'] = module.params['date_happened'] + if module.params['tags'] != None: + body['tags'] = module.params['tags'].split(",") + if module.params['aggregation_key'] != None: + body['aggregation_key'] = module.params['aggregation_key'] + if module.params['source_type_name'] != None: + body['source_type_name'] = module.params['source_type_name'] + + json_body = module.jsonify(body) + headers = {"Content-Type": "application/json"} + request = Request(uri, json_body, headers, unverifiable=True) + + try: + response = urlopen(request) + response_body = response.read() + response_json = module.from_json(response_body) + if response_json['status'] == 'ok': + module.exit_json(changed=True) + else: + module.fail_json(msg=response) + + except URLError, e: + module.fail_json(msg="URL error: %s." % e) + except socket.error, e: + module.fail_json(msg="Socket error: %s to %s" % (e, uri)) + +# this is magic, see lib/ansible/module_common.py +#<> +main()