돌아가기

티커 (Ticker)

스프링부트 서비스 라이브니스 보드

서비스가 살아있는지 한눈에, 문제면 왜인지 클릭 한 번에

Ticker는 스프링부트 앱·nginx·모든 HTTP 엔드포인트의 상태를 한 화면에 보여주는 오픈소스 라이브니스 보드입니다. 상태 벽(Status Wall)에서 살아있음을 확인하고, 타일을 누르면 CPU·힙·GC·스레드·HTTP·Tomcat·커넥션풀·JPA까지 서버가 큐레이션한 JVM/액추에이터 대시보드로 드릴다운합니다. DB 없이 인메모리로 동작하고(히스토리는 선택), Slack 알림까지 — 말하자면 '실제로 들여다보고 싶은 Spring Boot Admin'. Kotlin + Spring Boot 단일 앱, React UI 내장, Apache-2.0.

Ticker status wall — every service UP / DEGRADED / DOWN at a glance
Ticker curated Spring Boot / JVM metrics dashboard (CPU, heap, GC, threads)
Ticker per-metric inspector — live trend with min/avg/max and an inline Slack alert threshold editor
Ticker value-driven severity — cards turn amber near their alert threshold and red when breaching, with starred favourites

주요 기능

상태 벽 (Status Wall)

모든 서비스를 실시간 타일로. 색·기호·라벨로 상태 표시. 한 번 실패로 알리지 않고 N회 연속 실패 후에만 DOWN(디바운스).

JVM/액추에이터 드릴다운

타일을 누르면 전체 대시보드. CPU·힙/논힙 풀·GC(full/minor)·스레드·HTTP·Tomcat·Hikari/JDBC·JPA·캐시까지.

전체 카탈로그 · 미수집은 딤 처리

Micrometer 지표 15그룹 ~90위젯. 대상이 노출하지 않는 지표는 숨기지 않고 회색으로 표시 — 무엇을 내보내는지 한눈에.

★ 중요 표시 + 값 기반 심각도

핵심 지표를 별표로 고정. 값이 알림 임계값에 근접하면 노랑, 초과하면 빨강으로 카드 바가 바뀝니다.

두 종류의 알림

장애형(DOWN/복구, 쿨다운)과 지표 임계형(메트릭별 규칙). Slack 또는 로그로 발송, UI·코드로 설정.

선택형 히스토리

H2/MySQL/PostgreSQL(Spring JDBC). 서버측 다운샘플 범위(5분~7일), 보존 프루닝, 삭제 전 콜드 스토리지 아카이브.

UI 또는 코드로 설정

벽에서 HTTP 모니터 추가, 또는 TickerConfigurer 빈으로 타깃·알림 규칙을 코드로. 정적 targets.yml도 지원.

단일 앱 · i18n · Docker

한국어/영어 전환. React UI를 내장한 단일 Spring Boot 앱, Java 21 가상 스레드, 이미지 하나로 배포.

기능 자세히

상태 벽 + 디바운스

모든 대상을 한 화면 타일로 띄우고 색·기호·라벨을 함께 써서 UP·DEGRADED·DOWN·UNKNOWN을 표시합니다(색만으로 구분하지 않아 색약도 안전). 한 번의 실패로는 절대 알리지 않고 N회 연속 실패해야 DOWN으로 넘어가며(디바운스), 알림에는 쿨다운이 걸려 있어 새벽에 폰이 폭발하는 일이 없습니다.

JVM/액추에이터 드릴다운 + 지표 인스펙터

타일을 누르면 서버가 큐레이션한 대시보드가 열립니다. 게이지·라이브 차트·숫자로 CPU, 힙/논힙 풀, GC, 스레드, HTTP, Tomcat이 한눈에 들어오고, 위젯을 다시 누르면 인스펙터에서 라이브 추이와 min/avg/max, 히스토리를 켰다면 5분~7일 범위 그래프, 그리고 인라인 알림 임계값 편집까지 한자리에서 다룹니다.

전체 Micrometer 카탈로그 · 미수집은 딤 처리

흔히 쓰는 Micrometer 표면 전체 — 15그룹 약 90개 위젯 — 를 담았습니다. 대상이 노출하지 않는 지표는 숨기지 않고 '미수집'으로 회색 처리해, 각 앱이 실제로 무엇을 내보내는지 한눈에 보입니다. 폴링은 화이트리스트된 /actuator/metrics만 읽고 env·configprops·heapdump는 절대 건드리지 않습니다(가드레일 #4).

★ 중요 표시 + 값 기반 심각도 색상

노랑 바가 '경고'처럼 보이는 게 싫어서 중요도는 별표 토글로 분리했습니다. 색은 오직 심각도를 뜻합니다 — 값이 알림 임계값(또는 게이지 최대치)에 근접하면 노랑, 초과하면 빨강. CPU처럼 장애 때 100%에 근접하는 핵심 지표는 기본으로 별표가 켜져 있습니다.

두 갈래 알림

장애형(상태 전이 기반 DOWN/복구 + 쿨다운)과 지표 임계형(메트릭별 규칙 — CPU>80%, 힙>85%, 디스크 여유<10% 등)을 함께 지원합니다. Slack 웹훅으로 보내거나(웹훅은 env로만) 로그로 남기며, UI의 🔔 팝오버 또는 코드로 임계값·쿨다운을 조정하고, 최근 발화 내역도 UI에서 바로 확인됩니다.

3.x · 4.x 클라이언트 + UI/코드 설정

감시 대상 앱은 시작할 때 스스로 등록합니다 — Spring Boot 4용과 3.2+용 클라이언트 스타터가 따로 있어 레거시 앱도 그대로 붙습니다(컬렉터는 Boot 4/Java 21로 돌아도 무방). 대상·알림 규칙은 벽에서 클릭으로 추가하거나 TickerConfigurer 빈으로 코드에서, 또는 정적 targets.yml로 설정합니다.

게이트웨이 뒤 배포 · base-path

React UI를 내장한 Spring Boot 단일 앱이라 이미지 하나로 배포가 끝납니다. /api 경로가 공유 게이트웨이/인그레스와 겹치면 ticker.server.base-path 하나로 UI+API를 /ticker 같은 접두사 아래로 통째로 옮길 수 있고, 컬렉터 자신의 /actuator/health는 외부 프로브가 안정적으로 찌를 수 있도록 제자리에 둡니다.

왜 만들었나

Spring Actuator가 나오기 전에는, 서비스가 지금 괜찮은지 들여다보려면 이런저런 APM을 하나씩 붙여야 했습니다. Actuator가 나온 뒤로는 TICK 스택이나 Prometheus + Grafana 조합이 사실상 표준이 됐죠. 규모가 있는 팀이라면 직접 구축하거나 AWS 매니지드로 돌리면 됩니다 — 다만 비용이 만만치 않고, 무엇보다 다 깔아놓은 다음에도 대시보드와 알림을 하나하나 손으로 엮는 데 생각보다 품이 많이 듭니다.

Spring Boot Admin, TICK 스택, Prometheus + Grafana를 실제로 운영해보며 각자의 장점에서 영감을 받았고, 동시에 '작은 팀이 부담 없이 그냥 띄워두고 볼 수 있는 것'은 의외로 없다는 걸 느꼈습니다. 그래서 거대한 관측 플랫폼을 다시 만드는 대신, '살아있나?'에 즉답하고 필요할 때만 큐레이션된 JVM 지표로 깊게 파고드는 가벼운 보드를 오픈소스로 만들었습니다. 딱 거기까지 — 그 절제가 Ticker의 핵심입니다.

운영 — 저장소와 배포

저장소는 기본이 인메모리라 아무 설정 없이 5분이면 뜹니다. 히스토리는 필요할 때만 켜세요(옵트인). H2 파일 모드는 보존 기간만큼 커지다가 프루닝으로 평탄해지는데, H2 파일은 행을 지워도 자동으로 줄지 않으니(공간은 재사용) 보존을 줄인 뒤 디스크를 되찾으려면 앱을 멈추고 .mv.db 파일을 지우면 됩니다 — 옵트인이라 다시 쌓이면 그만입니다.

규모가 커지면 MySQL·PostgreSQL로 전환하고(자격증명은 env로만), 삭제 전에 gzip CSV로 콜드 스토리지에 아카이브하고 검증한 뒤에야 지우는 잡을 켤 수 있습니다(가드레일 #5 — 실패하면 재시도, 데이터는 절대 유실 없음). 대량이면 ts_millis 기준 RANGE 파티셔닝 + 파티션 드롭으로 보존을 처리하는 것을 권하며, 프루닝/아카이브 스캔용 인덱스도 기본으로 걸려 있습니다.

감시자는 밖에서 감시해야 합니다(가드레일 #1). 컬렉터가 죽는 것은 컬렉터 바깥에서 감지돼야 하므로 자체 /actuator/health를 노출하고, k8s 라이브니스 프로브 + 외부 핑 한 개를 반드시 함께 두세요. Ticker는 기존 온콜 알림을 대체하는 게 아니라 그 곁에서 돌아가는 가벼운 라이브니스 보드입니다.

기술 스택

Backend

KotlinSpring Boot 4Java 21Virtual ThreadsSpring JDBC

Frontend

ReactTypeScriptViteuPlot

Storage

In-memory (default)H2MySQLPostgreSQL

Ops

DockerActuator / MicrometerSlackApache-2.0