标签:DEFAULT sl redis results 查询 time 日志 NULL
(1)利用python执行 slowlog_get查询慢日志,写成job,一分钟执行一次,查200条,然后存到mysql,以便时候分析:
#!/usr/bin/env python import datetime,time,redis import mysql.connector import pytz pystime = time.time() tz = pytz.timezone('Asia/Shanghai') redis_ips=['10.x.x.x','6379','391axxx'] def slow_redis(): Redis = redis.StrictRedis(host=redis_ips[0],port=redis_ips[1],password=redis_ips[2],socket_timeout=1) results = Redis.slowlog_get(200) #每次获取200条 print(results) session_id=results[0]['id'] i_start_time = datetime.datetime.fromtimestamp(int(results[0]['start_time'])).strftime('%Y-%m-%d %H:%M:%S') #时间格式转换 duration = round(int(results[0]['duration'])/1000,2) #毫秒 command = results[0]['command'] if duration>=10: # 开发定义超过10ms的慢日志会留意 i_host=redis_ips[0] s_results={ "session_id":session_id,"host_ip":i_host,"start_time":i_start_time,"duration":duration,"cmd":command,'insert_time':datetime.datetime.now(tz) } # print(s_results) conn = mysql.connector.connect(host='192.168.x.x', port=3306, user='devops', passwd='xxxxx',db='devops', charset='utf8mb4') cur = conn.cursor(buffered=True) try: sql_d = "delete from devops.redis_log where insert_time <= DATE_SUB(CURDATE(), INTERVAL 7 DAY) " # 删除7天以前的数据 cur.execute(sql_d) conn.commit() except: conn.rollback() print('\adevops.redis_log table delete failed. Transaction rolled back') raise try: sql_i = ( f"insert ignore into devops.redis_log ({', '.join(s_results.keys())}) " f"values (%({')s, %('.join(s_results.keys())})s)") cur.execute(sql_i,s_results) conn.commit() # inserted = cur.rowcount except: conn.rollback() print('\adevops.redis_log table ops failed. Transaction rolled back') raise cur.close() conn.close() slow_redis() pyetime = time.time() print ('当前脚本运行时间为:',round(float(pyetime - pystime),3),'s')
注:先再mysql建立表结构:
CREATE TABLE `redis_log` ( `session_id` int DEFAULT NULL, `host_ip` varchar(100) COLLATE utf8mb4_0900_as_cs DEFAULT NULL, `start_time` datetime DEFAULT NULL, `duration` decimal(10,0) DEFAULT NULL, `cmd` varchar(5000) COLLATE utf8mb4_0900_as_cs DEFAULT NULL, `insert_time` timestamp(3) NULL DEFAULT NULL, `remark` varchar(100) COLLATE utf8mb4_0900_as_cs DEFAULT NULL, UNIQUE KEY `redis_slog_pk` (`session_id`), KEY `idx_start_time` (`start_time`)
(2)做成docker镜像,利用k8s cronjob一分钟执行一次。
Dockerfile如下:
FROM python:3.7-alpine RUN addgroup -S zwgroup && adduser -S zhanwei -G zwgroup #creates work dir WORKDIR /app #copy python script to the container folder app COPY redis_sl_db.py /app/redis_sl_db.py COPY ./requirements.txt /app/requirements.txt RUN chmod +x /app/redis_sl_db.py RUN pip install --no-cache-dir -r requirements.txt #user is appuser ENTRYPOINT ["python", "/app/redis_sl_db.py"]
k8s yaml如下:
apiVersion: batch/v1beta1 kind: CronJob metadata: name: dc-csharp-redis-sl spec: schedule: "*/1 * * * *" jobTemplate: spec: backoffLimit: 5 template: spec: containers: - name: dc-csharp-redis-sl image: dockerhub.xxxxx.com/ops/dc_csharp_redis_sl:0.2 imagePullPolicy: IfNotPresent command: [/app/redis_sl_db.py] imagePullSecrets: - name: dockerhub restartPolicy: OnFailure
最后查询mysql表 devops.redis_log数据就可以了
标签:DEFAULT,sl,redis,results,查询,time,日志,NULL 来源: https://www.cnblogs.com/5sdba-notes/p/15846568.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。