from db.art_relations import conn as art_relations_conn import config import boto3 import datetime import pytz from pytz import timezone MAX_SECONDS_THRESHOLD = 7200 # send message if no activity in one hour def get_last_bacon_event_time(column): last_bacon_event_time_query = 'select MAX({}) as max_{} from youtube_channel_video_status'.format(column, column) cursor = art_relations_conn.cursor() cursor.execute(last_bacon_event_time_query) result = cursor.fetchone() return result['max_{}'.format(column)].strftime('%Y-%m-%d %H:%M:%S') def get_bacon_event_diff_time(time_str): local_tz = pytz.timezone('US/Eastern') diff = datetime.datetime.now(timezone('US/Eastern')) - local_tz.localize(datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')) return diff.total_seconds() def build_notification(times, alarm_column, diff_time): notification_body = 'BACON has not seen activity in ' + str(int(diff_time / 60)) + ' minutes for column: ' + alarm_column + '\n' notification_body += '\n' notification_body += 'Last Video Search Time: ' + times['last_video_search_time'] + '\n' notification_body += 'Last Track Insert Time: ' + times['last_track_insert_time'] + '\n' notification_body += 'Last Asset Insert Time: ' + times['last_asset_insert_time'] + '\n' notification_body += 'Last Ownership Insert Time: ' + times['last_ownership_insert_time'] + '\n' notification_body += 'Last Claim Insert Time: ' + times['last_claim_insert_time'] + '\n' notification_body += 'Last Asset Match Insert Time: ' + times['last_asset_match_insert_time'] + '\n' notification_body += 'Last Reference Insert Time: ' + times['last_reference_insert_time'] + '\n' notification_body += 'Last Updated Time: ' + times['last_updated_time'] + '\n' notification_body += '\n' notification_body += 'Note: these times could all be from different videos' return notification_body def send_notification(notification_message): sns_client = boto3.client('sns') response = sns_client.publish( TopicArn=config.BACON_ALARM_ARN, Subject='BACON Alarm', Message=notification_message ) last_video_search_time = get_last_bacon_event_time('video_search_time') last_track_insert_time = get_last_bacon_event_time('track_insert_time') last_asset_insert_time = get_last_bacon_event_time('asset_insert_time') last_ownership_insert_time = get_last_bacon_event_time('ownership_insert_time') last_claim_insert_time = get_last_bacon_event_time('claim_insert_time') last_asset_match_insert_time = get_last_bacon_event_time('asset_match_insert_time') last_reference_insert_time = get_last_bacon_event_time('reference_insert_time') last_updated_time = get_last_bacon_event_time('last_updated') last_bacon_event_times = { 'last_video_search_time': last_video_search_time, 'last_track_insert_time': last_track_insert_time, 'last_asset_insert_time': last_asset_insert_time, 'last_ownership_insert_time': last_ownership_insert_time, 'last_claim_insert_time': last_claim_insert_time, 'last_asset_match_insert_time': last_asset_match_insert_time, 'last_reference_insert_time': last_reference_insert_time, 'last_updated_time': last_updated_time } last_video_search_diff = get_bacon_event_diff_time(last_video_search_time) last_track_insert_diff = get_bacon_event_diff_time(last_track_insert_time) last_asset_insert_diff = get_bacon_event_diff_time(last_asset_insert_time) last_ownership_insert_diff = get_bacon_event_diff_time(last_ownership_insert_time) last_claim_insert_diff = get_bacon_event_diff_time(last_claim_insert_time) last_asset_match_insert_diff = get_bacon_event_diff_time(last_asset_match_insert_time) last_reference_insert_diff = get_bacon_event_diff_time(last_reference_insert_time) last_updated_time_diff = get_bacon_event_diff_time(last_updated_time) if(last_video_search_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'video_search_time', last_video_search_diff) send_notification(notification_message) raise # raise exception to fail jenkins job so slack alert can be sent elif(last_track_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'track_insert_time', last_track_insert_diff) send_notification(notification_message) raise elif(last_asset_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'asset_insert_time', last_asset_insert_diff) send_notification(notification_message) raise elif(last_ownership_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'ownership_insert_time', last_ownership_insert_diff) send_notification(notification_message) raise elif(last_claim_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'claim_insert_time', last_claim_insert_diff) send_notification(notification_message) raise elif(last_asset_match_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'asset_match_insert_time', last_asset_match_insert_time) send_notification(notification_message) raise elif(last_reference_insert_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'reference_insert_time', last_reference_insert_time) send_notification(notification_message) raise elif(last_updated_time_diff) > MAX_SECONDS_THRESHOLD: notification_message = build_notification( last_bacon_event_times, 'last_updated', last_updated_time) send_notification(notification_message) raise