forked from kevinqqnj/sanic-ms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.py
95 lines (73 loc) · 3 KB
/
client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import logging
import opentracing
from aiohttp import ClientSession, hdrs
logger = logging.getLogger('sanic')
class Client:
def __init__(self, name, app=None, url=None, client=None, **kwargs):
self.name = name
self._client = client if client else ClientSession(loop=app.loop, **kwargs)
print('>>>>>', app, app.services)
self.services = app.services[self.name]
self._url = url
def handler_url(self):
if self._url:
return
if self.services:
s = random.choice(list(self.services))
print('>>>>>', self.services, s)
self._url = 'http://{}:{}'.format(s.service_address, s.service_port)
def cli(self, req):
self.handler_url()
print('>>>>>', req, self._url, self.services)
span = opentracing.tracer.start_span(operation_name='get', child_of=req['span'])
return ClientSessionConn(self._client, url=self._url, span=span)
def close(self):
self._client.close()
class ClientSessionConn:
_client = None
def __init__(self, client, url=None, span=None, **kwargs):
self._client = client
self._url = url
self._span = span
def handler_url(self, url):
if url.startswith("http"):
return url
if self._url:
return "{}/{}".format(self._url, url)
return url
def before(self, method, url):
self._span.log_kv({'event': 'client'})
self._span.set_tag('http.url', self._url)
self._span.set_tag('http.path', url)
self._span.set_tag('http.method', method)
http_header_carrier = {}
opentracing.tracer.inject(
self._span.context,
format=opentracing.Format.HTTP_HEADERS,
carrier=http_header_carrier)
return http_header_carrier
def request(self, method, url, **kwargs):
headers = self.before(method, url)
res = self._client.request(method, self.handler_url(url),
headers=headers, **kwargs)
self._span.set_tag('component', 'http-client')
self._span.finish()
return res
def get(self, url, allow_redirects=True, **kwargs):
return self.request(hdrs.METH_GET, url, allow_redirects=True,
**kwargs)
def post(self, url, data=None, **kwargs):
return self.request(hdrs.METH_POST, url, data=data, **kwargs)
def put(self, url, data=None, **kwargs):
return self.request(hdrs.METH_PUT, url, data=data, **kwargs)
def delete(self, url, **kwargs):
return self.request(hdrs.METH_DELETE, url, **kwargs)
def head(self, url, allow_redirects=False, **kwargs):
return self.request(hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs)
def options(self, url, allow_redirects=True, **kwargs):
return self.request(hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs)
def close(self):
self._client.close()