Skip to content

Commit e85d8dd

Browse files
committed
use what we have!
1 parent efe1838 commit e85d8dd

5 files changed

Lines changed: 38 additions & 125 deletions

File tree

cabotage/celery/tasks/build.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,6 @@ def run_image_build(image_id=None, buildkit=False):
11091109
raise KeyError(f"Image with ID {image_id} not found!")
11101110

11111111
image.build_job_id = secrets.token_hex(4)
1112-
image.started_at = datetime.datetime.utcnow()
11131112

11141113
# Create a GitHub check run at the start of the pipeline
11151114
application = image.application
@@ -1179,7 +1178,6 @@ def run_image_build(image_id=None, buildkit=False):
11791178
db.session.add(image)
11801179
image.error = True
11811180
image.error_detail = str(exc)
1182-
image.completed_at = datetime.datetime.utcnow()
11831181
db.session.commit()
11841182
from cabotage.celery.metrics import record_image_metrics
11851183

@@ -1207,8 +1205,6 @@ def run_image_build(image_id=None, buildkit=False):
12071205
except Exception: # nosec B110
12081206
pass
12091207
db.session.add(image)
1210-
if not image.completed_at:
1211-
image.completed_at = datetime.datetime.utcnow()
12121208
if not image.error:
12131209
image.error = True
12141210
image.error_detail = "Image build failed due to an internal error"
@@ -1228,7 +1224,6 @@ def run_image_build(image_id=None, buildkit=False):
12281224
image.image_id = build_metadata["image_id"]
12291225
image.processes = build_metadata["processes"]
12301226
image.built = True
1231-
image.completed_at = datetime.datetime.utcnow()
12321227
if image.image_metadata is None:
12331228
image.image_metadata = {
12341229
"dockerfile_env_vars": build_metadata["dockerfile_env_vars"]
@@ -1300,7 +1295,6 @@ def run_release_build(release_id=None):
13001295
release.release_metadata = {}
13011296

13021297
release.build_job_id = secrets.token_hex(4)
1303-
release.started_at = datetime.datetime.utcnow()
13041298
db.session.add(release)
13051299
db.session.commit()
13061300

@@ -1316,7 +1310,6 @@ def run_release_build(release_id=None):
13161310
build_metadata = build_release_buildkit(release)
13171311
release.release_id = build_metadata["release_id"]
13181312
release.built = True
1319-
release.completed_at = datetime.datetime.utcnow()
13201313
if (
13211314
"installation_id" in release.release_metadata
13221315
and "statuses_url" in release.release_metadata
@@ -1333,7 +1326,6 @@ def run_release_build(release_id=None):
13331326
except (BuildError, TemplateResolutionError) as exc:
13341327
release.error = True
13351328
release.error_detail = str(exc)
1336-
release.completed_at = datetime.datetime.utcnow()
13371329
try:
13381330
log_key = stream_key("release", release.build_job_id)
13391331
redis_client = get_redis_client(current_app.config["CELERY_BROKER_URL"])
@@ -1373,7 +1365,6 @@ def run_release_build(release_id=None):
13731365
pass
13741366
release.error = True
13751367
release.error_detail = "Release build failed due to an internal error"
1376-
release.completed_at = datetime.datetime.utcnow()
13771368
db.session.add(release)
13781369
db.session.commit()
13791370
if (

cabotage/celery/tasks/deploy.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,11 +1587,8 @@ def _run_job_streaming(
15871587

15881588

15891589
def deploy_release(deployment):
1590-
import datetime
1591-
15921590
job_id = secrets.token_hex(4)
15931591
deployment.job_id = job_id
1594-
deployment.started_at = datetime.datetime.utcnow()
15951592
db.session.add(deployment)
15961593
db.session.commit()
15971594
deploy_log = []
@@ -1886,12 +1883,10 @@ def log(msg):
18861883
else:
18871884
log(f"Release command {postdeploy_command} complete!")
18881885
deployment.complete = True
1889-
deployment.completed_at = datetime.datetime.utcnow()
18901886
log(f"Deployment {deployment.id} complete")
18911887
except DeployError as exc:
18921888
deployment.error = True
18931889
deployment.error_detail = str(exc)
1894-
deployment.completed_at = datetime.datetime.utcnow()
18951890
if (
18961891
deployment.deploy_metadata
18971892
and "installation_id" in deployment.deploy_metadata
@@ -1926,7 +1921,6 @@ def log(msg):
19261921
except Exception as exc:
19271922
deployment.error = True
19281923
deployment.error_detail = "Deploy failed due to an internal error"
1929-
deployment.completed_at = datetime.datetime.utcnow()
19301924
if (
19311925
deployment.deploy_metadata
19321926
and "installation_id" in deployment.deploy_metadata
@@ -2016,9 +2010,6 @@ def log(msg):
20162010

20172011

20182012
def fake_deploy_release(deployment):
2019-
import datetime as _dt
2020-
2021-
deployment.started_at = _dt.datetime.utcnow()
20222013
deploy_log = []
20232014
namespace = render_namespace(deployment.release_object)
20242015
deploy_log.append(f"Creating Namespace/{namespace.metadata.name}")
@@ -2146,7 +2137,7 @@ def fake_deploy_release(deployment):
21462137
)
21472138
deploy_log.append(yaml.dump(remove_none(deployment_object.to_dict())))
21482139
deployment.deploy_log = "\n".join(deploy_log)
2149-
deployment.completed_at = _dt.datetime.utcnow()
2140+
deployment.complete = True
21502141
db.session.commit()
21512142

21522143
from cabotage.celery.metrics import record_deploy_metrics

cabotage/server/models/projects.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -686,15 +686,13 @@ class Deployment(db.Model, Timestamp):
686686
db.String(64),
687687
nullable=True,
688688
)
689-
started_at = db.Column(db.DateTime, nullable=True)
690-
completed_at = db.Column(db.DateTime, nullable=True)
691689

692690
__mapper_args__ = {"version_id_col": version_id}
693691

694692
@property
695693
def duration_seconds(self):
696-
if self.started_at and self.completed_at:
697-
return (self.completed_at - self.started_at).total_seconds()
694+
if (self.complete or self.error) and self.created and self.updated:
695+
return (self.updated - self.created).total_seconds()
698696
return None
699697

700698
@property
@@ -800,15 +798,13 @@ class Release(db.Model, Timestamp):
800798
nullable=True,
801799
server_default=None,
802800
)
803-
started_at = db.Column(db.DateTime, nullable=True)
804-
completed_at = db.Column(db.DateTime, nullable=True)
805801

806802
__mapper_args__ = {"version_id_col": version_id}
807803

808804
@property
809805
def duration_seconds(self):
810-
if self.started_at and self.completed_at:
811-
return (self.completed_at - self.started_at).total_seconds()
806+
if (self.built or self.error) and self.created and self.updated:
807+
return (self.updated - self.created).total_seconds()
812808
return None
813809

814810
@property
@@ -1246,8 +1242,6 @@ class Image(db.Model, Timestamp):
12461242
db.String(64),
12471243
nullable=True,
12481244
)
1249-
started_at = db.Column(db.DateTime, nullable=True)
1250-
completed_at = db.Column(db.DateTime, nullable=True)
12511245

12521246
__mapper_args__ = {"version_id_col": version_id}
12531247
__table_args__ = (
@@ -1259,8 +1253,8 @@ class Image(db.Model, Timestamp):
12591253

12601254
@property
12611255
def duration_seconds(self):
1262-
if self.started_at and self.completed_at:
1263-
return (self.completed_at - self.started_at).total_seconds()
1256+
if (self.built or self.error) and self.created and self.updated:
1257+
return (self.updated - self.created).total_seconds()
12641258
return None
12651259

12661260
@property

cabotage/server/user/views.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4304,6 +4304,13 @@ def _pipeline_range_start(range_param):
43044304
return datetime.datetime.utcnow() - datetime.timedelta(days=days)
43054305

43064306

4307+
def _terminal_condition(table):
4308+
"""SQL condition for rows in a terminal state (built/complete or error)."""
4309+
if table == "deployments":
4310+
return "(complete = true OR error = true)"
4311+
return "(built = true OR error = true)"
4312+
4313+
43074314
@user_blueprint.route(
43084315
"/projects/<org_slug>/<project_slug>/env/<env_slug>/applications/<app_slug>/pipeline",
43094316
)
@@ -4348,12 +4355,13 @@ def project_application_pipeline_stats(org_slug, project_slug, app_slug, env_slu
43484355
# -- Throughput by day --
43494356
throughput_rows = db.session.execute(
43504357
sa_text(
4351-
"SELECT date_trunc('day', completed_at) AS day,"
4358+
"SELECT date_trunc('day', updated) AS day,"
43524359
" count(*) FILTER (WHERE complete = true) AS success,"
43534360
" count(*) FILTER (WHERE error = true) AS failure"
43544361
" FROM deployments"
43554362
" WHERE application_environment_id = :ae_id"
4356-
" AND completed_at >= :start AND completed_at IS NOT NULL"
4363+
" AND (complete = true OR error = true)"
4364+
" AND updated >= :start"
43574365
" GROUP BY day ORDER BY day"
43584366
),
43594367
{"ae_id": ae_id, "start": start},
@@ -4372,16 +4380,16 @@ def project_application_pipeline_stats(org_slug, project_slug, app_slug, env_slu
43724380
def _duration_percentiles(table):
43734381
return db.session.execute(
43744382
sa_text(
4375-
f"SELECT date_trunc('day', completed_at) AS day,"
4383+
f"SELECT date_trunc('day', updated) AS day,"
43764384
f" percentile_cont(0.5) WITHIN GROUP"
4377-
f" (ORDER BY extract(epoch FROM completed_at - started_at)) AS p50,"
4385+
f" (ORDER BY extract(epoch FROM updated - created)) AS p50,"
43784386
f" percentile_cont(0.95) WITHIN GROUP"
4379-
f" (ORDER BY extract(epoch FROM completed_at - started_at)) AS p95,"
4380-
f" avg(extract(epoch FROM completed_at - started_at)) AS avg_dur"
4387+
f" (ORDER BY extract(epoch FROM updated - created)) AS p95,"
4388+
f" avg(extract(epoch FROM updated - created)) AS avg_dur"
43814389
f" FROM {table}" # nosec B608 — table from hardcoded list
43824390
f" WHERE application_environment_id = :ae_id"
4383-
f" AND started_at IS NOT NULL AND completed_at IS NOT NULL"
4384-
f" AND completed_at >= :start"
4391+
f" AND {_terminal_condition(table)}"
4392+
f" AND updated >= :start"
43854393
f" GROUP BY day ORDER BY day"
43864394
),
43874395
{"ae_id": ae_id, "start": start},
@@ -4458,15 +4466,15 @@ def _duration_percentiles(table):
44584466
summary_row = db.session.execute(
44594467
sa_text(
44604468
"SELECT"
4461-
" avg(extract(epoch FROM completed_at - started_at)) AS avg_dur,"
4469+
" avg(extract(epoch FROM updated - created)) AS avg_dur,"
44624470
" percentile_cont(0.5) WITHIN GROUP"
4463-
" (ORDER BY extract(epoch FROM completed_at - started_at)) AS p50,"
4471+
" (ORDER BY extract(epoch FROM updated - created)) AS p50,"
44644472
" percentile_cont(0.95) WITHIN GROUP"
4465-
" (ORDER BY extract(epoch FROM completed_at - started_at)) AS p95"
4473+
" (ORDER BY extract(epoch FROM updated - created)) AS p95"
44664474
" FROM deployments"
44674475
" WHERE application_environment_id = :ae_id"
4468-
" AND started_at IS NOT NULL AND completed_at IS NOT NULL"
4469-
" AND completed_at >= :start"
4476+
" AND (complete = true OR error = true)"
4477+
" AND updated >= :start"
44704478
),
44714479
{"ae_id": ae_id, "start": start},
44724480
).fetchone()
@@ -4550,8 +4558,8 @@ def project_application_pipeline_runs(org_slug, project_slug, app_slug, env_slug
45504558
img = image_by_id.get(img_id) if img_id else None
45514559

45524560
total = None
4553-
if img and img.started_at and d.completed_at:
4554-
total = round((d.completed_at - img.started_at).total_seconds(), 2)
4561+
if img and img.created and d.updated and (d.complete or d.error):
4562+
total = round((d.updated - img.created).total_seconds(), 2)
45554563

45564564
runs.append(
45574565
{
@@ -4627,14 +4635,18 @@ def project_application_pipeline_slowest(
46274635
}
46284636
model = model_map.get(stage, Image)
46294637

4638+
terminal = (
4639+
(model.complete == True) | (model.error == True) # noqa: E712
4640+
if model is Deployment
4641+
else (model.built == True) | (model.error == True) # noqa: E712
4642+
)
46304643
rows = (
46314644
model.query.filter(
46324645
model.application_environment_id == app_env.id,
4633-
model.started_at.isnot(None),
4634-
model.completed_at.isnot(None),
4635-
model.completed_at >= start,
4646+
terminal,
4647+
model.updated >= start,
46364648
)
4637-
.order_by(desc(model.completed_at - model.started_at))
4649+
.order_by(desc(model.updated - model.created))
46384650
.limit(10)
46394651
.all()
46404652
)

migrations/versions/d3a1f7b2c4e5_add_pipeline_timing_columns.py

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)