1+ # (c) Copyright IBM Corp. 2025
2+
3+ import itertools
4+ import os
15from typing import Any , Dict , List , Union
6+
27from instana .log import logger
8+ from instana .util .config_reader import ConfigReader
39
410
511def parse_service_pair (pair : str ) -> List [str ]:
612 """
713 Parses a pair string to prepare a list of ignored endpoints.
814
915 @param pair: String format:
10- - "service1:endpoint1,endpoint2 " or "service1:endpoint1 " or "service1"
11- @return: List of strings in format ["service1.endpoint1 ", "service1.endpoint2 ", "service2"]
16+ - "service1:method1,method2 " or "service1:method1 " or "service1"
17+ @return: List of strings in format ["service1.method1 ", "service1.method2 ", "service2.* "]
1218 """
1319 pair_list = []
1420 if ":" in pair :
15- service , endpoints = pair .split (":" , 1 )
21+ service , methods = pair .split (":" , 1 )
1622 service = service .strip ()
17- endpoint_list = [ep .strip () for ep in endpoints .split ("," ) if ep .strip ()]
23+ method_list = [ep .strip () for ep in methods .split ("," ) if ep .strip ()]
1824
19- for endpoint in endpoint_list :
20- pair_list .append (f"{ service } .{ endpoint } " )
25+ for method in method_list :
26+ pair_list .append (f"{ service } .{ method } " )
2127 else :
22- pair_list .append (pair )
28+ pair_list .append (f" { pair } .*" )
2329 return pair_list
2430
2531
26- def parse_ignored_endpoints_string (params : str ) -> List [str ]:
32+ def parse_ignored_endpoints_string (params : Union [ str , os . PathLike ] ) -> List [str ]:
2733 """
2834 Parses a string to prepare a list of ignored endpoints.
2935
3036 @param params: String format:
31- - "service1:endpoint1,endpoint2 ;service2:endpoint3 " or "service1;service2"
32- @return: List of strings in format ["service1.endpoint1 ", "service1.endpoint2 ", "service2"]
37+ - "service1:method1,method2 ;service2:method3 " or "service1;service2"
38+ @return: List of strings in format ["service1.method1 ", "service1.method2 ", "service2.* "]
3339 """
3440 ignore_endpoints = []
3541 if params :
@@ -46,18 +52,45 @@ def parse_ignored_endpoints_dict(params: Dict[str, Any]) -> List[str]:
4652 Parses a dictionary to prepare a list of ignored endpoints.
4753
4854 @param params: Dict format:
49- - {"service1": ["endpoint1 ", "endpoint2 "], "service2": ["endpoint3 "]}
50- @return: List of strings in format ["service1.endpoint1 ", "service1.endpoint2 ", "service2"]
55+ - {"service1": ["method1 ", "method2 "], "service2": ["method3 "]}
56+ @return: List of strings in format ["service1.method1 ", "service1.method2 ", "service2.* "]
5157 """
5258 ignore_endpoints = []
5359
54- for service , endpoints in params .items ():
55- if not endpoints : # filtering all service
56- ignore_endpoints .append (service .lower ())
60+ for service , methods in params .items ():
61+ if not methods : # filtering all service
62+ ignore_endpoints .append (f" { service .lower ()} .*" )
5763 else : # filtering specific endpoints
58- for endpoint in endpoints :
59- ignore_endpoints .append (f"{ service .lower ()} .{ endpoint .lower ()} " )
64+ ignore_endpoints = parse_endpoints_of_service (
65+ ignore_endpoints , service , methods
66+ )
67+
68+ return ignore_endpoints
6069
70+
71+ def parse_endpoints_of_service (
72+ ignore_endpoints : List [str ],
73+ service : str ,
74+ methods : Union [str , List [str ]],
75+ ) -> List [str ]:
76+ """
77+ Parses endpoints of each service.
78+
79+ @param ignore_endpoints: A list of rules for endpoints to be filtered.
80+ @param service: The name of the service to be filtered.
81+ @param methods: A list of specific endpoints of the service to be filtered.
82+ """
83+ if service == "kafka" and isinstance (methods , list ):
84+ for rule in methods :
85+ for method , endpoint in itertools .product (
86+ rule ["methods" ], rule ["endpoints" ]
87+ ):
88+ ignore_endpoints .append (
89+ f"{ service .lower ()} .{ method .lower ()} .{ endpoint .lower ()} "
90+ )
91+ else :
92+ for method in methods :
93+ ignore_endpoints .append (f"{ service .lower ()} .{ method .lower ()} " )
6194 return ignore_endpoints
6295
6396
@@ -66,9 +99,9 @@ def parse_ignored_endpoints(params: Union[Dict[str, Any], str]) -> List[str]:
6699 Parses input to prepare a list for ignored endpoints.
67100
68101 @param params: Can be either:
69- - String: "service1:endpoint1,endpoint2 ;service2:endpoint3 " or "service1;service2"
70- - Dict: {"service1": ["endpoint1 ", "endpoint2 "], "service2": ["endpoint3 "]}
71- @return: List of strings in format ["service1.endpoint1 ", "service1.endpoint2 ", "service2"]
102+ - String: "service1:method1,method2 ;service2:method3 " or "service1;service2"
103+ - Dict: {"service1": ["method1 ", "method2 "], "service2": ["method3 "]}
104+ @return: List of strings in format ["service1.method1 ", "service1.method2 ", "service2.* "]
72105 """
73106 try :
74107 if isinstance (params , str ):
@@ -80,3 +113,28 @@ def parse_ignored_endpoints(params: Union[Dict[str, Any], str]) -> List[str]:
80113 except Exception as e :
81114 logger .debug ("Error parsing ignored endpoints: %s" , str (e ))
82115 return []
116+
117+
118+ def parse_ignored_endpoints_from_yaml (file_path : str ) -> List [str ]:
119+ """
120+ Parses configuration yaml file and prepares a list of ignored endpoints.
121+
122+ @param file_path: Path of the file as a string
123+ @return: List of strings in format ["service1.method1", "service1.method2", "service2.*", "kafka.method.topic", "kafka.*.topic", "kafka.method.*"]
124+ """
125+ config_reader = ConfigReader (file_path )
126+ ignore_endpoints_dict = None
127+ if "tracing" in config_reader .data :
128+ ignore_endpoints_dict = config_reader .data ["tracing" ].get ("ignore-endpoints" )
129+ elif "com.instana.tracing" in config_reader .data :
130+ logger .warning (
131+ 'Please use "tracing" instead of "com.instana.tracing" for local configuration file.'
132+ )
133+ ignore_endpoints_dict = config_reader .data ["com.instana.tracing" ].get (
134+ "ignore-endpoints"
135+ )
136+ if ignore_endpoints_dict :
137+ ignored_endpoints = parse_ignored_endpoints (ignore_endpoints_dict )
138+ return ignored_endpoints
139+ else :
140+ return []
0 commit comments