Heartbeat 모니터링: 스케줄된 작업이 조용히 중단될 때 알기

발행: (2026년 5월 3일 AM 11:53 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

서버가 다운될 때 알려주는 가동 시간 모니터링은 유용하지만, 가장 심각한 장애는 다음과 같이 보일 수 있습니다:

  • 서버는 정상이다
  • 크론 스케줄러가 실행되었다
  • 눈에 띄는 오류는 없었다

작업이 조용히 멈춰버린 경우입니다—며칠째 실행되지 않은 야간 데이터 동기화, “완료”됐지만 0바이트만 기록된 백업, 몇 주 전부터 예외를 발생시키기 시작한 보고서 작업 등. 이러한 실패는 엔드포인트가 절대 실패하지 않기 때문에 전통적인 HTTP 모니터링으로는 감지되지 않습니다.

하트비트 모니터링은 이 문제를 해결합니다.

작동 원리

하트비트 모니터는 사망 스위치(dead‑man’s switch)와 같습니다. Tickstem이 엔드포인트를 폴링하는 대신, 작업이 성공적으로 끝날 때마다 Tickstem에 호출을 보냅니다. 예상 간격 + 여유 기간 내에 핑이 도착하지 않으면 알림이 전송됩니다.

다음 두 가지를 설정합니다:

ParameterDescription
interval핑이 도착하기를 기대하는 주기(예: 매 24 시간)
grace window알림을 보내기 전 마감 시점 이후 허용하는 버퍼(예: 1 시간)

알림 규칙: 연속 두 번의 간격 동안 핑이 없으면 → 알림 전송.

적용 방법

Go

import "github.com/tickstem/heartbeat"

client := heartbeat.New(os.Getenv("TICKSTEM_API_KEY"))

hb, err := client.Create(ctx, heartbeat.CreateParams{
    Name:         "nightly-sync",
    IntervalSecs: 86400,
    GraceSecs:    3600,
})

// at the end of every successful run — token is the credential, no API key needed
if err := client.Ping(ctx, hb.Token); err != nil {
    log.Println("heartbeat ping failed:", err) // non-fatal
}

Node.js

import { HeartbeatClient } from "@tickstem/heartbeat"

const hb = new HeartbeatClient(process.env.TICKSTEM_API_KEY)

const heartbeat = await hb.create({ name: "nightly-sync", interval_secs: 86400 })

// at the end of every successful run
await hb.ping(heartbeat.token).catch(err => console.error("ping failed:", err))

Curl (no SDK needed)

curl -s -X POST https://api.tickstem.dev/v1/heartbeats/$HEARTBEAT_TOKEN/ping

토큰은 URL에 포함되며 인증 헤더는 필요하지 않습니다. curl이 실패하더라도 스크립트는 정상 종료되어야 합니다.

주목할 점

핑은 성공 시에만 발생합니다. 따라서 침묵은 무언가가 잘못됐음을 의미합니다—작업이 크래시했거나, 스케줄되지 않았거나, 실제 작업을 수행하지 않고 종료된 경우입니다. 핑을 비치명적으로 처리하세요; 일시적인 네트워크 오류가 성공적인 동기화를 중단하게 해서는 안 됩니다.

사용 시점

“작업이 실행되었다”와 “유용한 작업을 수행했다”가 다른 경우에 적용합니다:

  • 데이터베이스 백업
  • 데이터 동기화 / ETL 파이프라인
  • 보고서 생성
  • 청구서 또는 결제 처리
  • 캐시 워밍

가동 시간 모니터링과 하트비트 모니터링은 상호 보완적입니다:

  • Uptime = 서버가 살아 있음.
  • Heartbeat = 작업이 실제로 제 역할을 수행함.
0 조회
Back to Blog

관련 글

더 보기 »