utils.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. import os
  2. import json
  3. from aliyunsdkcore.client import AcsClient
  4. from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
  5. from model import InstanceList,IntfaceList
  6. # from DBSession import session_maker
  7. from model_longvideo import produce_video_task
  8. from DBSession_longvideo import session_maker_longvideo
  9. from aliyun.log.logclient import LogClient
  10. from aliyun.log.getlogsrequest import GetLogsRequest
  11. import requests
  12. import time
  13. import pymysql
  14. from sqlalchemy.sql import func
  15. from model_longvideo import produce_video_project
  16. client = AcsClient('LTAI4GBWbFvvXoXsSVBe1o9f', 'kRAikWitb4kDxaAyBqNrmLmllMEDO3', 'cn-hangzhou')
  17. def intances_list_update():
  18. request = DescribeInstancesRequest()
  19. request.set_accept_format('json')
  20. request.set_PageSize(100)
  21. request.set_InstanceNetworkType("vpc")
  22. request.set_Tags([
  23. {
  24. "Key": "ecs"
  25. }
  26. ])
  27. response = client.do_action_with_exception(request)
  28. instance_info = json.loads(response)
  29. intances_list_del()
  30. print(len(instance_info["Instances"]["Instance"]))
  31. for i in range(len(instance_info["Instances"]["Instance"])):
  32. instance_id = instance_info["Instances"]["Instance"][i]["InstanceId"]
  33. ipaddr = instance_info["Instances"]["Instance"][i]["VpcAttributes"]["PrivateIpAddress"]["IpAddress"][0]
  34. server_name = instance_info["Instances"]["Instance"][i]["Tags"]["Tag"][0]["TagValue"]
  35. status = instance_info["Instances"]["Instance"][i]["Status"]
  36. instance_name = instance_info["Instances"]["Instance"][i]["HostName"]
  37. if status == "running":
  38. status = 1
  39. instance_insert(instance_id, ipaddr, instance_name, server_name, status)
  40. return "OK"
  41. def intances_list_del():
  42. with session_maker() as session:
  43. session.query(InstanceList).delete()
  44. def instance_insert(instance_id, ipadd, instance_name, server_name, status):
  45. InstanceInfo = None
  46. InstanceInfo = InstanceList()
  47. with session_maker() as session:
  48. InstanceInfo.instance_id = instance_id
  49. InstanceInfo.ipadd = ipadd
  50. InstanceInfo.instance_name = instance_name
  51. InstanceInfo.server_name = server_name
  52. InstanceInfo.status = status
  53. session.add(InstanceInfo)
  54. def healthcheck(ipaddr,server_name):
  55. """返回容器upload时间,容器运行状态,健康坚持接口返回值,"""
  56. svc_name = server_name
  57. print(server_name)
  58. if svc_name == "longvideoapi.prod" :
  59. url = "http://{}:8080/longvideoapi/test".format(ipaddr)
  60. res = requests.post(url, timeout=5)
  61. print(res.status_code)
  62. return res.status_code
  63. if svc_name == "commonapi.prod":
  64. url = "http://{}:8080/commonapi/test".format(ipaddr)
  65. res = requests.post(url, timeout=5)
  66. return res.status_code
  67. if svc_name == "speed.prod":
  68. url = "http://{}:8080/longvideoapi/test".format(ipaddr)
  69. res = requests.post(url, timeout=5)
  70. return res.status_code
  71. if svc_name == "clipapi.prod":
  72. url = "http://{}:8080/longvideoapi/test".format(ipaddr)
  73. res = requests.post(url, timeout=5)
  74. return res.status_code
  75. if svc_name == "distribution.prod":
  76. url = "http://{}:8080/healthcheck".format(ipaddr)
  77. res = requests.post(url, timeout=5)
  78. return res.status_code
  79. if svc_name == "manager.prod":
  80. url = "http://{}:8971/dev/test/healthcheck".format(ipaddr)
  81. res = requests.post(url, timeout=5)
  82. return res.status_code
  83. if svc_name == "recommend-queue.prod":
  84. url = "http://{}:8080/healthcheck".format(ipaddr)
  85. res = requests.post(url, timeout=5)
  86. return res.status_code
  87. # def healthcheck_metirc(instance_id,ipaddr,server_name,http_code):
  88. # healthcheck_status = Gauge("healthcheck_status", "http_code", ['instance_id', 'server_name', 'ipaddress'],
  89. # registry=registry)
  90. #
  91. # healthcheck_status.labels(instance_id, server_name, ipaddr).set(http_code)
  92. #
  93. # return Response(generate_latest(registry),mimetype="text/plain")
  94. def count_qps(appType, url):
  95. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  96. accessKeyId = 'LTAIWYUujJAm7CbH'
  97. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  98. logstore = 'request-log'
  99. client = LogClient(endpoint, accessKeyId, accessKey)
  100. project = 'wqsd-longvideoapi'
  101. topic = ""
  102. start_time = int(time.time())
  103. end_time = start_time - 60
  104. req = GetLogsRequest(project, logstore, end_time, start_time, topic,
  105. "params.appType={} and requestUri= {} |select requestUri,count(1) as cnt, date_format(logTimestamp/1000,'%Y-%m-%d %H:%i:%S') as date group by requestUri, date order by cnt desc limit 1".format(appType, url)
  106. , 30, 0, False)
  107. try:
  108. res = client.get_logs(req)
  109. except :
  110. qps = 0
  111. else:
  112. if res.body:
  113. qps = res.body[0]["cnt"]
  114. else:
  115. qps = 0
  116. print(int(time.time())-start_time)
  117. return qps
  118. def count_avg_time(appType ,url):
  119. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  120. accessKeyId = 'LTAIWYUujJAm7CbH'
  121. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  122. logstore = 'request-log'
  123. client = LogClient(endpoint, accessKeyId, accessKey)
  124. project = 'wqsd-longvideoapi'
  125. topic = ""
  126. start_time = int(time.time())
  127. end_time = start_time - 60
  128. # url = '/longvideoapi/user/idolsUpdated'
  129. req = GetLogsRequest(project, logstore, end_time, start_time, topic,
  130. "params.appType=%s and requestUri=%s |select requestUri,round(avg(expendTime)) as avgs,count(1) as cnt group by requestUri " %(appType, url), 30, 0, False)
  131. try:
  132. res = client.get_logs(req)
  133. except Exception as e:
  134. avgs = 0
  135. else:
  136. if res.body:
  137. avgs = res.body[0]["avgs"]
  138. else:
  139. avgs = 0
  140. return avgs
  141. def slb_status_code_count(server_name):
  142. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  143. accessKeyId = 'LTAIWYUujJAm7CbH'
  144. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  145. client = LogClient(endpoint, accessKeyId, accessKey)
  146. if server_name == "longvideoapi":
  147. project = 'longvideoapi-slb-log'
  148. logstore = 'slb-access-log'
  149. if server_name == "speed":
  150. project = 'speed-slb-log'
  151. logstore = 'access-log'
  152. if server_name == "clip":
  153. project = 'clips-slb-log'
  154. logstore = 'access-log'
  155. if server_name == "commonapi":
  156. project = 'commonapi-slb-log'
  157. logstore = 'slb-access-log'
  158. topic = ""
  159. end_time = int(time.time())
  160. start_time = end_time - (end_time - time.timezone)%86400
  161. # url = '/longvideoapi/user/idolsUpdated'
  162. req = GetLogsRequest(project, logstore, start_time, end_time, topic,
  163. "* |SELECT status ,COUNT(*) as cnt group by status" , 30, 0, False)
  164. try:
  165. res = client.get_logs(req)
  166. except Exception as e:
  167. avgs = 0
  168. else:
  169. if res.body:
  170. return res.body
  171. def produce_video_task_status_count():
  172. with session_maker_longvideo() as session:
  173. video_progress_count = session.query(produce_video_task).filter(produce_video_task.task_status == 1).count()
  174. video_success_count = session.query(produce_video_task).filter(produce_video_task.task_status == 2).count()
  175. video_fail_count = session.query(produce_video_task).filter(produce_video_task.task_status == 3).count()
  176. end_time = int(time.time())
  177. start_time = end_time - (end_time - time.timezone) % 86400
  178. res = session.query(produce_video_task).filter(produce_video_task.task_status==2).order_by(produce_video_task.id.desc()).first()
  179. duration = res.duration
  180. submit_timestamp = res.submit_timestamp
  181. complete_timestamp = res.complete_timestamp
  182. print(res.id,duration,submit_timestamp,complete_timestamp)
  183. rate = (duration / (complete_timestamp - submit_timestamp) / 1000)
  184. def logs_tts_count(tts_channel, tts_status):
  185. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  186. accessKeyId = 'LTAIWYUujJAm7CbH'
  187. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  188. client = LogClient(endpoint, accessKeyId, accessKey)
  189. project = 'wqsd-monitor'
  190. logstore = 'monitor-log'
  191. topic = ""
  192. end_time = int(time.time())
  193. start_time = end_time - (end_time - time.timezone)%86400
  194. req = GetLogsRequest(project, logstore, start_time, end_time, topic,
  195. "* and __topic__: producetts and channel:{} and produceStatus:{}| select channel,produceStatus,count(*) as count group by channel,produceStatus".format(tts_channel, tts_status) , 30, 0, False)
  196. try:
  197. res = client.get_logs(req)
  198. except Exception as e:
  199. avgs = 0
  200. else:
  201. if res.body:
  202. return res.body
  203. def count_recommend_null():
  204. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  205. accessKeyId = 'LTAIWYUujJAm7CbH'
  206. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  207. logstore = 'app-recommend-log'
  208. client = LogClient(endpoint, accessKeyId, accessKey)
  209. project = 'wqsd-longvideoapi'
  210. topic = ""
  211. start_time = int(time.time())
  212. #监控获取时间间隔300s
  213. end_time = start_time - 300
  214. query_sql = "* and requestUri:'/longvideoapi/video/distribute/category/videoList/v2' | select count(DISTINCT json_extract(params, '$.machineCode')) as cnt where json_array_length(json_extract(result, '$.data')) = 0"
  215. req = GetLogsRequest(project, logstore, end_time, start_time, topic, query_sql, 30, 0, False)
  216. try:
  217. res = client.get_logs(req)
  218. except Exception as e:
  219. print(e)
  220. avgs = 0
  221. else:
  222. if res.body:
  223. cnt_300 = res.body[0]["cnt"]
  224. else:
  225. cnt_300 = 0
  226. return cnt_300
  227. def db_query(sql):
  228. HOST = 'rr-bp1x9785e8h5452bi157.mysql.rds.aliyuncs.com'
  229. PORT = '3306'
  230. DATABASE = 'longvideo'
  231. USERNAME = 'devops'
  232. PASSWORD = 'devops@123456'
  233. conn = pymysql.connect(host=HOST, user=USERNAME, password=PASSWORD, database=DATABASE, charset="utf8")
  234. cursor = conn.cursor()
  235. cursor.execute(sql)
  236. res = cursor.fetchone()
  237. return res
  238. def count_qps_avgtime(appType):
  239. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  240. accessKeyId = 'LTAIWYUujJAm7CbH'
  241. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  242. logstore = 'request-log'
  243. client = LogClient(endpoint, accessKeyId, accessKey)
  244. project = 'wqsd-longvideoapi'
  245. topic = ""
  246. start_time = int(time.time())
  247. end_time = start_time - 60
  248. # url = '/longvideoapi/user/idolsUpdated'
  249. req = GetLogsRequest(project, logstore, end_time, start_time, topic,
  250. "params.appType=%s | select requestUri,count(1) as cnt , avg(expendTime) as avg_time group by requestUri order by requestUri,cnt desc limit 1000" %(appType), 30, 0, False)
  251. try:
  252. res = client.get_logs(req)
  253. except Exception as e:
  254. avgs = 0
  255. return res
  256. def count_rt_less_time_count(appType, than, less):
  257. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  258. accessKeyId = 'LTAIWYUujJAm7CbH'
  259. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  260. logstore = 'request-log'
  261. client = LogClient(endpoint, accessKeyId, accessKey)
  262. project = 'wqsd-longvideoapi'
  263. topic = ""
  264. start_time = int(time.time())
  265. end_time = start_time - 60
  266. # url = '/longvideoapi/user/idolsUpdated'
  267. req = GetLogsRequest(project, logstore, end_time, start_time, topic,
  268. "params.appType=%s and expendtime >%s and expendtime <%s| select requestUri,count(1) as cnt group by requestUri order by requestUri,cnt desc limit 1000" %(appType,than,less), 30, 0, False)
  269. try:
  270. res = client.get_logs(req)
  271. except Exception as e:
  272. avgs = 0
  273. return res
  274. def app_openapi_qps_avgtime_count():
  275. endpoint = 'cn-hangzhou.log.aliyuncs.com'
  276. accessKeyId = 'LTAIWYUujJAm7CbH'
  277. accessKey = 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P'
  278. logstore = 'request-log'
  279. client = LogClient(endpoint, accessKeyId, accessKey)
  280. project = 'wqsd-longvideoapi'
  281. topic = ""
  282. start_time = int(time.time())
  283. end_time = start_time - 60
  284. url = '/longvideoapi/openapi/video/distribute/category/videoList/v2'
  285. req = GetLogsRequest(project, logstore, end_time, start_time, topic,
  286. "requestUri=%s| select requestUri,count(1) as cnt , avg(expendTime) as avg_time group by requestUri order by requestUri,cnt desc limit 1000"%(url) , 30, 0, False)
  287. try:
  288. res = client.get_logs(req)
  289. except Exception as e:
  290. avgs = 0
  291. return res,url
  292. if __name__ == '__main__':
  293. # slb_status_code_count("clip")
  294. # healthcheck_result = []
  295. # with session_maker() as session:
  296. # instance_infos = session.query(InstanceList).filter(InstanceList.status==0).all()
  297. # for index in range(len(instance_infos)):
  298. # ipaddr = instance_infos[index].ipadd
  299. # server_name = instance_infos[index].server_name
  300. # http_code = healthcheck(ipaddr,server_name)
  301. # result = {"ipaddr": ipaddr, "server_name": server_name, "http_code": http_code}
  302. # healthcheck_result.append(result)
  303. # print(healthcheck_result)
  304. # produce_video_task_status_count()
  305. # res = logs_tts_count("aliyun",1)
  306. # if res[0]["count"]:
  307. # print(res[0]["count"])
  308. # res = logs_tts_count("aliyun", 0)
  309. # if res[0]["count"]:
  310. # print(res[0]["count"])
  311. # res = logs_tts_count("azure", 1)
  312. # if res[0]["count"]:
  313. # print(res[0]["count"])
  314. # res = logs_tts_count("aliyun", 0)
  315. # if res[0]["count"]:
  316. # print(res[0]["count"])
  317. # res = count_recommend_nu
  318. # res = count_qps_avgtime(appType=0)
  319. # print(res.body)
  320. # for i in range(len(res.body)):
  321. # url = res.body[i]["requestUri"]
  322. #
  323. # qps = res.body[i]["cnt"]
  324. # avgtime = round(float(res.body[i]["avg_time"]), 2)
  325. # print(url,qps ,avgtime)
  326. query_sql = ("select round((successCount + processingCount1)/totalCount * 100,2) from "
  327. "(select count(*) as totalCount,"
  328. "sum(case when produce_status in (5,6,7,8) then 1 else 0 end) as successCount,"
  329. "sum(case when produce_status = 99 then 1 else 0 end) as failCount , "
  330. "sum(case when produce_status in(0,1,2,3,4) then 1 else 0 end) as processingCount,"
  331. "sum(case when produce_status in(0,1,2,3,4) and (rate < 1 or rate is null) then 1 else 0 end) processingCount1,"
  332. "sum(case when produce_status in(0,1,2,3,4) and rate >= 1 then 1 else 0 end) processingCount2 from "
  333. "(select t1.project_id, t1.produce_status, round((t2.last_connect_timestamp - t1.submit_timestamp) / (t1.video_duration/1000), 1) as rate from produce_video_project t1 "
  334. "left join produce_video_project_connect_time t2 on t1.project_id = t2.project_id "
  335. "where t1.project_id > '20210804000000000111111' and t1.project_id < '20210805000000000111111' and t1.app_type not in (1,13,15)) s1) ss1"
  336. )
  337. res = db_query(query_sql)
  338. print(res)