1+ import os
2+ import time
3+ import socket
4+ import threading
5+ from datetime import datetime
6+ from apscheduler .schedulers .background import BackgroundScheduler
7+ import requests
8+ import psutil
9+
10+ sched = BackgroundScheduler ()
11+
12+ class Cube ():
13+ def __init__ (self , api_key , node = socket .gethostname (), batch_size = 60 ,
14+ dispatch_interval = 60 , tags = None ):
15+ self .api_key = api_key
16+ self .node = node
17+ self .batch_size = batch_size
18+ self .dispatch_interval = dispatch_interval
19+ self .tags = tags
20+ self .uptime = 0
21+ self .cpu = 0.0
22+ self .memory = 0
23+ self .active_requests = 0
24+ self .requests = []
25+ self .lock = threading .Lock ()
26+
27+ def system ():
28+ p = psutil .Process (os .getpid ())
29+ self .uptime = int (datetime .now ().timestamp () - p .create_time ())
30+ self .cpu = p .cpu_percent ()
31+ self .memory = p .memory_full_info ().rss
32+
33+ sched .add_job (self ._dispatch , 'interval' , seconds = dispatch_interval )
34+ sched .add_job (system , 'interval' , seconds = 1 )
35+ sched .start ()
36+
37+ def _dispatch (self ):
38+ if not self .requests :
39+ return
40+
41+ r = requests .post ('https://api.labstack.com/cube' , headers = {
42+ 'User-Agent' : 'labstack/cube' ,
43+ 'Authorization' : 'Bearer ' + self .api_key
44+ }, json = self .requests )
45+ if not 200 <= r .status_code < 300 :
46+ # TOTO: handler error
47+ print ('cube error' , r .json ())
48+
49+ # Reset requests
50+ self .requests .clear ()
51+
52+ def start (self , request ):
53+ with self .lock :
54+ self .active_requests += 1
55+
56+ request ['time' ] = int (datetime .now ().timestamp () * 1000000 )
57+ request ['active' ] = self .active_requests
58+ request ['node' ] = self .node
59+ request ['uptime' ] = self .uptime
60+ request ['cpu' ] = self .cpu
61+ request ['memory' ] = self .memory
62+ request ['tags' ] = self .tags
63+ self .requests .append (request )
64+
65+ return request
66+
67+ def stop (self , request ):
68+ with self .lock :
69+ self .active_requests -= 1
70+ request ['latency' ] = int (datetime .now ().timestamp () * 1000000 ) - request ['time' ]
71+
72+ # Dispatch batch
73+ if len (self .requests ) >= self .batch_size :
74+ threading .Thread (target = self ._dispatch ).start ()
75+
0 commit comments