시계열 데이터 생성/저장/대시보드 ==> glances/InfluxDB/Grafana Computer Tip

시계열 데이터라는 것은 영어로는 Time Series Data 라는 것으로 시간을 축으로 하여 주기적 혹은 반복적으로 
입력되는 데이터를 지칭하는 것이라 할 수 있습니다.
물론 지금까지 대부분의 데이터가 어찌 보면 시간이 흐름에 따라 데이터가 입력되고 가공되고 
분석되어 또 다른 형태의 데이터로 출력되는 등의 크게 보면 모두 시계열 데이터 라고 말 할수도 있겠네요.
하지만 최근 IoT나 센서 테트워크 등 처럼 모든 사물이 인터넷 혹은 네트워크에 연결되어 있고
이것들로 부터 나오는 데이터를 주로 시계열 데이터라고 하는 경우가 많습니다.
혹은 기존의 네트워크 장비나 보안장비의 입장에서는 네트워크 트래픽 자체를 
모니터링 하고 그 수치를 주기적으로 확인하는 MRTG, RRD 등도 근자에 회자되는
시계열 데이터베이스의 원조 할아버지 격이라 할 수 있겠습니다.

다음은 크로스 플랫폼의 CPU, Memory, HDD, IO, 네트워크, 프로세스 등등의 모든 정보를
모니터링 하는 것으로서 과거에는 libstatgrab 이라는 라이브러리가 존재하였으나
오직 *Nix 계열만 지원했었습니다. 하지만 파이썬의 psutil 모듈은 linux 뿐만 아니라 Mac과
윈도우까지 지원합니다. 다시한번 파이썬의 Cross Platform 지원성에 대한 대단함을
느끼는 바 입니다.
그런데 이 psutil 을 주로 이용하여 (필요시 bottle 등 다른 모듈도 필요)
호스트의 시스템 자원을 보여주는 glances 라는 파이썬 유틸리티를 최근에 알았습니다.

아직 python3 에서는 웹서비스로 돌리는 것에 문제가 있었습니다만 python2에서는 잘 되었습니다.

$ pip install glances bottle

위와 같이 쉽게 설치가 끝납니다.

$ glances 
라고 실행파일을 돌리면,

위와 같이 터미널에서 현재 시스템의 모든 상태를 일목 요연하게 보여줍니다.

만약

$ glances -w

라고 웹 서비스를 기동시키면,
Glances web server started on http://0.0.0.0:61208/
라고 메시지가 나타납니다.

웹 브라우저에서 http://localhost:61208 을 접속하면,

위와 같은 안내화면에 이어,

위와 같은 터미널과 동일한 화면이 웹에서 보입니다.
터미널 에뮬레이션을 하지 않는 모바일 등에서는 위와 같이 간단한 웹서비스로 이용하면 쉽게
알아볼 수 있겠군요.

웹과 터미널에서는 대략 2,3초 만에 한번씩 내용을 갱신하는 것 같았습니다.

이제 위와 같은 결과가 나올 때 이 결과를 InfluxDB 로 저장하는 방법을 살펴보겠습니다.
우선 InfluxDB의 특징을 살펴보겠습니다.

우선 기존에 RDB 등으로 시계열 정보를 넣고 이를 이용하기 위해서는
TimeStamp 컬럼을 지정하고 색인을 한 다음 이 시각 컬럼을 WHERE 절에
이용하여 다른 값 자료를 가져오고 Group by 시키는 등의 역할을 하였습니다.

우선 RDB의 database 처럼 이용하는 것은 동일하고
RDB의 테이블에 해당되는 것이 Measurement 라는 것입니다.
어떤 시계열 Metric 정보를 넣는 테이블과 같은 단위라는 것이었구요.
그 아래에 레코드 처럼 들어가는데 Points 라고 이야기를 하는 것 같았습니다.
0.9.x 버전으로 없그레이드 되면서 예전 사용하던 LevelDB, VoltDB 등의 저장소
엔진 대신 자체 엔진을 이용하였다고 합니다.
레벨DB는 자체적으로 multi 쓰레드에서 사용할 수 있도록 되어 있지 않는 등의
제약사항이 발생하는데 그런 제약사항을 극복하지 위하여 결국은 별도 시계열
자료 저장을 위하여 개발하지 않았나 싶습니다.

암튼 InfluxDB는 Go 언어로 만들어져 있는데 이용해 보면 볼 수록 
시계열 DB 라는 것이 이렇게 차이가 있으면서 이렇게 편리하구나... 하는
생각을 많이 하게 만드는 좋은 소프트웨어라 보여집니다.

이렇게 InfluxDB로 내보내기 위해서는

$ vi ~/glances.conf 
[influxdb]
host=localhost
port=8086
user=root
password=root
db=glances
tags=host:10.20.30.40

와 같이 지정해 줍니다.

우선 glances 라는 DB를 InfluxDB에서 만들어 주어야 합니다.

$ influx
influx> create database glances
influx> exit

그리고 나서

$ glances -C ~/glances.conf --export-influxdb

라고 하여 실행시키면 glances 만 실행시켰을 때처럼 터미널에 화면 표시가 됨과 동시에
influxDB 시계열 DB에 여러 값들이 입력되기 시작합니다.

마지막으로 grafana 라는 대시보드를 살펴보겠습니다.

Grafana 대시보드는 InfluxDB와 같은 시계열 저장소로부터 결과를 가져와서 그 결과를 대시보드 식으로
보여주는 오픈소스로 BackEnd는 Go 언어로 되어있고 FrontEnd는 JavaScript로 되어 있습니다.

로컬호스트에 Grafana를 실행시켰고 admin / admin 으로 접속되었다고 가정합니다.

제일 먼저 DataSource를 지정해야 합니다.

위와 같이 누르고,

위와 같이 설정합니다. (User와 암호는 디폴트로 모두 root, root 입니다)
Data Source 이름은 glances로 하였습니다. 하단의 "Test Connection" 단추를 눌러 위와 같이 성공됨을 확인합니다.
그리고 "Save" 합니다.

위와 같이 상단에 대시보드에서 "New"를 누르고 "New Dashboard" 라는 곳에서 위와 같이 설정아이콘의 "Settings"를 선택합니다.

이름을 "Glances" 라고 하고 "Save" 합니다.
(최근 어느 유머에서 나이든 아버지가 젊었을 때 사용했던 3.5인치 디스크를 우연히 발견하고
 아들에게 보여주었더니, 아들이 한다는 말. "와우!!! 아버지. 재주 좋게도 저장 아이콘을 실제 3D 프린터로
 만들어놓으셨군요" 했다는... ㅋㅎ)


위와 같이 해당 로우에서 "Graph" 라는 대시보드 항목을 하나 만들어 봅니다.

잠깐 검색을 통해서 위와 같은 UI를 이용하여 SELECT 를 해보려 하였으나... 실패하고는
위와 같이 1,2,3 을 선택하고,

위에 1과 같이 SELECT 문을 지정한 다음, 2를 누르면 상단에 그래프가 보이는 것을 알 수 있습니다.

유사하게 B Query도 지정함으로써 시리즈를 하나 더 생성합니다.
(하단 오른편에 Data Source로 glances 라고 지정한 데이터 소스를 제대로 지정했는지 잘 확인합니다)

그래프 하단 오른편에 "Back to dashboard"를 눌러 설정 정보를 닫고 대시보드로 되돌아 갈 수 있습니다.

패널 제목을 누르고 "Edit"를 눌러 해당 패널의 설정으로 돌아갈 수 있습니다.

Row 는 모두 12단으로 되어 있고 이 12단을 나누어 다시 여러개의 그래프나 다른 상태 등을 나타내는
위짓을 나누어 작성할 수 있습니다. 하단의 "ADD ROW"를 눌러 계속하여 다른 행을 추가할 수 있습니다.

또한 상단의 시간 정보를 눌러 최근 n 시계열을 가져오는데 얼마나 자주 갱신하는 가를 줄 수 있습니다.
또는 시간 자체를 줄 수도 있습니다.

위에 시리즈 Query 를 할 때

WHERE $timeFilter
GROUP BY time($interval)

이라고 설정한 부분이 있습니다.

$timeFilter는 Grafana가 위와 같은 설정 시계열 정보의 시간 필터 정보가
자동으로 대입되는 변수이고,

$interval은 지정된 시계열 정보에 따라 지정되는 RRD의 Resolution과 같은 개념입니다.
예를 들어 최근 30분을 보려면 2초마다 그룹핑을 시키고, 최근 1달을 보면 1시간 마다
그룹핑을 하는 식입니다.

RRD에서는 DataSource와 ARCHIVE가 고정되어 들어갔으나
InfluxDB는 이런 스키마 정보가 고정됨이 없이 NoSQL처럼 tag값에 색인할 정보,
fields 값에 위와 같이 시리즈에 반영될 수 있는 실제 메트릭 정보가 들어가 있습니다.

또한 사용자 마다 자신의 대시보드를 만들어 여러 대시보드 중에 원하는 대시보드를 선택하여 확인해 볼 수 있습니다.

위에 테스트를 해본 결과 net라는 measurement에 네트워크 tx,rx 등의 정보가 들어갈 것 같으나
실제 레코드가 하나만 들어가고 마는 현상이 발생되었습니다.
아마도 glances에 약간의 수정이 필요한 것 같습니다.


Java를 제외하고는 Python이 아주 강력한 데이터 분석 및 처리 언어로 각광 받는 바 
그런 의미의 glances도 제대로 알 필요가 있습니다.

또한 구글에서 만든 Go 언어가 단순 새로운 언어를 넘어서
Docker로 시작하여 위와 같은 InfluxDB, Grafana 와 같은 오픈소스에
적용 됨으로써 파이썬과 같은 하이레벨 언어의 장점과 C와 같은 컴파일러 언어의
장점을 모두 딴 소프트웨어가 이후에도 많은 각광을 받을 것 같습니다.

개인적으로는 최근 오픈소스로 전향한 애플의 Swift도 Go와 유사한 것이라 보입니다.
 

어느분께는 도움이 되셨기를...

핑백

덧글

  • Forrest 2016/01/15 15:38 # 삭제 답글

    감사합니다. 하루종일 설정하다 고생했는데, 한방에 해결 되었습니다.
    ^^*
  • 지훈현서아빠 2016/01/15 16:21 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 잠비 2016/01/26 11:19 # 삭제 답글

    Grafana를 알게되어 내부용 모니터링 툴을 만들어보려 했는데
    관련자료 감사드립니다.

    - 시스템(자원정보)
    - 보안장보(로그정보)
    - 데이타베이스(실시간운영로그)

    그중 시스템(자원정보)모니터링 부분이 이해되었네요.....
  • 지훈현서아빠 2016/01/26 13:06 #

    나머지도 같은 맥락에서 다 거기서 거기 입니다. 최근 influxdb 사이트가 influxdata 라고 개편하고 그런
    일련의 것들을 모으는 작업을 진행하더군요.
    도움이 되셨다면 저의 보람입니다. ^^
  • SOul 2017/04/26 11:42 # 삭제 답글

    감사합니다 덕분에 많이 알았습니다.
  • 지훈현서아빠 2017/04/26 13:23 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트