콘텐츠로 이동

10. 실행과 모니터링

자동화는 만드는 것보다 조용히 멈춘 걸 알아채는 것이 어렵습니다. 이 문서는 그 부분을 다룹니다.


대시보드 — 전체 상황 보기

로그인 후 처음 보이는 화면입니다.

지표
전체 워크플로우 만들어둔 워크플로우 수
전체 실행 지금까지 실행된 총 횟수
성공률 성공률
진행 중 실행 지금 돌고 있는 실행 수

아래 최근 실행에 최근 실행이 나옵니다. 성공률이 갑자기 떨어졌다면 여기부터 보세요.


실행 이력 보기

워크플로우 상세 → 개요 탭 아래쪽에 그 워크플로우의 실행 이력이 있습니다.

실행 하나를 클릭하면 노드별로 이런 걸 볼 수 있습니다.

  • 각 노드의 상태 (성공/실패/재시도 중)
  • 그 노드가 받은 입력
  • 그 노드가 낸 출력
  • 실패했다면 에러 메시지

디버깅의 90%는 여기서 끝납니다. 실패한 노드의 바로 앞 노드 출력을 보면 표현식 경로가 틀렸는지, 값이 비어 있었는지 대부분 바로 보입니다.

상태 읽기

실행 전체

상태
RUNNING 돌고 있음
COMPLETED 끝까지 성공
FAILED 도중에 실패
CANCELLED 취소됨

노드 하나하나

상태
PENDING 차례를 기다리는 중
RUNNING 실행 중
COMPLETED 성공
FAILED 실패
RETRYING 재시도 중
CANCELLED 실행이 실패로 끝나면서 정리됨
SKIPPED 조건 분기에서 선택되지 않아 실행되지 않음

CANCELLED는 그 노드 자체의 문제가 아닙니다. 다른 노드가 실패해서 실행이 종료될 때 아직 돌고 있던 노드가 정리된 상태입니다. 진짜 원인은 FAILED 노드에 있습니다.

SKIPPED정상입니다. CONDITIONAL이 다른 가지를 골라서 이쪽 길이 안 쓰인 것뿐입니다. JOINTLOOP_ENDSKIPPED를 "끝난 것"으로 인정하므로 실행이 여기서 멈추지 않습니다. → 06. 흐름 제어


재시도와 타임아웃

외부 API는 가끔 실패합니다. 일시적인 실패로 자동화 전체가 멈추지 않도록 두 가지 장치가 있습니다.

- id: fetch-orders
  name: 주문 조회
  type: CALL
  integration: http_request
  timeout: 10s
  retry-policy:
    max-attempts: 3
    backoff:
      type: EXPONENTIAL
      initial-delay: 500ms
      multiplier: 2.0
      max-delay: 10s
    retry-on: ["429", "5xx"]
  input:
    ...

timeout — 언제까지 기다릴지

timeout: 10s

이 시간을 넘으면 노드를 실패 처리합니다. 쓸 수 있는 형식은 500ms · 10s · 5m 입니다 (숫자 + ms/s/m).

노드 종류 권장
빠른 API 조회 5s ~ 10s
무거운 조회·리포트 API 30s ~ 1m
AI 호출 (llm_chat) 30s ~ 2m

타임아웃을 안 걸면 응답 없는 API를 하염없이 기다리다 실행이 오래 매달릴 수 있습니다. 외부 호출에는 걸어두는 편이 좋습니다.

retry-policy — 몇 번 다시 해볼지

항목 필수 설명
max-attempts 최대 시도 횟수 (최초 시도 포함). 3이면 최초 1회 + 재시도 2회
backoff.type FIXED (매번 같은 간격) 또는 EXPONENTIAL (점점 길게)
backoff.initial-delay 첫 재시도까지 대기 시간
backoff.multiplier EXPONENTIAL일 때 배수. 기본 2.0
backoff.max-delay 대기 시간 상한
retry-on 어떤 실패일 때 재시도할지. 비우면 재시도 가능한 실패 전부

EXPONENTIALinitial-delay: 500ms, multiplier: 2.0이면 대기 시간이 500ms → 1s → 2s → 4s로 늘어납니다.

⚠️ retry-on 은 두 종류를 따로 거릅니다

retry-on에 쓸 수 있는 값은 두 갈래이고, 각 갈래는 서로를 건드리지 않습니다.

갈래 쓸 수 있는 값
HTTP 상태 "429" · "503" (정확한 코드) · "5xx" · "4xx" (범위) 응답은 왔는데 상태 코드가 실패
실패 종류 "timeout" · "connect-error" 응답 자체가 없는 실패 (상태 코드가 없음)

한 갈래에 아무것도 안 적으면 그 갈래는 전부 재시도됩니다. 이게 가장 헷갈리는 지점입니다.

retry-on: ["5xx"]
# → 상태는 5xx 만 재시도. 하지만 실패 종류 쪽에 적은 게 없으므로
#   타임아웃 · 연결 오류는 여전히 전부 재시도됩니다.

retry-on: ["5xx", "connect-error"]
# → 상태는 5xx 만, 실패 종류는 연결 오류만. 타임아웃은 재시도하지 않습니다.

retry-on: ["timeout"]
# → "타임아웃만 재시도"가 아닙니다. 상태 쪽에 적은 게 없으므로
#   429 · 5xx 를 포함한 상태 실패가 전부 재시도됩니다.

retry-on: ["TIMEOUT"]
# ❌ 대문자는 없는 값입니다. 저장이 거부됩니다 (소문자 "timeout")

발송 노드처럼 재시도를 정말 좁혀야 한다면 두 갈래를 다 적으세요.

재시도를 걸면 안 되는 경우

같은 요청을 두 번 보내면 안 되는 일에는 재시도를 걸지 마세요.

노드 재시도
조회 (GET) ✅ 안전
데이터 변환 ✅ 안전
메시지 발송 ⚠️ 두 번 갈 수 있음
결제·주문 생성 ❌ 위험

메시지 발송은 두 갈래를 다 적어서 좁히는 게 안전합니다.

retry-on: ["429", "5xx", "connect-error"]
# 연결이 아예 안 된 경우(= 아직 안 갔음)만 재시도하고,
# 타임아웃(= 갔는데 응답을 못 받았을 수 있음)은 재시도하지 않습니다.

워크플로우 켜고 끄기

지우지 않고 잠시 멈추는 기능입니다. 매일 도는 스케줄러가 잘못된 알림을 계속 보내고 있는데 워크플로우는 살려두고 싶을 때 씁니다.

어디서 끄나

워크플로우 목록상세 화면의 토글로 켜고 끕니다. 켜져 있으면 켜짐, 꺼져 있으면 꺼짐입니다.

꺼두면 무엇이 막히나

실행 경로 꺼진 상태에서
스케줄(cron) 발화 ❌ 발화하지 않음
웹훅 수신 409로 거절
AI 비서(MCP) 실행 ❌ 거절
화면에서 실행 버튼 통과

수동 실행만 열어둔 이유는 끄고 → 고치고 → 테스트하고 → 다시 켜는 흐름이 성립해야 하기 때문입니다. 고친 걸 확인하려고 다시 켜는 순간 cron이 같이 살아나면 곤란하니까요.

알아둘 것

  • 막는 것은 새 실행뿐입니다. 이미 시작된 실행은 끝까지 갑니다. 멈추려면 실행 이력에서 취소하세요.
  • 끈다고 저장이 풀리지는 않습니다. 실행 중인 워크플로우는 여전히 저장할 수 없습니다.
  • YAML을 다시 저장해도 켜짐/꺼짐은 그대로입니다. 켜짐 상태는 워크플로우 정의(YAML)가 아니라 운영 상태라서 YAML 탭 왕복에 영향을 받지 않습니다.

⚠️ GitHub 웹훅을 오래 꺼두면

GitHub은 웹훅 전송 실패가 쌓이면 그 웹훅을 자동으로 비활성화합니다. 꺼진 동안 이음새가 409를 돌려주므로 GitHub 입장에서는 실패로 쌓입니다.

오래 꺼두었다가 다시 켰다면, GitHub 쪽 웹훅이 아직 살아 있는지 리포지토리 설정에서 확인하세요.


실패 알림 설정 — 꼭 하세요

매일 도는 자동화가 조용히 멈춰도 아무도 모릅니다. 이걸 막는 기능입니다.

사이드바 알림으로 들어가서 설정합니다.

항목 설명
웹훅 URL 실패 알림을 받을 주소. http:// 또는 https://로 시작해야 합니다
알림 활성화 꺼두면 실패해도 알림이 가지 않습니다

워크플로우 실행이 실패로 끝나면 이 주소로 한 번 POST가 갑니다.

Slack 수신 웹훅 만들기

  1. api.slack.com/apps에서 앱을 만들거나 기존 앱을 엽니다.
  2. Incoming Webhooks를 켭니다.
  3. Add New Webhook to Workspace로 알림 받을 채널을 고릅니다.
  4. 나온 https://hooks.slack.com/services/... 주소를 알림 화면에 붙여넣습니다.

Discord도 채널 설정 → 연동 → 웹훅에서 같은 방식으로 주소를 만들 수 있습니다.

이미 URL이 설정되어 있으면 화면에 가려진 형태로 표시됩니다. 입력창을 비워둔 채 저장하면 기존 URL이 유지되고 켜기/끄기만 바뀝니다.

워크플로우 안의 Slack 발송과는 다른 기능입니다. 여기 설정은 "자동화가 실패했다"는 시스템 알림이고, slack_post_message 노드는 자동화가 정상 동작해서 보내는 업무 메시지입니다.


워크플로우 수정과 실행 중인 작업

실행이 시작될 때 그 순간의 워크플로우 모양이 저장되고, 그 실행은 끝까지 그 모양대로 돕니다.

  • 오래 걸리는 실행이 도는 중에 워크플로우를 고쳐도 이미 도는 실행은 영향받지 않습니다.
  • 수정 내용은 다음 실행부터 적용됩니다.
  • MCP로 워크플로우를 수정할 때는 실행 중인 게 있으면 거부됩니다. 끝나기를 기다리거나 취소한 뒤 다시 시도하세요.

점검 체크리스트

새 자동화를 켤 때 한 번씩 확인하면 좋습니다.

  • [ ] 외부 호출 노드에 timeout을 걸었나
  • [ ] 조회 노드에 retry-policy를 걸었나
  • [ ] 발송·결제 노드에 불필요한 재시도를 걸지 않았나
  • [ ] 알림 화면에 실패 알림 웹훅을 설정했나
  • [ ] 스케줄 트리거에 timezone: "Asia/Seoul"을 넣었나
  • [ ] API 키를 YAML에 직접 적지 않고 ${secrets.*}로 넣었나
  • [ ] 배열을 넘기는 곳에 | raw를 붙였나
  • [ ] 첫 실행을 실제로 돌려보고 실행 이력에서 결과를 확인했나
  • [ ] 공개된 웹훅이라면 WEBHOOK_SECRET으로 서명 검증을 켰나

다음11. AI 비서로 만들기 (MCP)