Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(363)

Side by Side Diff: infra/libs/event_mon/router.py

Issue 875403010: event_mon: actually implemented push (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Rebased + fixed nits Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « infra/libs/event_mon/monitoring.py ('k') | infra/libs/event_mon/test/config_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import Queue 5 import Queue
6 import logging 6 import logging
7 import requests
7 import threading 8 import threading
8 import time 9 import time
9 10
10 from infra.libs.event_mon.log_request_lite_pb2 import LogRequestLite 11 from infra.libs.event_mon.log_request_lite_pb2 import LogRequestLite
11 12
12 13
13 def time_ms(): 14 def time_ms():
14 """Return current timestamp in milliseconds.""" 15 """Return current timestamp in milliseconds."""
15 return int(1000 * time.time()) 16 return int(1000 * time.time())
16 17
17 18
18 class _Router(object): 19 class _Router(object):
19 """Route events to the right destination. 20 """Route events to the right destination.
20 21
21 This object is meant to be a singleton, and is not part of the API. 22 This object is meant to be a singleton, and is not part of the API.
22 23
23 Usage: 24 Usage:
24 router = _Router() 25 router = _Router()
25 event = ChromeInfraEvent.LogEventLite(...) 26 event = ChromeInfraEvent.LogEventLite(...)
26 ... fill in event ... 27 ... fill in event ...
27 router.push_event(event) 28 router.push_event(event)
28 """ 29 """
29 def __init__(self, dry_run=True): 30 def __init__(self, endpoint=None):
30 # dry_run is meant for local testing and unit testing. When True, this 31 # endpoint == None means 'dry run'. No data is sent.
31 # object should have no side effect. 32 self.endpoint = endpoint
32 self.dry_run = dry_run
33 33
34 self.event_queue = Queue.Queue() 34 self.event_queue = Queue.Queue()
35 self._thread = threading.Thread(target=self._router) 35 self._thread = threading.Thread(target=self._router)
36 self._thread.daemon = True 36 self._thread.daemon = True
37 self._thread.start() 37 self._thread.start()
38 38
39 def _router(self): 39 def _router(self):
40 while(True): # pragma: no branch 40 while(True): # pragma: no branch
41 events = self.event_queue.get() 41 events = self.event_queue.get()
42 if events is None: 42 if events is None:
43 break 43 break
44 44
45 # Set this time at the very last moment 45 # Set this time at the very last moment
46 events.request_time_ms = time_ms() 46 events.request_time_ms = time_ms()
47 47 if self.endpoint: # pragma: no cover
48 if not self.dry_run: # pragma: no cover 48 # TODO(pgervais): log when something fails.
49 # TODO(pgervais): Actually do something 49 requests.post(self.endpoint, data=events.SerializeToString())
50 pass 50 else:
51 print('fake post request')
51 52
52 def close(self, timeout=None): 53 def close(self, timeout=None):
53 """ 54 """
54 Returns: 55 Returns:
55 success (bool): True if everything went well. Otherwise, there is no 56 success (bool): True if everything went well. Otherwise, there is no
56 guarantee that all events have been properly sent to the remote. 57 guarantee that all events have been properly sent to the remote.
57 """ 58 """
58 timeout = timeout or 5 59 timeout = timeout or 5
59 self.event_queue.put(None) 60 self.event_queue.put(None)
60 self._thread.join(timeout) 61 self._thread.join(timeout)
(...skipping 12 matching lines...) Expand all
73 event (LogRequestLite.LogEventLite): one single event. 74 event (LogRequestLite.LogEventLite): one single event.
74 Returns: 75 Returns:
75 success (bool): False if an error happened. True means 'event accepted', 76 success (bool): False if an error happened. True means 'event accepted',
76 but NOT 'event successfully pushed to the remote'. 77 but NOT 'event successfully pushed to the remote'.
77 """ 78 """
78 if not isinstance(event, LogRequestLite.LogEventLite): 79 if not isinstance(event, LogRequestLite.LogEventLite):
79 logging.error('Invalid type for "event": %s (should be LogEventLite)' 80 logging.error('Invalid type for "event": %s (should be LogEventLite)'
80 % str(type(event))) 81 % str(type(event)))
81 return False 82 return False
82 83
83 # Dumb implementation, can be made more sophisticated (batching) 84 # TODO(pgervais): implement batching.
84 request = LogRequestLite() 85 request_p = LogRequestLite()
85 request.log_event.extend((event,)) # copies the protobuf 86 request_p.log_source_name = 'CHROME_INFRA'
86 self.event_queue.put(request) 87 request_p.log_event.extend((event,)) # copies the protobuf
88 self.event_queue.put(request_p)
87 return True 89 return True
OLDNEW
« no previous file with comments | « infra/libs/event_mon/monitoring.py ('k') | infra/libs/event_mon/test/config_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698