{% extends layout %}{% import 'ui/kit.html' as kit %} {% block title %}amebo - deployment{% endblock %} {% block content %} {%- if d is none %}

Deployment not found

No deployment exists under that id.

{%- else %}
Deployments/{{ d.short_sha or d.version or d.deploy }}

{{ d.title or d.repository }}

{% include 'ui/automate/_deploy_chips.html' %} {{ d.status or 'unknown' }}
{{ d.author or 'unknown' }}
deployed by
{{ d.ts|ago }}
when
{%- if not d.service %}

Impact no service matched

No reporting service matches the repository {{ d.repository }}. amebo matches a repo tail against a service.name, so either the service is not exporting telemetry yet or the two are named differently. Setting service.name to the repository's short name is the usual fix.

{%- elif not d.after or (d.after.count == 0 and d.before.count == 0) %}

Impact no telemetry in the window

{{ d.service }} reported no spans either side of this deploy, so there is nothing to compare.

{%- else %} {%- set b, a = d.before, d.after %}

Impact on {{ d.service }} equal windows either side ({{ ((d.window[2] - d.window[1]) // 60) or 1 }} min each), from the same histograms

signalbeforeafterchange
throughput{{ b.count }}{{ a.count }}{{ delta(b.count, a.count, True) }}
error rate{{ rate_text(b.errors, b.count) }}{{ rate_text(a.errors, a.count) }}{{ delta(rate10(b.errors, b.count), rate10(a.errors, a.count), False) }}
p50{{ dur_text(b.p50_us) }}{{ dur_text(a.p50_us) }}{{ delta(b.p50_us, a.p50_us, False) }}
p95{{ dur_text(b.p95_us) }}{{ dur_text(a.p95_us) }}{{ delta(b.p95_us, a.p95_us, False) }}
p99{{ dur_text(b.p99_us) }}{{ dur_text(a.p99_us) }}{{ delta(b.p99_us, a.p99_us, False) }}
slowest span{{ dur_text(b.max_us) }}{{ dur_text(a.max_us) }}{{ delta(b.max_us, a.max_us, False) }}
{%- endif %}
{%- if not impacts %}

Contracts nothing registered

No application in the catalog owns actions matching this repository, so there is no contract to check. Register the service as an application and its actions become part of this view.

{%- else %}

Contracts what this deploy did to the promises {{ d.application }} makes

{%- if stale_total > 0 or failed_total > 0 %}
{{ stale_total }} consumer{{ '' if stale_total == 1 else 's' }} still subscribed to a deprecated or retired action, and {{ failed_total }} deliver{{ 'y' if failed_total == 1 else 'ies' }} dead-lettered after this deploy landed. That is migration debt this deploy just made urgent.
{%- else %}

Every consumer is on an active version and nothing dead-lettered after this deploy.

{%- endif %}
{% for i in impacts %} {% endfor %}
actionversionstatusconsumersstaleevents sincedead-lettered
{{ i.action }} {{ i.version }} {% if i.status == 'active' %}active{% elif i.status == 'deprecated' %}deprecated {{ i.successor }}{% else %}retired{% endif %} {{ i.consumers }} {% if i.stale_consumers %}{{ i.stale_consumers }}{% else %}0{% endif %} {{ i.events_after }} {% if i.failed_after %}{{ i.failed_after }}{% else %}0{% endif %}
{%- endif %}
{%- if issues %}

Issues first seen after this deploy grouped by fingerprint, so a refactor does not fork one

{% for i in issues %} {% endfor %}
issueeventsfirst seen
{%- endif %} {%- if versions %}

Versions reporting last 24 hours, from service.version on the OTel resource

{% for v in versions %} {% endfor %}
versionspanserrorsp50p95p99last seen
{{ v.version }} {{ v.count }} {{ err_cell(v.errors, v.count) }} {{ dur_text(v.p50_us) }} {{ dur_text(v.p95_us) }} {{ dur_text(v.p99_us) }} {{ v.last_ts|ago }}
{%- endif %}

This deploy as an event it is on the ledger like anything else

Delivered to every subscriber of vcs.v1.{{ d.kind }}, with retries and dead-lettering, replayable and backfillable. {%- if d.event %} Open its full lifecycle timeline. {%- endif %}

{{ kit.kv([('repository', d.repository), ('application', d.application or '-'), ('ref', d.ref or '-'), ('sha', d.sha or '-'), ('event', d.event or '-'), ('received', d.ts|when)]) }} {%- if d.url and (d.url.startswith('https://') or d.url.startswith('http://')) %}

View at {{ d.provider }}

{% endif %}
{%- endif %} {% endblock %}