@@ -244,6 +244,9 @@ def _aggregate_check_table_services(
244244 * ,
245245 config_cache : ConfigCache ,
246246 service_name_config : PassiveServiceNameConfig ,
247+ enforced_services_table : Callable [
248+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
249+ ],
247250 skip_ignored : bool ,
248251 filter_mode : FilterMode ,
249252 get_autochecks : Callable [[HostAddress ], Sequence [AutocheckEntry ]],
@@ -275,6 +278,7 @@ def _aggregate_check_table_services(
275278 host_name ,
276279 get_autochecks ,
277280 configure_autochecks ,
281+ enforced_services_table ,
278282 plugins ,
279283 )
280284 if sfilter .keep (s )
@@ -286,13 +290,7 @@ def _aggregate_check_table_services(
286290 if sfilter .keep (s )
287291 )
288292
289- yield from (
290- svc
291- for _ , svc in config_cache .enforced_services_table (
292- host_name , plugins , service_name_config
293- ).values ()
294- if sfilter .keep (svc )
295- )
293+ yield from (svc for _ , svc in enforced_services_table (host_name ).values () if sfilter .keep (svc ))
296294
297295 # NOTE: as far as I can see, we only have two cases with the filter mode.
298296 # Either we compute services to check, or we compute services for fetching.
@@ -321,6 +319,7 @@ def _aggregate_check_table_services(
321319 host_name ,
322320 get_autochecks ,
323321 configure_autochecks ,
322+ enforced_services_table ,
324323 plugins ,
325324 )
326325 if sfilter .keep (s )
@@ -392,6 +391,9 @@ def _get_services_from_cluster_nodes(
392391 [HostName , Sequence [AutocheckEntry ]],
393392 Iterable [ConfiguredService ],
394393 ],
394+ enforced_services_table : Callable [
395+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
396+ ],
395397 plugins : Mapping [CheckPluginName , CheckPlugin ],
396398) -> Iterable [ConfiguredService ]:
397399 for cluster in config_cache .clusters_of (node_name ):
@@ -401,6 +403,7 @@ def _get_services_from_cluster_nodes(
401403 cluster ,
402404 get_autochecks ,
403405 configure_autochecks ,
406+ enforced_services_table ,
404407 plugins ,
405408 )
406409
@@ -414,6 +417,9 @@ def _get_clustered_services(
414417 [HostName , Sequence [AutocheckEntry ]],
415418 Iterable [ConfiguredService ],
416419 ],
420+ enforced_services_table : Callable [
421+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
422+ ],
417423 plugins : Mapping [CheckPluginName , CheckPlugin ],
418424) -> Iterable [ConfiguredService ]:
419425 nodes = config_cache .nodes (cluster_name )
@@ -453,10 +459,7 @@ def appears_on_cluster(node_name: HostAddress, entry: AutocheckEntry) -> bool:
453459 )
454460
455461 yield from merge_enforced_services (
456- {
457- node_name : config_cache .enforced_services_table (node_name , plugins , service_name_config )
458- for node_name in nodes
459- },
462+ {node_name : enforced_services_table (node_name ) for node_name in nodes },
460463 # similiar to appears_on_cluster, but we don't check for ignored services
461464 lambda node_name , service_name , discovered_labels : (
462465 config_cache .effective_host (
@@ -563,6 +566,9 @@ class LoadedConfigFragment:
563566 folder_attributes : Mapping [str , FolderAttributesForBase ]
564567 discovery_rules : Mapping [RuleSetName , Sequence [RuleSpec ]]
565568 checkgroup_parameters : Mapping [str , Sequence [RuleSpec [Mapping [str , object ]]]]
569+ static_checks : Mapping [
570+ str , list [RuleSpec [list [object ]]]
571+ ] # a.k.a. "enforced_services". Keep the name for consistency
566572 service_rule_groups : set [str ]
567573 service_descriptions : Mapping [str , str ]
568574 service_description_translation : Sequence [RuleSpec [Mapping [str , object ]]]
@@ -710,6 +716,7 @@ def _perform_post_config_loading_actions(
710716 folder_attributes = folder_attributes ,
711717 discovery_rules = discovery_settings ,
712718 checkgroup_parameters = checkgroup_parameters ,
719+ static_checks = static_checks ,
713720 service_rule_groups = service_rule_groups ,
714721 service_descriptions = service_descriptions ,
715722 service_description_translation = service_description_translation ,
@@ -1703,6 +1710,9 @@ def fetcher_factory(
17031710 service_configurer : ServiceConfigurer ,
17041711 ip_lookup : ip_lookup .IPLookup ,
17051712 service_name_config : PassiveServiceNameConfig ,
1713+ enforced_services_table : Callable [
1714+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
1715+ ],
17061716 ) -> FetcherFactory :
17071717 return FetcherFactory (
17081718 self ,
@@ -1713,6 +1723,7 @@ def fetcher_factory(
17131723 self .ruleset_matcher ,
17141724 service_configurer ,
17151725 service_name_config ,
1726+ enforced_services_table ,
17161727 is_cmc = self ._loaded_config .monitoring_core == "cmc" ,
17171728 )
17181729
@@ -1856,6 +1867,9 @@ def make_checking_sections(
18561867 service_configurer : ServiceConfigurer ,
18571868 service_name_config : PassiveServiceNameConfig ,
18581869 hostname : HostName ,
1870+ enforced_services_table : Callable [
1871+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
1872+ ],
18591873 * ,
18601874 selected_sections : SectionNameCollection ,
18611875 ) -> frozenset [SectionName ]:
@@ -1871,6 +1885,7 @@ def make_checking_sections(
18711885 plugins .check_plugins ,
18721886 service_configurer ,
18731887 service_name_config ,
1888+ enforced_services_table ,
18741889 filter_mode = FilterMode .INCLUDE_CLUSTERED ,
18751890 skip_ignored = True ,
18761891 ).needed_check_names ()
@@ -1921,6 +1936,9 @@ def check_table(
19211936 plugins : Mapping [CheckPluginName , CheckPlugin ],
19221937 service_configurer : ServiceConfigurer ,
19231938 service_name_config : PassiveServiceNameConfig ,
1939+ enforced_services_table : Callable [
1940+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
1941+ ],
19241942 * ,
19251943 use_cache : bool = True ,
19261944 filter_mode : FilterMode = FilterMode .NONE ,
@@ -1937,6 +1955,7 @@ def check_table(
19371955 hostname ,
19381956 config_cache = self ,
19391957 service_name_config = service_name_config ,
1958+ enforced_services_table = enforced_services_table ,
19401959 skip_ignored = skip_ignored ,
19411960 filter_mode = filter_mode ,
19421961 get_autochecks = self .autochecks_memoizer .read ,
@@ -1956,10 +1975,15 @@ def _sorted_services(
19561975 plugins : Mapping [CheckPluginName , CheckPlugin ],
19571976 service_configurer : ServiceConfigurer ,
19581977 service_name_config : PassiveServiceNameConfig ,
1978+ enforced_services_table : Callable [
1979+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
1980+ ],
19591981 ) -> Sequence [ConfiguredService ]:
19601982 # This method is only useful for the monkeypatching orgy of the "unit"-tests.
19611983 return sorted (
1962- self .check_table (hostname , plugins , service_configurer , service_name_config ).values (),
1984+ self .check_table (
1985+ hostname , plugins , service_configurer , service_name_config , enforced_services_table
1986+ ).values (),
19631987 key = lambda service : service .description ,
19641988 )
19651989
@@ -1969,9 +1993,14 @@ def configured_services(
19691993 plugins : Mapping [CheckPluginName , CheckPlugin ],
19701994 service_configurer : ServiceConfigurer ,
19711995 service_name_config : PassiveServiceNameConfig ,
1996+ enforced_services_table : Callable [
1997+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
1998+ ],
19721999 service_depends_on : Callable [[HostAddress , ServiceName ], Sequence [ServiceName ]],
19732000 ) -> Sequence [ConfiguredService ]:
1974- services = self ._sorted_services (hostname , plugins , service_configurer , service_name_config )
2001+ services = self ._sorted_services (
2002+ hostname , plugins , service_configurer , service_name_config , enforced_services_table
2003+ )
19752004 if self ._loaded_config .monitoring_core == "cmc" :
19762005 return services
19772006
@@ -3621,11 +3650,28 @@ def _site_of_host(self, host_name: HostName) -> SiteId:
36213650 )
36223651 )
36233652
3624- def enforced_services_table (
3653+
3654+ class EnforcedServicesTable :
3655+ """A table of enforced services"""
3656+
3657+ def __init__ (
36253658 self ,
3626- hostname : HostName ,
3627- plugins : Mapping [CheckPluginName , CheckPlugin ],
3659+ enforced_services_config : Callable [
3660+ [HostName ],
3661+ Mapping [str , Sequence [Sequence [object ]]],
3662+ ],
36283663 service_name_config : PassiveServiceNameConfig ,
3664+ plugins : Mapping [CheckPluginName , CheckPlugin ],
3665+ ) -> None :
3666+ self ._enforced_services_config = enforced_services_config
3667+ self ._service_name_config = service_name_config
3668+ self ._plugins = plugins
3669+ self ._memoized : dict [
3670+ HostName , Mapping [ServiceID , tuple [RulesetName , ConfiguredService ]]
3671+ ] = {}
3672+
3673+ def __call__ (
3674+ self , hostname : HostName
36293675 ) -> Mapping [
36303676 ServiceID ,
36313677 tuple [RulesetName , ConfiguredService ],
@@ -3638,24 +3684,24 @@ def enforced_services_table(
36383684 and item.
36393685 """
36403686 with contextlib .suppress (KeyError ):
3641- return self .__enforced_services_table [hostname ]
3687+ return self ._memoized [hostname ]
36423688
3643- return self .__enforced_services_table .setdefault (
3689+ return self ._memoized .setdefault (
36443690 hostname ,
36453691 {
36463692 ServiceID (check_plugin_name , item ): (
36473693 RulesetName (checkgroup_name ),
36483694 ConfiguredService (
36493695 check_plugin_name = check_plugin_name ,
36503696 item = item ,
3651- description = service_name_config .make_name (
3697+ description = self . _service_name_config .make_name (
36523698 hostname ,
36533699 check_plugin_name ,
36543700 service_name_template = (
36553701 None
36563702 if (
36573703 p := agent_based_register .get_check_plugin (
3658- check_plugin_name , plugins
3704+ check_plugin_name , self . _plugins
36593705 )
36603706 )
36613707 is None
@@ -3664,22 +3710,19 @@ def enforced_services_table(
36643710 item = item ,
36653711 ),
36663712 parameters = compute_enforced_service_parameters (
3667- plugins , check_plugin_name , params
3713+ self . _plugins , check_plugin_name , params
36683714 ),
36693715 discovered_parameters = {},
36703716 discovered_labels = {},
36713717 labels = {},
36723718 is_enforced = True ,
36733719 ),
36743720 )
3675- for checkgroup_name , ruleset in static_checks .items ()
3721+ for checkgroup_name , matched_rule_values in self ._enforced_services_config (
3722+ hostname
3723+ ).items ()
36763724 for check_plugin_name , item , params in (
3677- ConfigCache ._sanitize_enforced_entry (* entry )
3678- for entry in reversed (
3679- self .ruleset_matcher .get_host_values_all (
3680- hostname , ruleset , self .label_manager .labels_of_host
3681- )
3682- )
3725+ self ._sanitize_enforced_entry (* entry ) for entry in reversed (matched_rule_values )
36833726 )
36843727 },
36853728 )
@@ -3824,6 +3867,9 @@ def __init__(
38243867 ruleset_matcher_ : RulesetMatcher ,
38253868 service_configurer : ServiceConfigurer ,
38263869 service_name_config : PassiveServiceNameConfig ,
3870+ enforced_services_table : Callable [
3871+ [HostName ], Mapping [ServiceID , tuple [object , ConfiguredService ]]
3872+ ],
38273873 * ,
38283874 is_cmc : bool ,
38293875 ) -> None :
@@ -3834,6 +3880,7 @@ def __init__(
38343880 self ._ruleset_matcher : Final = ruleset_matcher_
38353881 self ._service_configurer : Final = service_configurer
38363882 self ._service_name_config : Final = service_name_config
3883+ self ._enforced_services_table : Final = enforced_services_table
38373884 self .is_cmc : Final = is_cmc
38383885 self .__disabled_snmp_sections : dict [HostName , frozenset [SectionName ]] = {}
38393886
@@ -3907,6 +3954,7 @@ def make_snmp_fetcher(
39073954 self ._service_configurer ,
39083955 self ._service_name_config ,
39093956 host_name ,
3957+ self ._enforced_services_table ,
39103958 selected_sections = fetcher_config .selected_sections ,
39113959 ),
39123960 sections = plugins .snmp_sections .values (),
0 commit comments