Skip to content

Commit c23c2e8

Browse files
authored
chore: add changelog for 0.4.0 and minor refactor (#80)
1 parent 52a4937 commit c23c2e8

15 files changed

+326
-372
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
## Change Logs
22

3+
### 0.4.0
4+
5+
- Feature: Support Kafka reporter protocol (#74)
6+
- BugFix: Move generated packages into `skywalking` namespace to avoid conflicts (#72)
7+
- BugFix: Agent cannot reconnect after server is down (#79)
8+
- Test: Mitigate unsafe yaml loading (#76)
9+
310
### 0.3.0
411

512
- New plugins

skywalking/plugins/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import logging
1919
import pkgutil
2020
import re
21+
import traceback
22+
2123
import pkg_resources
2224

2325
from packaging import version
@@ -51,7 +53,13 @@ def install():
5153
if not hasattr(plugin, 'install') or inspect.ismethod(getattr(plugin, 'install')):
5254
logger.warning('no `install` method in plugin %s, thus the plugin won\'t be installed', modname)
5355
continue
54-
plugin.install()
56+
57+
# noinspection PyBroadException
58+
try:
59+
plugin.install()
60+
except Exception:
61+
logger.warning('failed to install plugin %s', modname)
62+
traceback.print_exc() if logger.isEnabledFor(logging.DEBUG) else None
5563

5664

5765
_operators = {

skywalking/plugins/sw_django.py

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -31,59 +31,56 @@
3131

3232

3333
def install():
34-
try:
35-
from django.core.handlers.base import BaseHandler
36-
from django.core.handlers import exception
37-
38-
_get_response = BaseHandler.get_response
39-
_handle_uncaught_exception = exception.handle_uncaught_exception
40-
41-
def _sw_get_response(this, request):
42-
if request is None:
43-
resp = _get_response(this, request)
44-
return resp
45-
46-
context = get_context()
47-
carrier = Carrier()
48-
for item in carrier:
49-
# Any HTTP headers in the request are converted to META keys by converting all characters to uppercase,
50-
# replacing any hyphens with underscores and adding an HTTP_ prefix to the name.
51-
# https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.META
52-
sw_http_header_key = 'HTTP_%s' % item.key.upper().replace('-', '_')
53-
if sw_http_header_key in request.META:
54-
item.val = request.META[sw_http_header_key]
55-
56-
with context.new_entry_span(op=request.path, carrier=carrier) as span:
57-
span.layer = Layer.Http
58-
span.component = Component.Django
59-
span.peer = '%s:%s' % (request.META.get('REMOTE_ADDR'), request.META.get('REMOTE_PORT') or "80")
60-
61-
span.tag(Tag(key=tags.HttpMethod, val=request.method))
62-
span.tag(Tag(key=tags.HttpUrl, val=request.build_absolute_uri().split("?")[0]))
63-
64-
# you can get request parameters by `request.GET` even though client are using POST or other methods
65-
if config.django_collect_http_params and request.GET:
66-
span.tag(Tag(key=tags.HttpParams,
67-
val=params_tostring(request.GET)[0:config.http_params_length_threshold]))
68-
69-
resp = _get_response(this, request)
70-
span.tag(Tag(key=tags.HttpStatus, val=resp.status_code))
71-
if resp.status_code >= 400:
72-
span.error_occurred = True
73-
return resp
74-
75-
def _sw_handle_uncaught_exception(request, resolver, exc_info):
76-
if exc_info is not None:
77-
entry_span = get_context().active_span()
78-
if entry_span is not None:
79-
entry_span.raised()
80-
81-
return _handle_uncaught_exception(request, resolver, exc_info)
82-
83-
BaseHandler.get_response = _sw_get_response
84-
exception.handle_uncaught_exception = _sw_handle_uncaught_exception
85-
except Exception:
86-
logger.warning('failed to install plugin %s', __name__)
34+
from django.core.handlers.base import BaseHandler
35+
from django.core.handlers import exception
36+
37+
_get_response = BaseHandler.get_response
38+
_handle_uncaught_exception = exception.handle_uncaught_exception
39+
40+
def _sw_get_response(this, request):
41+
if request is None:
42+
resp = _get_response(this, request)
43+
return resp
44+
45+
context = get_context()
46+
carrier = Carrier()
47+
for item in carrier:
48+
# Any HTTP headers in the request are converted to META keys by converting all characters to uppercase,
49+
# replacing any hyphens with underscores and adding an HTTP_ prefix to the name.
50+
# https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.META
51+
sw_http_header_key = 'HTTP_%s' % item.key.upper().replace('-', '_')
52+
if sw_http_header_key in request.META:
53+
item.val = request.META[sw_http_header_key]
54+
55+
with context.new_entry_span(op=request.path, carrier=carrier) as span:
56+
span.layer = Layer.Http
57+
span.component = Component.Django
58+
span.peer = '%s:%s' % (request.META.get('REMOTE_ADDR'), request.META.get('REMOTE_PORT') or "80")
59+
60+
span.tag(Tag(key=tags.HttpMethod, val=request.method))
61+
span.tag(Tag(key=tags.HttpUrl, val=request.build_absolute_uri().split("?")[0]))
62+
63+
# you can get request parameters by `request.GET` even though client are using POST or other methods
64+
if config.django_collect_http_params and request.GET:
65+
span.tag(Tag(key=tags.HttpParams,
66+
val=params_tostring(request.GET)[0:config.http_params_length_threshold]))
67+
68+
resp = _get_response(this, request)
69+
span.tag(Tag(key=tags.HttpStatus, val=resp.status_code))
70+
if resp.status_code >= 400:
71+
span.error_occurred = True
72+
return resp
73+
74+
def _sw_handle_uncaught_exception(request, resolver, exc_info):
75+
if exc_info is not None:
76+
entry_span = get_context().active_span()
77+
if entry_span is not None:
78+
entry_span.raised()
79+
80+
return _handle_uncaught_exception(request, resolver, exc_info)
81+
82+
BaseHandler.get_response = _sw_get_response
83+
exception.handle_uncaught_exception = _sw_handle_uncaught_exception
8784

8885

8986
def params_tostring(params):

skywalking/plugins/sw_elasticsearch.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,25 @@
2525

2626

2727
def install():
28-
# noinspection PyBroadException
29-
try:
30-
from elasticsearch import Transport
31-
_perform_request = Transport.perform_request
32-
33-
def _sw_perform_request(this: Transport, method, url, headers=None, params=None, body=None):
34-
context = get_context()
35-
peer = ",".join([host["host"] + ":" + str(host["port"]) for host in this.hosts])
36-
with context.new_exit_span(op="Elasticsearch/" + method + url, peer=peer) as span:
37-
span.layer = Layer.Database
38-
span.component = Component.Elasticsearch
39-
try:
40-
res = _perform_request(this, method, url, headers=headers, params=params, body=body)
41-
42-
span.tag(Tag(key=tags.DbType, val="Elasticsearch"))
43-
if config.elasticsearch_trace_dsl:
44-
span.tag(Tag(key=tags.DbStatement, val="" if body is None else body))
45-
46-
except BaseException as e:
47-
span.raised()
48-
raise e
49-
return res
50-
51-
Transport.perform_request = _sw_perform_request
52-
53-
except Exception:
54-
logger.warning('failed to install plugin %s', __name__)
28+
from elasticsearch import Transport
29+
_perform_request = Transport.perform_request
30+
31+
def _sw_perform_request(this: Transport, method, url, headers=None, params=None, body=None):
32+
context = get_context()
33+
peer = ",".join([host["host"] + ":" + str(host["port"]) for host in this.hosts])
34+
with context.new_exit_span(op="Elasticsearch/" + method + url, peer=peer) as span:
35+
span.layer = Layer.Database
36+
span.component = Component.Elasticsearch
37+
try:
38+
res = _perform_request(this, method, url, headers=headers, params=params, body=body)
39+
40+
span.tag(Tag(key=tags.DbType, val="Elasticsearch"))
41+
if config.elasticsearch_trace_dsl:
42+
span.tag(Tag(key=tags.DbStatement, val="" if body is None else body))
43+
44+
except BaseException as e:
45+
span.raised()
46+
raise e
47+
return res
48+
49+
Transport.perform_request = _sw_perform_request

skywalking/plugins/sw_flask.py

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -27,52 +27,47 @@
2727

2828

2929
def install():
30-
# noinspection PyBroadException
31-
try:
32-
from flask import Flask
33-
_full_dispatch_request = Flask.full_dispatch_request
30+
from flask import Flask
31+
_full_dispatch_request = Flask.full_dispatch_request
3432

35-
_handle_user_exception = Flask.handle_user_exception
33+
_handle_user_exception = Flask.handle_user_exception
3634

37-
def params_tostring(params):
38-
return "\n".join([k + '=[' + ",".join(params.getlist(k)) + ']' for k, _ in params.items()])
35+
def params_tostring(params):
36+
return "\n".join([k + '=[' + ",".join(params.getlist(k)) + ']' for k, _ in params.items()])
3937

40-
def _sw_full_dispatch_request(this: Flask):
41-
import flask
42-
req = flask.request
43-
context = get_context()
44-
carrier = Carrier()
38+
def _sw_full_dispatch_request(this: Flask):
39+
import flask
40+
req = flask.request
41+
context = get_context()
42+
carrier = Carrier()
4543

46-
for item in carrier:
47-
if item.key.capitalize() in req.headers:
48-
item.val = req.headers[item.key.capitalize()]
49-
with context.new_entry_span(op=req.path, carrier=carrier) as span:
50-
span.layer = Layer.Http
51-
span.component = Component.Flask
52-
span.peer = '%s:%s' % (req.environ["REMOTE_ADDR"], req.environ["REMOTE_PORT"])
53-
span.tag(Tag(key=tags.HttpMethod, val=req.method))
54-
span.tag(Tag(key=tags.HttpUrl, val=req.url.split("?")[0]))
55-
if config.flask_collect_http_params and req.values:
56-
span.tag(Tag(key=tags.HttpParams,
44+
for item in carrier:
45+
if item.key.capitalize() in req.headers:
46+
item.val = req.headers[item.key.capitalize()]
47+
with context.new_entry_span(op=req.path, carrier=carrier) as span:
48+
span.layer = Layer.Http
49+
span.component = Component.Flask
50+
span.peer = '%s:%s' % (req.environ["REMOTE_ADDR"], req.environ["REMOTE_PORT"])
51+
span.tag(Tag(key=tags.HttpMethod, val=req.method))
52+
span.tag(Tag(key=tags.HttpUrl, val=req.url.split("?")[0]))
53+
if config.flask_collect_http_params and req.values:
54+
span.tag(Tag(key=tags.HttpParams,
5755
val=params_tostring(req.values)[0:config.http_params_length_threshold]))
58-
resp = _full_dispatch_request(this)
56+
resp = _full_dispatch_request(this)
5957

60-
if resp.status_code >= 400:
61-
span.error_occurred = True
58+
if resp.status_code >= 400:
59+
span.error_occurred = True
6260

63-
span.tag(Tag(key=tags.HttpStatus, val=resp.status_code))
64-
return resp
61+
span.tag(Tag(key=tags.HttpStatus, val=resp.status_code))
62+
return resp
6563

66-
def _sw_handle_user_exception(this: Flask, e):
67-
if e is not None:
68-
entry_span = get_context().active_span()
69-
if entry_span is not None and type(entry_span) is not NoopSpan:
70-
entry_span.raised()
64+
def _sw_handle_user_exception(this: Flask, e):
65+
if e is not None:
66+
entry_span = get_context().active_span()
67+
if entry_span is not None and type(entry_span) is not NoopSpan:
68+
entry_span.raised()
7169

72-
return _handle_user_exception(this, e)
70+
return _handle_user_exception(this, e)
7371

74-
Flask.full_dispatch_request = _sw_full_dispatch_request
75-
Flask.handle_user_exception = _sw_handle_user_exception
76-
77-
except Exception:
78-
logger.warning('failed to install plugin %s', __name__)
72+
Flask.full_dispatch_request = _sw_full_dispatch_request
73+
Flask.handle_user_exception = _sw_handle_user_exception

skywalking/plugins/sw_http_server.py

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#
1717
import inspect
1818
import logging
19-
import traceback
2019

2120
from skywalking import Layer, Component
2221
from skywalking.trace import tags
@@ -28,25 +27,19 @@
2827

2928

3029
def install():
31-
# noinspection PyBroadException
32-
try:
33-
from http.server import BaseHTTPRequestHandler
30+
from http.server import BaseHTTPRequestHandler
3431

35-
_handle = BaseHTTPRequestHandler.handle
32+
_handle = BaseHTTPRequestHandler.handle
3633

37-
def _sw_handle(handler: BaseHTTPRequestHandler):
38-
clazz = handler.__class__
39-
if 'werkzeug.serving.WSGIRequestHandler' == ".".join([clazz.__module__, clazz.__name__]):
40-
wrap_werkzeug_request_handler(handler)
41-
else:
42-
wrap_default_request_handler(handler)
43-
_handle(handler)
34+
def _sw_handle(handler: BaseHTTPRequestHandler):
35+
clazz = handler.__class__
36+
if 'werkzeug.serving.WSGIRequestHandler' == ".".join([clazz.__module__, clazz.__name__]):
37+
wrap_werkzeug_request_handler(handler)
38+
else:
39+
wrap_default_request_handler(handler)
40+
_handle(handler)
4441

45-
BaseHTTPRequestHandler.handle = _sw_handle
46-
47-
except Exception:
48-
logger.warning('failed to install plugin %s', __name__)
49-
traceback.print_exc()
42+
BaseHTTPRequestHandler.handle = _sw_handle
5043

5144

5245
def wrap_werkzeug_request_handler(handler):

skywalking/plugins/sw_kafka.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,13 @@
2727

2828

2929
def install():
30-
# noinspection PyBroadException
31-
try:
32-
from kafka import KafkaProducer
33-
from kafka import KafkaConsumer
34-
35-
_send = KafkaProducer.send
36-
__poll_once = KafkaConsumer._poll_once
37-
KafkaProducer.send = _sw_send_func(_send)
38-
KafkaConsumer._poll_once = _sw__poll_once_func(__poll_once)
39-
40-
except Exception:
41-
logger.warning('failed to install plugin %s', __name__)
30+
from kafka import KafkaProducer
31+
from kafka import KafkaConsumer
32+
33+
_send = KafkaProducer.send
34+
__poll_once = KafkaConsumer._poll_once
35+
KafkaProducer.send = _sw_send_func(_send)
36+
KafkaConsumer._poll_once = _sw__poll_once_func(__poll_once)
4237

4338

4439
def _sw__poll_once_func(__poll_once):

0 commit comments

Comments
 (0)