Skip to content

Commit 03249d4

Browse files
dorellangcopybara-github
authored andcommitted
Separate service-reported and end-to-end cluster creation times.
PiperOrigin-RevId: 930777510
1 parent 8c50972 commit 03249d4

3 files changed

Lines changed: 62 additions & 25 deletions

File tree

perfkitbenchmarker/dpb_service.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,15 @@ def GetClusterCreateTime(self) -> float | None:
681681
return None
682682
return self.resource_ready_time - self.create_start_time
683683

684+
def GetServiceReportedClusterCreateTime(self) -> float | None:
685+
"""Returns the cluster creation time as reported by the service.
686+
687+
Returns:
688+
A float representing the creation time in seconds or None if not
689+
implemented.
690+
"""
691+
return None
692+
684693
def GetServiceWrapperScriptsToUpload(self) -> List[str]:
685694
"""Gets service wrapper scripts to upload alongside benchmark scripts."""
686695
return []
@@ -756,9 +765,13 @@ def GetSamples(self) -> list[sample.Sample]:
756765
"""Gets samples with service statistics."""
757766
samples = []
758767
metrics: dict[str, tuple[float | None, str]] = {
759-
# Cluster creation time as reported by the DPB service
760-
# (non-Serverless DPB services only).
768+
# Cluster creation time as measured on PKB's end (E2E).
761769
'dpb_cluster_create_time': (self.GetClusterCreateTime(), 'seconds'),
770+
# Cluster creation time as reported by the DPB service backend.
771+
'dpb_service_reported_cluster_create_time': (
772+
self.GetServiceReportedClusterCreateTime(),
773+
'seconds',
774+
),
762775
# Cluster duration as computed by the underlying benchmark.
763776
# (non-Serverless DPB services only).
764777
'dpb_cluster_duration': (self.GetClusterDuration(), 'seconds'),
@@ -805,6 +818,9 @@ def _Delete(self) -> None:
805818
def GetClusterCreateTime(self) -> float | None:
806819
return None
807820

821+
def GetServiceReportedClusterCreateTime(self) -> float | None:
822+
return None
823+
808824
def GetClusterDuration(self) -> float | None:
809825
return None
810826

perfkitbenchmarker/providers/aws/aws_dpb_emr.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import json
2323
import logging
2424
import os
25+
import time
2526
from typing import Any, Dict
2627

2728
from absl import flags
@@ -39,7 +40,6 @@
3940
from perfkitbenchmarker.providers.aws import s3
4041
from perfkitbenchmarker.providers.aws import util
4142

42-
4343
FLAGS = flags.FLAGS
4444
flags.DEFINE_string(
4545
'dpb_emr_release_label', None, 'DEPRECATED use dpb_service.version.'
@@ -197,8 +197,8 @@ def __init__(self, dpb_service_spec):
197197
self.storage_service = s3.S3Service()
198198
self.storage_service.PrepareService(self.region)
199199
self.bucket_to_delete = None
200-
self._cluster_create_time: float | None = None
201-
self._cluster_ready_time: float | None = None
200+
self._service_reported_cluster_create_time: float | None = None
201+
self._service_reported_cluster_ready_time: float | None = None
202202
self._cluster_delete_time: float | None = None
203203
if not self.GetDpbVersion():
204204
raise errors.Setup.InvalidSetupError(
@@ -212,17 +212,26 @@ def persistent_fs_prefix(self) -> str | None:
212212
def GetDpbVersion(self) -> str | None:
213213
return FLAGS.dpb_emr_release_label or super().GetDpbVersion()
214214

215-
def GetClusterCreateTime(self) -> float | None:
216-
"""Returns the cluster creation time.
215+
def GetServiceReportedClusterCreateTime(self) -> float | None:
216+
"""Returns the cluster creation time as reported by the service.
217217
218218
On this implementation, the time returned is based on the timestamps
219-
reported by the EMR API (which is stored in the _cluster_create_time
219+
reported by the EMR API (which is stored in the
220+
_service_reported_cluster_create_time
220221
attribute).
221222
222223
Returns:
223224
A float representing the creation time in seconds or None.
224225
"""
225-
return self._cluster_ready_time - self._cluster_create_time
226+
if (
227+
self._service_reported_cluster_create_time is None
228+
or self._service_reported_cluster_ready_time is None
229+
):
230+
return None
231+
return (
232+
self._service_reported_cluster_ready_time
233+
- self._service_reported_cluster_create_time
234+
)
226235

227236
@property
228237
def security_group_id(self):
@@ -397,9 +406,11 @@ def _IsReady(self):
397406
# TODO(saksena): Handle error outcomees when spinning up emr clusters
398407
is_ready = result['Cluster']['Status']['State'] == READY_STATE
399408
if is_ready:
400-
self._cluster_create_time, self._cluster_ready_time = (
401-
self._ParseClusterCreateTime(result)
402-
)
409+
(
410+
self._service_reported_cluster_create_time,
411+
self._service_reported_cluster_ready_time,
412+
) = self._ParseClusterCreateTime(result)
413+
self.resource_ready_time = time.time()
403414
return is_ready
404415

405416
@classmethod
@@ -575,8 +586,7 @@ def _FetchLogs(self, step_id: str) -> str | None:
575586
's3',
576587
'cp',
577588
os.path.join(
578-
self.base_dir,
579-
f'{self.cluster_id}/steps/{step_id}/stderr.gz'
589+
self.base_dir, f'{self.cluster_id}/steps/{step_id}/stderr.gz'
580590
),
581591
local_stdout_path,
582592
]
@@ -615,7 +625,7 @@ def __init__(self, dpb_service_spec):
615625
self.cmd_prefix += ['--region', self.region]
616626
self.storage_service = s3.S3Service()
617627
self.storage_service.PrepareService(self.region)
618-
self._cluster_create_time = None
628+
self._service_reported_cluster_create_time = None
619629
if not self.GetDpbVersion():
620630
raise errors.Setup.InvalidSetupError(
621631
'dpb_service.version must be provided. Versions follow the format: '

perfkitbenchmarker/providers/gcp/gcp_dpb_dataproc.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import logging
2323
import os
2424
import re
25+
import time
2526
from typing import Any, Dict, Tuple
2627

2728
from absl import flags
@@ -88,8 +89,8 @@ def __init__(self, dpb_service_spec):
8889
self.region = self.dpb_service_zone.rsplit('-', 1)[0]
8990
self.storage_service = gcs.GoogleCloudStorageService()
9091
self.storage_service.PrepareService(location=self.region)
91-
self._cluster_create_time: float | None = None
92-
self._cluster_ready_time: float | None = None
92+
self._service_reported_cluster_create_time: float | None = None
93+
self._service_reported_cluster_ready_time: float | None = None
9394
self._cluster_delete_time: float | None = None
9495

9596
@property
@@ -179,19 +180,26 @@ def _InitializeMetadata(self) -> None:
179180
gcp_flags.GCP_DATAPROC_LIGHTNING_ENGINE_RUNTIME.value
180181
)
181182

182-
def GetClusterCreateTime(self) -> float | None:
183-
"""Returns the cluster creation time.
183+
def GetServiceReportedClusterCreateTime(self) -> float | None:
184+
"""Returns the cluster creation time as reported by the service.
184185
185186
On this implementation, the time returned is based on the timestamps
186-
reported by the Dataproc API (which is stored in the _cluster_create_time
187+
reported by the Dataproc API (which is stored in the
188+
_service_reported_cluster_create_time
187189
attribute).
188190
189191
Returns:
190192
A float representing the creation time in seconds or None.
191193
"""
192-
if self._cluster_create_time is None or self._cluster_ready_time is None:
194+
if (
195+
self._service_reported_cluster_create_time is None
196+
or self._service_reported_cluster_ready_time is None
197+
):
193198
return None
194-
return self._cluster_ready_time - self._cluster_create_time
199+
return (
200+
self._service_reported_cluster_ready_time
201+
- self._service_reported_cluster_create_time
202+
)
195203

196204
def _Create(self):
197205
"""Creates the cluster."""
@@ -293,13 +301,16 @@ def _Create(self):
293301
cmd.flags['labels'] = util.MakeFormattedDefaultTags()
294302
timeout = 900 # 15 min
295303
stdout, stderr, retcode = cmd.Issue(timeout=timeout, raise_on_failure=False)
296-
self._cluster_create_time, self._cluster_ready_time = (
297-
self._ParseClusterCreateTime(stdout)
298-
)
304+
(
305+
self._service_reported_cluster_create_time,
306+
self._service_reported_cluster_ready_time,
307+
) = self._ParseClusterCreateTime(stdout)
299308
if retcode:
300309
util.CheckGcloudResponseKnownFailures(stderr, retcode)
301310
raise errors.Resource.CreationError(stderr)
302311

312+
self.resource_ready_time = time.time()
313+
303314
@classmethod
304315
def _ParseClusterCreateTime(
305316
cls, stdout: str

0 commit comments

Comments
 (0)