Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
I
ils-common-video
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
提交
议题看板
打开侧边栏
OpsTeam
ils-common-video
Commits
80b4e640
提交
80b4e640
authored
5月 11, 2021
作者:
zw.wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 异常告警钉钉推送和异常重试
上级
6bc25db8
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
51 行增加
和
10 行删除
+51
-10
const.py
isc_video_record/const.py
+1
-0
mysql.py
isc_video_record/db/mysql.py
+16
-6
merger.py
isc_video_record/merger.py
+2
-0
recorder.py
isc_video_record/recorder.py
+12
-3
alarm_utils.py
isc_video_record/utils/alarm_utils.py
+19
-0
setup.py
setup.py
+1
-1
没有找到文件。
isc_video_record/const.py
浏览文件 @
80b4e640
LAST_CHECK_TIME_KEY
=
'hk_isc:recorder:camera:{}'
PROCESSING_CAMERA_KEY
=
'hk_isc:processing:camera:{}'
PROCESSING_TOTAL_KEY
=
'hk_isc:recording:processing:total'
isc_video_record/db/mysql.py
浏览文件 @
80b4e640
...
...
@@ -144,18 +144,28 @@ def update_video_info(cursor, conn, db_table, video_id, status,
@query
(
cursor_dict
=
True
)
def
get_untreated_events
(
cursor
,
conn
,
db_table
,
camera_code
,
status
=
3
):
def
get_untreated_events
(
cursor
,
conn
,
db_table
,
camera_code
,
status
=
3
,
**
kw
):
if
'retry'
in
kw
:
sub_str
=
'status in (2, 3) and update_time > data_sub(now(), interval 12 hour)'
else
:
sub_str
=
'status = {}'
.
format
(
status
)
sql
=
'''
select
id as video_id,
device_code as camera_code,
start_time, end_time, status
start_time, end_time,
status,
recovered_time,
video_url,
file_name
from {}
where device_code =
%
s
and create_time > date_sub(
create_time
, interval 7 day)
and
status =
%
s
and create_time > date_sub(
now()
, interval 7 day)
and
{}
order by create_time
'''
.
format
(
db_table
)
'''
.
format
(
db_table
,
sub_str
)
cursor
.
execute
(
sql
,
[
camera_code
,
status
])
cursor
.
execute
(
sql
,
[
camera_code
])
return
cursor
.
fetchall
()
isc_video_record/merger.py
浏览文件 @
80b4e640
...
...
@@ -8,6 +8,7 @@ from datetime import datetime, timedelta
from
intelab_python_sdk.logger
import
log
from
isc_video_record.db
import
rabbitmq_connect
,
redis_connect
,
mysql
from
isc_video_record.utils.alarm_utils
import
send_alarm_to_developer
from
isc_video_record.const
import
LAST_CHECK_TIME_KEY
from
isc_video_record.pre_event
import
PreEvent
from
isc_video_record.db.mysql
import
get_camera_info
,
insert_video_info
...
...
@@ -34,6 +35,7 @@ class EventMergerJob:
self
.
run
()
except
Exception
as
e
:
log
.
exception
(
e
)
send_alarm_to_developer
(
'isc-merger'
,
e
)
next_run_at
=
time
.
time
()
+
15
*
16
log
.
info
(
'next run at:
%
s'
,
time
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
,
time
.
localtime
(
next_run_at
)))
time
.
sleep
(
15
*
60
)
...
...
isc_video_record/recorder.py
浏览文件 @
80b4e640
...
...
@@ -12,10 +12,11 @@ from intelab_python_sdk.logger import log_init, log
from
intelab_python_sdk.ffmpeg.ffmpeg_concat
import
concat
from
isc_video_record.db
import
rabbitmq_connect
,
redis_connect
from
isc_video_record.const
import
PROCESSING_CAMERA_KEY
from
isc_video_record.const
import
PROCESSING_CAMERA_KEY
,
PROCESSING_TOTAL_KEY
from
isc_video_record.utils.api_helper
import
IntelabApiHelper
from
isc_video_record.utils
import
aliyun_oss
from
isc_video_record.utils.record_utils
import
record_thread
,
get_video_duration
,
time_to_seconds
from
isc_video_record.utils.alarm_utils
import
send_alarm_to_developer
from
isc_video_record.db
import
mysql
tz
=
pytz
.
timezone
(
'Asia/Shanghai'
)
...
...
@@ -66,6 +67,7 @@ class StreamRecorder:
log
.
info
(
'Thread id:
%
s: camera_code[
%
s] processing, end.'
,
thread_id
,
body
[
'camera_code'
])
except
Exception
as
e
:
log
.
exception
(
e
)
send_alarm_to_developer
(
'recorder_{}'
.
format
(
thread_id
),
e
)
finally
:
if
pipe
.
get
(
camera_key
)
==
str
(
thread_id
):
pipe
.
delete
(
camera_key
)
...
...
@@ -108,22 +110,29 @@ class StreamRecorder:
def
process_message
(
self
,
pipe
,
camera_key
,
thread_id
,
body
):
ack
=
False
events
=
mysql
.
get_untreated_events
(
body
[
'db_table'
],
body
[
'camera_code'
])
events
=
mysql
.
get_untreated_events
(
body
[
'db_table'
],
body
[
'camera_code'
],
retry
=
'status=2'
)
log
.
info
(
'Thread_id:
%
s: events count:
%
s'
,
thread_id
,
len
(
events
))
pipe
.
incr
(
PROCESSING_TOTAL_KEY
)
# 当前录制进程数+1
for
inx
,
event
in
enumerate
(
events
):
log
.
info
(
event
)
if
pipe
.
keys
(
camera_key
):
if
pipe
.
get
(
camera_key
)
==
str
(
thread_id
):
# 判定当前分布式锁是本线程设置的
self
.
recording
(
thread_id
,
body
[
'db_table'
],
event
)
continue
if
not
self
.
set_nx
(
pipe
,
camera_key
,
thread_id
,
body
[
'ex'
]):
break
else
:
ack
=
True
pipe
.
decr
(
PROCESSING_TOTAL_KEY
)
# 本次录制结束进程数-1
return
ack
def
recording
(
self
,
thread_id
,
db_table
,
event
):
# TODO 录制失败的视频重试和续录
if
event
[
'status'
]
==
2
:
log
.
info
(
'下载失败重试任务
%
s'
,
event
[
'file_name'
])
t1
=
time
.
time
()
record_result
=
self
.
recorder
(
...
...
isc_video_record/utils/alarm_utils.py
0 → 100644
浏览文件 @
80b4e640
from
dynaconf
import
settings
from
threading
import
Thread
from
intelab_python_sdk.dingtalk
import
DingTalkMessage
def
send_alarm_to_developer
(
service_name
,
e
):
dingtalk_config
=
settings
.
get
(
'DINGTALK'
)
dingtalk_mobiles
=
dingtalk_config
.
get
(
'MOBILES'
)
dingtalk
=
DingTalkMessage
(
dingtalk_config
.
get
(
'WEBHOOK'
),
dingtalk_config
.
get
(
'SECRET'
))
import
traceback
content
=
'告警::
\n
{}服务模块出错:
\n
{}'
.
format
(
service_name
,
traceback
.
format_exc
())
t
=
Thread
(
target
=
dingtalk
.
send_text
,
args
=
(
content
,
dingtalk_mobiles
,
False
))
t
.
start
()
setup.py
浏览文件 @
80b4e640
...
...
@@ -21,7 +21,7 @@ requires = [
setuptools
.
setup
(
name
=
'isc-video-record'
,
version
=
'1.0.0a
6
'
,
version
=
'1.0.0a
7
'
,
description
=
'ISC motion detection playback video stream recording service.'
,
long_description
=
long_description
,
long_description_content_type
=
'text/markdown'
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论