Files
assist/src/analytics/__pycache__/ai_success_monitor.cpython-310.pyc

134 lines
13 KiB
Plaintext
Raw Normal View History

o
<00><>5i:Z<00>@s<>dZddlZddlZddlmZmZmZmZmZddl m Z m
Z
ddl m Z ddl mZddlZddlmZdd lmZdd
lmZdd lmZe<02>e<19>Ze Gd d <0A>d <0A><02>ZGdd<0F>d<0F>ZdS)uM
AI调用成功率监控模块
监控AI API调用的成功率和性能指标
<EFBFBD>N)<05>Dict<63>List<73>Optional<61>Any<6E>Tuple)<02>datetime<6D> timedelta)<01> dataclass)<01> defaultdict<63>)<01>
db_manager)<01>Alert)<01> redis_manager)<01>Configc@sveZdZUdZeed<eed<eeed<eed<eed<e ed<e
ed<eeed <eeed
<eed <eed <d S)<0E>APICalluAPI调用记录<E8AEB0> timestamp<6D>user_id<69> work_order_id<69>
model_name<EFBFBD>endpoint<6E>success<73> response_time<6D> status_code<64> error_message<67> input_length<74> output_lengthN) <0B>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r<00>__annotations__<5F>strr<00>int<6E>bool<6F>float<61>r%r%<00>0/root/assist/src/analytics/ai_success_monitor.pyrs
    rc@sxeZdZdZdd<03>Zdd<05>Z    d:ded eed
ed ed e d e
deedeededede fdd<14>Z de fdd<17>Z de fdd<19>Zd
edefdd<1B>Zdedefdd<1E>Zd;d
ed ede
fd!d"<22>Zd;d
ed ede
fd#d$<24>Zd%ed&ed'efd(d)<29>Zd<d
ed edeeeffd+d,<2C>Zd-e
d.e
defd/d0<64>Zd<d edeeeffd1d2<64>Zd=d4edeeeeffd5d6<64>Zd>d4edefd8d9<64>ZdS)?<3F>AISuccessMonitoruAI调用成功率监控器cCs>dddddd<06>|_ddd <09>dd
d <09>d d d <09>d dd <09>d<0F>|_dS)Ngffffff<66>?g$@g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><00>
)<05>success_rate_min<69>avg_response_time_max<61>error_rate_max<61>consecutive_failures_max<61>hourly_failures_maxg\<5C><><EFBFBD>(\<5C>?g@)<02> success_raterg@g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g @g333333<33>?g(@)<04> excellent<6E>good<6F>fair<69>poor)<02>
thresholds<EFBFBD>performance_levels<6C><01>selfr%r%r&<00>__init__(s<08>
 <0C>zAISuccessMonitor.__init__cCst<00><01>S)u获取Redis客户端)r<00>get_connectionr6r%r%r&<00>_get_redis_client:sz"AISuccessMonitor._get_redis_clientNrrrrrrrrrrr<00>returnc Cs<>z-tt<01><02>||||||||| |
d<01> } |<00>| <0B>|<00>| <0B>t<05>d|<03>d|r&dnd<05><00><04>| WStyH} zt<05>d| <0C><00><02>WYd} ~ dSd} ~ ww)u记录API调用) rrrrrrrrrrruAPI调用记录: z - u成功u失败u记录API调用失败: N) rr<00>now<6F>_save_to_redis<69>_check_thresholds<64>logger<65>info<66> Exception<6F>error) r7rrrrrrrrrr<00>api_call<6C>er%r%r&<00>record_api_call>s.<06>

<08><02>z AISuccessMonitor.record_api_callrCc Cs<>|<00><00>}|sdSzT|j<01><01>}|j|j|j|j|j|j|j|j |j
|j d<02>
}|<02> dt j|dd<05>|i<01>|<02> d|j<04><00>t j|dd<05>|i<01>|<02> d|j<02><00>t j|dd<05>|i<01>|<02>dd<08>WdStyw}zt<11>d |<05><00><02>WYd}~dSd}~ww)
u保存到RedisN)
rrrrrrrrrr<00>api_calls:dailyF)<01> ensure_ascii<69>api_calls:model:zapi_calls:user:i<00>'u保存API调用到Redis失败: )r:rrrrrrrrrrr<00>zadd<64>json<6F>dumps<70>expirerAr?rB)r7rC<00> redis_clientr<00> call_datarDr%r%r&r=hsB
<06><04>
<04>
<04><08><02>zAISuccessMonitor._save_to_redisc
Cs$zv|<00>|j<01>}||jdkr|<00>dd|j<01>d|<02>d<05>d<06>|<00>|j<05>}||jdkr4|<00>dd |<03><00>d
<EFBFBD>|j|jd d <0C>}||jd krR|<00>dd|j<01>d|d<10><04>d
<EFBFBD>|j|jd d <0C>}||jdkrt|<00>dd|j<01>d|d<14>d<15>d
<EFBFBD>WdSWdSty<>}zt <09>
d|<06><00><02>WYd}~dSd}~ww)u检查阈值并触发预警r-<00>consecutive_failuresu模型 u 连续失败 u<>criticalr.<00>high_hourly_failuresu每小时失败次数过多: <20>warning<6E><00><01>hoursr*<00>low_success_rateu 成功率过低: z.2%r+<00> slow_responseu 响应时间过长: z.2fu秒u检查阈值失败: N) <0B>_get_consecutive_failuresrr4<00>_trigger_alert<72>_get_hourly_failuresr<00>_get_recent_success_rate<74>_get_avg_response_timerAr?rB)r7rCrO<00>hourly_failuresr/<00>avg_response_timerDr%r%r&r><00>sD <04> <04><04>
<EFBFBD><06><08><02>z"AISuccessMonitor._check_thresholdsc
Cs<>zB|<00><00>}|s
WdS|jd|<01><00>dddd<05>}d}|D]%\}}zt<02>|<05>}|<07>dd<04>s/|d7}nW|WSWqtjy?Yqw|WSty]}zt<07>d|<08><00><02>WYd }~dSd }~ww)
u获取连续失败次数rrH<00> T<><01>
withscoresrrSu 获取连续失败次数失败: N) r:<00> zrevrangerJ<00>loads<64>get<65>JSONDecodeErrorrAr?rB) r7rrM<00> recent_callsrOrN<00>_<>callrDr%r%r&rX<00>s8<06> 
 
<04><02><08><02>z*AISuccessMonitor._get_consecutive_failuresrc
Cs<>zP|<00><00>}|s
WdS|jdddd<02>}|tdd<04>}|<03><03>}|<04><03>}|jd||dd<07>}d}|D]\} }
zt<05>| <09>} | <0B>dd<06>sB|d7}Wq.tjyMYq.w|WSt yk} zt
<EFBFBD> d | <0C><00><02>WYd
} ~ dSd
} ~ ww) u获取每小时失败次数r)<03>minute<74>second<6E> microsecondrSrTrFTr`ru#获取每小时失败次数失败: N) r:<00>replacerr<00> zrangebyscorerJrcrdrerAr?rB) r7rrM<00>
hour_start<EFBFBD>hour_end<6E>
start_time<EFBFBD>end_time<6D>calls<6C>failuresrNrgrhrDr%r%r&rZ<00>s<<06> 
 <04><02><08><02>z%AISuccessMonitor._get_hourly_failuresrSrUc
Cs<>z_|<00><00>}|s
WdSt<01><02><00><03>}t<01><02>t|d<02><00><03>}|jd|<01><00>||dd<05>}|s,WdSd}t|<06>}|D]\} }
zt<07>| <09>} | <0B> dd<04>rH|d 7}Wq4tj
ySYq4w|dkr]||WSdWSt yz} zt <0C> d
| <0C><00><02>WYd } ~ dSd } ~ ww) u获取最近成功率<E58A9F>rTrHTr`g<00>?rrrSu获取成功率失败: N)r:rr<rrrm<00>lenrJrcrdrerAr?rB) r7rrUrMrqrprr<00>successful_calls<6C> total_callsrNrgrhrDr%r%r&r[s> <06> 
 <04><02><08><02>z)AISuccessMonitor._get_recent_success_ratec
Csze|<00><00>}|s
WdSt<01><02><00><03>}t<01><02>t|d<02><00><03>}|jd|<01><00>||dd<05>}|s,WdSd}d}|D]'\} }
zt<06>| <09>} | <0B>dd<06>} | dkrN|| 7}|d7}Wq2tj yYYq2w|dkrc||WSdWSt
y<EFBFBD>} zt <0B> d | <0A><00><02>WYd
} ~ dSd
} ~ ww) u获取平均响应时间rtrTrHTr`rrrSu 获取平均响应时间失败: N) r:rr<rrrmrJrcrdrerAr?rB)r7rrUrMrqrprr<00>
total_time<EFBFBD>countrNrgrhrrDr%r%r&r\%sB <06> 
 <04><02><08><02>z'AISuccessMonitor._get_avg_response_time<6D>
alert_type<EFBFBD>message<67>severityc
Cs<>z8td|<01><00>||||dt<01><02>d<03>}t<03><04><00>}|<05>|<04>|<05><06>Wd<00>n1s)wYt<07>d|<02><00><02>WdSt yS}zt<07>
d|<06><00><02>WYd}~dSd}~ww)u 触发预警uAI成功率监控_T)<07> rule_namerz<00>levelr|r{<00> is_active<76>
created_atNuAI成功率监控预警: u%触发AI成功率监控预警失败: ) r rr<r <00> get_session<6F>add<64>commitr?rRrArB)r7rzr{r|<00>alert<72>sessionrDr%r%r&rYLs&<06>

<1C><08><02>zAISuccessMonitor._trigger_alert<72>c Cs&z<>|<00><00>}|s
iWSt<01><02><00><03>}t<01><02>t|d<01><00><03>}|jd|<01><00>||dd<04>}|s3|dddddd<08>WSt|<06>dddgtt<08>d <09>}|D]U\}} zGt <09>
|<08>}
|
<EFBFBD> d
d<03>r[|d d 7<n|d d 7<|
<EFBFBD> dd<07>} |d| d 7<|
<EFBFBD> dd<05>} | dkr<>|d| 7<|d<00> | <0C>WqBt j y<>YqBw|ddkr<>|d |dnd} |dr<>|dt|d<00>nd}|ddkr<>|d |dnd}|<00>| |<0E>}||d|d |d t| d<14>t|d<15>t|d<14>|tt|d<00><12><00>dd<17><00>d<18> WSt<13>y}zt<14>d|<11><00><02>iWYd}~Sd}~ww)u获取模型性能指标rTrHTr`rrt<00>unknown)rrwr/r^<00>
error_rate<EFBFBD>performance_level)rwrv<00> failed_calls<6C>total_response_time<6D>response_times<65>errorsrrvrSr<>rr<>rr<>r<>rw<00>r Nr() rrwrvr<>r/r^r<>r<><00>
top_errorsu获取模型性能失败: )r:rr<rrrmrur
r"rJrcrd<00>appendre<00>_determine_performance_level<65>round<6E>dict<63>list<73>itemsrAr?rB)r7rrUrMrqrprr<00>statsrNrgrh<00> error_msgrr/r^r<>r<>rDr%r%r&<00>get_model_performancebs| <06><08>
<06> 
   <04><02>    <08> <08><02>z&AISuccessMonitor.get_model_performancer/r^cCs8|j<00><01>D]\}}||dkr||dkr|SqdS)u确定性能等级r/rr3)r5r<>)r7r/r^r~r4r%r%r&r<><00>s
<02>z-AISuccessMonitor._determine_performance_levelc
Csz<>|<00><00>}|s
iWSt<01><02><00><03>}t<01><02>t|d<01><00><03>}|jd||dd<04>}|s/ddddid<07>WSt|<05>dddt<07>tt <09>tt <09>d<08>}|D]i\}}z[t
<EFBFBD> |<07>} | <09> d d<03>r[|d
d 7<n|d d 7<| <09> d d<05>}
|
dkru|d|
7<|d<00> | <09> dd<11><02>|d| <09> dd<14>d 7<t<01>|<08><01>d<15>} |d| d 7<WqBt
jy<>YqBw|ddkr<>|d
|dnd} |ddkr<>|d|dnd} |d|d
|d t| d<18>t| d<19>t|d<00>t|d<00>t|d<00>d<1A>WSt<13>y }zt<14>d|<0E><00><02>iWYd}~Sd}~ww)u获取系统整体性能rTrFTr`rrt)rwr/r^<00> unique_users<72>model_distribution)rwrvr<>r<>r<>r<><00>hourly_distributionrrvrSr<>rr<>r<>r<00>r<>rr<>z%H:00r<30>rwr<>r )rwrvr<>r/r^r<>r<>r<>u获取系统性能失败: N)r:rr<rrrmru<00>setr
r"rJrcrdr<><00> fromtimestamp<6D>strftimerer<>r<>rAr?rB)r7rUrMrqrprrr<>rNrrhr<00>hourr/r^rDr%r%r&<00>get_system_performance<63>sv <06><08> <06>

  <02>  


<08> <08><02>z'AISuccessMonitor.get_system_performance<63><00>daysc
Cs<>z<>g}t|<01>D]<5D>}t<01><02><00><03>t|d<01>}t<01>|tj<06><07><00>}t<01>|tj<08><07><00>}|<05> <09>}|<06> <09>}|<00>
<EFBFBD>} | sA|<02> |<04> <0C>dddd<04><04>q| j d||dd<07>}
|
sY|<02> |<04> <0C>dddd<04><04>qd} d} |
D]-\} }zt<0E>| <0A>}|<0F>dd<06>rs| d 7} |<0F>d
d<02>}|dkr<>| |7} Wq_tjy<>Yq_w|
r<EFBFBD>| t|
<EFBFBD>nd}|
r<EFBFBD>| t|
<EFBFBD>nd}|<02> |<04> <0C>t|
<EFBFBD>t|d <0B>t|d <0C>d<04><04>qtt|<02><01>WSty<>}zt<17>d |<13><00><02>gWYd}~Sd}~ww)u获取性能趋势<E8B68B>r<>rrt)<04>daterwr/r^rFTr`rrSrr<>r u获取性能趋势失败: N)<19>rangerr<r<>r<00>combine<6E>min<69>time<6D>maxrr:r<><00> isoformatrmrJrcrdrerur<>r<><00>reversedrAr?rB)r7r<><00>
trend_data<EFBFBD>ir<69><00> day_start<72>day_endrprqrMrrrvr<>rNrgrhrr/r^rDr%r%r&<00>get_performance_trendsv <08><06><08> 
  <04><02>
<EFBFBD><08><02>z&AISuccessMonitor.get_performance_trend<6E>c
Cs<>zH|<00><00>}|s
WdSt<01><02>t|d<02><00><04>}|<02>dd|<03>}|<02>d<04>}|D] }|<02>|d|<03>q#|<02>d<05>}|D] }|<02>|d|<03>q4t<07>d|<04><00><02>|WSt yc}zt<07>
d|<08><00><02>WYd}~dSd}~ww) u清理旧数据rr<>rFzapi_calls:model:*zapi_calls:user:*u,清理AI成功率监控数据成功: 数量=u%清理AI成功率监控数据失败: N) r:rr<rr<00>zremrangebyscore<72>keysr?r@rArB) r7r<>rM<00> cutoff_time<6D> removed_count<6E>
model_keys<EFBFBD>key<65> user_keysrDr%r%r&<00>cleanup_old_dataMs.<04>

<08><02>z!AISuccessMonitor.cleanup_old_data)NNrr)rS)r<>)r<>)r<>)rrrrr8r:r!rr"r#r$rrEr=r>rXrrZr[r\rYrrr<>r<>r<>rr<>r<>r%r%r%r&r'%sV <04><02><02><02><02><02><02><02> <02>
<02> <02>
<EFBFBD>*+* #%' O NGr')rrJ<00>logging<6E>typingrrrrrrr<00> dataclassesr <00> collectionsr
r<><00> core.databaser <00> core.modelsr <00>core.redis_managerr<00> config.configr<00> getLoggerrr?rr'r%r%r%r&<00><module>s