event.py (6735B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\datadog\dogshell\event.py 2 from __future__ import print_function 3 import datetime 4 import time 5 import re 6 import sys 7 from datadog import api 8 from datadog.dogshell.common import report_errors, report_warnings 9 from datadog.util.compat import json 10 time_pat = re.compile('(?P<delta>[0-9]*\\.?[0-9]+)(?P<unit>[mhd])') 11 12 def prettyprint_event(event): 13 title = event['title'] or '' 14 text = event.get('text', '') or '' 15 handle = event.get('handle', '') or '' 16 date = event['date_happened'] 17 dt = datetime.datetime.fromtimestamp(date) 18 link = event['url'] 19 print((title + ' ' + text + ' ' + ' (' + handle + ')').strip()) 20 print(dt.isoformat(' ') + ' | ' + link) 21 22 23 def print_event(event): 24 prettyprint_event(event) 25 26 27 def prettyprint_event_details(event): 28 prettyprint_event(event) 29 30 31 def print_event_details(event): 32 prettyprint_event(event) 33 34 35 def parse_time(timestring): 36 now = time.mktime(datetime.datetime.now().timetuple()) 37 if timestring is None: 38 t = now 39 else: 40 try: 41 t = int(timestring) 42 except Exception: 43 match = time_pat.match(timestring) 44 if match is None: 45 raise Exception 46 delta = float(match.group('delta')) 47 unit = match.group('unit') 48 if unit == 'm': 49 delta = delta * 60 50 if unit == 'h': 51 delta = delta * 60 * 60 52 if unit == 'd': 53 delta = delta * 60 * 60 * 24 54 t = now - int(delta) 55 56 return int(t) 57 58 59 class EventClient(object): 60 61 @classmethod 62 def setup_parser(cls, subparsers): 63 parser = subparsers.add_parser('event', help='Post events, get event details, and view the event stream.') 64 verb_parsers = parser.add_subparsers(title='Verbs', dest='verb') 65 verb_parsers.required = True 66 post_parser = verb_parsers.add_parser('post', help='Post events.') 67 post_parser.add_argument('title', help='event title') 68 post_parser.add_argument('--date_happened', help='POSIX timestamp when the event occurred. if unset defaults to the current time.') 69 post_parser.add_argument('--handle', help='user to post as. if unset, submits as the generic API user.') 70 post_parser.add_argument('--priority', help='"normal" or "low". defaults to "normal"') 71 post_parser.add_argument('--related_event_id', help='event to post as a child of. if unset, posts a top-level event') 72 post_parser.add_argument('--tags', help='comma separated list of tags') 73 post_parser.add_argument('--host', help='related host (default to the local host name)', default='') 74 post_parser.add_argument('--no_host', help='no host is associated with the event (overrides --host))', action='store_true') 75 post_parser.add_argument('--device', help='related device (e.g. eth0, /dev/sda1)') 76 post_parser.add_argument('--aggregation_key', help='key to aggregate the event with') 77 post_parser.add_argument('--type', help='type of event, e.g. nagios, jenkins, etc.') 78 post_parser.add_argument('--alert_type', help='"error", "warning", "info" or "success". defaults to "info"') 79 post_parser.add_argument('message', help='event message body. if unset, reads from stdin.', nargs='?') 80 post_parser.set_defaults(func=cls._post) 81 show_parser = verb_parsers.add_parser('show', help='Show event details.') 82 show_parser.add_argument('event_id', help='event to show') 83 show_parser.set_defaults(func=cls._show) 84 stream_parser = verb_parsers.add_parser('stream', help='Retrieve events from the Event Stream', description="Stream start and end times can be specified as either a POSIX timestamp (e.g. the output of `date +%s`) or as a period of time in the past (e.g. '5m', '6h', '3d').") 85 stream_parser.add_argument('start', help='start date for the stream request') 86 stream_parser.add_argument('end', help="end date for the stream request (defaults to 'now')", nargs='?') 87 stream_parser.add_argument('--priority', help="filter by priority. 'normal' or 'low'. defaults to 'normal'") 88 stream_parser.add_argument('--sources', help='comma separated list of sources to filter by') 89 stream_parser.add_argument('--tags', help='comma separated list of tags to filter by') 90 stream_parser.set_defaults(func=cls._stream) 91 92 @classmethod 93 def _post(cls, args): 94 api._timeout = args.timeout 95 format = args.format 96 message = args.message 97 if message is None: 98 message = sys.stdin.read() 99 if args.tags is not None: 100 tags = [ t.strip() for t in args.tags.split(',') ] 101 else: 102 tags = None 103 host = None if args.no_host else args.host 104 res = api.Event.create(title=args.title, text=message, handle=args.handle, priority=args.priority, related_event_id=args.related_event_id, tags=tags, host=host, device=args.device, aggregation_key=args.aggregation_key, source_type_name=args.type, alert_type=args.alert_type) 105 report_warnings(res) 106 report_errors(res) 107 if format == 'pretty': 108 prettyprint_event(res['event']) 109 elif format == 'raw': 110 print(json.dumps(res)) 111 else: 112 print_event(res['event']) 113 114 @classmethod 115 def _show(cls, args): 116 api._timeout = args.timeout 117 format = args.format 118 res = api.Event.get(args.event_id) 119 report_warnings(res) 120 report_errors(res) 121 if format == 'pretty': 122 prettyprint_event_details(res['event']) 123 elif format == 'raw': 124 print(json.dumps(res)) 125 else: 126 print_event_details(res['event']) 127 128 @classmethod 129 def _stream(cls, args): 130 api._timeout = args.timeout 131 format = args.format 132 if args.sources is not None: 133 sources = [ s.strip() for s in args.sources.split(',') ] 134 else: 135 sources = None 136 if args.tags is not None: 137 tags = [ t.strip() for t in args.tags.split(',') ] 138 else: 139 tags = None 140 start = parse_time(args.start) 141 end = parse_time(args.end) 142 res = api.Event.query(start=start, end=end, priority=args.priority, sources=sources, tags=tags) 143 report_warnings(res) 144 report_errors(res) 145 if format == 'pretty': 146 for event in res['events']: 147 prettyprint_event(event) 148 print() 149 150 elif format == 'raw': 151 print(json.dumps(res)) 152 else: 153 for event in res['events']: 154 print_event(event) 155 print()