argocd-notifications-controller). This integration provides an argocd-notifications-cm configuration with one webhook service, one request body template, and one trigger. Each sync operation of an Argo CD Application becomes one Flashduty change: it is recorded as Processing when the sync starts and updated to Done, Failed, or Canceled when it ends.
Automated syncs, manual syncs from the UI or CLI, and rollbacks are all sync operations and are all recorded. For sync-failed and health-degraded alerts, use the Argo CD alert integration; both integrations can be configured side by side.
In Flashduty On-call
- In the Flashduty console, go to Integration Center → Change Events
- Select Argo CD and enter an integration name
- To assign changes to specific channels, add rules under the integration’s Routes that match labels such as
application,project, ordestination_namespace - Click Save and copy the generated Push URL
Configure Argo CD
The steps below need Kubernetes permission to edit ConfigMaps in the Argo CD namespace (
argocd by default) and to edit annotations on Applications or AppProjects. The Argo CD cluster must be able to reach the domain of the push URL.
1
Add the webhook service, template, and trigger
Save the following as Merge it into the existing If Argo CD is installed with the Helm chart, put
flashduty-change.yaml and replace url with the push URL copied above (including ?integration_key=...):argocd-notifications-cm (--type merge only adds or updates the keys above and leaves the rest of the configuration alone):service.webhook.flashduty-change under notifications.notifiers, the template under notifications.templates, and the trigger under notifications.triggers; otherwise the next upgrade overwrites manual edits.Notes:- Every value in the template is escaped with
toJson, so quotes and line breaks in sync messages cannot break the JSON. Do not remove it. Do not rename fields;app_uid,phase, andstarted_atare required - Optional fields are read with
dig, so the template renders even when the application has never synced or the sync has no result yet - The two trigger conditions cover the start and the end of a sync.
oncePeris the sync operation’s start time, so the start and the end of every sync operation are each sent once, even when Argo CD does not observe the state between two consecutive syncs. Do not remove it - The service name
flashduty-changediffers fromflashdutyused by the alert integration, so the two integrations’ push URLs do not interfere argocd_urlcomes fromcontext.argocdUrlinargocd-notifications-cmand is used to build the change link. Without it, changes have no link but are still recorded
2
Subscribe to notifications
A trigger sends only after it is subscribed. Choose one scope:
-
One application: add an annotation to the Application
-
All applications in a project: add the same annotation
notifications.argoproj.io/subscribe.on-flashduty-change.flashduty-change: ""to the AppProject’smetadata.annotations -
All applications: add an entry to
subscriptionsinargocd-notifications-cm. Ifsubscriptionsalready exists (for example the entry added by the alert integration), append to the existing list instead of overwriting it with the merge command above
3
Test connectivity
Argo CD has no button for sending a test message. From the The command prints debug logs of the request and response, including the full push URL with its
argocd-notifications-controller Pod, use argocd admin notifications template notify to send one notification based on the application’s current state:integration_key, so do not paste the output anywhere public. A 200 OK status on the Received response: line means Flashduty accepted the request. For an application that has synced before, this notification is the result of its latest sync and merges into that sync’s existing record without adding a change; for an application that has never synced, Flashduty ignores it.4
Verify sync records
Sync a subscribed application (click Sync in the UI, or run
argocd app sync <app name>). Confirm that a Processing change appears in the Flashduty change list and is updated to Done or Failed when the sync ends.What one change is
One change is one sync operation of one application. Its change key (change_key) is
<app_uid>/<started_at>:
app_uidis the application’smetadata.uid. Kubernetes assigns every object a UID that is unique over the whole lifetime of the cluster, so same-named applications in different Argo CD instances, and an application deleted and recreated, are different applicationsstarted_atis the sync operation’s start time (status.operationState.startedAt, recorded in UTC). Argo CD writes it when the sync starts and keeps it through retries, and an application runs only one sync operation at a time
app_uid or started_at, or whose times are not in RFC 3339 format.
Status mapping
Done, Failed, and Canceled are end states; Flashduty records the change’s end time. An operation that Argo CD terminates because of the sync timeout (the message contains
triggered by controller sync timeout) is recorded as Failed.
Sync phases are case-sensitive, and other values are rejected. The following deliveries return success without creating a change: an application with no sync operation yet (empty phase), and dry-run syncs.
The recorded time is started_at when a sync starts and finished_at when it ends. While Argo CD retries a failed sync automatically, the phase stays Running, so the change is not marked Failed early.
Change content
- Title:
<app name>: sync <revision> to <destination namespace>. A Git commit shows its first 7 characters; other values, such as a Helm chart version, are shown as is. The revision or destination namespace part is omitted when empty - Link:
<argocdUrl>/applications/<app name>, only whencontext.argocdUrlis configured
Empty fields are not written as labels.
FAQ
Why are no changes received?
Why are no changes received?
- Check the
argocd-notifications-controllerlogs (kubectl logs -n argocd deploy/argocd-notifications-controller) and confirm that the application has thenotifications.argoproj.io/subscribe.on-flashduty-change.flashduty-changeannotation, or thatsubscriptionsincludeson-flashduty-change - If the logs show
template 'flashduty-change' is not supportedortrigger 'on-flashduty-change' is not configured, confirm the configuration is inargocd-notifications-cm; for Helm installs, check the corresponding values
Only the end of a sync arrived, not the start?
Only the end of a sync arrived, not the start?
When a sync finishes within a few seconds, Argo CD may not observe the
Running phase and sends only the end notification. Flashduty records the change directly in its end state.Is the same notification recorded twice if it is sent again?
Is the same notification recorded twice if it is sent again?
No. An event with the same phase and the same time is recorded only once.
The logs show failed with error code 400?
The logs show failed with error code 400?
Confirm the template matches this page and every value goes through
toJson. The response names the missing or unsupported field, such as app_uid is missing, started_at is missing, or unsupported phase.