forked from DataDog/dd-agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
emitter.py
82 lines (63 loc) · 2.46 KB
/
emitter.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
# stdlib
from hashlib import md5
import logging
import os
import re
import sys
import zlib
# 3rd party
import requests
import simplejson as json
# project
from config import get_version
# Starting with Agent 5.0.0, there should always be a local forwarder
# running and all payloads should go through it. So we should make sure
# that we pass the no_proxy environment variable that will be used by requests
# See: https://github.com/kennethreitz/requests/pull/945
os.environ['no_proxy'] = '127.0.0.1,localhost'
# urllib3 logs a bunch of stuff at the info level
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.WARN)
requests_log.propagate = True
# From http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python
control_chars = ''.join(map(unichr, range(0,32) + range(127,160)))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
def http_emitter(message, log, agentConfig):
"Send payload"
url = agentConfig['dd_url']
log.debug('http_emitter: attempting postback to ' + url)
# Post back the data
try:
payload = json.dumps(message)
except UnicodeDecodeError:
message = remove_control_chars(message)
payload = json.dumps(message)
zipped = zlib.compress(payload)
log.debug("payload_size=%d, compressed_size=%d, compression_ratio=%.3f" % (len(payload), len(zipped), float(len(payload))/float(len(zipped))))
apiKey = message.get('apiKey', None)
if not apiKey:
raise Exception("The http emitter requires an api key")
url = "{0}/intake?api_key={1}".format(url, apiKey)
try:
headers = post_headers(agentConfig, zipped)
r = requests.post(url, data=zipped, timeout=5, headers=headers)
r.raise_for_status()
if r.status_code >= 200 and r.status_code < 205:
log.debug("Payload accepted")
except Exception:
log.exception("Unable to post payload.")
try:
log.error("Received status code: {0}".format(r.status_code))
except Exception:
pass
def post_headers(agentConfig, payload):
return {
'User-Agent': 'Datadog Agent/%s' % agentConfig['version'],
'Content-Type': 'application/json',
'Content-Encoding': 'deflate',
'Accept': 'text/html, */*',
'Content-MD5': md5(payload).hexdigest(),
'DD-Collector-Version': get_version()
}