4141from collections import defaultdict
4242from timeit import default_timer as timer
4343from time import sleep
44+ from threading import Thread
4445
4546
47+ local_cache = []
48+
4649class MetadataHandler (metaclass = Singleton ):
4750
4851 def __init__ (self , ** kwargs ):
@@ -153,6 +156,7 @@ def __getSuggest(self, params):
153156
154157 if params .get ('q' ):
155158 searchStr = params ['q' ].strip ()
159+ self .logger .trace (f'Suggest for { searchStr } called' )
156160 # if '*' and tagv, then it denotes a grouping key value: do not process
157161 if not (searchStr == '*' and params ['type' ] == 'tagv' ):
158162 # Since grafana sends the candidate string quickly, one character at a time, it
@@ -194,6 +198,7 @@ def __getLookup(self, params):
194198 res = LookupResultObj (searchMetric )
195199 res .parseResultTags (identifiersMap )
196200 res .parseRequestTags (filterBy )
201+ self .logger .trace (f'lookUp result { res } ' )
197202 resp = res .__dict__
198203
199204 except Exception as e :
@@ -545,6 +550,7 @@ def parseTags(self, logger, filtersMap, columnInfo):
545550 ident = [key .parent ]
546551 ident .extend (key .identifier )
547552 logger .debug (MSG ['ReceivAttrValues' ].format ('Single ts identifiers' , ', ' .join (ident )))
553+ found = False
548554 for filtersDict in filtersMap :
549555 if all ((value in filtersDict .values ()) for value in ident ):
550556 logger .debug (MSG ['ReceivAttrValues' ].format ('filtersKeys' , ', ' .join (filtersDict .keys ())))
@@ -553,7 +559,20 @@ def parseTags(self, logger, filtersMap, columnInfo):
553559 else :
554560 for _key , _value in filtersDict .items ():
555561 tagsDict [_key ].add (_value )
562+ found = True
556563 break
564+ # detected zimon key, do we need refresh local TOPO?
565+ if not found :
566+ already_reported = False
567+ for cache_item in local_cache :
568+ if set (cache ) == set (ident ):
569+ logger .trace (MSG ['NewKeyAlreadyReported' ].format (ident ))
570+ already_reported = True
571+ break
572+ if not already_reported :
573+ logger .debug (MSG ['NewKeyDetected' ].format (ident ))
574+ local_cache .append (ident )
575+ Thread (name = 'AdHocMetaDataUpdate' , target = refresh_metadata ).start ()
557576
558577 for _key , _values in tagsDict .items ():
559578 if len (_values ) > 1 :
0 commit comments