돌아가기

티커 (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 — a Docker fleet with an 8-instance orders-api grouped into one tile, every service UP / DEGRADED / DOWN at a glance
Ticker same-name replica grouping — 2 of 8 orders-api instances down: amber 6/8 tile, red dots, dead instances sorted to the top
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/복구, 쿨다운), 지표 임계형(메트릭별 규칙), 그리고 배포 알림 — 앱이 뜨고/내려가고/사라질 때 호스트명·IP까지 Slack으로. 롤링 배포는 서비스별 한 건으로 묶여서 옵니다. 채널도 따로 지정 가능.

선택형 히스토리

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

UI 또는 코드로 설정

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

단일 앱 · i18n · Docker

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

서비스 맵 (트레이싱 없이)

호출 흐름대로 정렬된 레이어드 맵 — 직각 라우팅으로 선이 엉키지 않고, 라이브 트래픽 입자가 엣지를 타고 흐릅니다. 가장 느린 구간 amber, 5xx red. 카드 드래그 재배치에 휠 줌·배경 팬까지 draw.io처럼(전부 브라우저에 기억), 노드를 누르면 사이드 패널에서 상세로 점프. 전부 Boot 자동 계측 지표의 집계.

관리 화면 (⚙)

운영을 UI로: 무중단 H2 백업을 목록·다운로드·업로드에 원클릭 복원(재시작 없음)까지, 배포 사일런스 창, 알림 규칙 토글, 인스턴스별 하트비트가 보이는 타깃 레지스트리.

기능 자세히

상태 벽 + 디바운스

서비스 하나가 타일 하나예요. 색과 기호, 글자 라벨을 같이 써서 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%까지 치솟는 지표는 처음부터 별표가 켜져 있습니다.

두 갈래 알림

알림은 두 종류예요. 하나는 장애형 — 서비스가 죽거나 되살아날 때(쿨다운 포함). 다른 하나는 지표 임계형 — 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에 적으면 됩니다.

같은 이름 여러 인스턴스 · 게이트웨이 배포

실무에선 인스턴스에 이름을 하나하나 붙이지 않죠 — ASG든 k8s든 같은 설정으로 N대가 한꺼번에 뜹니다. Ticker는 같은 이름의 레플리카를 타일 하나로 묶어요. 타일엔 8/8 UP 집계와 인스턴스별 점 스트립이 보이고, 아픈 인스턴스가 항상 위로 올라옵니다(각각 hostname:port + IP로 구분). 상세 화면엔 인스턴스 스위처가 있어서 한 대씩 파고들 수 있고, 정상 종료된 인스턴스는 스스로 등록을 해제해요 — 배포는 장애가 아니니까요. 게이트웨이 뒤에서 /api가 겹치면 프로퍼티 하나로 전체를 /ticker 같은 접두사 밑으로 옮길 수 있고, /actuator는 헬스 프로브를 위해 제자리에 둡니다.

왜 만들었나

Spring Actuator가 없던 시절엔 서비스 상태 하나 확인하려고 이런저런 APM을 하나씩 붙여야 했어요. Actuator가 나오고부터는 TICK 스택이나 Prometheus + Grafana 조합이 사실상 표준이 됐고요. 규모가 있는 팀이야 직접 구축하든 AWS의 managed 서비스를 쓰든 그만이지만 — 비용이 꽤 나가는 데다, 막상 다 깔아놓고 나면 대시보드 하나하나 만들고 알림 규칙 엮는 손작업이 한참 남아 있더라고요.

Spring Boot Admin, TICK 스택, Prometheus + Grafana를 전부 실무에서 직접 굴려봤습니다. 각자 배울 게 분명했지만, 정작 '작은 팀이 아무 부담 없이 하나 띄워두고 흘끗 확인하는 용도'에 딱 맞는 도구는 의외로 없더라고요. 그래서 거대한 observability 플랫폼을 또 하나 만드는 대신, '살아있나?'에 바로 답하고 필요할 때만 엄선된 JVM 지표로 파고드는 가벼운 보드를 만들어 오픈소스로 공개했습니다. 딱 여기까지만 하고 멈춘 것 — 그 절제가 Ticker의 핵심이에요.

운영 — 저장소와 배포

처음엔 아무것도 안 해도 됩니다. 전부 메모리에서 도니까 5분이면 떠요. 히스토리는 필요할 때만 켜세요(옵트인). 켜면 H2 파일이 보존 기간만큼 커지다가 프루닝이 돌면서 어느 선에서 평평해집니다. 다만 H2는 행을 지워도 파일이 자동으로 줄지는 않아요(그 공간을 재사용합니다). 보존을 줄이고 디스크를 되찾고 싶으면, 앱을 잠깐 멈추고 .mv.db 파일을 지우면 됩니다 — 옵트인이라 다시 쌓이면 그만이에요.

H2로 부족해지면 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