ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Holt-Winters Method를 이용하여 값 예측하기(Feat. Grafana)
    레거시/레거시-influxdb 2020. 4. 19. 13:10
    반응형

    목표 : InfluxDB, Grafana 이용하여 모니터링 시스템을 구축하고 Holt Winters Method를 통해 그래프를 분석 후, 값을 예측하여 이상 징후를 확인해봅시다.

    목차

    1. 개요
    2. InfluxDB + Grafana 모니터링 시스템 구축
    3. Holt Winters 예제 따라하기
    4. 결론

    개요

    이번 절에서는 간단하게 이번 실습의 중요 컴포넌트인 InfluxDB, Grafana, Holt Winters Method가 무엇인지 알아보고 왜 실습을 진행하게 되었는지, 어떻게 실습을 진행할지 알아봅니다.

    What?

    InfluxDB란?

    InfluxDB는 인플럭스데이터가 개발한 오픈 소스 타임 시리즈(시계열) 데이터베이스입니다.

    Grafana란?

    Grafana는 다중 플랫폼 오픈 소스 분석 및 대화형 시각화 소프트웨어입니다. 많은 모니터링 시스템에서 UI로써 사용하고 있습니다.

    Holt Winters Method란?

    타임 시리즈(시계열) 데이터를 분석하여 값을 예측하는 방법. 이론적으로 복잡하지 않으면서, 상당히 효과적인 방법으로 알려져있습니다.

    Why?

    이 실습이 저에게 가지는 큰 의미는 2개입니다.

     

    1. 모니터링 툴 그라파나 활용 능력 강화
    2. Holt Winters Method에 대한 간단한 이해와 InfluxDB에서 사용 방법 터득

    How?

    다음 절부터 도커 컴포즈를 활용하여, InfluxDB와 Grafana를 연동한 모니터링 시스템을 구축합니다. 그 후 InfluxDB 공식 홈페이지에서 제공하는 Holt Winters 예제를 따라해보면서 Chronograf 에서 Grafana로 마이그레이션 합니다. 또한 InfluxDB에서 Holt Winters를 어떻게 적용할 수 있는지 알아봅니다.

    InfluxDB + Grafana 모니터링 시스템 구축

    이번 절에서는 도커 컴포즈를 활용하여, InfluxDB와 Grafana 도커 이미지를 띄우고 서로 연동하는 방법에 대해서 알아봅니다. 필요한 컴포넌트들은 다음과 같습니다.

     

    • Docker version 19.03.8 이상
    • docker-compose version 1.25.4 이상

    설치 방법에 대해선 따로 기술하지 않습니다.

    도커 컴포즈 작성

    먼저 프로젝트 루트 디렉토리를 만듭니다.

    # 현재 위치
    $ pwd
    # 개인 워크스페이스 경로
    /Users/a1101320/Workspace
    
    # 프로젝트 루트 디렉토리 생성
    $ mkdir docker-compose-holt-winters
    
    # 프로젝트 루트 디렉토리로 이동
    $ cd docker-compose-holt-winters

    해당 경로에 docker-compose.yml을 만들고 다음을 입력합니다. (docker-compose-holt-winters는 기니까 project로 표기하겠습니다.)

     

    project/docker-compose.yml

    version: '3'
    
    services:
      influxdb:
        image: influxdb
        networks:
          hw_monitor:
        volumes:
          - ./data/influxdb:/var/lib/influxdb
        ports:
          - "8086:8086"
    
      grafana:  
        image: "grafana/grafana"  
        networks:
          hw_monitor:
        volumes:  
          - ./data/grafana:/var/lib/grafana  
        links:
          - influxdb
        ports:  
          - "3000:3000"
        
    
    networks:
      hw_monitor:
        driver: bridge  

    이제 터미널에 다음을 입력합니다.

    # 도커 컨테이너들 띄우기
    $ docker-compose up --build -d
    
    # 실행되는 컨테이너 확인
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    092a21f9bcca        grafana/grafana     "/run.sh"                18 seconds ago      Up 2 seconds        0.0.0.0:3000->3000/tcp   docker-compose-holt-winters_grafana_1
    9a2f250649a2        influxdb            "/entrypoint.sh infl…"   19 seconds ago      Up 2 seconds        0.0.0.0:8086->8086/tcp   docker-compose-holt-winters_influxdb_1

    이제 웹 브라우저에서 localhost:3000 을 접속합니다. 초기에는 로그인 화면이 뜨는데 아이디와 비밀번호에 "admin"을 입력하고 접속하면 됩니다. 그럼 다음 화면이 뜰 것입니다.

    Grafana에서 InfluxDB 연동

    이제 Grafana와 InfluxDB를 연동해보도록 하겠습니다. 먼저 Add data source를 클릭합니다. 그럼 다음 화면이 나옵니다.

    Time series database에 있는 InfluxDB를 선택합니다. 그럼 다음 화면이 뜹니다.

    HTTP 탭에 URL에는 "http://influxdb:8086", InfluxDB Details 탭에서는 Database에 "_internal"을 입력한 후 밑에 "Save & Test" 버튼을 누릅니다.

    "http://influxdb:8086" 는 도커 컴포즈를 이용해 네트워크를 구성했기 때문에 Grafana 컨테이너는 InfluxDB 컨테이너의 IP Adress를 "influxdb"로 인지합니다. _internal은 인플럭스디비가 만들어질 때 기본으로 생성되는 데이터베이스 이름입니다.

    그럼 다음 화면이 뜨는 것을 볼 수 있습니다.

    위의 화면이 뜬다면, 정상적으로 Grafana와 InfluxDB가 연동이 된 것입니다.

    Holt Winters 예제 따라하기

    이제 InfluxDB 공식 문서에서 제공하는 Holt Winters 예제를 따라서 실습을 진행하겠습니다. 자세한 사항은 여기를 참고하세요.

    예제에 나온 HOLT_WINTERS 사용법

    HOLT_WINTERS()

    이 메소드는 influxdb 쿼리 메소드이며, holt-winters 계절 메소드를 사용하여, N개의 필드 값을 예측한 값을 반환합니다. 공식 문서에 따르면, 다음과 상황에서 위 쿼리를 사용할 수 있습니다.

     

    • 데이터가 주어진 Theshold를 넘을 것을 예측할 때
    • 데이터의 예측된 값과, 실제 값을 비교하여 이상 탐지할 때

    구문은 다음과 같습니다.

    > SELECT HOLT_WINTERS\[_WITH-FIT\](<function>(<field_key>),<N>,<S>) [INTO_clause] \
        FROM_clause [WHERE_clause] \ 
        GROUP_BY_clause [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]

    자세한 설명은 공식 문서를 참고하시길 바랍니다.

    예제 데이터 저장하기

    예제 데이터를 얻는 자세한 방법은 여기를 참고하시면 됩니다. 여기서는 도커 컨테이너 안으로 들어가서 실습을 진행하겠습니다. 터미널에 다음을 입력합니다.

    # InfluxDB 컨테이너 접속
    $ docker exec -it docker-compose-holt-winters_influxdb_1 bash
    
    # influx 접속
    root@9a2f250649a2:/> influx
    Connected to http://localhost:8086 version 1.7.10
    InfluxDB shell version: 1.7.10
    # database 생성
    > CREATE DATABASE NOAA_water_database
    
    # database 목록 보기
    > SHOW DATABASES;
    name: databases
    name
    ----
    _internal
    NOAA_water_database
    
    # influx 접속 종료
    > exit
    
    # 예제 데이터 S3에서 받아옴.
    root@9a2f250649a2:/> curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      1 4957k    1 51863    0     0   4012      0  0:21:05  0:00:12  0:20:53  6073
    
    # influx에 데이터 저장
    root@9a2f250649a2:/> influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
    2020/04/16 04:22:35 Processed 1 commands
    2020/04/16 04:22:35 Processed 76290 inserts
    2020/04/16 04:22:35 Failed 0 inserts
    
    # influx 접속
    root@9a2f250649a2:/> influx
    Connected to http://localhost:8086 version 1.7.10
    InfluxDB shell version: 1.7.10
    
    # DB 목록 확인 NOAA_water_databas 있어야 함.
    > show databases;
    name: databases
    name
    ----
    _internal
    NOAA_water_database
    
    # NOAA_water_databas 사용
    > use NOAA_water_database;
    Using database NOAA_water_database
    
    # measurements 목록 확인
    > SHOW measurements
    name: measurements
    name
    ----
    average_temperature
    h2o_feet
    h2o_pH
    h2o_quality
    h2o_temperature

    위의 명령어가 모두 입력이 잘 되고 출력이 되면 데이터 셋 저장은 끝입니다.

    Grafana 실습

    Grafana와 InfluxDB 연동 부분을 수정하도록 하겠습니다. 왼쪽 탭에서 Configuration > Data sources 클릭합니다.

    이제 아까 연결해두었던 InfluxDB를 클릭합니다. 그 후 InfluxDB Details > Database 입력창에 "NOAA_water_database"를 입력하고 하단에 "Save & Test" 버튼을 누릅니다. 그럼 다음 화면이 나올 것입니다.

    스텝 1. Raw Data 시각화

    그라파나에서 다음 쿼리에 해당하는 그래프를 만들어줍니다. 이제 왼쪽 탭의 Dashboards > Home을 클릭합니다. 그러면 다음 화면이 뜹니다.

    여기서 New dashboard를 클릭합니다. 그럼 다음 화면이 뜰 것입니다.

    이제 Add Query를 눌러서 다음을 입력합니다.

    SELECT "water_level" FROM "NOAA_water_database"."autogen"."h2o_feet" 
    WHERE "location"='santa_monica' 
    	AND time >= '2019-08-25 00:00:00' 
        AND time <= '2019-08-31 23:59:59'

     

    위의 쿼리는 "h2o_feet" measurements에서 location이 santa_monica, time은 2019-08-25 00:00:00 와 2019-08-31 23:59:59 사이에 발생한 데이터들을 가져옵니다. 여기까지 진행했으면 대시보드 상단에 time rage를 2019-08-24 00:00:00 to 2019-09-04 00:00:00 로 변경합니다.(실제 입력시에는 한 줄로 써주세요 ^^)

    그럼 다음 화면이 뜹니다.

    스텝 2. Raw Data의 트렌드를 매칭

    이제 GROUP BY time()을 이용하여 RAW_DATA인 water_level의 일반적인 트렌드와 매치하는 값을 갖고 오는 쿼리를 작성하겠습니다. 여기서는 FIRST()함수를 사용합니다. Add Query를 누르고 다음을 입력하세요

    SELECT FIRST("water_level") FROM "NOAA_water_database"."autogen"."h2o_feet" 
    WHERE "location"='santa_monica'  
    	AND time >= '2019-08-25 00:00:00' 
        AND time <= '2019-08-31 23:59:59' 
    GROUP BY time(379m,348m)

     

    "GROUP BY time()"에서 첫번째 인순 379m은 water_level의 최고점과 최저점 사이에서 발생하는 시간 길이와 일치합니다. 두번째 인수 348m는 오프셋 간격을 의미합니다. 결국 이 함수는 RAW_DATA의 시간 범위와 일치하도록 기본 경계를 변경합니다. 여기를 작성하면, 다음 화면이 보일 것입니다.

    스텝 3. 계절성 패턴을 결정

    스탭 2에서의 쿼리를 사용하여, 데이터의 계절 패턴을 식별할 수 있습니다. 초록샋 선의 water_level 데이터 기준으로 패턴이 약 25시간 15분마다 반복됩니다. 계절마다 4개의 데이터의 요소가 있으므로 계절 패턴 인수도 4입니다. 아래 그림을 참고하세요.

    스텝 4. HOLT_WINTERS() 함수 적용

    이제 Holt Winters 메소드를 적용해보도록 하겠습니다. HOLT_WINTERS_WITH_FIT()을 이용하면, 적합치와 예측값을 모두 볼 수 있습니다. Add Query를 누르고 다음을 입력하세요.

    SELECT HOLT_WINTERS_WITH_FIT(FIRST("water_level"),10,4) 
    FROM "NOAA_water_database"."autogen"."h2o_feet" 
    WHERE "location"='santa_monica' 
    	AND time >= '2019-08-25 00:00:00' 
        AND time <= '2019-08-31 23:59:59' 
    GROUP BY time(379m,348m)

     

    그럼 다음의 그래프를 얻을 수 있습니다.

    결론

    우선 목표는 모두 달성했습니다.

     

    1. 도커 컨테이너를 활용한 InfluxDB, Grafana 연동
    2. Chronograf 예시를 Grafana로 마이그레이션
    3. HOLT_WINTERS 예제 따라하기

    그러나 저의 경우 HOLT_WINTERS가 정확히 무엇인지 모르니까 그래프가 그려지더라도 잘 그려진 것인지, 어디에 Threshold를 걸어서 알림을 오게 할 것인지를 판단이 안되고 있습니다. 더 알아봐야 할 것 같습니다.

Designed by Tistory.