
    ^nj                     `   d Z ddlmZmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
  eh d      Zdd	d
dddZdeeef   dedefdZdeeef   deeef   fdZdeeef   defdZdeeef   deeef   dedz  fdZdeeef   defdZdeeef   deeeef      deeeef      dededeeef   fdZy)z0Read-only alert summary for external dashboards.    )IterableMapping)UTCdatetime)Any   )iso	parse_iso>   stalefailedunknowndegraded
fehlerfreiu   gestörtfehlgeschlagenveraltet	unbekannt)healthyr   r   r   r   rowkeyreturnc                 $    | j                  |      S )N)get)r   r   s     J/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/alerts.py_valuer      s    773<    c                     t        | d      }t        |t              rN|D ci c]B  }t        |t              sd|v st	        |j                  d            |j                  d      D c}S i S c c}w )Nevidence_jsonr   value)r   
isinstancelistdictstrr   )r   r   items      r   	_evidencer$      sc    3(E%DIvDZX\^bMchmquhuDHHUO$dhhw&77vvI ws   A-A-,A-c                    t        t        | d      xs d      }|dk(  ry|j                  d      r|j                  d       dS dd	d
dddd}||v r||   S t	        |       }|j                  d      s|j                  d      rDt        |j                  d      xs d      }t        |j                  d      xs d      }d| d| S t        t        | d      xs d      }dt        j                  |d       S )Nstatus_reason zrun failed with exit code 15u*   Ausführung mit Exitcode 15 fehlgeschlagenzrun failed with exit code zrun failed with z fehlgeschlagenzGemeldeter Quellenstatusu%   Konfigurierte Quelle nicht verfügbaru?   Letzter bekannter Status; aktuelle Beobachtung nicht verfügbaru    Erwarteter Lauf ist überfälligu)   Quelle lieferte nicht genügend Nachweiseu4   Keine erwartete Aktivität seit mehr als 60 Sekunden)zreported source statusz.collector could not read the configured sourcez?last known job status retained; current observation unavailableexpected run is overduez7source was readable but did not provide enough evidencez-no expected activity for more than 60 secondssystemd_ActiveStatesystemd_SubStater   zSystemd-Zustand: /health_statusr   zAktueller Zustand: )r"   r   
startswithremoveprefixr$   r   HEALTH_LABELS)r   reasontranslationsevidenceactivesubhealths          r   _problem_reasonr6      s   _-34F//;56%%&89:/JJ"<:a LM#ECn9oL F##~H||)*hll;M.NX\\"78GKH(,,12AkB"6(!C511_-:;F !2!26;!G HIIr   events_by_instanceNc                     |j                  t        t        | d                  }|rt        |      }||S t        | d      dk(  rt        t        | d            S y )Ninstance_idr,   r   last_failure_at)r   intr   r
   )r   r7   
event_timeparseds       r   _problem_sincer>   7   s[    #''F3,F(GHJ:&Mc?#x/%6788r   c                 j    t        | d      t        v xs  t        | d      dk(  xs t        | d      dk(  S )Nr,   observation_statusunavailabler&   r(   )r   ACTIVE_HEALTH_STATUSES)r   s    r   _is_active_alertrC   B   sD    3(,BB Ic/0MAIc?+/HHJr   r5   job_rowsstatus_eventsnowcycle_interval_secondsc                 	   |j                  t              }t        |      }t        |      }i }|D ]  }t        |d      }	|	|D 
cg c]T  }
|
j	                  d      |	k(  r>|
j	                  d      t        |d      k(  r |
j	                  d      t        |d      k(  r|
V }}
|st|d   j	                  d      st        |d   d         |t        |	      <    |D cg c]  }t        |      s| }}t        | j	                  d	            }|dn%t        d
t        ||z
  j                                     }t        dt        |      dz        }|duxr |duxr ||k  }t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }g }|r|j                  | d|dk7  rdndz          |r|j                  | d|dk7  rdndz          |r|j                  | d|dk7  rdndz          |r|j                  | d|dk7  rdndz          |r|j                  | d|dk7  rdndz          |r|j                  | d|dk7  rdndz          t        | j	                  dd
      xs d
      r,t        | d         }|j                  | d|dk7  rdndz          | j	                  d       d!k(  s|s*d"}||j                  d
d#       nJ|j                  d
d$       n7|rd%}n2|s| j	                  d&      d'k(  rd(}n| j	                  d&      d)k(  rd)}nd*}g }|D ]  }t        ||      }|j                  t        |d+      t        |d,      t        |d      t        |d      t        |d-      t!        |      |dn%t        d
t        ||z
  j                                     t#        |      d.        |j%                  d/ 0       i d1|d2|d&| j	                  d&d*      d3t        | j	                  d3t'        |            xs d
      d)t        | j	                  d4d
      xs d
      d'|d5|d*|d6|d"|d7|d8t'        |      d9|r|d
   ndd	| j	                  d	      d:| j	                  d:      d;|d<||t!        |      d=S c c}
w c c}w )>zOBuild a compact external summary without changing watcher state or data models.r9   Nnew_health_statusr,   new_observation_statusr@   occurred_atlast_cycle_finished_atr   r      c              3   @   K   | ]  }t        |d       dk(  sd  yw)r,   r   r   Nr   .0r   s     r   	<genexpr>z&build_alert_summary.<locals>.<genexpr>e   s     OsfS/&Bh&NO   c              3   @   K   | ]  }t        |d       dk(  sd  yw)r,   r   r   NrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>f   s     SsO(D
(R1SrT   c              3   @   K   | ]  }t        |d       dk(  sd  yw)r,   r   r   NrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>g   s     McVC%AW%LMrT   c              3   @   K   | ]  }t        |d       dk(  sd  yw)r,   r   r   NrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>h   s     Qvc?'Cy'P!QrT   c              3   @   K   | ]  }t        |d       dk(  sd  yw)r@   rA   r   NrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>i   s      ^C6#7K+LP]+]a^rT   c              3   @   K   | ]  }t        |d       dk(  sd  yw)r&   r(   r   NrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>j   s     avc?'CG`'`!arT   c              3   \   K   | ]$  }t        |d       dk(  xs t        |d      dk(   & yw)r,   r   severitycriticalNrP   rQ   s     r   rS   z&build_alert_summary.<locals>.<genexpr>k   s9       Cor_5AjVCQ[E\`jEjj  Cs   *,z fehlgeschlagene Aufgabenr'   u    gestörte Aufgabez veraltete Beobachtungenz unbekannte Aufgabeu    nicht verfügbare Beobachtungu    überfällige Aufgabecollectors_failedz fehlgeschlagener Collectorsdatabase_statuserrorrA   u)   Noch keine abgeschlossene Worker-Prüfungu!   Worker-Überwachung nicht aktuellr\   watcher_statusr   warningr   r   job_keynamer[   )re   display_namer,   r@   r[   problem_sinceage_secondsr0   c                 <    | d   d u | d   xs dt        | d         fS )Nrh   r'   re   )r"   )r#   s    r   <lambda>z%build_alert_summary.<locals>.<lambda>   s/    D$9T$A4CXC^\^`cdhirds`t#u r   )r   overall_statusoverall_reasons
jobs_totaljobs_healthyr   r   overdueactive_alertsoldest_problemlast_successful_cycle_atdata_age_secondsdata_stale_after_seconds)data_is_currentgenerated_at)
astimezoner   r    r   r   r"   r;   rC   r
   maxtotal_secondssumanyappendinsertr>   r	   r6   sortlen)r5   rD   rE   rF   rG   rows
event_rowsr7   r   r9   eventmatchingactive_rowslast_cycle_finishedri   stale_after_secondsrv   r   r   r   r   rA   rp   critical_alertreasonscountrl   problemsrh   s                                r   build_alert_summaryr   H   s    ..
C>Dm$J)+ 	TS-0'1 beyy/;>		"56&o:VV		":;vcK_?``  b b ((736x|M7R3Ss;/0	T #'@3*:3*?3@K@#FJJ/G$HI-5$3q#sM`G`FoFoFqBr;sKa%;!<q!@A)5x+T:QxVaexVxOOdOOFSSSHMTMMEQtQQG^4^^KataaG  C  wB  C  CNG&!9:Vq[cVXYZ(#56Q#TVWX% 675A:4SUVW'"56A#SUVW+&DEQ\`aQagijk'"89GqLSVXYZ
6::)1-23F./0% ;<uPQzWYZ[zz#$/&&NN1IJNN1AB	#	

#34
B"	$	%	2""%'H &s,>?c9-"3/#C9"(.B"CsJ/ /#0#84c!S#P]J]IlIlInEo>p%c*	
 		 MMuMv.7 	&**%5yA 	c&**\3t9=BC	
 	3vzz.!49: 	H 	& 	7 	 	{ 	7 	[) 	(1+t 	!&**-E"F 	#FJJ/I$J  	K!" 	#$7#$ +C' Ib As   ASS-S)__doc__collections.abcr   r   r   r   typingr   timeutilr	   r
   	frozensetrB   r/   r"   r   r!   r$   r6   r;   r>   boolrC   r    r   r   <module>r      s_   6 - "  $"#MN S!   738$ c3h Jc* Js J2S) wsCx?P U]`dUd J'#s(+ J JhCHhwsCx()h GCH-.h 
	h
  h 
#s(^hr   