§
    ÷žyjj_  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ  ej        e¦  «        ZdZ eh d£¦  «        Z eh d£¦  «        Z ej        d	¦  «        Zd
dœdId„ZdJd„ZdKd„ZdLd„Z ed¬¦  «         G d„ d¦  «        ¦   «         ZdMd„ZdMd „ZdNd"„Zdd#d$œdOd'„ZdPd*„ZdQd,„Z dQd-„Z!dRd.„Z"dRd/„Z#dSd0„Z$dRd1„Z%dTd2„Z&d3„ Z'dUd4„Z(dUd5„Z)dTd6„Z*dVd8„Z+dWd:„Z,dXd<„Z- G d=„ d>¦  «        Z.dYd?„Z/dZdC„Z0d[dD„Z1d\dF„Z2d]dG„Z3ddHgZ4dS )^aC  Gateway Health & Diagnostics OTLP export runtime.

This exporter emits operator-owned gateway service-health metrics plus
narrow redacted diagnostic events. It is deliberately in-process and fail-open so
it works under systemd, launchd, s6, containers, tmux, nohup, or a simple shell
without a sidecar/watchdog dependency.
é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚOptionalzhermes.gateway.diagnostics>	   úcloud.regionúcloud.platformúcloud.providerúservice.versionúservice.namespaceúdeployment.environment.nameúservice.nameútelemetry.scopeúservice.instance.id>	   ÚnameÚversionÚplatformÚseverityÚ	new_stateÚ	old_stateÚ	subsystemÚ
error_codeÚerror_classz^[A-Za-z0-9._:/-]{1,128}$iô  ©ÚlimitÚrawr   r   ÚintÚreturnÚstrc               óz   — 	 ddl m}  |t          | pd¦  «        ¦  «        pdd |…         S # t          $ r Y dS w xY w)Nr   )Úredact_for_exportÚ z
[redacted]z[redaction-unavailable])Úagent.monitoring.redactionr!   r   Ú	Exception)r   r   r!   s      úL/home/ragecks/.hermes/hermes-agent/agent/monitoring/gateway_health_export.pyÚ_redact_stringr&   /   sf   € ð)Ø@Ð@Ð@Ð@Ð@Ð@Ø!Ð!¥# c i¨R¡.¤.Ñ1Ô1ÐA°\À6ÀEÀ6ÔJÐJøÝð )ð )ð )Ø(Ð(Ð(ð)øøøs   ‚), ¬
:¹:úDict[str, str]c                ób  — i }t          | t          ¦  «        s|S |                      ¦   «         D ]€\  }}t          |¦  «        }|t          vs|€Œ |dk    rddlm}  ||¦  «        ||<   Œ;t          |¦  «        }t                               |¦  «        sŒet          |d¬¦  «        |k    rŒ{|||<   Œ�|S )zIAllowlist bounded resource labels and reject values changed by redaction.Nr   r   ©Ú_safe_instance_idé€   r   )
Ú
isinstanceÚdictÚitemsr   Ú_RESOURCE_ATTRIBUTE_KEYSÚagent.monitoring.gateway_healthr*   Ú_SAFE_RESOURCE_VALUEÚ	fullmatchr&   )r   ÚattrsÚkeyÚvaluer*   Útexts         r%   Ú_safe_resource_attributesr7   7   sÛ   € à€EÝ�c�4Ñ Ô ð ØˆØ—i’i‘k”kð ð ‰
ˆˆUÝ�#‰hŒhˆØÕ.Ð.Ð.°%°-ØØÐ'Ò'Ð'ØIÐIÐIÐIÐIÐIØ*Ð*¨5Ñ1Ô1ˆE�#‰JØÝ�5‰zŒzˆÝ#×-Ò-¨dÑ3Ô3ð 	ØÝ˜$ cÐ*Ñ*Ô*¨dÒ2Ð2ØØˆˆc‰
ˆ
Ø€Ló    ÚconfigúDict[str, Any]Útelemetry_scopec               ó¾   — t          | ¦  «        }t          |                     d¦  «        ¦  «        }ddlm} d|d<    |t          | ¦  «        ¦  «        |d<   ||d<   |S )zCBuild the safe OTLP resource shared by metrics and diagnostic logs.Úresource_attributesr   r)   zhermes-gatewayr   r   r   )Ú_gateway_health_configr7   Úgetr0   r*   Ú_install_id)r9   r;   Úghr3   r*   s        r%   Ú_runtime_resource_attributesrB   M   su   € õ 
  Ñ	'Ô	'€BÝ% b§f¢fÐ-BÑ&CÔ&CÑDÔD€EØAÐAÐAÐAÐAÐAà,€Eˆ.ÑØ#4Ð#4µ[ÀÑ5HÔ5HÑ#IÔ#I€EÐ
Ñ Ø.€EÐ
ÑØ€Lr8   Úeventc                ó¦   — i }t           D ]F}|                      |¦  «        }|€Œt          |t          ¦  «        rt	          |¦  «        n||d|› �<   ŒG|S )Nzhermes.)Ú_DIAGNOSTIC_ATTRIBUTE_KEYSr?   r,   r   r&   )rC   r3   r4   r5   s       r%   Ú_diagnostic_log_attributesrF   [   sd   € Ø€EÝ)ð \ð \ˆØ—	’	˜#‘”ˆØˆ=ØÝ:DÀUÍCÑ:PÔ:PÐ![¥°Ñ!6Ô!6Ð!6ÐV[ˆˆo˜ˆoˆoÑÐØ€Lr8   T)Úslotsc                  ó„   — e Zd ZU ded<   dZded<   dZded<   dZded	<   dZded
<   dZded<   dZ	ded<   dZ
ded<   dd„ZdS )ÚGatewayHealthExportRuntimeÚboolÚenabledÚdisabledr   ÚreasonNr   ÚstreamerÚmetric_providerÚlog_handlerÚlog_streamerzOptional[threading.Thread]ÚthreadzOptional[threading.Event]Ú
stop_eventr   ÚNonec                ó  ‡— | j         �| j                              ¦   «          | j        �| j                             d¬¦  «         | j        �=	 t          j        ¦   «                              | j        ¦  «         n# t          $ r Y nw xY w	 ddl	m
}  |¦   «         }|                     d¬¦  «         | j        �|                     | j        ¦  «         | j        �|                     | j        ¦  «         n# t          $ r Y nw xY wd„ | j        | j        | j        fD ¦   «         Šdˆfd	„}‰rAt!          j        |d
d¬¦  «        }|                     ¦   «          |                     d¬¦  «         d | _        d | _        d | _        d | _        d | _         d S )Ng      Ð?)Útimeoutr   ©Úget_emitterg      ð?c                ó   — g | ]}|®|‘ŒS ©N© )Ú.0Úitems     r%   ú
<listcomp>z7GatewayHealthExportRuntime.shutdown.<locals>.<listcomp>‹   s(   € ð 
ð 
ð 
ØØÐð ØÐÐr8   r   rT   c                 ó\   •— ‰D ]'} 	 |                       ¦   «          Œ# t          $ r Y Œ$w xY wd S rZ   )Úshutdownr$   )r]   Ú
closeabless    €r%   Ú_closez3GatewayHealthExportRuntime.shutdown.<locals>._close�   sP   ø€ Ø"ð ð �ðØ—M’M‘O”O�O�OøÝ ð ð ð Ø�Dðøøøðð s   ‡œ
)¨)z%hermes-gateway-health-export-shutdownT©Útargetr   Údaemong       @©r   rT   )rS   ÚsetrR   ÚjoinrP   ÚloggingÚ	getLoggerÚremoveHandlerr$   Úagent.monitoring.emitterrX   ÚflushrN   ÚunsubscriberQ   rO   Ú	threadingÚThreadÚstart)ÚselfrX   Úemitterrb   Úworkerra   s        @r%   r`   z#GatewayHealthExportRuntime.shutdownp   sç  ø€ ØŒ?Ð&ØŒO×ÒÑ!Ô!Ð!ØŒ;Ð"ØŒK×Ò TÐÑ*Ô*Ð*ØÔÐ'ðÝÔ!Ñ#Ô#×1Ò1°$Ô2BÑCÔCÐCÐCøÝð ð ð Ø�ðøøøð		Ø<Ð<Ð<Ð<Ð<Ð<Ø!�k‘m”mˆGØ�MŠM #ˆMÑ&Ô&Ð&ØŒ}Ð(Ø×#Ò# D¤MÑ2Ô2Ð2ØÔ Ð,Ø×#Ò# DÔ$5Ñ6Ô6Ð6øøÝð 	ð 	ð 	ØˆDð	øøøð

ð 
Ø"œm¨TÔ->ÀÔ@TÐUð
ñ 
ô 
ˆ
ð
	ð 	ð 	ð 	ð 	ð 	ð ð 	%ÝÔ%ØØ<Øðñ ô ˆFð
 �LŠL‰NŒNˆNØ�KŠK ˆKÑ$Ô$Ð$àˆŒØ ˆÔØ#ˆÔØˆŒØˆŒˆˆs%   Á+A8 Á8
BÂBÂ	A(C2 Ã2
C?Ã>C?rf   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rM   rN   rO   rP   rQ   rR   rS   r`   r[   r8   r%   rI   rI   e   sª   € € € € € € à€M€M�MØ€FÐÐÐÑØ€HÐÐÐÑØ€OÐÐÐÑØ€KÐÐÐÑØ€LÐÐÐÑØ)-€FÐ-Ð-Ð-Ñ-Ø,0€JÐ0Ð0Ð0Ñ0ð4ð 4ð 4ð 4ð 4ð 4r8   rI   c                ób   — | pi                       d¦  «        pi }|                      d¦  «        pi S )NÚ
monitoringÚgateway_health_export©r?   )r9   Úmons     r%   r>   r>   §   s6   € Øˆ<�R×
Ò
˜\Ñ
*Ô
*Ð
0¨b€CØ�7Š7Ð*Ñ+Ô+Ð1¨rÐ1r8   c                ó�   — | pi                       d¦  «        pi }|                      d¦  «        pi }|                      d¦  «        pi S )Nrz   ÚexportÚotlpr|   )r9   r}   r   s      r%   Ú_otlp_configr�   ¬   sK   € Øˆ<�R×
Ò
˜\Ñ
*Ô
*Ð
0¨b€CØ�WŠW�XÑÔÐ$ "€FØ�:Š:�fÑÔÐ# Ð#r8   rJ   c                óÖ   — t          | ¦  «        }t          | ¦  «        }t          |                     d¦  «        o)|                     d¦  «        o|                     d¦  «        ¦  «        S )NrK   Úendpoint)r>   r�   rJ   r?   )r9   rA   r€   s      r%   Ú_enabledr„   ²   sX   € Ý	 Ñ	'Ô	'€BÝ˜ÑÔ€DÝ�—’�yÑ!Ô!ÐR d§h¢h¨yÑ&9Ô&9ÐR¸d¿hºhÀzÑ>RÔ>RÑSÔSÐSr8   F)Úauto_installÚpromptr…   r†   c                óH  — | r%	 ddl m}  |d|¬¦  «         n# t          $ r Y nw xY w	 ddlm} ddlm} ddlm} ddl	m
}m}m} dd	lm}	 dd
lm}
 ddlm} ddlm} ddlm} ddlm} ddlm} ||||	|||||
||||dœS # t          $ r}t7          d|› �¦  «        |‚d }~ww xY w)Nr   )Úensurezexport.otlp©r†   )ÚOTLPLogExporter)ÚOTLPMetricExporter)ÚObservation)ÚINVALID_SPAN_IDÚINVALID_TRACE_IDÚ
TraceFlags)Ú	LogRecord)ÚSeverityNumber)ÚLoggerProvider)ÚBatchLogRecordProcessor)ÚMeterProvider)ÚPeriodicExportingMetricReader)ÚResource)rŠ   r‹   rŒ   r�   r’   r�   rŽ   r�   r‘   r“   r”   r•   r–   zOTLP metrics SDK unavailable: )Útools.lazy_depsrˆ   r$   Ú4opentelemetry.exporter.otlp.proto.http._log_exporterrŠ   Ú6opentelemetry.exporter.otlp.proto.http.metric_exporterr‹   Úopentelemetry.metricsrŒ   Úopentelemetry.tracer�   rŽ   r�   Úopentelemetry._logsr�   Úopentelemetry._logs.severityr‘   Úopentelemetry.sdk._logsr’   Úopentelemetry.sdk._logs.exportr“   Úopentelemetry.sdk.metricsr”   Ú opentelemetry.sdk.metrics.exportr•   Úopentelemetry.sdk.resourcesr–   ÚRuntimeError)r…   r†   Ú_lazy_ensurerŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   Úexcs                    r%   Ú_require_metrics_sdkr¦   ¸   s¥  € Øð ð	Ø>Ð>Ð>Ð>Ð>Ð>ØˆL˜¨vÐ6Ñ6Ô6Ð6Ð6øÝð 	ð 	ð 	ØˆDð	øøøðLØXÐXÐXÐXÐXÐXØ]Ð]Ð]Ð]Ð]Ð]Ø5Ð5Ð5Ð5Ð5Ð5ØUÐUÐUÐUÐUÐUÐUÐUÐUÐUØ1Ð1Ð1Ð1Ð1Ð1Ø?Ð?Ð?Ð?Ð?Ð?Ø:Ð:Ð:Ð:Ð:Ð:ØJÐJÐJÐJÐJÐJØ;Ð;Ð;Ð;Ð;Ð;ØRÐRÐRÐRÐRÐRØ8Ð8Ð8Ð8Ð8Ð8à.Ø"4Ø&Ø"Ø,Ø.Ø 0Ø$Ø,Ø'>Ø*Ø-JØ ð
ð 
ð 	
øõ ð Lð Lð LÝÐA¸CÐAÐAÑBÔBÈÐKøøøøðLøøøs$   „ ˜
%¤%©AA? Á?
B!Â	BÂB!Úheaders_envúOptional[Dict[str, str]]c                óÂ   — i }| pi                       ¦   «         D ]E\  }}t          j                             t	          |¦  «        ¦  «        }|r||t	          |¦  «        <   ŒF|S rZ   )r.   ÚosÚenvironr?   r   )r§   ÚresolvedÚheader_nameÚenv_nameÚvals        r%   Ú_resolve_headersr°   Þ   se   € Ø!€HØ"-Ð"3°×!:Ò!:Ñ!<Ô!<ð -ð -Ñˆ�XÝŒj�nŠn�S ™]œ]Ñ+Ô+ˆØð 	-Ø),ˆH•S˜Ñ%Ô%Ñ&øØ€Or8   rƒ   c                óf   — |                       d¦  «        r| d t          d¦  «         …         dz   S | S )Nú
/v1/tracesú/v1/metrics©ÚendswithÚlen©rƒ   s    r%   Ú_metric_endpointr¸   ç   s>   € Ø×Ò˜Ñ&Ô&ð >ØÐ,�3˜|Ñ,Ô,Ð,Ð,Ô-°Ñ=Ð=Ø€Or8   c                óÆ   — |                       d¦  «        r| d t          d¦  «         …         dz   S |                       d¦  «        r| d t          d¦  «         …         dz   S | S )Nr²   z/v1/logsr³   r´   r·   s    r%   Ú_logs_endpointrº   í   su   € Ø×Ò˜Ñ&Ô&ð ;ØÐ,�3˜|Ñ,Ô,Ð,Ð,Ô-°
Ñ:Ð:Ø×Ò˜Ñ'Ô'ð <ØÐ-�3˜}Ñ-Ô-Ð-Ð-Ô.°Ñ;Ð;Ø€Or8   c                 óP   — 	 ddl m}  t          | ¦  «        S # t          $ r Y dS w xY w)Nr   ©Ú__version__Úunknown)Ú
hermes_clir½   r   r$   r¼   s    r%   Ú_versionrÀ   õ   sI   € ðØ*Ð*Ð*Ð*Ð*Ð*Ý�;ÑÔÐøÝð ð ð Øˆyˆyðøøøs   ‚ —
%¤%c                 ód   — 	 ddl m}  t           | ¦   «         pd¦  «        S # t          $ r Y dS w xY w)Nr   ©Úget_active_profile_nameÚdefault)Úhermes_cli.profilesrÃ   r   r$   rÂ   s    r%   Ú_profilerÆ   ý   sX   € ðØ?Ð?Ð?Ð?Ð?Ð?ÝÐ*Ð*Ñ,Ô,Ð9°	Ñ:Ô:Ð:øÝð ð ð Øˆyˆyðøøøs   ‚! ¡
/®/c                ób   — 	 ddl m} t           || ¦  «        ¦  «        S # t          $ r Y dS w xY w)Nr   )Úensure_install_idr¾   )Úagent.monitoring.policyrÈ   r   r$   )r9   rÈ   s     r%   r@   r@     sU   € ðØ=Ð=Ð=Ð=Ð=Ð=ÝÐ$Ð$ VÑ,Ô,Ñ-Ô-Ð-øÝð ð ð Øˆyˆyðøøøs   ‚   
.­.c                 óŠ  — t           j                             d¦  «        rdS t           j                             d¦  «        st           j                             d¦  «        rdS t           j                             d¦  «        st           j                             d¦  «        rdS t           j                             d¦  «        rd	S d
S )NÚINVOCATION_IDÚsystemdÚS6_CMD_ARG0Ú
S6_VERSIONÚs6Ú	containerz/.dockerenvÚLAUNCHD_SOCKETÚlaunchdÚmanual)rª   r«   r?   ÚpathÚexistsr[   r8   r%   Ú_supervision_moderÖ     sž   € Ý	„z‡~‚~�oÑ&Ô&ð ØˆyÝ	„z‡~‚~�mÑ$Ô$ð ­¬
¯ª°|Ñ(DÔ(Dð ØˆtÝ	„z‡~‚~�kÑ"Ô"ð ¥b¤g§n¢n°]Ñ&CÔ&Cð Øˆ{Ý	„z‡~‚~Ð&Ñ'Ô'ð ØˆyØˆ8r8   c           	     óÞ   — ddl m} 	 ddlm}  |¦   «         pi }n# t          $ r i }Y nw xY w ||dt          ¦   «         t          | ¦  «        t          ¦   «         t          ¦   «         ¬¦  «        S )Nr   )Úbuild_gateway_health_snapshot)Úread_runtime_statusT)Úgateway_runningÚprofileÚ
install_idr   Úsupervision_mode)	r0   rØ   Úgateway.statusrÙ   r$   rÆ   r@   rÀ   rÖ   )r9   rØ   rÙ   Úruntimes       r%   Ú_read_gateway_snapshotrà     s¦   € ØMÐMÐMÐMÐMÐMðØ6Ð6Ð6Ð6Ð6Ð6Ø%Ð%Ñ'Ô'Ð-¨2ˆˆøÝð ð ð Øˆˆˆðøøøà(Ð(ØØÝ‘
”
Ý˜vÑ&Ô&Ý‘
”
Ý*Ñ,Ô,ðñ ô ð s   ˆ ›*©*c                 ó"   — ddl m}   | ¦   «         S )Nr   ©Úbuild_cron_health_snapshot)Úagent.monitoring.cron_healthrã   râ   s    r%   Ú_read_cron_snapshotrå   *  s#   € ØGÐGÐGÐGÐGÐGà%Ð%Ñ'Ô'Ð'r8   c                 óŽ  — d} 	 ddl m} | t          dt           |¦   «         ¦  «        ¦  «        z  } n,# t          $ r t
                               dd¬¦  «         Y nw xY w	 ddlm} | t          dt          | 	                    ¦   «         ¦  «        ¦  «        z  } n,# t          $ r t
                               dd¬¦  «         Y nw xY w| S )aû  Count live background/subagent work that ``active_agents`` does NOT include.

    ``hermes.gateway.active_agents`` counts foreground turns + in-flight cron
    jobs + API runs, but deliberately excludes backgrounded ``delegate_task``
    subagents, ``terminal(background=true)`` processes, kanban workers, and the
    runner's own background tasks (they are tracked only for the scale-to-zero
    suspend guard, ``_scale_to_zero_has_live_background_work``). Without this
    metric a peer churning through delegated subagents shows ``active_agents=0``
    on the fleet dashboard. Best-effort and content-free: a single integer,
    no job/task identity. Returns 0 if a source can't be imported.

    Delegation is counted TASK-granular (``active_task_count``): a fan-out batch
    of N subagents contributes N, not 1, so the metric reflects real concurrent
    subagent load rather than dispatch-unit/pool-slot count. This intentionally
    differs from the async pool's capacity accounting (one batch = one slot).
    r   )Úactive_task_countz-background-work async-delegation count failedT©Úexc_info)Úprocess_registryz-background-work process-registry count failed)
Útools.async_delegationrç   Úmaxr   r$   ÚloggerÚdebugÚtools.process_registryrê   Úcount_running)Útotalrç   rê   s      r%   Ú_read_background_work_countrò   0  s	  € ð" €EðUØ<Ð<Ð<Ð<Ð<Ð<à•�Q�Ð-Ð-Ñ/Ô/Ñ0Ô0Ñ1Ô1Ñ1ˆˆøÝð Uð Uð UÝ�ŠÐDÈtˆÑTÔTÐTÐTÐTðUøøøðUØ;Ð;Ð;Ð;Ð;Ð;à•�Q�Ð,×:Ò:Ñ<Ô<Ñ=Ô=Ñ>Ô>Ñ>ˆˆøÝð Uð Uð UÝ�ŠÐDÈtˆÑTÔTÐTÐTÐTðUøøøà€Ls!   „.3 ³&AÁAÁ 8B Â&CÃCc                 ó´   — 	 ddl m}  t          dt           | ¦   «         ¦  «        ¦  «        S # t          $ r  t
                               dd¬¦  «         Y dS w xY w)u¨  Count live async delegation UNITS (dispatch/pool slots).

    Complements ``_read_background_work_count`` (which is task-granular): this
    counts each ``delegate_task`` dispatch as ONE regardless of fan-out width,
    matching the async pool's capacity accounting (a batch = one slot). Together
    the two metrics let an operator see both slot pressure
    (``background_delegations``, alert vs ``max_concurrent_children``) and real
    concurrent subagent load (``background_work``). Delegations only â€” it does
    not include ``terminal(background)`` / kanban work, which are already folded
    into ``background_work``. Best-effort; 0 if the source can't be imported.
    r   ©Úactive_countz#background-delegations count failedTrè   )rë   rõ   rì   r   r$   rí   rî   rô   s    r%   Ú"_read_background_delegations_countrö   Q  sp   € ðØ7Ð7Ð7Ð7Ð7Ð7å�1•c˜,˜,™.œ.Ñ)Ô)Ñ*Ô*Ð*øÝð ð ð Ý�ŠÐ:ÀTˆÑJÔJÐJØˆqˆqðøøøs   ‚*- ­&AÁAc                ó.  — t          | ¦  «        }	 ddlm} |j        rt	          |j        d         j        ¦  «        ni }|j                              |dt          ¦   «         |¬¦  «        ¦  «         |j                              |dt          ¦   «         |¬¦  «        ¦  «         n`# t          $ rS}t                               dt          |¦  «        j        ¦  «         t                               dd¬	¦  «         Y d }~nd }~ww xY w	 t          ¦   «         }nb# t          $ rU}t                               d
t          |¦  «        j        ¦  «         t                               dd¬	¦  «         |cY d }~S d }~ww xY w|j                             |j        ¦  «         |S )Nr   )ÚGatewayMetricúhermes.gateway.background_work©r   r5   Ú
attributesú%hermes.gateway.background_delegationszIbackground-work snapshot unavailable; metric not exported (error_type=%s)z"background-work snapshot tracebackTrè   zMcron health snapshot unavailable; cron telemetry not exported (error_type=%s)zcron health snapshot traceback)rà   r0   rø   Úmetricsr-   rû   Úappendrò   rö   r$   rí   ÚwarningÚtyperu   rî   rå   Úextend)r9   Úgateway_snapshotrø   Úbaser¥   Úcron_snapshots         r%   Ú_read_runtime_snapshotr  f  sì  € Ý-¨fÑ5Ô5ÐðJØAÐAÐAÐAÐAÐAà?OÔ?WÐ_�tÐ$Ô,¨QÔ/Ô:Ñ;Ô;Ð;Ð]_ˆØÔ ×'Ò'ØˆMØ5Ý1Ñ3Ô3Øðñ ô ñ	
ô 	
ð 	
ð 	Ô ×'Ò'ØˆMØ<Ý8Ñ:Ô:Øðñ ô ñ	
ô 	
ð 	
ð 	
øõ ð Jð Jð JÝ�ŠØWÝ�‰IŒIÔñ	
ô 	
ð 	
õ 	�ŠÐ9ÀDˆÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøð Ý+Ñ-Ô-ˆˆøÝð 
 ð 
 ð 
 õ
 	�ŠØ[Ý�‰IŒIÔñ	
ô 	
ð 	
õ 	�ŠÐ5ÀˆÑEÔEÐEØÐÐÐÐÐÐøøøøð
 øøøð Ô×#Ò# MÔ$9Ñ:Ô:Ð:ØÐs8   ‘BB$ Â$
DÂ.A	C<Ã<DÄD Ä
E3ÄA
E.Å(E3Å.E3rT   c                ó  — t          | ¦  «        }|                     dd¦  «        sd S 	 ddlm} t	          | ¦  «        }|j        D ]}|                     |¦  «         Œd S # t          $ r  t           	                    dd¬¦  «         Y d S w xY w)NÚdiagnostic_events_enabledTr   )rs   z#gateway health snapshot emit failedrè   )
r>   r?   Úagent.monitoringrs   r  ÚeventsÚemitr$   rí   rî   )r9   rA   rs   ÚsnapshotrC   s        r%   Ú_emit_snapshot_eventsr  ”  s¿   € Ý	 Ñ	'Ô	'€BØ�6Š6Ð-¨tÑ4Ô4ð ØˆðKØ,Ð,Ð,Ð,Ð,Ð,Ý)¨&Ñ1Ô1ˆØ”_ð 	 ð 	 ˆEØ�LŠL˜ÑÔÐÐð	 ð 	 øåð Kð Kð KÝ�ŠÐ:ÀTˆÑJÔJÐJÐJÐJÐJðKøøøs   ©4A Á&B	ÂB	Úsdkc           	     óè  ‡ ‡— t          ‰ ¦  «        }|                     dd¦  «        sd S t          ‰ ¦  «        }t          t	          |                     d¦  «        ¦  «        ¦  «        }t          |                     d¦  «        ¦  «        } |d         ||pd ¬¦  «        }t          dt          |                     dd	¦  «        ¦  «        ¦  «        d
z  } |d         ||¬¦  «        }t          ‰ d¬¦  «        }	 |d         |g|d          	                    |	¦  «        ¬¦  «        }
|
 
                    d¦  «        }|d         Šg d¢}dˆˆ fd„}|D ]#}|                     | ||¦  «        g¬¦  «         Œ$|
S )NÚmetrics_enabledTrƒ   r§   r‹   ©rƒ   Úheadersé   Úexport_interval_secondsé<   iè  r•   )Úexport_interval_millisÚgateway_health©r;   r”   r–   )Úmetric_readersÚresourcezhermes.gateway.healthrŒ   )zhermes.gateway.upzhermes.gateway.statezhermes.gateway.active_agentszhermes.gateway.busyzhermes.gateway.drainablez hermes.gateway.restart_requestedrù   rü   zhermes.platform.upzhermes.platform.degradedz+hermes.cron.scheduler.heartbeat_age_secondsz.hermes.cron.scheduler.last_success_age_secondsz*hermes.cron.scheduler.catch_up_occurrenceszhermes.cron.jobs.enabledzhermes.cron.jobs.runningzhermes.cron.jobs.overduer   r   c                ó   •‡ — dˆˆˆ fd„	}|S )Nc                ó¨   •— 	 t          ‰¦  «        }ˆˆfd„|j        D ¦   «         S # t          $ r! t                               dd¬¦  «         g cY S w xY w)Nc                óR   •— g | ]#}|j         ‰k    ¯ ‰|j        |j        ¦  «        ‘Œ$S r[   rú   )r\   ÚmrŒ   r   s     €€r%   r^   zI_start_metric_provider.<locals>.callback.<locals>._cb.<locals>.<listcomp>Ì  s8   ø€ ÐgÐgÐg¸qÐXYÔX^ÐbfÒXfÐXf˜˜ A¤G¨Q¬\Ñ:Ô:ÐXfÐXfÐXfr8   zgateway metric callback failedTrè   )r  rý   r$   rí   rî   )Ú_optionsr  rŒ   r9   r   s     €€€r%   Ú_cbz5_start_metric_provider.<locals>.callback.<locals>._cbÉ  sp   ø€ ðÝ1°&Ñ9Ô9�ØgÐgÐgÐgÐgÀHÔDTÐgÑgÔgÐgøÝð ð ð Ý—’Ð=È�ÑMÔMÐMØ�	�	�	ðøøøs   ƒ"& ¦(AÁArZ   r[   )r   r  rŒ   r9   s   ` €€r%   Úcallbackz(_start_metric_provider.<locals>.callbackÈ  s3   øø€ ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ
r8   )Ú	callbacks)r   r   )r>   r?   r�   r¸   r   r°   rì   r   rB   ÚcreateÚ	get_meterÚcreate_observable_gauge)r9   r  rA   r€   rƒ   r  ÚexporterÚinterval_msÚreaderÚresource_attrsÚproviderÚmeterÚmetric_namesr   Úmetric_namerŒ   s   `              @r%   Ú_start_metric_providerr-  ¡  s¾  øø€ Ý	 Ñ	'Ô	'€BØ�6Š6Ð# TÑ*Ô*ð ØˆtÝ˜ÑÔ€DÝ¥ D§H¢H¨ZÑ$8Ô$8Ñ 9Ô 9Ñ:Ô:€HÝ˜tŸxšx¨Ñ6Ô6Ñ7Ô7€GØ(ˆsÐ'Ô(°(ÀGÀOÈtÐTÑTÔT€HÝ�a�˜RŸVšVÐ$=¸rÑBÔBÑCÔCÑDÔDÀtÑK€KØ1ˆSÐ0Ô1°(ÐS^Ð_Ñ_Ô_€FÝ1ØÐ 0ðñ ô €Nð $ˆs�?Ô#Ø�xØ�Z”×'Ò'¨Ñ7Ô7ðñ ô €Hð ×ÒÐ6Ñ7Ô7€EØ�mÔ$€Kðð ð €Lð&ð ð ð ð ð ð ð $ð Vð VˆØ×%Ò% k¸h¸hÀ{Ñ>SÔ>SÐ=TÐ%ÑUÔUÐUÐUØ€Or8   r   c                óÆ   — | d         }t          |pd¦  «                             ¦   «         }|dv r|j        S |dk    r|j        S |dv r|j        S |dk    r|j        S |j        S )Nr‘   rÿ   >   ÚfatalÚcriticalÚerror>   ÚinfoÚinformationrî   )r   ÚlowerÚFATALÚERRORÚINFOÚDEBUGÚWARN)r  r   r‘   Úsevs       r%   Ú_severity_numberr;  ×  s‚   € ØÐ)Ô*€NÝ
ˆhÐ#˜)Ñ
$Ô
$×
*Ò
*Ñ
,Ô
,€CØ
Ð#Ð#Ð#ØÔ#Ð#Ø
ˆg‚~€~ØÔ#Ð#Ø
Ð%Ð%Ð%ØÔ"Ð"Ø
ˆg‚~€~ØÔ#Ð#ØÔÐr8   c                  ó*   — e Zd ZdZdd„Zdd
„Zdd„ZdS )ÚGatewayDiagnosticLogStreamerzEEmitter subscriber that sends gateway diagnostic events as OTLP logs.r9   r:   r  c                óV  — t          |¦  «        }t          |                     d¦  «        ¦  «        }t          t	          |                     d¦  «        ¦  «        ¦  «        }t          |d¬¦  «        } |d         |d                              |¦  «        ¬¦  «        | _         |d          |d	         ||pd ¬
¦  «        ¦  «        | _        | j         	                    | j        ¦  «         | j         
                    t          ¦  «        | _        |d         | _        || _        d| _        d S )Nr§   rƒ   Úgateway_diagnosticsr  r’   r–   )r  r“   rŠ   r  r�   r   )r�   r°   r?   rº   r   rB   r"  Ú	_providerÚ
_processorÚadd_log_record_processorÚ
get_loggerÚ_DEFAULT_DIAGNOSTIC_SCOPEÚ_loggerÚ
_LogRecordÚ_sdkÚexported)rr   r9   r  r€   r  rƒ   r(  s          r%   Ú__init__z%GatewayDiagnosticLogStreamer.__init__è  s  € Ý˜FÑ#Ô#ˆÝ" 4§8¢8¨MÑ#:Ô#:Ñ;Ô;ˆÝ!¥# d§h¢h¨zÑ&:Ô&:Ñ";Ô";Ñ<Ô<ˆÝ5ØÐ$9ð
ñ 
ô 
ˆð /˜Ð-Ô.¸¸J¼×8NÒ8NÈ~Ñ8^Ô8^Ð_Ñ_Ô_ˆŒØ8˜#Ð7Ô8Ø"ˆCÐ!Ô"¨H¸g¸oÈÐNÑNÔNñ
ô 
ˆŒð 	Œ×/Ò/°´Ñ@Ô@Ð@Ø”~×0Ò0Õ1JÑKÔKˆŒØ˜kÔ*ˆŒØˆŒ	ØˆŒˆˆr8   Úbatchúlist[Dict[str, Any]]r   rT   c                ó¼  — ddl m} |D �]Q}|                     d¦  «        dk    rŒt          |¦  «        } ||                     d¦  «        ¦  «        }|�| j                             |¦  «        n| j        }d}|                      |                     d¦  «        | j        d         | j        d	         | j        d
         j	        t          |                     d¦  «        pd¦  «                             ¦   «         t          | j        |                     d¦  «        ¦  «        t          |¦  «        |¬¦  «        }|                     |¦  «         | xj        dz  c_        �ŒSd S )Nr   )Úsource_logger_for_exportrC   Úgateway_diagnosticÚsource_loggerzgateway diagnosticÚts_nsrŽ   r�   r�   r   rÿ   )Ú	timestampÚtrace_idÚspan_idÚtrace_flagsÚseverity_textÚseverity_numberÚbodyrû   é   )r0   rM  r?   rF   r@  rC  rE  rF  rG  ÚDEFAULTr   Úupperr;  r&   r
  rH  )	rr   rJ  rM  Úevr3   rO  Úotel_loggerrW  Úrecords	            r%   Ú__call__z%GatewayDiagnosticLogStreamer.__call__ù  sc  € ØLÐLÐLÐLÐLÐLàð 	ñ 	ˆBØ�vŠv�g‰ŒÐ"6Ò6Ð6ØÝ.¨rÑ2Ô2ˆEð 5Ð4°R·V²V¸OÑ5LÔ5LÑMÔMˆMð !Ð,ð ”×)Ò)¨-Ñ8Ô8Ð8à”\ð ð
 (ˆDØ—_’_ØŸ&š& ™/œ/ØœÐ#5Ô6Øœ	Ð"3Ô4Ø œI lÔ3Ô;Ý! "§&¢&¨Ñ"4Ô"4Ð"A¸	ÑBÔB×HÒHÑJÔJÝ 0°´¸B¿FºFÀ:Ñ<NÔ<NÑ OÔ OÝ# DÑ)Ô)Ø ð %ñ 	ô 	ˆFð ×Ò˜VÑ$Ô$Ð$ØˆMŒM˜QÑˆMŒM‰Mð;	ð 	r8   c                óø   — 	 ddl m}  |¦   «                              | ¦  «         n# t          $ r Y nw xY w	 | j                             ¦   «          | j                             ¦   «          d S # t          $ r Y d S w xY w©Nr   rW   )rl   rX   rn   r$   rA  Úforce_flushr@  r`   )rr   rX   s     r%   r`   z%GatewayDiagnosticLogStreamer.shutdown  s«   € ð	Ø<Ð<Ð<Ð<Ð<Ð<ØˆK‰MŒM×%Ò% dÑ+Ô+Ð+Ð+øÝð 	ð 	ð 	ØˆDð	øøøð	ØŒO×'Ò'Ñ)Ô)Ð)ØŒN×#Ò#Ñ%Ô%Ð%Ð%Ð%øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚#& ¦
3²3·2A+ Á+
A9Á8A9N)r9   r:   r  r:   )rJ  rK  r   rT   rf   )ru   rv   rw   Ú__doc__rI  r^  r`   r[   r8   r%   r=  r=  å  sW   € € € € € ØOÐOðð ð ð ð" ð  ð  ð  ðD
ð 
ð 
ð 
ð 
ð 
r8   r=  c                ól   — ddl m} t          | |¦  «        } |¦   «                              |¦  «         |S r`  )rl   rX   r=  Ú	subscribe)r9   r  rX   rN   s       r%   Ú_start_diagnostic_log_streamerre  (  sB   € Ø4Ð4Ð4Ð4Ð4Ð4Ý+¨F°CÑ8Ô8€HØ€K�M„M×Ò˜HÑ%Ô%Ð%Ø€Or8   rS   úthreading.Eventúthreading.Threadc           	     óî   ‡ ‡‡— t          dt          t          ‰ ¦  «                             dd¦  «        ¦  «        ¦  «        Šd	ˆ ˆˆfd„}t	          j        |dd¬¦  «        }|                     ¦   «          |S )
Nr  Úlogs_export_interval_secondsr   rT   c                 ó~   •— ‰                      ‰¦  «        s&t          ‰ ¦  «         ‰                      ‰¦  «        ¯$d S d S rZ   )Úwaitr  )r9   ÚintervalrS   s   €€€r%   Ú_runz$_start_snapshot_thread.<locals>._run2  sO   ø€ Ø—/’/ (Ñ+Ô+ð 	*Ý! &Ñ)Ô)Ð)ð —/’/ (Ñ+Ô+ð 	*ð 	*ð 	*ð 	*ð 	*r8   zhermes-gateway-health-exportTrc   rf   )rì   r   r>   r?   ro   rp   rq   )r9   rS   rm  rR   rl  s   ``  @r%   Ú_start_snapshot_threadrn  /  sŒ   øøø€ Ý�1•cÕ0°Ñ8Ô8×<Ò<Ð=[Ð]^Ñ_Ô_Ñ`Ô`ÑaÔa€Hð*ð *ð *ð *ð *ð *ð *ð *õ Ô TÐ0NÐW[Ð\Ñ\Ô\€FØ
‡L‚L�N„N€NØ€Mr8   c                ó8  — t          | ¦  «        }|                     dd¦  «        r|                     dd¦  «        sd S ddlm}  |t	          ¦   «         t          ¦   «         ¬¦  «        }t          j        ¦   «         }||j        vr| 	                    |¦  «         |S )Nr  TÚwarning_error_events_enabledr   )ÚGatewayDiagnosticLogHandler)rÛ   r   )
r>   r?   r0   rq  rÆ   rÀ   ri   rj   ÚhandlersÚ
addHandler)r9   rA   rq  ÚhandlerÚroots        r%   Ú_attach_log_handlerrv  ;  s£   € Ý	 Ñ	'Ô	'€BØ�6Š6Ð-¨tÑ4Ô4ð ¸B¿FºFÐCaÐcgÑ<hÔ<hð ØˆtØKÐKÐKÐKÐKÐKØ)Ð)µ(±*´*ÅhÁjÄjÐQÑQÔQ€GÝÔÑÔ€DØ�d”mÐ#Ð#Ø�Š˜Ñ Ô Ð Ø€Nr8   r[  c                ó0   — |                       d¦  «        dv S )NrC   >   Úcron_executionr  r|   )r[  s    r%   Ú_gateway_health_eventry  G  s   € Ø�6Š6�'‰?Œ?ÐBÐBÐBr8   c                óˆ  — t          | ¦  «        st          dd¬¦  «        S t          | ¦  «        }t          dd¬¦  «        }d}|                     dd¦  «        s|                     dd¦  «        rO	 t	          d¬	¦  «        }n=# t
          $ r0 t                               d
d¬¦  «         t          dd¬¦  «        cY S w xY w|                     dd¦  «        rj|�h	 t          | |¦  «        |_	        nQ# t
          $ rD t                               dd¬¦  «         | 
                    ¦   «          t          dd¬¦  «        cY S w xY w|                     dd¦  «        r§|�¥	 ddlm} |                     | t          ¬¦  «        |_        |j        €t!          d¦  «        ‚t#          | |¦  «        |_        nQ# t
          $ rD t                               dd¬¦  «         | 
                    ¦   «          t          dd¬¦  «        cY S w xY w	 t)          | ¦  «        |_        n,# t
          $ r t                               dd¬¦  «         Y nw xY w|                     dd¦  «        ro	 t-          | ¦  «         t/          j        ¦   «         |_        t5          | |j        ¦  «        |_        n,# t
          $ r t                               dd¬¦  «         Y nw xY w|S )z;Start P0 gateway health export if configured. Never raises.FrL   )rK   rM   TrK   Nr  r  r‰   zbmonitoring.gateway_health_export.enabled but OTLP SDK is unavailable; install 'hermes-agent[otlp]'rè   Úotlp_unavailablez+gateway health OTLP metrics failed to startÚmetrics_start_failedr   )Úotlp_exporter)Úevent_filterz*gateway health span streamer did not startz.gateway diagnostic OTLP export failed to startÚdiagnostics_start_failedz/gateway diagnostic log handler failed to attachz.gateway health snapshot thread failed to start)r„   rI   r>   r?   r¦   r$   rí   rÿ   r-  rO   r`   r  r}  Ústart_streamingry  rN   r£   re  rQ   rî   rv  rP   r  ro   ÚEventrS   rn  rR   )r9   rA   rß   r  r}  s        r%   Ústart_gateway_health_exportr‚  K  sW  € å�FÑÔð LÝ)°%À
ÐKÑKÔKÐKÝ	 Ñ	'Ô	'€BÝ(°¸iÐHÑHÔH€GØ$(€Cà	‡v‚vÐ Ñ&Ô&ð 	X¨"¯&ª&Ð1LÈdÑ*SÔ*Sð 	Xð	XÝ&¨eÐ4Ñ4Ô4ˆCˆCøÝð 	Xð 	Xð 	XÝ�NŠNð/àð ñ ô ð õ
 .°eÐDVÐWÑWÔWÐWÐWÐWð	Xøøøð 
‡v‚vÐ Ñ&Ô&ð \¨3¨?ð	\Ý&<¸VÀSÑ&IÔ&IˆGÔ#Ð#øÝð 	\ð 	\ð 	\Ý�NŠNÐHÐSWˆNÑXÔXÐXØ×ÒÑÔÐÝ-°eÐDZÐ[Ñ[Ô[Ð[Ð[Ð[ð	\øøøð
 
‡v‚vÐ)¨4Ñ0Ô0ð 
`°S°_ð		`Ø6Ð6Ð6Ð6Ð6Ð6Ø,×<Ò<¸VÕRgÐ<ÑhÔhˆGÔØÔÐ'Ý"Ð#OÑPÔPÐPÝ#AÀ&È#Ñ#NÔ#NˆGÔ Ð øÝð 	`ð 	`ð 	`Ý�LŠLÐIÐTXˆLÑYÔYÐYØ×ÒÑÔÐÝ-°eÐD^Ð_Ñ_Ô_Ð_Ð_Ð_ð	`øøøð
WÝ1°&Ñ9Ô9ˆÔÐøÝð Wð Wð WÝ�ŠÐFÐQUˆÑVÔVÐVÐVÐVðWøøøà	‡v‚vÐ)¨4Ñ0Ô0ð Zð	ZÝ! &Ñ)Ô)Ð)Ý!*¤Ñ!2Ô!2ˆGÔÝ3°F¸GÔ<NÑOÔOˆGŒNˆNøÝð 	Zð 	Zð 	ZÝ�LŠLÐIÐTXˆLÑYÔYÐYÐYÐYð	Zøøøà€Ns^   Á0B Â7B;Â:B;ÃC- Ã-AD;Ä:D;ÅAF* Æ*AG8Ç7G8Ç<H È&H:È9H:ÉAJ Ê&J?Ê>J?r‚  )r   r   r   r   r   r   )r   r   r   r'   )r9   r:   r;   r   r   r'   )rC   r:   r   r:   )r9   r:   r   r:   )r9   r:   r   rJ   )r…   rJ   r†   rJ   r   r:   )r§   r¨   r   r'   )rƒ   r   r   r   )r   r   )r9   r:   r   r   )r9   r:   )r   r   )r9   r:   r   rT   )r9   r:   r  r:   r   r   )r  r:   r   r   r   r   )r9   r:   r  r:   r   r=  )r9   r:   rS   rf  r   rg  )r9   r:   r   r   )r[  r:   r   rJ   )r9   r:   r   rI   )5rb  Ú
__future__r   ri   rª   Úrero   Údataclassesr   Útypingr   r   r   rj   ru   rí   rD  Ú	frozensetr/   rE   Úcompiler1   r&   r7   rB   rF   rI   r>   r�   r„   r¦   r°   r¸   rº   rÀ   rÆ   r@   rÖ   rà   rå   rò   rö   r  r  r-  r;  r=  re  rn  rv  ry  r‚  Ú__all__r[   r8   r%   ú<module>rŠ     sÔ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à	ˆÔ	˜8Ñ	$Ô	$€à8Ð à$˜9ð 
&ð 
&ð 
&ñ 
ô 
Ð ð '˜Yð 
(ð 
(ð 
(ñ 
ô 
Ð ð "�r”zÐ">Ñ?Ô?Ð ð .1ð )ð )ð )ð )ð )ð )ðð ð ð ð,ð ð ð ðð ð ð ð €�ÐÑÔð>ð >ð >ð >ð >ñ >ô >ñ Ôð>ðB2ð 2ð 2ð 2ð
$ð $ð $ð $ðTð Tð Tð Tð 26Àeð #Lð #Lð #Lð #Lð #Lð #LðLð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð	ð 	ð 	ð 	ðð ð ð ð"(ð (ð (ðð ð ð ðBð ð ð ð*+ð +ð +ð +ð\
Kð 
Kð 
Kð 
Kð3ð 3ð 3ð 3ðlð ð ð ð@ð @ð @ð @ð @ñ @ô @ð @ðFð ð ð ð	ð 	ð 	ð 	ð	ð 	ð 	ð 	ðCð Cð Cð Cð2ð 2ð 2ð 2ðl !Ø!ð€€€r8   