+
    iHàj§/  ã                  óò  a€ 0 t $ R t^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt ]P.                  ! ]4      t ! R R	]4      tR
RJRRKRRLRRMRRNRRORRPRRQRRRRRSRRTRRURRVRRW/tR]R&   ]P=                  4        U UUu/ uF  w  rV F  q"V bK  	  K  	  uppp tR]R&   RXt ] 3RR/R R lllt!R  R! lt"R" R# lt#R$ R% lt$RYt%R& R' lt&]'! 0 RZm4      t(]	PR                  ! R(4      t*R) R* lt+R+ R, lt,R- R. lt-R/ R0 lt.R1 R2 lt/R3 R4 lt0R5R[R6R\R7R]/t1R]R8&   R9 R: lt2R; R< lt3R= R> lt4 ! R? R@4      t5 ! RA RB]54      t6RC RD lt7RE RF lt8RGR/RH RI llt9. R^Ot:R# u uppp i )_a  Export monitoring events to an OpenTelemetry Collector over OTLP/HTTP.

Maps gateway monitoring events to OTel spans for the operator-configured ``monitoring.export.otlp``
endpoint (no default destination ships) and hosts the OTLP plumbing shared with
``gateway_health_export``.  The OTel SDK is an optional extra (``hermes-agent[otlp]``) imported
lazily; ``headers_env`` values are read at export time and never logged or stored.  The streaming
subscriber runs fail-isolated on the emitter thread; ``event_filter`` keeps other planes off it.
)Úannotations)Úinstall_hintN)Úsuppress)ÚAnyÚCallableÚDictÚIterableÚListÚOptional)Ú_safe_instance_id)Úredact_boundedc                  ó   € ] tR t^tRtRtR# )ÚOTLPUnavailablez;Raised when the optional OpenTelemetry SDK isn't installed.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚC/home/ubuntu/.hermes/hermes-agent/agent/monitoring/otlp_exporter.pyr   r      s   † ÝEr   r   zopentelemetry.sdk.tracezopentelemetry.sdk.trace.exportzopentelemetry.sdk.resourcesz5opentelemetry.exporter.otlp.proto.http.trace_exporterz4opentelemetry.exporter.otlp.proto.http._log_exporterz6opentelemetry.exporter.otlp.proto.http.metric_exporterzopentelemetry.tracezopentelemetry.metricszopentelemetry._logszopentelemetry._logs.severityzopentelemetry.sdk._logszopentelemetry.sdk._logs.exportzopentelemetry.sdk.metricsz opentelemetry.sdk.metrics.exportzdict[str, tuple[str, ...]]Ú_SDK_MODULESúdict[str, str]Ú_SDK_SYMBOLSÚauto_installTc               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚnamesúIterable[str]r   ÚboolÚreturnúdict[str, Any]r   )Úformats   "r   Ú__annotate__r$   3   s"   € ÷ 
ñ 
˜ð 
ÀDð 
ÐTbñ 
r   c          
     ó0  € V'       d    ^ RI Hp V! R4        V  Uu/ uF.  q3\        \        P
                  ! \        V,          4      V4      bK0  	  up#   \         d     LIi ; iu upi   \         d!   p\        R\        R4       RT R24      hRp?ii ; i)u{  Import the named OTel SDK symbols, lazily installing the extra on first use.

Routes through pm.ensure_import('otlp') so a missing SDK triggers the
standard venv install flow â€” same as every other optional backend â€” gated by
security.allow_lazy_installs.  Any lazy-install failure falls through to the
import attempt, which raises OTLPUnavailable with a manual install hint.
)Úensure_importÚotlpz@OTLP export requires the optional dependency. Install with:
    z
(import error: Ú)N)	Úpmr&   Ú	ExceptionÚgetattrÚ	importlibÚimport_moduler   r   r   )r   r   Ú_lazy_ensureÚnameÚes   &$   r   Ú_require_sdkr1   3   s¥   € ÷ ð	Ý8Ù˜Ô ð
Ù]bÓcÑ]bÐUY”gœi×5Ò5´lÀ4Õ6HÓIÈ4ÓPÒPÑ]bÑcÐcøô ô 	Ùð	üò døÜô 
ÜðÜ Ó'Ð(ð )Ø˜S ð#ó
ð 	
ûð
ús9   ŠA ™A* �4A%ÁA* ÁA"Á!A"Á%A* Á*BÁ5BÂBc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úconfigr"   ÚpathÚstrr!   r   )r#   s   "r   r$   r$   L   s!   € ÷ ñ  ð °sð ¸~ñ r   c                ó˜   € T ;'       g    / P                  R 4      ;'       g    / pV F  pVP                  V4      ;'       g    / pK   	  V# )Ú
monitoring)Úget)r3   r4   ÚnodeÚkeys   &*  r   Ú_monitoring_sectionr;   L   sD   € Ø—�˜2×"Ñ" <Ó0×6Ð6°B€DÛˆØ�x‰x˜‹}×"Ð" Šñ à€Kr   c               ó    € V ^8„  d   QhRRRR/# )r   r3   r"   r!   r   )r#   s   "r   r$   r$   S   s   € ÷ 9ñ 9˜ð 9¨Nñ 9r   c                ó   € \        V R R4      # )Úexportr'   )r;   ©r3   s   &r   Ú_otlp_configr@   S   s   € Ü˜v x°Ó8Ð8r   c               ó    € V ^8„  d   QhRRRR/# )r   Úheaders_envzOptional[dict[str, str]]r!   r   r   )r#   s   "r   r$   r$   W   s   € ÷ 	ñ 	Ð":ð 	¸~ñ 	r   c                óú   € / pT ;'       g    / P                  4        FZ  w  r#\        P                  P                  \	        V4      4      pV'       d   WA\	        V4      &   KD  \
        P                  RW#4       K\  	  V# )zRResolve {header_name: ENV_VAR_NAME} -> {header_name: value}; missing vars skipped.z,OTLP header %s: env var %s not set; skipping)ÚitemsÚosÚenvironr8   r5   ÚloggerÚdebug)rB   ÚresolvedÚheader_nameÚenv_nameÚvals   &    r   Ú_resolve_headersrM   W   sa   € à!€HØ"-×"3Ð"3°×!:Ñ!:Ö!<ÑˆÜ�j‰j�n‰nœS ›]Ó+ˆßØ),”S˜Ó%Ó&ä�L‰LÐGÈÖ_ñ "=ð €Or   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úendpointr5   Úsignalr!   r   )r#   s   "r   r$   r$   f   s!   € ÷ ñ ˜sð ¨Cð °Cñ r   c                ó˜   € RV 2p\          F:  pW28w  g   K  V P                  V4      '       g   K$  V R\        V4      )  V,           u # 	  V # )zQRewrite a traces/metrics OTLP path to ``/v1/<signal>``; other paths pass through.z/v1/N)Ú_SIGNAL_SUFFIXESÚendswithÚlen)rO   rP   ÚtargetÚsuffixs   &&  r   Ú_signal_endpointrW   f   sL   € à�F�8ˆ_€Fß"ˆØÖ × 1Ñ 1°&× 9Ô 9Ø˜Nœs 6›{˜lÐ+¨fÕ4Ò4ñ #ð €Or   z^[A-Za-z0-9._:/-]{1,128}$c               ó    € V ^8„  d   QhRRRR/# )r   r3   r"   r!   r5   r   )r#   s   "r   r$   r$   v   s   € ÷ ñ ˜ð ¨3ñ r   c                óV   €  ^ RI Hp \        V! V 4      4      #   \         d     R# i ; i)é    )Úensure_install_idÚunknown)Úagent.monitoring.policyr[   r5   r*   )r3   r[   s   & r   Ú_install_idr^   v   s-   € ðÝ=ÜÑ$ VÓ,Ó-Ð-øÜô Úðús   ‚ ™(§(c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r!   r   r   )r#   s   "r   r$   r$   ~   s   € ÷ ñ  3ð ¨>ñ r   c                óP  € / p\        V \        4      '       d   V P                  4       MR Fw  w  r#\        V4      pV\        9  g   Vf   K!  \        V4      pVR8X  d   \        V4      W&   KB  \        P                  V4      '       g   K_  \        V^€R7      V8X  g   Ks  WAV&   Ky  	  V# )zIAllowlist bounded resource labels and reject values changed by redaction.úservice.instance.id)Úlimitr   )	Ú
isinstanceÚdictrD   r5   Ú_RESOURCE_ATTRIBUTE_KEYSr   Ú_SAFE_RESOURCE_VALUEÚ	fullmatchr   )r`   Úattrsr:   ÚvalueÚtexts   &    r   Ú_safe_resource_attributesrl   ~   s‘   € à€EÜ&0°´d×&;Ò&;�s—y‘y”{ÀÒC‰
ˆÜ�#‹hˆØÔ.Ô.°%²-ÙÜ�5‹zˆØÐ'Ô'Ü*¨5Ó1ˆE‹JÜ!×+Ñ+¨D×1Ô1´nÀTÐQTÔ6UÐY]Ö6]Ø�#‹Jñ Dð €Lr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r3   r"   Útelemetry_scoper5   r!   r   r   )r#   s   "r   r$   r$   �   s"   € ÷ ñ ¨ð ÈSð ÐUcñ r   c               óŽ   € \        \        V R4      P                  R4      4      pRVR&   \        \	        V 4      4      VR&   WR&   V# )zJBuild the safe OTLP resource shared by spans, metrics and diagnostic logs.Úgateway_health_exportÚresource_attributeszhermes-gatewayúservice.namerb   útelemetry.scope)rl   r;   r8   r   r^   )r3   rn   ri   s   &$ r   Ú_runtime_resource_attributesrt   �   sN   € ä%Ô&9¸&ÐBYÓ&Z×&^Ñ&^Ð_tÓ&uÓv€EØ,€Eˆ.ÑÜ#4´[ÀÓ5HÓ#I€EÐ
Ñ Ø.Ð
ÑØ€Lr   c               ó   € V ^8„  d   QhRR/# ©r   r3   r"   r   )r#   s   "r   r$   r$   –   s   € ÷ qñ q˜>ñ qr   c                óÚ   € \        4       p\        V 4      pVP                  R4      pV'       g   \        R4      hVR,          ! T\	        VP                  R4      4      ;'       g    RR7      # )zNConstruct an OTLP span exporter from config. Raises OTLPUnavailable if no SDK.rO   z*monitoring.export.otlp.endpoint is not setÚOTLPSpanExporterrB   N)rO   Úheaders)r1   r@   r8   Ú
ValueErrorrM   )r3   Úsdkr'   rO   s   &   r   Úbuild_exporterr|   –   s\   € ä
‹.€CÜ˜Ó€DØ�x‰x˜
Ó#€HßÜÐEÓFÐFØÐ!Ö"¨HÔ>NÈtÏxÉxÐXeÓOfÓ>g×>oÐ>oÐkoÔpÐpr   c               ó    € V ^8„  d   QhRRRR/# )r   r3   r"   r!   r   r   )r#   s   "r   r$   r$       s   € ÷ Vñ V ð V°Nñ Vr   c                ó   € \        V R R7      # )Úgateway_monitoring)rn   )rt   r?   s   &r   Ú_resource_attributesr€       s   € Ü'¨Ð@TÔUÐUr   c               ó   € V ^8„  d   QhRR/# rv   r   )r#   s   "r   r$   r$   ¤   s   € ÷ ñ ˜>ñ r   c                óÌ   € \        4       pVR ,          ! VR,          P                  \        V 4      4      R7      pVR,          ! \        V 4      4      pVP	                  V4       W#3# )ÚTracerProviderÚResource)ÚresourceÚBatchSpanProcessor)r1   Úcreater€   r|   Úadd_span_processor)r3   r{   ÚproviderÚ	processors   &   r   Ú_make_providerr‹   ¤   s[   € Ü
‹.€CØÐ#Ö$¨c°*­o×.DÑ.DÔEYÐZ`ÓEaÓ.bÔc€HØÐ(Ö)¬.¸Ó*@ÓA€IØ×Ñ 	Ô*ØÐÐr   Úgateway_healthÚgateway_diagnosticÚcron_executionÚ_KEEP_BY_KINDc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úevr"   Úkeysr   r!   r   )r#   s   "r   r$   r$   ¸   s!   € ÷ ñ ˜>ð °ð À>ñ r   c                óœ   € / pV FC  pV P                  V4      pVf   K  \        V\        4      '       d   \        V4      MTVRV 2&   KE  	  V# )zU``hermes.<key>`` attributes for present keys; string values are redacted and bounded.úhermes.)r8   rd   r5   r   )r‘   r’   ri   ÚcolÚvs   &&   r   Ú_allowlisted_attrsr—   ¸   sN   € à€EÛˆØ�F‰F�3‹KˆØŒ=Ü:DÀQÌ×:LÒ:L¤^°AÔ%6ÐRSˆE�G˜C˜5�/Ó"ñ ð €Lr   c               ó    € V ^8„  d   QhRRRR/# )r   r‘   r"   r!   r   )r#   s   "r   r$   r$   Â   s   € ÷ ñ �Nð  ~ñ r   c           	     ó¢   € V P                  R4      pRT;'       g    R/pVP                  \        V \        P                  VR4      4      4       V# )zFSpan attributes for a monitoring event (content-free by construction).Úeventzhermes.eventr\   r   )r8   Úupdater—   r�   )r‘   Úkindri   s   &  r   Ú_span_attrsr�   Â   sG   € à�6‰6�'‹?€DØ+¨T×->Ð->°YÐ?€EØ	‡L�LÔ# B¬×(9Ñ(9¸$ÀÓ(CÓDÔEØ€Lr   c               ó    € V ^8„  d   QhRRRR/# )r   Úbatchúlist[dict[str, Any]]r!   Úintr   )r#   s   "r   r$   r$   Ê   s   € ÷ 
ñ 
Ð"6ð 
¸3ñ 
r   c                ó  € V P                  R4      p^ pV FJ  p VP                  RVP                  RR4       2\        V4      R7      P	                  4        V^,          pKL  	  V#   \
         d    \        P                  RRR7        Ku  i ; i)z;Map a batch of events to OTel spans. Returns spans created.zhermes.monitoringr”   rš   )Ú
attributeszOTLP span map failedT)Úexc_info)Ú
get_tracerÚ
start_spanr8   r�   Úendr*   rG   rH   )r‰   rŸ   ÚtracerÚnr‘   s   &&   r   Úexport_batchrª   Ê   s�   € à× Ñ Ð!4Ó5€FØ	€AÛˆð	@Ø×Ñ ¨¯©¨w¸Ó(@Ð'AÐBÌ{Ð[]ËÐÓ_×cÑcÔeØ��FŠAñ ð €Høô ô 	@Ü�L‰LÐ/¸$ˆL×?ð	@ús   šAA&Á&"BÂBc                  óJ   € ] tR t^Øt$ RtR]R&   R]R&   ^ tR]R&   R R ltR	tR
# )ÚEmitterStreamerz”Base for emitter subscribers owning an OTel provider + batch processor.
Register with ``emitter.subscribe(streamer)``. Fail-isolated by the emitter.r   Ú	_providerÚ
_processorr¡   Úexportedc               ó   € V ^8„  d   QhRR/# )r   r!   ÚNoner   )r#   s   "r   r$   ÚEmitterStreamer.__annotate__ß   s   € ÷ &ñ &˜$ñ &r   c                	ót  € \        \        4      ;_uu_ 4        ^ RIHp V! 4       P	                  V 4       RRR4       \        \        4      ;_uu_ 4        V P
                  P                  4        V P                  P                  4        RRR4       R#   + '       g   i     Lf; i  + '       g   i     R# ; i)rZ   ©Úget_emitterN)	r   r*   Úagent.monitoring.emitterrµ   Úunsubscriber®   Úforce_flushr­   Úshutdown)Úselfrµ   s   & r   r¹   ÚEmitterStreamer.shutdownß   so   € Ü”i× Õ Ý<Ù‹M×%Ñ% dÔ+÷ !ô ”i× Õ Ø�O‰O×'Ñ'Ô)Ø�N‰N×#Ñ#Ô%÷ !Ñ ÷ !× ú÷ !× Ð ús   ˜BÁ5B&ÂB#	Â&B7	r   N)	r   r   r   r   r   Ú__annotations__r¯   r¹   r   r   r   r   r¬   r¬   Ø   s&   ‡ ñTàƒNØƒOØ€HˆcÓ÷&ñ &r   r¬   c                  ó:   € ] tR t^ètRtRR/R R lltR R ltRtR# )	ÚOTLPStreamerzBA live subscriber that pushes each emitter batch to OTLP as spans.Úevent_filterNc               ó    € V ^8„  d   QhRRRR/# )r   r3   r"   r¿   ú*Optional[Callable[[dict[str, Any]], bool]]r   )r#   s   "r   r$   ÚOTLPStreamer.__annotate__ë   s   € ÷ ñ ˜~ð Ð@jñ r   c               	óP   € \        V4      w  V n        V n        W n        ^ V n        R# )rZ   N)r‹   r­   r®   Ú_event_filterr¯   )rº   r3   r¿   s   &&$r   Ú__init__ÚOTLPStreamer.__init__ë   s"   € Ü*8¸Ó*@Ñ'ˆŒ˜œØ)ÔØˆŽr   c               ó    € V ^8„  d   QhRRRR/# )r   rŸ   r    r!   r±   r   )r#   s   "r   r$   rÂ   ð   s   € ÷ =ñ =Ð2ð =°tñ =r   c                	óì   € V P                   e*   V Uu. uF  q P                  V4      '       g   K  VNK  	  ppV'       g   R # V ;P                  \        V P                  V4      ,          un        R # u upi )N)rÄ   r¯   rª   r­   )rº   rŸ   r‘   s   && r   Ú__call__ÚOTLPStreamer.__call__ð   sT   € Ø×ÑÒ)Ù"'ÓB¡%˜B×+=Ñ+=¸b×+A—R�R¡%ˆEÐBßÙØ�Šœ d§n¡n°eÓ<Õ<�ùò Cs
   “A1°A1)rÄ   r®   r­   r¯   )r   r   r   r   r   rÅ   rÉ   r   r   r   r   r¾   r¾   è   s   † ÙLðÐmq÷ ÷
=ñ =r   r¾   c               ó   € V ^8„  d   QhRR/# )r   r!   r    r   )r#   s   "r   r$   r$   ø   s   € ÷ ñ �dñ r   c                 óD   €  \        RR7       R#   \         d     R# i ; i)zKTrue when the OTel SDK is already importable (pure check, no auto-install).F)r   T)r1   r   r   r   r   Úis_availablerÍ   ø   s$   € ðÜ %Õ(ÙøÜô Úðús   ‚ �žc               ó    € V ^8„  d   QhRRRR/# )r   r3   r"   r!   r    r   )r#   s   "r   r$   r$     s   € ÷ >ñ >�~ð >¨$ñ >r   c                ó~   € \        V 4      p\        VP                  R 4      ;'       d    VP                  R4      4      # )ÚenabledrO   )r@   r    r8   )r3   r'   s   & r   Ú
is_enabledrÑ     s1   € Ü˜Ó€DÜ�—‘˜Ó#×<Ð<¨¯©°Ó(<Ó=Ð=r   r¿   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r3   r"   r¿   rÁ   r!   zOptional[OTLPStreamer]r   )r#   s   "r   r$   r$     s$   € ÷ ñ ØðØ-Wðàñr   c               óà   € \        V 4      '       g   R#  \        4        ^ RIHp \        YR7      pT! 4       P                  T4       T#   \         d    \        P	                  R4        R# i ; i)u4  If OTLP is enabled, attach a streamer to the singleton emitter.

``event_filter`` scopes the exporter to its plane.  Startup is non-interactive: a
configured-but-missing SDK is lazily installed once (gated by
security.allow_lazy_installs); if it still can't load, log and no-op â€” never raise into startup.
Nzmmonitoring.export.otlp.enabled but the OTel SDK could not be installed/imported; install 'hermes-agent[otlp]'r´   )r¿   )	rÑ   r1   r   rG   Úwarningr¶   rµ   r¾   Ú	subscribe)r3   r¿   rµ   Ústreamers   &$  r   Ústart_streamingr×     sg   € ô �f×ÒÙðÜŒõ
 5Ü˜FÔ>€HÙƒM×Ñ˜HÔ%Ø€Oøô ô Ü�‰ð Mô 	Nâðús   •
A	 Á	 A-Á,A-)rƒ   )r†   )r„   )rx   )ÚOTLPLogExporter)ÚOTLPMetricExporter)ÚSpanKindÚINVALID_SPAN_IDÚINVALID_TRACE_IDÚ
TraceFlags)ÚObservation)Ú	LogRecord)ÚSeverityNumber)ÚLoggerProvider)ÚBatchLogRecordProcessor)ÚMeterProvider)ÚPeriodicExportingMetricReader)rƒ   r†   r„   rx   rÚ   )z
/v1/tracesz/v1/metrics>	   úcloud.regionrr   úcloud.platformúcloud.providerúservice.versionrs   úservice.namespacerb   údeployment.environment.name)r/   Úgateway_stateÚ	old_stateÚ	new_stateÚexit_reasonÚrestart_requestedÚactive_agentsÚgateway_busyÚgateway_drainableÚplatform_countÚfatal_platform_countÚversionÚsupervision_modeÚpid)	r/   Ú	subsystemÚerror_classÚ
error_codeÚplatformrì   rí   rõ   Úseverity)ÚstatusÚjob_keyÚsourceÚduration_msÚdelivery_outcomerù   )r¾   r   r|   rª   rÍ   rÑ   r×   );Ú__conditional_annotations__r   Ú
__future__r   r)   r   r,   ÚloggingrE   ÚreÚ
contextlibr   Útypingr   r   r   r   r	   r
   Úagent.monitoring.gateway_healthr   Úagent.monitoring.redactionr   Ú	getLoggerr   rG   ÚRuntimeErrorr   r   r¼   rD   r   Ú	_SPAN_SDKr1   r;   r@   rM   rR   rW   Ú	frozensetrf   Úcompilerg   r^   rl   rt   r|   r€   r‹   r�   r—   r�   rª   r¬   r¾   rÍ   rÑ   r×   Ú__all__)Úmoduler   r/   r  s   000@r   Ú<module>r     sÕ  øðôõ #å Û Û Û 	Û 	Ý ß @× @å =Ý 5à	×	Ò	˜8Ó	$€ôF�lô Fð Ð2Ø$Ð&=Ø! =Ø;Ð=RØ:Ð<PØ<Ð>UØÐ\ØÐ-Ø˜>Ø"Ð$7ØÐ2Ø$Ð&BØÐ!3Ø&Ð(Jð,€Ð(ó ð  CO×BTÑBTÔBVÕiÑBV±°ÓchÐ[_ f¢Ñch¡ÑBVÓi€ˆnÓ iØ`€	ð )2ñ 
È4÷ 
ð 
õ2õ9õ	ð 1Ð õñ %ò &ó Ð ð —z’zÐ">Ó?Ð õõõõqõVõð ð ð ð  JØÐgð-€Ð)ó õõõ
÷&ñ &ô =�?ô =õ õ>ð
ØZ^÷ò.‚ùô]  js   ÂE2