brunch

You can make anything
by writing

C.S.Lewis

by 영춘 Mar 31. 2022

개백취 | 일상을 위한 나만의 대시보드 만들기

우리 아기 몇살이었더라?

안녕하세요, 영춘입니다.


소프트웨어 엔지니어 여러분, 제럴드 와인버그라는 분을 아십니까? “프로그래밍 심리학이란 책의 저자이며 컨설팅 업체에서 일하기도 했으며 IBM에서 나사의 머큐리 프로젝트에 참여하기도 했습니다. 글쓰기에도 많은 관심을 두고 직접 글쓰기에 대한 책을 쓰기도 했습니다. “와인버그의 글쓰기 (원제 Weinberg on Writing)”  글쓰기에 대한 저자의 접근방식과 요령, 실습해  거리 들이 담겨있습니다. 자연석 기법 Fieldstone Method 이라 이름지은 와인버그의 방식은 제텔카스텐 Zettelkasten 이라 불리는 메모 기법과 닮아 있습니다. 글쓰기를 하며 제가 느끼는 어려움은  종류입니다. 하나는 “할말을 찾고 준비하기”, 다른 하나는 “생각을 문장으로 옮기기입니다. 저는   가지 어려움 중에서 앞선 어려움, 그러니까 무얼 말할지 얼마나 말할지 준비하는   어려워합니다. 와인버그의 글쓰기 책은 이런 어려움을 해결할 방법을 제시하는데 한마디로 정리하면 “돌담을 쌓기 위해 필요한 돌멩이들을 눈에 띄는 대로 주워  정리해두기입니다.


학생 시절 경험한 글쓰기라고 하면, 보통 주제를 정하고 (혹은 정해지고)  주제에 대한 자료를 찾아 쓰는 글쓰기 입니다. 물론 필요에 따라 본인의 관심과 무관한 글을 써야할 때도 있고, 제한된 시간동안 새로운 주제를 탐색하며 글을 써야할 때도 있습니다. 하지만 어떤 제약도 없이 본인이 쓰고 싶은 글을   있을  와인버그의 글쓰기 방법이 도움이 됩니다.

 방법의 문제점은 ‘ 정도 크기에 이런 색깔의 돌을 저기서 찾아야겠어!’ 라고 말로만 떠들어서는 들판에서 돌을 찾기 힘들다는 사실이다. 하지만 작문시간에 글짓기를  때면, 선생님은 바로 이런 식으로 학생들에게 지시한다. ‘오늘밤 집에 가서 개미핥기 사육장을 지으려면 어떻게 해야 좋을지 쓸만한 방법을 다섯 가지 정도 찾아보세요. 그리고  다섯 가지로  개요를 잡아 300단어 분량의 글을 써오세요’” - p.32, 와인버그의 글쓰기

“자연석 돌담은 콘크리트 블록이나 벽돌처럼 균일한 재료로 쌓지 않는다. 자연석 돌담은 크기, 색, 질감, 모양, 밀도 등이 천차만별인 원석으로 쌓는다. 듣고 나니 훌륭한 소설을 쓰고 싶은 생각이 들지 않는가? 더 나은 글을 쓰고 싶은 마음이 샘솟지 않는가? 자연석 기법은 흥미를 끄는 글, 사진, 도표, 인용구, 그림, 참조 등에서 얻는 생각을 ‘돌’로 사용한다. 그렇게 모은 ‘자연석’을 사용해 기사, 보고서, 책, 대본 등의 ‘돌담’을 정교하게 만든다. 보통 사람들은 글을 쓰려고 시간을 내지만 효율적으로 시간을 활용할 줄 모르는데, 자연석 기법은 그런 ‘시간의 돌’, 즉 다양한 특성과 길이의 가용한 글쓰기 시간도 활용한다. 이처럼 넘쳐나는 다양한 재료들로 막힘 없이 아름다운 돌담을 쌓을 수 있다.” - p.35, 와인버그의 글쓰기

이제 다시 이번 글의 주제로 돌아와.. 소프트웨어 엔지니어들은 글감을 찾는 일이 비교적 쉬울  있습니다. 우리 소프트웨어 엔지니어들이 일상적으로 겪는 기술적인 문제들, 새로 배운 기술들, 취미 삼아 만든 모든 것들이 글쓰기 재료가 되니까요.  역시 “개발자의 백만가지 취미 준비했던 할말들이 끝나고 새로운 글쓰기 주제를 탐색하고 있었지만 게으른 탓에 시간이 부족한 탓에 충분히 글감을 모으지 못했습니다. 하지만 소프트웨어 엔지니어에게 코딩이란  먹는 것과 비슷한  아니겠습니까? 글감은 모으진 못했지만 취미로 만든 대시보드가 있었습니다. 그리하여 오늘은 “일상을 위한 나만의 대시보드만들기에 대해 알아봅시다!



대시보드가 뭐야?

당연스럽게 사용하던 대시보드 Dashboard 단어인데 이참에 위키피디아에서 찾아봤습니다.

https://en.m.wikipedia.org/wiki/Dashboard_(business)
A dashboard is a type of graphical user interface which often provides at-a-glance views of key performance indicators (KPIs) relevant to a particular objective or business process. In other usage, “dashboard” is another name for “progress report” or “report” and considered a form of data visualization.

성과를 한눈에 확인할  있는 그래픽 인터페이스 라는데, 보통 웹브라우저로 접속할  있는 페이지 형태로 여러 지표들이 다양한 그래프 형태로 나와있습니다. 모니터링 하고자 하는 요소들의 현재 상황을 시각적으로 빠르게 파악할  있으며 따라서 어떤 부분이 문제인지 문제없는지 확인할  있습니다. 웹서비스를 한다면 백엔드 서버의 분당 요청 처리 수라던가 실패한 요청의 수를 나타낼  있고, 비즈니스 측면을 생각한다면 일일 활성 사용자  혹은 신규 유입 사용자  등을 표시할 수도 있습니다.


저는 업무에서도 대시보드를 자주 사용합니다. 보통 Kubernetes 위에 어플리케이션을 배포하기 때문에 K8s에서 널리 사용하는 Prometheus + Grafana 스택으로 대시보드를 구성합니다. 보통  가지의 목적인데 하나는 시스템의 건강 상태를 모니터링하기 위함입니다. 어플리케이션이 배포된 하드웨어의 자원 상태를 확인하거나, 메시징을 위해 사용하는 Kafka 토픽의 분당 메시지 처리  등을 확인합니다.  다른 목적은 어플리케이션 기능의 시각화입니다. 예를 들어, 고객이 제공하는 센서 데이터를 입력 받아 이상치 Anomaly Score 계산하는 경우, 센서 입력 자체를 그래프로 표현하고 해당 입력으로부터 구한 이상치도 그래프로 그립니다. 때에 따라서는 이상치가 미리 정한 임계치를 상회하는 경우, 알람을 보내기도 합니다.


이처럼 시스템의 상태를 파악하기 위해선 필요한 지표 Metric 정의하여 구한 다음, 그래픽 요소로 시각화 하는게 필요합니다. , 가시성 Visibility  확보하는게 시스템 모니터링의 첫걸음이라   있습니다.


요구사항

회사에서 대시보드를 사용하다 문득 “ 업무에서만 대시보드를 사용하지?” 라는 물음이 생겼습니다.  삶을 위한 대시보드, 일상을 위한 대시보드를 만들기로 마음 먹고 무얼 표시할  고민해봤습니다.

저는 집에 간단히 K8s 클러스터를 만들어 사용하고 있고, 오라클 클라우드, 그램 노트북 서버 등 몇가지 컴퓨팅 자원들이 있습니다. 이 자원들의 상태와 사용량을 모니터링 하는게 첫번째 임무입니다.

아이는 날마다 쑥쑥 커가는데 때로 아이가 태어나고 얼마나 지났는지 헷갈릴 때가 있습니다. 아이의 만 나이를 보여주는 패널도 있다면 좋겠습니다.

 다른 활용처를 생각해보면 주식, 가상화폐  개인 자산의 평가액과 수익률을 표시하고 알림을 주는 것입니다. 가상화폐의 경우, 2021   폭으로 하락하여  역시 고전을 면치 못하고 있는데 계절이 돌아오듯  언젠가는 봄이 오지 않겠습니까? 그렇게 찾아올 봄의 전령으로 대시보드에 알림을 달아두자고 하는 겁니다.

시스템 개요


구성도


네트워크

컴퓨팅 자원들은 오라클 클라우드 서울 리전 (강원도 어딘가에 있을 데이터센터), 저희  (도봉구) 소파  구석진 자리, TV 받침대  셋탑박스 근처  물리적으로 다른 장소에 흩어져 있습니다. 이들 컴퓨터들에서 실행 중인 요소들이 원활하게 소통하며 동작하기 위해 하나의 추상 네트워크가 필요합니다. 저는 Subspace VPN 도구를 이용, Wireguard 프로토콜의 VPN 만들어 사용했습니다.


하드웨어

오라클 클라우드

모니터링 대시보드 자체는 가능한 한 장애 없이 동작해야 하기 때문에 집에 켜둔 컴퓨터를 사용하는 건 부적합했습니다. — 정전이라도 생기면 끝장이니까요 — 그래서 클라우드 자원을 사용했습니다. 오라클 클라우드에서 무료로 제공하는 인스턴스를 사용했고 무료인만큼 성능이 좋지 않습니다. 메모리가 1GB라서 꼭 필요한 요소들만 가볍게 설치해 사용할 생각입니다.

총 2대를 제공하는데 다음 요소들을 설치했습니다.

1번: Docker Daemon, Subspace VPN/Grafana/Prometheus/Prometheus Pushgateway 컨테이너 실행

2: 도메인 연결을 위해 Nginx 설치, OpenFaas faasd 가볍게 설치 (모니터링에 필요한 Serverless function 실행에 사용)


Mini PC

XCY Portable Mini PC Intel Celeron N4100

K8s 노드로 사용하려고 AliExpress에서 작은 컴퓨터들을 구입했습니다.   하나를 가져와 마찬가지로 OpenFaas faasd 설치했습니다. 개인적으로 필요한 API들을 구현해 사용할 용도로 https://objfunc.com 사이트를 만들었고 여기에 리스팅  API들을 운영할 용도입니다. 8GB 메모리를 가졌고 faasd 실행하기에 충분한 성능입니다. 참고로 OpenFaas Function as a Service 만들  사용할  있는 오픈소스인데 보통 K8s 클러스터에 설치해 사용합니다. faasd 경량화 버전으로 라즈베리파이 같은 장치에 설치해 사용할  있을만큼 가볍습니다.


소프트웨어

Grafana

대시보드는 Grafana 사용했습니다. 사용할  있는 여러 종류의 패널들이 있고 Prometheus, Database  데이터소스 연결도 쉽습니다. 알람 보내는 기능도 쉽게 추가할  있는데 Email, Webhook  Contact Points 추가해  다음 원하는 패널 알람에서 사용하면 됩니다. 저는 텔레그램 웹훅을 설정했습니다.


Prometheus / Prometheus Pushgateway

Metric 수집 및 Grafana 연결엔 Prometheus를 사용했습니다. 보통 Prometheus는 Pull 방식으로 Metric을 가져옵니다. 이말인 즉슨, Metric을 제공하는 쪽에서 Metric Server를 켜두고, Prometheus에서 그 서버들에 접속해서 값들을 가져오는 방식입니다.


제가 사용하고 있는 컴퓨터들의 상황을 모니터링 하기 위해 Node Exporter를 사용했는데 Node Exporter를 실행하면 자원들의 Metric들이 보이는 페이지에 접근할 수 있습니다.


예시) GET /metrics

# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 2.945339201e+07
node_cpu_seconds_total{cpu="0",mode="iowait"} 3282.41
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 1055.72
node_cpu_seconds_total{cpu="0",mode="softirq"} 3350.57
node_cpu_seconds_total{cpu="0",mode="steal"} 122042.07
node_cpu_seconds_total{cpu="0",mode="system"} 41963.77
...

하나 문제가 있었는데 제가 사용하려는 몇가지 기능은 항상 서버로 실행되는 코드 대신 잠깐 실행되고 끝나는 형태라는 점입니다. 계획은 Serverless function 형태로 코드를 작성하여 원하는 Metric 구한 다음, Prometheus Push하는 것인데 Prometheus Pull 방식과 맞지 않습니다. 찾아보니 이를 해결해줄  있는 Pushgateway 있어 사용했습니다


Pushgateway Docker Container 띄워두고 해당 컨테이너에서 오픈한 포트로 Push 하면 그곳에 값이 기록됩니다. 또한 Pushgateway 일반적인 Metric Server 기능하므로 Prometheus Target으로 등록해두면 Push 기록한 값이 최종적으로 Prometheus 전달됩니다.


OpenFaas / faasd

앞서 소개한 OpenFaas Code snippet 형태로 코드를 작성하고 배포하면 사용자 요청에 따라 자동적으로 해당 코드를 실행하고 결과를 반환해줍니다. 내부적으로는 사용자 코드를 감싸는 Wrapper 있고 전체 코드를 컨테이너 이미지로 만들어 사용합니다. 여기에 사용자 HTTP 요청을 코드 실행과 연결해주는 게이트웨이가 더해져 쉽게 API 작성하고 운영할  있습니다.


faasd 경우, docker-compose.yaml 파일을 통해 전체 시스템을 운영합니다. 따라서 필요한 추가 요소의 경우, docker-compose.yaml 파일을 편집하는 것으로 쉽게 추가할  있습니다. 저는 세가지 요소를 추가했습니다.


cron-connector: OpenFaas에서 제공하는 것으로, cronjob 처럼 특정 시간 혹은 주기마다 함수를 실행시켜줍니다

PostgreSQL: 어떤 기능을 구현할 , 연산과 데이터가 필요한데 데이터를 영속적으로 저장할  사용하기 위함입니다

Redis: 생명주기가 짧은 데이터를 잠깐 저장하거나 캐시 용도로 사용합니다



함수들


컴퓨팅 자원 상태

Node exporter 이용합니다. 모니터링의 대상이 되는 컴퓨터에서 Docker 혹은 바이너리 파일로 실행합니다. , 물론 Prometheus   있도록 설정파일에 등록해줍니다.


자산 평가

예전에 미국 주식 손익을 평가해 보여주는 함수를 작성한 일이 있습니다. (https://minhwan.kim/blog:archived:stock-profit-loss-with-openfaas) 이를 활용하여 주식 자산의 평가액을 계산해 Prometheus Metric으로 추가합니다. HTTP Request 결과에서 원하는 값을 뽑아내 사용합니다.

가상 자산의 경우, 대부분의 거래소는 API 제공하므로 이를 이용합니다. Upbit API Wrapper Class 만들어 사용했습니다.

가족 나이 계산

이건 따로 API를 만들어 objfunc.com에 추가해두었습니다. 사용 예시를 보여드리자면..


Elon Musk 생년월일을 기준일로 등록하기

등록한 기준일을 사용하여 나이 구하기

API 있으니 나이를 Metric으로 추가하는  간단합니다.


대시보드 화면

대시보드 완성입니다!

첫번째 줄엔 가족들의 나이가 표시되며, 두번째 줄엔 자산 현황이 나옵니다. 마지막 세번째 줄엔 컴퓨팅 자원들의 상황을 표시합니다. 메모리가 가득 차거나 스토리지가 부족해지면 알람을 보내도록 설정했습니다.


이제 대시보드를 통해 살아온 세월, 가계 상황, 컴퓨터 친구들 건강을 한눈에 파악할  있습니다.


대시보드에 추가할 다른 지표들을 생각해  수도 있습니다.

스마트 워치에서 측정하는 심박/스트레스 지수

소비와 지출

터미널에 머무른 시간

주간 Github commit/push 라인 


지표에 대해 고민하다보니 측정 방식 또한 중요하다는  알았습니다. 인터랙티브하게 사용자가 직접 수치를 입력하는 방식은 번거롭기 때문에 사용자 개입 없이 데이터를 측정할 방법이 필요합니다. 예를 들어, 매일 얼마나 책상에 앉아 있는지 모니터링 하고 싶다고 가정해볼까요? 책상에 앉아 있는 시간을 어떻게 기록할까요?


1. 아날로그 애호가

책상 앞에 종이를 두고 자리에 앉은 시간, 떠난 시간을 기록합니다. 하루를 마무리   각각의 시간을 합산하여 모니터링 시스템에 기록합니다. 연필로 종이에 글을   나는 서걱거리는 소리, 하루를 돌아보는 여유로운 시간.. 따뜻한  한잔을 곁들이면 금상첨화입니다. 하지만 정신없이 바쁜 날엔 펜을  여유가 없을지도 모릅니다.


2. 소프트웨어에 힘주기

하드웨어 추가 없이 소프트웨어로  나은 방법을 찾을  있을까요? 간단하게는 종이를 대체할만한 입력 페이지를 만들  있습니다.  형태로 “앉기”, “떠나기두가지 버튼을 만들면 버튼을 누르는 행위만으로 시간을 기록할  있습니다. 버튼을 누르는 것도 생략하고 싶다면? 마우스와 키보드의 활동을 모니터링 하는 방법은 어떨까요. 단위 시간  마우스의 움직임 혹은  입력 수를 확인하는 방식으로 컴퓨터를 사용하는 사람이 있는지 없는지   있습니다. 하지만 자리에 앉아 컴퓨터를 하지 않고 책을 읽는다면  활동은 놓치고 말겠지요.


3. 하드웨어에 힘주기

하드웨어를 만들어보는 방법도 있습니다. 인간의 감각기관에 상응하는 센서 부품을 이용하여 세상을 감지할  있습니다. 의자 방석에 압력 센서를 둔다면 사람이 앉았을    있습니다. 저는 4–5  예전 회사에서 비슷한 장치를 만들었습니다. 자리에 오래 앉아 있으면 다시 일어나 몸을 움직이라는 알람을 주는 용도 입니다. (https://minhwan.kim/blog:handcrafted:sedentary-alarm). 초음파 거리 센서는 초음파를 발생시키는 부분과 초음파를 듣는 부분이 있어서 초음파를 보낸 다음 물체에 부딪혀 돌아올 때까지의 시간을 이용해 거리를 구합니다. 자리에 앉았을 때의 측정 거리, 자리를 이탈했을 때의 측정 거리를 구해 구분하는데 매끈한 평면이 아닌 물체라 그런지 오차가 크게 발생합니다. 이런 하드웨어 구성의 한계는 소프트웨어 처리로 극복해낼  있습니다.


4. 소프트웨어와 하드웨어의 조화

믿을만한 하드웨어 제품과 약간의 소프트웨어를 결합해 만들  있는 방식으로 “웹캠 얼굴인식 있습니다. 시판 웹캠을 하나 구입해 모니터 상단에 달아두고 역시 이미  연구된 얼굴인식 라이브러리를 사용하면 어렵지 않게 문제를 해결할  있습니다.


자, 어떠신가요? 소프트웨어 엔지니어가 할 수 있는 무궁무진한 삽질이 보이지 않습니까? 여러분도 자신만의 모니터링 지표를 생각해보시고 측정방법도 생각해보시고 무료할 틈 없는 소프트웨어 엔지니어의 취미활동에 푹 빠져보시지 않겠습니까?

매거진의 이전글 개백취 | 쓸모없음의 쓸모
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari