File: //usr/local/qcloud/monitor/barad/plugin/dispatcher/versioninfo_sender.py
#!/usr/bin/env python
import sys
import os
import urllib2
import json
sys.path.append(os.getcwd() + '/../../comm/')
import gzip
import StringIO
import constant
from plugin_base import BaseSender
import cutils
from cutils import CommUtils
import datetime
import time
class VersionInfoSender(BaseSender):
def init(self):
self.url = cutils.get_url('VersionInfoSender','new_version_url','version_url')
self.timeout = float(self.get_config('version_timeout'))/1000
self.is_compress = int(self.get_config('is_compress'))
self.newurl = self.url
self.dnstime = 0
self.dnscachetime = int(self.get_config('version_dns_timeout'))
self.max_retries = 3
self.retry_delay = 1
def send_data(self, json_data):
try:
curtime = datetime.datetime.now()
if(self.dnstime ==0 or (curtime - self.dnstime).seconds > self.dnscachetime):
self.dnstime = curtime
if not cutils.check_net(self.newurl, self.timeout):
self.newurl = cutils.get_url('VersionInfoSender','new_version_url','version_url')
tmpurl = CommUtils.dns_parse(self.newurl)
if cutils.check_net(tmpurl, self.timeout):
self.newurl = tmpurl
self.logger().info("get VersionInfoSender dns ipurl : %s" % self.newurl)
req = urllib2.Request(self.newurl)
req.add_header('Content-Type','application/json')
timeout = self.timeout
data = json.dumps(json_data).lower()
if self.is_compress == 1:
try:
in_data = data
out = StringIO.StringIO()
with gzip.GzipFile(fileobj=out, mode="wb") as f:
f.write(in_data)
data = out.getvalue()
req.add_header('Content-Encoding', 'gzip')
req.add_header('Content-Length', len(data))
self.logger().info("gzip compress before %d, after %d", len(in_data), len(data))
except Exception,e:
self.logger().error("compress data error, error: %s, original data: %s", str(e), str(in_data))
for attempt in range(self.max_retries):
try:
http_ret = urllib2.urlopen(req, data, timeout)
response = http_ret.read()
break
except urllib2.URLError,e:
if attempt < (self.max_retries - 1):
self.logger().info("send data error: %s sleep 1s and retry %d/%d" % (str(e),attempt + 1, self.max_retries))
time.sleep(self.retry_delay)
else:
self.logger().error("send data error max_retries , error :%s, data : %s", str(e), data)
return
try:
json_resp = json.loads(response)
retcode = int(json_resp["code"])
if retcode != 200:
self.logger().error("versioninfo send error, retcode : %d, msg : %s, data : %s" % (retcode, json_resp["msg"], data))
else:
self.logger().info("versioninfo send succ, data : %s" % str(data))
except ValueError,e:
self.logger().error("versioninfo send error, got a invalid json response : %s" % response)
except urllib2.URLError,e:
self.logger().error("send data error , error :%s, data : %s", str(e), data)
def main():
sender = VersionInfoSender()
data = {'region': 'gz', 'data': {'meta': {'domain': 'version_info', 'namespace': 'qce/cvm'}, 'values': [{'kernel_version': '5.15.0-126-generic', 'barad_version': '3.1.72_09', '__region__': 'gz', 'reported_at': '2025-02-07 14:49:49', 'uuid': '9c058f4e-70d6-48a0-b744-90e115d2e2a6'}]}}
sender.init()
sender.send_data(data)
if __name__ == '__main__':
main()