NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()