Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

79 wiersze
2.2KB

  1. import random
  2. from eventlet import wsgi
  3. from eventlet.zipkin import api
  4. from eventlet.zipkin._thrift.zipkinCore.constants import \
  5. SERVER_RECV, SERVER_SEND
  6. from eventlet.zipkin.http import \
  7. HDR_TRACE_ID, HDR_SPAN_ID, HDR_PARENT_SPAN_ID, HDR_SAMPLED
  8. _sampler = None
  9. __original_handle_one_response__ = wsgi.HttpProtocol.handle_one_response
  10. def _patched_handle_one_response(self):
  11. api.init_trace_data()
  12. trace_id = int_or_none(self.headers.getheader(HDR_TRACE_ID))
  13. span_id = int_or_none(self.headers.getheader(HDR_SPAN_ID))
  14. parent_id = int_or_none(self.headers.getheader(HDR_PARENT_SPAN_ID))
  15. sampled = bool_or_none(self.headers.getheader(HDR_SAMPLED))
  16. if trace_id is None: # front-end server
  17. trace_id = span_id = api.generate_trace_id()
  18. parent_id = None
  19. sampled = _sampler.sampling()
  20. ip, port = self.request.getsockname()[:2]
  21. ep = api.ZipkinDataBuilder.build_endpoint(ip, port)
  22. trace_data = api.TraceData(name=self.command,
  23. trace_id=trace_id,
  24. span_id=span_id,
  25. parent_id=parent_id,
  26. sampled=sampled,
  27. endpoint=ep)
  28. api.set_trace_data(trace_data)
  29. api.put_annotation(SERVER_RECV)
  30. api.put_key_value('http.uri', self.path)
  31. __original_handle_one_response__(self)
  32. if api.is_sample():
  33. api.put_annotation(SERVER_SEND)
  34. class Sampler(object):
  35. def __init__(self, sampling_rate):
  36. self.sampling_rate = sampling_rate
  37. def sampling(self):
  38. # avoid generating unneeded random numbers
  39. if self.sampling_rate == 1.0:
  40. return True
  41. r = random.random()
  42. if r < self.sampling_rate:
  43. return True
  44. return False
  45. def int_or_none(val):
  46. if val is None:
  47. return None
  48. return int(val, 16)
  49. def bool_or_none(val):
  50. if val == '1':
  51. return True
  52. if val == '0':
  53. return False
  54. return None
  55. def patch(sampling_rate):
  56. global _sampler
  57. _sampler = Sampler(sampling_rate)
  58. wsgi.HttpProtocol.handle_one_response = _patched_handle_one_response
  59. def unpatch():
  60. wsgi.HttpProtocol.handle_one_response = __original_handle_one_response__