Skip to content

Commit 2c7fc11

Browse files
authored
Fix per stage PromQL metric queries by using time.time() instead of time.perf_counter() (#177)
PromQL queries require the epoch time as input which requires using `time.time()` since `time.perf_counter()` should only be used for relative differences in time. Lost precision associated with using `time.time()` over `time.perf_counter()` is of negligible consequence. Minor logging improvements also included.
1 parent dafba53 commit 2c7fc11

File tree

4 files changed

+17
-11
lines changed

4 files changed

+17
-11
lines changed

inference_perf/client/metricsclient/prometheus_client/base.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def collect_metrics_for_stage(self, runtime_parameters: PerfRuntimeParameters, s
156156
# Get the query evaluation time and duration for the stage
157157
# The query evaluation time is the end time of the stage plus the scrape interval and a buffer to ensure metrics are collected
158158
# Duration is calculated as the difference between the eval time and start time of the stage
159+
logger.debug(f"runtime parameters for stage {stage_id}: {runtime_parameters}")
159160
query_eval_time = runtime_parameters.stages[stage_id].end_time + self.scrape_interval + PROMETHEUS_SCRAPE_BUFFER_SEC
160161
query_duration = query_eval_time - runtime_parameters.stages[stage_id].start_time
161162
return self.get_model_server_metrics(runtime_parameters.model_server_client, query_duration, query_eval_time)
@@ -230,15 +231,15 @@ def execute_query(self, query: str, eval_time: str) -> float:
230231
"""
231232
query_result = 0.0
232233
try:
233-
logger.debug(f"Making PromQL query: '{query}'")
234+
logger.debug(f"making PromQL query: '{query}'")
234235
response = requests.get(self.query_url, headers=self.get_headers(), params={"query": query, "time": eval_time})
235236
if response is None:
236-
logger.error("Error executing query: %s" % (query))
237+
logger.error("error executing query: %s" % (query))
237238
return query_result
238239

239240
response.raise_for_status()
240241
except Exception as e:
241-
logger.error("Error executing query: %s" % (e))
242+
logger.error("error executing query: %s" % (e))
242243
return query_result
243244

244245
# Check if the response is valid
@@ -258,9 +259,11 @@ def execute_query(self, query: str, eval_time: str) -> float:
258259
# ]
259260
# }
260261
# }
262+
261263
response_obj = response.json()
264+
logger.debug(f"got result for query '{query}': {response_obj}")
262265
if response_obj.get("status") != "success":
263-
logger.error("Error executing query: %s" % (response_obj))
266+
logger.error("error executing query: %s" % (response_obj))
264267
return query_result
265268

266269
data = response_obj.get("data", {})
@@ -276,8 +279,9 @@ def execute_query(self, query: str, eval_time: str) -> float:
276279
try:
277280
query_result = round(float(result[0]["value"][1]), 6)
278281
except ValueError:
279-
logger.error("Error converting value to float: %s" % (result[0]["value"][1]))
282+
logger.error("error converting value to float: %s" % (result[0]["value"][1]))
280283
return query_result
284+
logger.debug(f"inferred result from query '{query}': {query_result}")
281285
return query_result
282286

283287
def get_headers(self) -> dict[str, Any]:

inference_perf/client/modelserver/mock_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, metrics_collector: RequestDataCollector, api_config: APIConfi
3030
self.metrics_collector = metrics_collector
3131

3232
async def process_request(self, data: InferenceAPIData, stage_id: int, scheduled_time: float) -> None:
33-
start = time.monotonic()
33+
start = time.perf_counter()
3434
logger.debug("Processing mock request for stage %d", stage_id)
3535
await asyncio.sleep(3)
3636
self.metrics_collector.record_metric(
@@ -43,7 +43,7 @@ async def process_request(self, data: InferenceAPIData, stage_id: int, scheduled
4343
),
4444
error=None,
4545
start_time=start,
46-
end_time=time.monotonic(),
46+
end_time=time.perf_counter(),
4747
scheduled_time=scheduled_time,
4848
)
4949
)

inference_perf/loadgen/load_generator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ async def mp_run(self, client: ModelServerClient) -> None:
137137

138138
# Allow generation a second to begin populating the queue so the workers
139139
# don't miss the initial scheuled request times
140+
start_time_epoch = time.time()
140141
start_time = time.perf_counter() + 1
141142
num_requests = stage.rate * stage.duration
142143

@@ -167,7 +168,7 @@ async def mp_run(self, client: ModelServerClient) -> None:
167168
logger.debug("Loadgen joining request queue")
168169
request_queue.join()
169170
self.stage_runtime_info[stage_id] = StageRuntimeInfo(
170-
stage_id=stage_id, rate=stage.rate, start_time=start_time, end_time=time.perf_counter()
171+
stage_id=stage_id, rate=stage.rate, start_time=start_time_epoch, end_time=time.time()
171172
)
172173
logger.info("Stage %d - run completed", stage_id)
173174
if self.stageInterval and stage_id < len(self.stages) - 1:
@@ -182,6 +183,7 @@ async def run(self, client: ModelServerClient) -> None:
182183

183184
for stage_id, stage in enumerate(self.stages):
184185
timer = self.get_timer(stage.rate)
186+
start_time_epoch = time.time()
185187
start_time = time.perf_counter()
186188
end_time = start_time + stage.duration
187189
logger.info("Stage %d - run started", stage_id)
@@ -198,7 +200,7 @@ async def run(self, client: ModelServerClient) -> None:
198200
else:
199201
break
200202
self.stage_runtime_info[stage_id] = StageRuntimeInfo(
201-
stage_id=stage_id, rate=stage.rate, start_time=start_time, end_time=time.perf_counter()
203+
stage_id=stage_id, rate=stage.rate, start_time=start_time_epoch, end_time=time.time()
202204
)
203205
logger.info("Stage %d - run completed", stage_id)
204206
if self.stageInterval and stage_id < len(self.stages) - 1:

inference_perf/loadgen/load_timer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def __init__(self, rate: float) -> None:
4444

4545
def start_timer(self, initial: Optional[float] = None) -> Generator[float, None, None]:
4646
# Set start time
47-
next_time = time.monotonic() if initial is None else initial
47+
next_time = time.perf_counter() if initial is None else initial
4848

4949
# Given a rate, yield a time to wait before the next request
5050
while True:
@@ -59,7 +59,7 @@ def __init__(self, rate: float) -> None:
5959

6060
def start_timer(self, initial: Optional[float] = None) -> Generator[float, None, None]:
6161
# Set start time
62-
next_time = time.monotonic() if initial is None else initial
62+
next_time = time.perf_counter() if initial is None else initial
6363

6464
# Given a rate, yield a time to wait before the next request
6565
while True:

0 commit comments

Comments
 (0)