55
66# adjust paths to make the Splunk app working
77import import_declare_test # noqa: F401
8- from dataset_common import normalize_time
8+ from dataset_common import logger , normalize_time
99
1010# Dataset V2 API client (generated)
1111from dataset_query_api_client import AuthenticatedClient
2424)
2525
2626
27+ # APIException stores response payload received by API.
28+ # Payload is passed as is into search_error_exit.
29+ class APIException (Exception ):
30+ def __init__ (self , payload ):
31+ self .payload = payload
32+
33+
2734# TODO: Convert to the expected format
2835# https://www.python-httpx.org/advanced/#http-proxying
2936def convert_proxy (proxy ):
@@ -39,7 +46,13 @@ def convert_proxy(proxy):
3946
4047# Executes Dataset LongRunningQuery for log events
4148def ds_lrq_log_query (
42- base_url , api_key , start_time , end_time , filter_expr , limit , proxy
49+ base_url ,
50+ api_key ,
51+ start_time ,
52+ end_time ,
53+ filter_expr ,
54+ limit ,
55+ proxy ,
4356):
4457 client = AuthenticatedClient (
4558 base_url = base_url , token = api_key , proxy = convert_proxy (proxy )
@@ -69,7 +82,14 @@ def ds_lrq_power_query(base_url, api_key, start_time, end_time, query, proxy):
6982
7083# Executes Dataset LongRunningQuery to fetch facet values
7184def ds_lrq_facet_values (
72- base_url , api_key , start_time , end_time , filter , name , max_values , proxy
85+ base_url ,
86+ api_key ,
87+ start_time ,
88+ end_time ,
89+ filter ,
90+ name ,
91+ max_values ,
92+ proxy ,
7393):
7494 client = AuthenticatedClient (
7595 base_url = base_url , token = api_key , proxy = convert_proxy (proxy )
@@ -87,29 +107,53 @@ def ds_lrq_facet_values(
87107
88108# Executes LRQ run loop of launch-ping-remove API requests until the query completes
89109# with a result
110+ # Returns tuple - value, error message
90111def ds_lrq_run_loop (
91112 client : AuthenticatedClient , body : PostQueriesLaunchQueryRequestBody
92113):
93114 body .query_priority = PostQueriesLaunchQueryRequestBodyQueryPriority .HIGH
94115 response = post_queries .sync_detailed (client = client , json_body = body )
116+ logger ().debug (response )
95117 result = response .parsed
96- forward_tag = response .headers ["x-dataset-query-forward-tag" ]
97- steps_done = result .steps_completed
98- steps_total = result .steps_total
99- query_id = result .id
100- while steps_done < steps_total :
101- response = get_queries .sync_detailed (
102- id = query_id ,
103- query_type = body .query_type ,
104- client = client ,
105- last_step_seen = steps_done ,
106- forward_tag = forward_tag ,
107- )
108- result = response .parsed
118+ if result :
119+ forward_tag = response .headers ["x-dataset-query-forward-tag" ]
109120 steps_done = result .steps_completed
110- delete_queries .sync_detailed (id = query_id , client = client , forward_tag = forward_tag )
121+ steps_total = result .steps_total
122+ query_id = result .id
123+ retry = 0
124+ while steps_done < steps_total :
125+ response = get_queries .sync_detailed (
126+ id = query_id ,
127+ query_type = body .query_type ,
128+ client = client ,
129+ last_step_seen = steps_done ,
130+ forward_tag = forward_tag ,
131+ )
132+ logger ().debug (response )
133+ result = response .parsed
134+ if result :
135+ steps_done = result .steps_completed
136+ retry = 0
137+ else :
138+ # 2023-11-01: QA server is sometimes returns 500 Operation not
139+ # permitted, after several batches have been received.
140+ # Idea is to try few retries. However, based on my handful of examples
141+ # when this happened, retries has never helped.
142+ retry += 1
143+ logger ().warning ("Retrying: {}; {}" .format (retry , response ))
144+ if retry > 5 :
145+ logger ().error (response )
146+ raise APIException (json .loads (response .content ))
147+ else :
148+ time .sleep (retry )
149+
150+ delete_queries .sync_detailed (
151+ id = query_id , client = client , forward_tag = forward_tag
152+ )
153+ return result
111154
112- return result
155+ logger ().error (response )
156+ raise APIException (json .loads (response .content ))
113157
114158
115159# Returns a valid PowerQuery incorporating provided filter, columns and limit
0 commit comments