import os from datetime import datetime import pymysql import requests CE_ENDPOINT = os.environ["CE_ENDPOINT"] CE_DB_HOST = os.environ["CE_DB_HOST"] CE_DB_PORT = 4000 CE_DB_USER = os.environ["CE_DB_USER"] CE_DB_PASSWD = os.environ["CE_DB_PASSWD"] CE_DB_NAME = "diagnose-rule-stats" def lambda_handler(event, context): if context.get_remaining_time_in_millis() < 60000: raise ValueError("the lambda function's timeout property should be configured at least 60s") _end = int(datetime.now().timestamp()) _start = _end - 600 try: feedback_records = calculate_feedback_records(_start, _end) write_feedback_records_to_db(feedback_records) except Exception as e: return { "code": 500, "error": e, } return {"code": 200} def query_api(uri, body=None): _url = "{}{}".format(CE_ENDPOINT, uri) if not body: return requests.get(_url).json() return requests.post(_url, json=body).json() def calculate_feedback_records(start, end): uri = "/tasks/diag-rule-feedback?status=success&begin={}&end={}".format(start, end) feedback_resp = query_api(uri) records = [] for _resp in feedback_resp: if _resp["status"] != "success": continue _args = _resp["args"] records.append( { "rule_id": _args["rule"], "user": _args["user"], "click_ts": _resp["created_at"], "trigger_ts": _resp["updated_at"], "agree": 1 if _args["agree"] else 0, "message": _args["msg"], } ) return records def write_feedback_records_to_db(records): conn = pymysql.connect( host=CE_DB_HOST, port=CE_DB_PORT, user=CE_DB_USER, password=CE_DB_PASSWD, database=CE_DB_NAME, charset="utf8mb4", cursorclass=pymysql.cursors.DictCursor, ) with conn: with conn.cursor() as cursor: for r in records: _cts = datetime.fromtimestamp(r["click_ts"]).strftime("%Y-%m-%d %H:%M:%S") _tts = datetime.fromtimestamp(r["trigger_ts"]).strftime("%Y-%m-%d %H:%M:%S") sql = """REPLACE INTO `rule_feedback_details` (rule_id, user, click_ts, trigger_ts, agree, message) VALUES ('{}', '{}', '{}', '{}', '{}', '{}')""".format( r["rule_id"], r["user"], _cts, _tts, r["agree"], r["message"], ) try: cursor.execute(sql) except pymysql.IntegrityError: # skip exist rows continue # connection is not autocommit by default. So you must commit to save # your changes. conn.commit()