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. Flashduty records it as Processing when the sync starts and updates it to Done, Failed, or Canceled when it ends.
Automated syncs, manual syncs from the UI or CLI, and rollbacks are all sync operations, and Flashduty records them all. 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. It makes Argo CD send each sync’s start and end once, even when it misses the state between two consecutive syncs. Don’t 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 synced before, this notification carries its latest sync result. It merges into that sync’s existing record and adds no change. For an application that 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 that it updates to Done or Failed when the sync ends.How changes are merged
One change is one sync operation of one application:- The start, failed retries, and final result of one sync update the same change
- Two syncs of one application are two changes, even for the same revision
- Same-named applications in different Argo CD instances, and applications deleted and recreated, are never merged
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) becomes Failed.
Sync phases are case-sensitive, and Flashduty rejects other values. 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. Flashduty records an event with the same phase and the same time 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.