def _send(self, ev):
'''_send should only be called from sender and sends an individual
event to Honeycomb'''
start = get_now()
try:
url = urljoin(urljoin(ev.api_host, "/1/events/"), ev.dataset)
req = requests.Request('POST', url, data=str(ev))
event_time = ev.created_at.isoformat()
if ev.created_at.tzinfo is None:
event_time += "Z"
req.headers.update({
"X-Event-Time": event_time,
"X-Honeycomb-Team": ev.writekey,
"X-Honeycomb-SampleRate": str(ev.sample_rate)})
preq = self.session.prepare_request(req)
resp = self.session.send(preq)
if (resp.status_code == 200):
sd.incr("messages_sent")
else:
sd.incr("send_errors")
response = {
"status_code": resp.status_code,
"body": resp.text,
"error": "",
}
except Exception as e:
# Sometimes the ELB returns SSL issues for no good reason. Sometimes
# Honeycomb will timeout. We shouldn't influence the calling app's
# stack, so catch these and hand them to the responses queue.
sd.incr("send_errors")
response = {
"status_code": 0,
"body": "",
"error": repr(e),
}
finally:
dur = get_now() - start
response["duration"] = dur.total_seconds() * 1000 # report in milliseconds
response["metadata"] = ev.metadata
if self.block_on_response:
self.responses.put(response)
else:
try:
self.responses.put_nowait(response)
except queue.Full:
pass
评论列表
文章目录