Skip to content

Commit c0b0fca

Browse files
committed
Cube/flask integration
Signed-off-by: Vishal Rana <vr@labstack.com>
1 parent 78e96fe commit c0b0fca

File tree

9 files changed

+137
-232
lines changed

9 files changed

+137
-232
lines changed

README.md

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,9 @@
11
<a href="https://labstack.com"><img height="80" src="https://cdn.labstack.com/images/labstack-logo.svg"></a>
22

3-
## Python Client
3+
# Python Client
44

55
## Installation
66

77
`pip install labstack`
88

9-
## Quick Start
10-
11-
[Sign up](https://labstack.com/signup) to get an API key
12-
13-
Create a file `app.py` with the following content:
14-
15-
```python
16-
from labstack import Client, APIError
17-
18-
client = Client('<ACCOUNT_ID>', '<API_KEY>')
19-
20-
try:
21-
response = client.barcode_generate(format='qr_code', content='https://labstack.com')
22-
client.download(response['id'], '/tmp/' + response['name'])
23-
except APIError as error:
24-
print(error)
25-
```
26-
27-
From terminal run your app:
28-
29-
```sh
30-
python app.py
31-
```
32-
339
## [API](https://labstack.com/api) | [Forum](https://forum.labstack.com)

labstack/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
from .client import Client, APIError

labstack/client.py

Lines changed: 0 additions & 199 deletions
This file was deleted.

labstack/common.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

labstack/cube.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+

labstack/flask.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import socket
2+
from flask import request, g
3+
from .cube import Cube
4+
from .util import strip_port
5+
6+
def cube(app, api_key, **kwargs):
7+
c = Cube(api_key, **kwargs)
8+
9+
@app.before_request
10+
def before_request():
11+
g._r = c.start({
12+
'id': request.headers.get('X-Request-ID'),
13+
'host': strip_port(request.host),
14+
'path': request.path,
15+
'method': request.method,
16+
'bytes_in': int(request.headers.get('Content-Length') or 0),
17+
# TODO: revisit
18+
'remote_ip': request.headers.get('X-Forwarded-For', request.remote_addr),
19+
'client_id': request.headers.get('X-Client-ID'),
20+
'user_agent': request.headers.get('User-Agent')
21+
})
22+
23+
@app.after_request
24+
def after_request(response):
25+
r = g._r
26+
r['id'] = r['id'] or response.headers.get('X-Request-ID')
27+
r['status'] = response.status_code
28+
r['bytes_out'] = int(response.headers.get('Content-Length') or 0)
29+
c.stop(r)
30+
return response

labstack/util.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
def strip_port(host):
2+
colon = host.find(':')
3+
if colon == -1:
4+
return host
5+
i = host.find(']')
6+
if i != -1:
7+
return host[host.find('(')+1:i]
8+
return host[:colon]

setup.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,25 @@
22

33
setup(
44
name='labstack',
5-
version='0.21.0',
6-
description='Official Python client library for the LabStack API',
5+
version='0.21.1',
6+
description='Official Python client library for the LabStack platform',
77
long_description='`<https://github.com/labstack/labstack-python>`_',
8-
keywords='image compress, image resize, text summary, barcode generate, barcode scan',
8+
keywords='api, testing, monitoring, analytics',
99
url='https://github.com/labstack/labstack-python',
1010
author='Vishal Rana',
1111
author_email='vr@labstack.com',
1212
license='MIT',
1313
packages=['labstack'],
1414
install_requires=[
15-
'requests==2.18.1'
15+
'requests==2.18.4',
16+
'psutil==5.4.3',
17+
'APScheduler==3.5.1'
18+
],
19+
extra_requires=[
20+
'Flask==0.12.2'
1621
],
1722
classifiers=[
18-
'Programming Language :: Python :: 3.5',
19-
'Programming Language :: Python :: 3.6'
23+
'Programming Language :: Python :: 3.5',
24+
'Programming Language :: Python :: 3.6'
2025
]
2126
)

0 commit comments

Comments
 (0)