본문 바로가기
네트워크 (LAN,WAN)

ipTIME 공유기 트래픽사용량 수집정보 JSON 형식 변환 및 통계 그래프

by 날으는물고기 2023. 9. 19.

ipTIME 공유기 트래픽사용량 수집정보 JSON 형식 변환 및 통계 그래프

ipTIME 공유기에 연결된 내부(LAN) 및 외부(WAN) 링크에 대한 트래픽 사용량 정보를 수집하여 도식화 했습니다.

공유기 관리자 페이지를 크롤링하면 텍스트 형태로 정보를 가져와서 JSON 형식으로 변환하여 통계화를 해봤는데, jq 명령어를 활용하니 손쉽게 변환할 수 있었습니다.

 

WAN 링크의 트래픽 정보를 수집하면 아래와 같이 텍스트 형태 정보를 확보할 수 있습니다.

"Rx_Packets": "648233790"
"Rx_Bytes": "617839018055"
"Rx_Broadcast": "63695556"
"Rx_Multicast": "399605"
"Rx_Discard": "295574"
"Rx_Error": "0"
"Tx_Packets": "310319281"
"Tx_Bytes": "126893906437"
"Tx_Broadcast": "6"
"Tx_Multicast": "39569"
"Tx_Collision": "0"

주어진 텍스트 파일 내용으로 JSON을 생성하는 jq 명령어를 사용해보겠습니다. 주어진 텍스트를 파싱하고 원하는 JSON 형식으로 포맷팅하기 위해 jq 명령어를 사용할 수 있습니다.

 

아래의 명령어를 사용하면 됩니다.

jq -n '{
  "Rx_Packets": "648233790",
  "Rx_Bytes": "617839018055",
  "Rx_Broadcast": "63695556",
  "Rx_Multicast": "399605",
  "Rx_Discard": "295574",
  "Rx_Error": "0",
  "Tx_Packets": "310319281",
  "Tx_Bytes": "126893906437",
  "Tx_Broadcast": "6",
  "Tx_Multicast": "39569",
  "Tx_Collision": "0"
}'

이 명령어를 실행하면 주어진 텍스트를 파싱하여 다음과 같은 JSON을 생성합니다.

{
  "Rx_Packets": "648233790",
  "Rx_Bytes": "617839018055",
  "Rx_Broadcast": "63695556",
  "Rx_Multicast": "399605",
  "Rx_Discard": "295574",
  "Rx_Error": "0",
  "Tx_Packets": "310319281",
  "Tx_Bytes": "126893906437",
  "Tx_Broadcast": "6",
  "Tx_Multicast": "39569",
  "Tx_Collision": "0"
}

이렇게 생성된 JSON 객체를 원하는 대로 사용할 수 있습니다.

 

주어진 텍스트 파일에서 각 라인의 "키: 값" 쌍을 JSON 형식으로 만들어야 합니다.

아래의 명령어는 주어진 파일에서 데이터를 읽어와 원하는 형태의 JSON을 생성합니다.

awk -F ': ' '{ printf "\"%s\": \"%s\",\n", $1, $2 }' input.txt | sed '$s/,$//' | jq -Rs 'split("\n") | .[:-1] | join(", ") | "{" + . + "}"' | jq -s add

위 명령어는 다음 단계를 수행합니다.

  1. awk를 사용하여 각 줄을 "키: 값" 형식의 문자열로 포맷합니다.
  2. sed를 사용하여 마지막 줄의 끝에 있는 마지막 쉼표를 제거합니다.
  3. jq를 사용하여 줄을 배열로 분할하고 마지막 줄의 쉼표로 연결하여 JSON 객체를 생성합니다.
  4. 다시 한 번 jq를 사용하여 배열의 모든 객체를 병합하여 최종 JSON 객체를 만듭니다.

이렇게 하면 "Rx_Packets": "648233790"와 같이 각 항목이 실제 JSON 형식으로 들어가게 됩니다. 결과를 출력하거나 원하는 대로 활용할 수 있습니다.

 

jq 명령어에서 split("\n")을 사용하면 각 줄을 분리하여 배열 요소로 처리합니다. 따라서 각 키-값 쌍이 배열의 각 요소로 나뉘게 됩니다. 이 경우, 각 요소는 아직 JSON 객체가 아닌 문자열로 처리됩니다.

 

원하는 결과를 얻으려면 추가 단계가 필요합니다. 아래는 더 나은 방법으로 JSON 객체를 만드는 방법입니다.

jq -Rs 'split("\n") | map( split(": ") | { (.[0]): .[1] } ) | add' input.txt

이 명령어는 다음 단계로 수행됩니다.

  1. split("\n")을 사용하여 각 줄을 분리합니다.
  2. map 함수를 사용하여 각 줄을 split(": ")을 통해 키-값 쌍 객체로 변환합니다.
  3. add 함수를 사용하여 모든 객체를 병합하여 최종 JSON 객체를 만듭니다.

이제 각 키-값 쌍이 올바른 JSON 객체로 처리되어 결과를 얻을 수 있습니다.

 

jq에서 map() 함수는 주어진 입력 배열의 각 요소에 대해 지정된 작업을 수행하고 그 결과를 새로운 배열로 반환하는데 사용됩니다. map() 함수를 사용하면 입력 데이터를 변환하거나 처리할 수 있으며, 일반적으로 JSON 데이터를 조작하거나 필요한 형식으로 변환하는 데 유용합니다.

 

예를 들어, 다음은 map() 함수를 사용하여 입력 배열의 각 숫자를 제곱하는 간단한 jq 스크립트입니다.

[1, 2, 3, 4, 5] | map(. * .)

이 스크립트는 [1, 4, 9, 16, 25]와 같이 각 숫자를 제곱하여 새로운 배열을 생성합니다. map() 함수는 입력 배열의 각 요소에 . * . 작업을 적용하고 그 결과를 반환합니다.

 

map() 함수를 사용하면 입력 데이터를 변환하거나 필터링하여 새로운 형식으로 구성할 수 있으며, 복잡한 JSON 데이터에서 원하는 정보를 추출하거나 형식을 변환하는 데 특히 유용합니다.

 

주어진 JSON 객체들을 하나의 JSON 객체로 합치려면 jq를 사용하여 입력 데이터를 처리할 수 있습니다.

아래의 jq 명령어는 주어진 JSON 객체를 하나의 JSON 객체로 만듭니다.

jq -s 'reduce .[] as $item ({}; . + $item)' input.txt

이 명령어는 -s 플래그를 사용하여 입력 파일의 모든 JSON 객체를 배열로 묶고, 그런 다음 reduce 함수를 사용하여 배열 내의 모든 객체를 하나의 객체로 병합합니다.

 

실행하면 다음과 같이 하나의 JSON 객체로 합쳐진 결과를 얻을 수 있습니다.

{
  "Rx_Packets": "648233790",
  "Rx_Bytes": "617839018055",
  "Rx_Broadcast": "63695556",
  "Rx_Multicast": "399605",
  "Rx_Discard": "295574",
  "Rx_Error": "0",
  "Tx_Packets": "310319281",
  "Tx_Bytes": "126893906437",
  "Tx_Broadcast": "6",
  "Tx_Multicast": "39569",
  "Tx_Collision": "0"
}

이제 주어진 JSON 객체들이 하나의 JSON 객체로 합쳐져 있습니다.

 

주어진 JSON 객체에 "a":"b" 키-값 쌍을 추가하려면 jq를 사용하여 다음과 같이 명령어를 작성할 수 있습니다.

jq '. + {"a": "b"}' input.json

위 명령어는 주어진 JSON 객체에 { "a": "b" }를 추가합니다. 결과로 나오는 JSON 객체에 "a":"b" 키-값 쌍이 포함됩니다. input.json은 입력 파일의 이름으로 변경해야 합니다.

 

만약 기존 JSON 객체를 변경하지 않고 새로운 JSON 객체를 생성하고 싶다면 다음과 같이 명령어를 작성할 수 있습니다.

echo '{"a": "b"}' | jq --argjson input "$(cat input.json)" '. + $input'

이 명령어는 기존 JSON 객체와 새로운 JSON 객체를 합쳐서 새로운 JSON 객체를 생성하며, 기존 JSON 객체는 변경되지 않습니다.

 

구글 시트에 JSON 트래픽 값을 주기적으로 추가하기 위해서는 Python과 Google Sheets API를 사용할 수 있습니다. 아래는 이를 수행하기 위한 코드 예제입니다. 코드를 실행하려면 먼저 Google Sheets API를 활성화하고 필요한 라이브러리를 설치해야 합니다.

  1. Google API Console에서 프로젝트를 생성하고 Google Sheets API를 활성화합니다.
  2. credentials.json 파일을 다운로드하고 프로젝트 디렉토리에 저장합니다.
  3. 필요한 Python 라이브러리를 설치합니다:
pip install gspread oauth2client
  1. 다음은 JSON 데이터를 수집하고 Google Sheets에 추가하는 Python 코드입니다. credentials.json 파일은 Google API Console에서 다운로드한 파일입니다. 그리고 SHEET_ID는 대상 Google 시트의 ID로 바꿔야 합니다.
import json
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# Google Sheets API 정보 설정
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(creds)

# 대상 Google 시트 열기 (SHEET_ID는 대상 시트의 ID로 바꿔야 함)
SHEET_ID = 'your_spreadsheet_id'
sheet = client.open_by_key(SHEET_ID).sheet1

# JSON 데이터
data = {
    "Rx_Packets": "648233790",
    "Rx_Bytes": "617839018055",
    "Rx_Broadcast": "63695556",
    "Rx_Multicast": "399605",
    "Rx_Discard": "295574",
    "Rx_Error": "0",
    "Tx_Packets": "310319281",
    "Tx_Bytes": "126893906437",
    "Tx_Broadcast": "6",
    "Tx_Multicast": "39569",
    "Tx_Collision": "0"
}

# JSON 데이터를 Google 시트에 추가
row_to_insert = [data['Rx_Packets'], data['Rx_Bytes'], data['Rx_Broadcast'], data['Rx_Multicast'],
                 data['Rx_Discard'], data['Rx_Error'], data['Tx_Packets'], data['Tx_Bytes'],
                 data['Tx_Broadcast'], data['Tx_Multicast'], data['Tx_Collision']]

sheet.append_row(row_to_insert)

print("데이터가 Google Sheets에 추가되었습니다.")

이 코드를 실행하면 JSON 데이터가 Google Sheets에 추가됩니다. 필요에 따라 주기적으로 실행되도록 스케줄러를 설정하실 수 있습니다.

 

Google Sheets에서 데이터를 사용하여 통계 그래프를 생성하는 방법은 다음과 같은 단계로 수행할 수 있습니다.

  1. 데이터 정리: 먼저 Google Sheets에서 데이터를 정리합니다. 이미 데이터가 시트에 추가되어 있다고 가정하겠습니다. 데이터가 다음과 같은 형태로 정리되어 있는 것으로 가정합니다.
    |   A   |     B     |     C     |      D     |
    |-------|-----------|-----------|------------|
    | Date  | Rx_Packets| Rx_Bytes  | Tx_Packets |
    |-------|-----------|-----------|------------|
    | Date1 | Value1    | Value2    | Value3     |
    | Date2 | Value4    | Value5    | Value6     |
    | Date3 | Value7    | Value8    | Value9     |
    | ...   | ...       | ...       | ...        |
    여기서 "Date" 열은 날짜를 나타내며, "Rx_Packets", "Rx_Bytes", "Tx_Packets" 등의 열은 그래프를 그릴 데이터를 나타냅니다.
  2. 데이터 선택: 그래프를 그릴 범위를 선택합니다. 예를 들어, "Date" 열을 x-축으로 사용하고 "Rx_Packets" 열을 y-축으로 사용하여 그래프를 그리려면 "Date" 열과 "Rx_Packets" 열을 선택합니다.
  3. 그래프 생성: 선택한 데이터를 기반으로 그래프를 생성합니다.
    • "삽입" 메뉴에서 "차트" 옵션을 선택합니다.
    • "차트 편집기" 팝업 창이 나타납니다. 여기서 차트 유형을 선택하고 설정합니다. 예를 들어, "선 그래프"를 선택하고 필요한 설정(색상, 라벨 등)을 구성합니다.
  4. 그래프 제목과 레이블 설정: 그래프에 제목과 레이블을 추가합니다.
    • "차트 제목"을 설정하여 그래프에 제목을 추가합니다.
    • 축 레이블과 범례 레이블을 추가하여 그래프를 이해하기 쉽게 만듭니다.
  5. 차트 위치 설정: 그래프를 시트에 삽입하고 위치를 조정합니다. 그래프를 삽입하려는 위치를 선택하고 "삽입" 버튼을 클릭합니다.
  6. 그래프 형태 수정: 그래프의 형태와 스타일을 필요에 따라 수정합니다. 그래프를 선택하고 "편집" 옵션을 사용하여 변경할 수 있습니다.
  7. 통계 그래프 업데이트: 데이터가 주기적으로 업데이트되는 경우, 그래프를 업데이트하려면 시트에 새로운 데이터를 추가하고 그래프가 자동으로 업데이트되도록 설정합니다.

이제 이러한 단계를 따라 Google Sheets에서 통계 그래프를 만들 수 있어야 합니다. 그래프를 그릴 데이터와 원하는 그래프 유형에 따라 단계를 조정하실 수 있습니다.

728x90

댓글