Describe the bug
I am experiencing a persistent restart loop in Gatus where the server shuts down and restarts every few minutes, citing configuration changes that have not occurred. This instability appears to be interfering with the alerting system, as Slack notifications are not being dispatched when endpoints fail.
What do you see?
The logs show that Gatus detects a configuration change almost every minute:
[main.listenToConfigurationFileChanges] Configuration file has been modified
This triggers a graceful shutdown:
[controller.Handle] Server has shut down successfully
Because the server is constantly restarting and canceling current executions, the alerting logic for failing endpoints never seems to complete or fire the Slack webhook.
Relevant logs:
2026/05/07 12:46:33 [watchdog.executeEndpoint] Monitored group=core; endpoint=test; key=core_test; success=false; errors=0; duration=22ms; body={"status":"healthy", ...}
2026/05/07 12:46:33 [main.listenToConfigurationFileChanges] Configuration file has been modified
2026/05/07 12:46:33 [watchdog.monitorEndpoint] Canceling current execution of group=core; endpoint=test; key=core_test
2026/05/07 12:46:33 [controller.Handle] Server has shut down successfully
2026/05/07 12:46:34 [config.LoadConfiguration] Reading configuration from configFile=config/config.yaml
What do you expect to see?
In the end: An alert in slack. But I guess this is due to the server restarts so I think the goal would be that the server does not restart unless there are real changes
List the steps that must be taken to reproduce this issue
- Deploy Gatus to a Containerized Environment: Use a platform like Google Cloud Run or Kubernetes where the configuration file (config.yaml) is mounted via a volume or sidecar.
- Configure an Endpoint to Fail: Create an endpoint with a condition that is guaranteed to fail, ensuring it is linked to a Slack alert.
endpoints:
- name: reproduction-test
url: "https://somethingwhichfails.comm"
interval: 30s
conditions:
- "[BODY].test == ok"
alerts:
- type: slack
I have set this up in Google Secret Manager and Gatus itself is running in one instance (exactly one, no autoscalling) in Google Cloud Run.
3. Observe the Race Condition: Monitor the logs. Note that the moment the watcher detects a change, it initiates a Server has shut down successfully sequence.
4. Check for Alerts: Observe that because the watchdog.monitorEndpoint execution is canceled immediately after the failure is detected, the Slack notification is never dispatched.
Version
v5.35.0
Additional information
I guess the reason the Slack alerts aren't working is that Gatus is killing itself the exact same millisecond it realizes the test failed.
In my logs:
14:46:33.243: core_test fails.
14:46:33.331: (Less than 100ms later) Gatus sees a "config change" and starts the shutdown.
14:46:33.332: It logs Canceling current execution. This kills the alert before it even leaves the server.
Now the question is why this change is getting triggered.
Describe the bug
I am experiencing a persistent restart loop in Gatus where the server shuts down and restarts every few minutes, citing configuration changes that have not occurred. This instability appears to be interfering with the alerting system, as Slack notifications are not being dispatched when endpoints fail.
What do you see?
The logs show that Gatus detects a configuration change almost every minute:
[main.listenToConfigurationFileChanges] Configuration file has been modifiedThis triggers a graceful shutdown:
[controller.Handle] Server has shut down successfullyBecause the server is constantly restarting and canceling current executions, the alerting logic for failing endpoints never seems to complete or fire the Slack webhook.
Relevant logs:
What do you expect to see?
In the end: An alert in slack. But I guess this is due to the server restarts so I think the goal would be that the server does not restart unless there are real changes
List the steps that must be taken to reproduce this issue
I have set this up in Google Secret Manager and Gatus itself is running in one instance (exactly one, no autoscalling) in Google Cloud Run.
3. Observe the Race Condition: Monitor the logs. Note that the moment the watcher detects a change, it initiates a Server has shut down successfully sequence.
4. Check for Alerts: Observe that because the watchdog.monitorEndpoint execution is canceled immediately after the failure is detected, the Slack notification is never dispatched.
Version
v5.35.0
Additional information
I guess the reason the Slack alerts aren't working is that Gatus is killing itself the exact same millisecond it realizes the test failed.
In my logs:
14:46:33.243: core_test fails.14:46:33.331: (Less than 100ms later) Gatus sees a "config change" and starts the shutdown.14:46:33.332: It logs Canceling current execution. This kills the alert before it even leaves the server.Now the question is why this change is getting triggered.