Ë
    Ô–ëj;  ã                  ó�   — d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ  ej                  e«      Z G d„ d«      Zd
d„Zdd	gZy)uø  Monitoring and metrics for knowledge plane (Phase C3).

Implementuje observability vrstvu zaloÅ¾enou na:
- Prometheus metrics (prometheus_client) pro /metrics endpoint
- Prometheus instrumentation patterns (latency histograms, counters, summaries)

Metriky (podle vÃ½zkumu: Redis LangCache, OpenTelemetry RAG pipeline, 
embedding stack latency benchmarks):

1. **Embedding latency**: histogram `knowledge_embedding_query_latency_seconds`,
   counter `knowledge_embedding_requests_total` s outcomes (success/error).

2. **Cache metrics**: countery `knowledge_embedding_cache_hits_total` /
   `knowledge_embedding_cache_misses_total`, `knowledge_search_cache_hits_total` /
   `knowledge_search_cache_misses_total`.

3. **Vector search**: histogram `knowledge_vector_search_latency_seconds`,
   counter `knowledge_vector_search_queries_total`.

4. **Batch processing**: countery `knowledge_batch_items_total`,
   `knowledge_batch_successes_total`, `knowledge_batch_failures_total`,
   `knowledge_batch_dead_lettered_total`.

5. **Sensitivity/PII**: countery `knowledge_sensitivity_detected_total` s
   sensitivity level labels.

6. **Health**: gauge `knowledge_component_health` (0/1 per component).

Pattern: Prometheus metrics exporter (prometheus_client REGISTRY) + custom
business metrics. Snapshot API pro CLI/health check.

PouÅ¾itÃ­:
    metrics = KnowledgeMetrics()
    metrics.record_embedding_latency(0.012)
    metrics.record_vector_search(latency=0.15, best_distance=0.42)
    snapshot = metrics.get_metrics_snapshot()
é    )ÚannotationsN)ÚAny)ÚCollectorRegistryÚCounterÚGaugeÚ	Histogramc                  ó„   — e Zd ZdZddd„Zdddœdd„Zdd„Zdd„Zddd	„Zdd
„Z	dd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚKnowledgeMetricsz>Central collection point for knowledge plane business metrics.Nc                óL  — |xs
 t        «       | _        t        j                  «       | _        t        ddd| j                  ¬«      | _        t        dddg| j                  ¬«      | _        t        d	d
d| j                  ¬«      | _	        t        dd| j                  ¬«      | _
        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        ddd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        dd| j                  ¬«      | _        t        d d!d"g| j                  ¬«      | _        t        d#d$d%| j                  ¬«      | _        t-        d&d'| j                  ¬«      | _        t-        d(d)| j                  ¬«      | _        t        d*d+d,| j                  ¬«      | _        t-        d-d.d/g| j                  ¬«      | _        d0| _        d0| _        d0| _        d0| _        d0| _        d0| _         d0| _!        d0| _"        d0| _#        d0| _$        y )1NÚ)knowledge_embedding_query_latency_secondsz4Latency of single embedding query in knowledge plane)ç{®Gázt?ç{®Gáz„?çš™™™™™™?çš™™™™™©?çš™™™™™¹?ç      Ð?ç      à?ç      ð?ç      @ç      @ç      $@)ÚbucketsÚregistryÚ"knowledge_embedding_requests_totalzTotal embedding requestsÚstatus)r   Ú)knowledge_embedding_batch_latency_secondsz'Latency of batched embedding operationsÚ$knowledge_embedding_cache_hits_totalzTotal embedding cache hitsÚ&knowledge_embedding_cache_misses_totalzTotal embedding cache missesÚ!knowledge_search_cache_hits_totalz Total semantic search cache hitsÚ#knowledge_search_cache_misses_totalz"Total semantic search cache missesÚ'knowledge_vector_search_latency_secondsz#Latency of vector similarity search)çü©ñÒMbP?r   r   r   r   r   r   r   r   r   r   Ú%knowledge_vector_search_queries_totalzTotal vector search queriesÚknowledge_batch_items_totalzTotal batch items processedÚknowledge_batch_successes_totalz(Total batch items successfully processedÚknowledge_batch_failures_totalz(Total batch items failed (after retries)Ú#knowledge_batch_dead_lettered_totalz,Total batch items moved to dead-letter queueÚ$knowledge_sensitivity_detected_totalz2Total documents where PII/sensitivity was detectedÚsensitivity_levelÚ(knowledge_classification_latency_secondszClassification latency)r   r   r   r   r   r   r   r   Úknowledge_entity_countz%Number of entities in knowledge graphÚknowledge_entity_edge_countz"Number of edges in knowledge graphÚ&knowledge_kg_traversal_latency_secondsz%Knowledge graph BFS traversal latency)
r"   r   r   r   r   r   r   r   r   r   Úknowledge_component_healthz0Component health status (1=healthy, 0=unhealthy)Ú	componentr   )%r   r   ÚtimeÚ	monotonicÚ_start_timer   Úembedding_latencyr   Úembedding_requests_totalÚembedding_batch_latencyÚembedding_cache_hitsÚembedding_cache_missesÚsearch_cache_hitsÚsearch_cache_missesÚvector_search_latencyÚvector_search_totalÚbatch_items_totalÚbatch_successes_totalÚbatch_failures_totalÚbatch_dead_letteredÚsensitivity_detectedÚclassification_latencyr   Úkg_entity_countÚkg_edge_countÚkg_traversal_latencyÚcomponent_healthÚ_internal_embedding_requestsÚ_internal_embedding_errorsÚ_internal_vector_searchesÚ_internal_batch_itemsÚ_internal_batch_successesÚ_internal_batch_failuresÚ_internal_batch_dead_letteredÚ_internal_sensitivity_detectedÚ!_internal_classification_requestsÚ_internal_kg_traversals)Úselfr   s     úM/home/oem/CyberBrain26-unified/src/cyberbrain26/knowledge_plane/monitoring.pyÚ__init__zKnowledgeMetrics.__init__5   s¦  € Ø Ò7Ô$5Ó$7ˆŒÜŸ>™>Ó+ˆÔô
 "+Ø7ØBØSØ—]‘]ô	"
ˆÔô )0Ø0Ø&ØˆJØ—]‘]ô	)
ˆÔ%ô (1Ø7Ø5ØSØ—]‘]ô	(
ˆÔ$ô %,Ø2Ø(Ø—]‘]ô%
ˆÔ!ô
 '.Ø4Ø*Ø—]‘]ô'
ˆÔ#ô ")Ø/Ø.Ø—]‘]ô"
ˆÔô
 $+Ø1Ø0Ø—]‘]ô$
ˆÔ ô &/Ø5Ø1ØTØ—]‘]ô	&
ˆÔ"ô $+Ø3Ø)Ø—]‘]ô$
ˆÔ ô ")Ø)Ø)Ø—]‘]ô"
ˆÔô
 &-Ø-Ø6Ø—]‘]ô&
ˆÔ"ô
 %,Ø,Ø6Ø—]‘]ô%
ˆÔ!ô
 $+Ø1Ø:Ø—]‘]ô$
ˆÔ ô %,Ø2Ø@Ø Ð!Ø—]‘]ô	%
ˆÔ!ô '0Ø6Ø$Ø?Ø—]‘]ô	'
ˆÔ#ô  %Ø$Ø3Ø—]‘]ô 
ˆÔô
 #Ø)Ø0Ø—]‘]ô
ˆÔô
 %.Ø4Ø3ØOØ—]‘]ô	%
ˆÔ!ô !&Ø(Ø>ØˆMØ—]‘]ô	!
ˆÔð -.ˆÔ)Ø*+ˆÔ'Ø)*ˆÔ&Ø%&ˆÔ"Ø)*ˆÔ&Ø()ˆÔ%Ø-.ˆÔ*Ø./ˆÔ+Ø12ˆÔ.Ø'(ˆÕ$ó    F)ÚcachedÚerrorc               óª  — | j                   j                  |«       |r@| j                  j                  d¬«      j	                  «        | xj
                  dz  c_        n?| j                  j                  d¬«      j	                  «        | xj                  dz  c_        |r| j                  j	                  «        y| j                  j	                  «        y)u>   ZaznamenÃ¡ latency embeddingu (pÅ™Ã­padnÄ› cache hit / error).rU   )r   é   ÚsuccessN)	r3   Úobserver4   ÚlabelsÚincrG   rF   r6   r7   )rP   Úlatency_secondsrT   rU   s       rQ   Úrecord_embedding_latencyz)KnowledgeMetrics.record_embedding_latencyÒ   s¢   € à×Ñ×&Ñ& Ô7ÙØ×)Ñ)×0Ñ0¸Ð0Ó@×DÑDÔFØ×+Ò+¨qÑ0Ö+à×)Ñ)×0Ñ0¸	Ð0ÓB×FÑFÔHØ×-Ò-°Ñ2Õ-ÙØ×%Ñ%×)Ñ)Õ+à×'Ñ'×+Ñ+Õ-rS   c                ó:   — | j                   j                  |«       y)u%   ZaznamenÃ¡ latency batched embedding.N)r5   rY   ©rP   r\   s     rQ   Úrecord_embedding_batch_latencyz/KnowledgeMetrics.record_embedding_batch_latencyà   s   € à×$Ñ$×,Ñ,¨_Õ=rS   c                ór   — |r| j                   j                  «        y| j                  j                  «        y)u.   ZaznamenÃ¡ cache hit/miss pro semantic search.N)r8   r[   r9   )rP   Úhits     rQ   Úrecord_search_cache_hitz(KnowledgeMetrics.record_search_cache_hitè   s)   € áØ×"Ñ"×&Ñ&Õ(à×$Ñ$×(Ñ(Õ*rS   c                ó˜   — | j                   j                  |«       | j                  j                  «        | xj                  dz  c_        y)u6   ZaznamenÃ¡ vector search latency + score distribution.rW   N)r:   rY   r;   r[   rH   )rP   r\   Úbest_distances      rQ   Úrecord_vector_searchz%KnowledgeMetrics.record_vector_searchó   s9   € à×"Ñ"×*Ñ*¨?Ô;Ø× Ñ ×$Ñ$Ô&Ø×&Ò&¨!Ñ+Ö&rS   c               óˆ  — | j                   j                  «        | xj                  dz  c_        |r0| j                  j                  «        | xj                  dz  c_        y|r0| j
                  j                  «        | xj                  dz  c_        y| j                  j                  «        | xj                  dz  c_        y)u   ZaznamenÃ¡ batch zÃ¡znam.rW   N)	r<   r[   rI   r?   rL   r=   rJ   r>   rK   )rP   rX   Údead_lettereds      rQ   Úrecord_batch_itemz"KnowledgeMetrics.record_batch_itemý   s—   € à×Ñ×"Ñ"Ô$Ø×"Ò" aÑ'Õ"ÙØ×$Ñ$×(Ñ(Ô*Ø×.Ò.°!Ñ3Õ.ØÙØ×&Ñ&×*Ñ*Ô,Ø×*Ò*¨aÑ/Ö*à×%Ñ%×)Ñ)Ô+Ø×)Ò)¨QÑ.Ö)rS   c                óˆ   — |r@| j                   j                  |¬«      j                  «        | xj                  dz  c_        yy)u#   ZaznamenÃ¡ detekci sensitivity/PII.)r)   rW   N)r@   rZ   r[   rM   )rP   ÚlevelÚdetecteds      rQ   Úrecord_sensitivityz#KnowledgeMetrics.record_sensitivity  s;   € áØ×%Ñ%×,Ñ,¸uÐ,ÓE×IÑIÔKØ×/Ò/°1Ñ4Ö/ð rS   c                ó”   — | j                   j                  |«       | xj                  dz  c_        |st        j	                  d«       yy)u.   ZaznamenÃ¡ classification latency a vÃ½sledek.rW   zClassification failedN)rA   rY   rN   ÚloggerÚwarning)rP   r\   rX   s      rQ   Úrecord_classificationz&KnowledgeMetrics.record_classification  s<   € à×#Ñ#×+Ñ+¨OÔ<Ø×.Ò.°!Ñ3Õ.ÙÜ�N‰NÐ2Õ3ð rS   c                ó:   — | j                   j                  |«       y)u    ZaznamenÃ¡ poÄ�et entit v grafe.N)rB   Úset©rP   Úcounts     rQ   Úrecord_entity_countz$KnowledgeMetrics.record_entity_count!  s   € à×Ñ× Ñ  Õ'rS   c                ó:   — | j                   j                  |«       y)u   ZaznamenÃ¡ poÄ�et hran v grafe.N)rC   rs   rt   s     rQ   Úrecord_entity_edgesz$KnowledgeMetrics.record_entity_edges%  s   € à×Ñ×Ñ˜uÕ%rS   c                ód   — | j                   j                  |«       | xj                  dz  c_        y)u'   ZaznamenÃ¡ latency BFS traversalu v KG.rW   N)rD   rY   rO   r_   s     rQ   Úrecord_kg_traversalz$KnowledgeMetrics.record_kg_traversal)  s'   € à×!Ñ!×)Ñ)¨/Ô:Ø×$Ò$¨Ñ)Ö$rS   c                ól   — | j                   j                  |¬«      j                  |rd«       yd«       y)u"   NastavÃ­ health status komponenty.©r/   r   g        N)rE   rZ   rs   )rP   r/   Úhealthys      rQ   Úset_component_healthz%KnowledgeMetrics.set_component_health2  s,   € à×Ñ×$Ñ$¨yÐ$Ó9×=Ñ=ÁW¸cÕVÐRUÕVrS   c                óB  — ddl m} dd„}| j                  | j                  | j                   || j
                  «       || j                  «      dœ| j                   || j                  «      dœ| j                  | j                  | j                  | j                  dœ| j                   || j                  «       || j                  «      dD �ci c]%  }| || j                   j#                  |¬«      «      “Œ' c} || j$                  «      j'                  d	«      d
œ	S c c}w )u8   VrÃ¡tÃ­ aktuÃ¡lnÃ­ snapshot metrik pro CLI/health check.r   )Úgenerate_latestc                óÊ   — 	 t        | j                  «       «      }|r-|d   j                  r|d   j                  d   }|j                  S y # t        t
        t        f$ r Y y w xY w)Nr   éÿÿÿÿ)ÚlistÚcollectÚsamplesÚvalueÚKeyErrorÚAttributeErrorÚ
IndexError)ÚmetricÚ	collectedÚlast_samples      rQ   Ú_metric_valuez<KnowledgeMetrics.get_metrics_snapshot.<locals>._metric_value?  sj   € ðÜ  §¡Ó!1Ó2�	Ù ¨1¡×!5Ò!5Ø"+¨A¡,×"6Ñ"6°rÑ":�KØ&×,Ñ,Ð,ð øô œn¬jÐ9ò ØØðús   ‚AA ÁA"Á!A")Úrequests_totalÚerrorsÚ
cache_hitsÚcache_misses)Úqueries_totalÚlatest_latency)Úitems_totalÚ	successesÚfailuresrh   )Ú	embeddingÚvector_storeÚ	navigatorr|   zutf-8)	Ústart_time_monotonicr—   Úvector_searchÚbatchr@   Úkg_entitiesÚkg_edgesrE   Úprometheus_text)rŠ   r   Úreturnúfloat | None)Úprometheus_clientr€   r2   rF   rG   r6   r7   rH   r:   rI   rJ   rK   rL   rM   rB   rC   rE   rZ   r   Údecode)rP   r€   r�   Úcs       rQ   Úget_metrics_snapshotz%KnowledgeMetrics.get_metrics_snapshot:  s  € å5ó	ð %)×$4Ñ$4à"&×"CÑ"CØ×9Ñ9Ù+¨D×,EÑ,EÓFÙ -¨d×.IÑ.IÓ Jñ	ð "&×!?Ñ!?Ù"/°×0JÑ0JÓ"Kñð
  $×9Ñ9Ø!×;Ñ;Ø ×9Ñ9Ø!%×!CÑ!Cñ	ð %)×$GÑ$GÙ(¨×)=Ñ)=Ó>Ù% d×&8Ñ&8Ó9ð Dö!àð ‘= ×!6Ñ!6×!=Ñ!=ÈÐ!=Ó!JÓKÑKò!ñ  /¨t¯}©}Ó=×DÑDÀWÓMñ3
ð 	
ùò*!s   Ã*D)N)r   zCollectorRegistry | Noner    ÚNone)r\   ÚfloatrT   ÚboolrU   r¨   r    r¦   )r\   r§   r    r¦   )rb   r¨   r    r¦   )r\   r§   re   r¡   r    r¦   )rX   r¨   rh   r¨   r    r¦   )rk   Ústrrl   r¨   r    r¦   )r\   r§   rX   r¨   r    r¦   )ru   Úintr    r¦   )r/   r©   r}   r¨   r    r¦   )r    zdict[str, Any])Ú__name__Ú
__module__Ú__qualname__Ú__doc__rR   r]   r`   rc   rf   ri   rm   rq   rv   rx   rz   r~   r¥   © rS   rQ   r
   r
   2   sS   „ ÙHôW)ðz RWÐfkõ .ó>ó+ô,ó/ó&5ó4ó(ó&ó*óWô)
rS   r
   c                 ó   — t        «       S )u+   VrÃ¡tÃ­ globÃ¡lnÃ­ default instance metrik.)r
   r¯   rS   rQ   Úget_default_metricsr±   f  s   € äÓÐrS   r±   )r    r
   )r®   Ú
__future__r   Úloggingr0   Útypingr   r¢   r   r   r   r   Ú	getLoggerr«   ro   r
   r±   Ú__all__r¯   rS   rQ   ú<module>r·      sP   ðñ$õL #ã Û Ý ç JÓ Jà	ˆ×	Ñ	˜8Ó	$€÷q
ñ q
óh	ð
 Ð4Ð
5�rS   