Blog

  • Node-RED 설치하기

    Grafana에서 Alert을 보내는 방법은 여러가지가 있다. 그런데 대부분 메세지 기반의 서비스 들이다. 병원에서 쓰려면 소리가 나야 하는 법. 그래서 찾아봤더니 Node-RED를 이용해서 구현할 수 있는 것 같았다.

    그래서 Node-RED를 설치해 보았다. 오늘의 목표는 소리가 나게 하는 것이다. 다음과 같이 Node-RED를 도커로 설치한다.

    sudo docker run -it \
    -p 1880:1880 \
    --name mynodered \
    nodered/node-red

    방화벽에서도 1880을 포워딩 시켜준다.

    add action=dst-nat chain=dstnat comment=node_red dst-port=1880 protocol=tcp src-address-list=trusted_source to-addresses=10.10.10.184 to-ports=1880

    웹브라우저에서 소리가 나는 것을 구현하기 위해서 필요한 Node-RED의 라이브러리는 다음과 같다. 도커에서 실행시키기 위해서는 다음과 같이 한다.

    $ sudo docker exec -it mynodered /bin/bash

    이렇게 하면 bash 창이 나온다. 다음의 명령어를 이용하여 라이브러리를 설치한다. dashboard도 같이 설치해 준다.

    npm install node-red-dashboard
    npm install node-red-contrib-play-audio

    다음과 같이 하면 된다. chime.mp3 와 관련된 부분을 지정할 때에는 ‘file in’을 선택하고, 경로는 가능하면 절대 경로로 한다. Output에는 Buffer라고 되어 있는 2개중 하나를 선택하면 된다.

    그리고 Deploy 시킨다. curl 을 이용하여 확인해 보려면 다음과 같이 한다.

    $ curl -v -X POST localhost:1880/hello

  • Flux 작성하기

    InfluxDB v2.0 부터 Flux 라는 형식으로 데이터를 추출하도록 해야 한다고 한다.

    ICU03번으로 입력된 SpO2 1일치 자료는 다음과 같이 입력하면 깔끔하게 출력된다. map 부분을 저렇게 해주지 않으면 예쁘지 않은 label로 보인다.

    from(bucket: "measurements")
    |> range(start:-1d)
    |> filter(fn: (r) => r._measurement == "vital" and r.bed  == "ICU03" and r._field == "spo2")
    |>  map(fn: (r) => ({ _value:r._value, _time:r._time, _field:"SpO2" }))
  • API로 결과 입력하기

    InfluxDB의 경우 ns 단위로 시간 결과를 입력할 수 있다고 한다. 나의 경우에는 ms도 과할 정도고 s 단위 정도면 충분하다.

    기본적으로 다음과 같은 식으로 데이터를 준비해야 한다.

    빈 칸(white space)는 두 번 들어갈 수 있다. 첫 번째는 tag와 field 사이이고 두 번째는 field와 timestamp 사이이다.

    꼭 필요한 값은 measurement 와 field 이다. timestamp 의 경우 입력하지 않으면 host 시간을 기준으로 입력된다.

    curl --request POST \
    "http://localhost:8086/api/v2/write?org=rcc&bucket=measurements&precision=s" \
      --header "Authorization: Token MY_TOKEN_HERE" \
      --header "Content-Type: text/plain; charset=utf-8" \
      --header "Accept: application/json" \
      --data-binary '
        vital,bed=ICU01 spo2=99
        '

    curl 로 입력하려면 위와 같은 식으로 준비하면 된다.

    Python의 Requests로 입력하려면 다음과 같이 하면 된다. 준비 과정에서 따옴표가 지나치게 많이 들어가기 때문에 최대한 dictionary 타입으로 준비하는 것이 좋다. 위에서 언급했지만 precision은 second로 하도록 한다.

    headers = {
        "Authorization": "Token My_TOKEN_HERE",  
        "Content-Type": "text/plain; charset=utf-8",
        "Accept": "application/json"
    }
    
    requests.post(
    "http://rcc.work:8086/api/v2/write?org=rcc&bucket=measurements&precision=s",
    headers=headers,
    data=data_influx_3
    )
  • InfluxDB 설치

    현재 최신 버젼은 v2.7이다.

    기존에 설치되어 있는 컨테이너를 삭제하고 설치한다.

    sudo docker rm -f influxdb
    sudo docker run -it \
      --network rcc \
      -p 8086:8086 \
      --restart always \
      --name influxdb \
      debian

    컨테이너 기본을 설정한다.

    echo exit 0 > /usr/sbin/policy-rc.d
    echo 'Acquire::http::Proxy "http://rcc.work:3142";' > /etc/apt/apt.conf
    rm -rf /etc/localtime; ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
    
    apt -y update && apt -y upgrade && apt -y install wget nano curl procps

    설치 편의를 위하여 미리 다운받은 패키지를 다운받고 설치한다.

    cd ~
    wget http://rcc.work:3143/influxdb2-2.7.0-amd64.deb
    dpkg -i influxdb2-2.7.0-amd64.deb
    

    다음과 같은 명령어를 사용하여 서비스를 실행한다.

    # service influxdb start
    Starting influxdb...
    influxdb process was started [ OK ]
    

    다음에는 웹으로 접속해서 organization과 bucket 이름, 보관 기한 등을 설정한다. 결과 입력용 token을 별도로 발급하는 것이 권한 관리에 좋다.