[ Splunk Project ] Splunk로 주식 분석 | Phase 3. 현재 나의 현황 대시보드 만들기
본문 바로가기

Splunk/Splunk Project

[ Splunk Project ] Splunk로 주식 분석 | Phase 3. 현재 나의 현황 대시보드 만들기

728x90
반응형

🔆 오늘의 핵심 내용 🔆

        룩업 만들기에 살짝 곁들여진 대시보드 만들기

 

🔆 룩업이 뭐가 좋은디!? 🔆

          Splunk의 모아진 데이터의 내용을 좀 더 알기 쉽게 해석할 수 있도록 도와줄 뿐만 아니라,

          KVStore를 이용해 현재의 상태를 업데이트 하는데도 사용할 수 있다.

 

🔆 룩업의 종류 🔆

        ▪️   파일 룩업

        ▪️   KV Store 룩업

 

 

 

 

 

1. 파일 룩업 만들기

아래의 kospi_200.csv 파일을 이용하여 룩업을 만들자!

kospi_200.csv
0.01MB

 

설정에서 룩업을 클릭

룩업 테이블 파일에서 새로 생성 클릭

파일을 선택하고 룩업 이름을 입력

검색에서 다음을 실행하면 해당 룩업 파일에 대해서 조회할 수 있다.

| inputlookup kospi_200.csv

우리가 수집한 파일에는 코드만 있고 회사명이 존재 하지 않기 때문에 편의를 위해서

코드와 회사명을 연결해 주는데 룩업을 사용할 것이다.

실제 데이터와 룩업을 아기 위해서는 한 가지 작업이 더 필요하다.

 

설정 > 룩업

Add New (새로 생성) 클릭

 

파일 기반의 룩업으로 생성

자 이렇게 저장하게 되면 룩업을 사용할 수 있게 되었다.

index = "kospi" Date="2023-06-12" 
| lookup kospi_200 code OUTPUT name
| table code, name, Date, Close, Open, High, Low

 

🍬 룩업을 사용하지 않았을 때 : name field가 없음

 

index=kospi Date="2023-06-12" 
| lookup kospi_200 code OUTPUT name
| table name, code, Date, Close, Open, High, Low

룩업 명령어는 다음처럼

  • "kospi_200" 룩업 이름
  • 본 테이블과 매칭할 필드 명 "code"
  • lookup 후 추가할 필드 명들 "name" 로 구성된다.

 

🍬 룩업을 사용할 때 :  name field가 있음

 

 

 

2.  KV Store 룩업 만들기

룩업에는 파일 룩업 말고도  kvstore 룩업도 있다.

이것도 한 번 실습해보자.

다시 설정 > 룩업으로 들어가서

이번에는 룩업 테이블 파일 업로드 과정 없이

바로 룩업 정의를 만든다.

룩업 정의의 새로 추가를 클릭

다른 부분은 다 비슷하게 설정을 하고, 타입은  KV Store 로 선택한다.

그리고 필드 항목들을 넣자.

_key는 해달 컬럼을 구분하는 구분자로 히든 컬럼으로 처리됨

여기에는 나의 주식 보유사항들을 기록하는데 사용할 예정이다.

히스토리 형태로 남기지 않고 현재 상태를 계속해서 업데이트 하는 용도로 사용한다.

또한 주식을 보유하지 않았지만 관심있는 항목으로 설정하기 위해서 "interest" 칼럼도 추가했다.

 

나만 사용하는 시스템이라 사용자 구분은 생략함.

 

KV_store 를 사용하기위해서는 간단하지만 약간의 번거로운 작업이 추가적으로 필요하다.

스플렁크의 앱(stock)의 local 디렉토리에서 collections.conf 를 수정해야 한다.

$ vi $SPLUNK_HOME/etc/apps/stock/local/collections.conf

[my_stock]

KV store를 위한 룩업 완성!!

| makeresults 1 | eval code = "005930", share = 5, interest = 1
| eval _key = code
| outputlookup my_stock append=true override_if_empty=true

makeresults는 가상의 데이터를 만들 때 사용한다.

005930(삼성전자) 주식으로 5주 소유했고 관심주로 등록한다.

이 때 _key를 만들어 주지 않으면 key가 랜덤으로 생성되기 때문에 나중에 업데이트가 되지 않는다.

따라서 명시적으로 설정해주는 것이 좋다.

그리고 최종 정보를 "outputlookup" 명령을 이용해 kv_store에 저장한다.

 

저장 시 주의할 점

반드시 append=true로 해야한다.

그렇지 않으면 기존 내용을 모두 삭제하게 된다.

그리고 업데이트를 위해서 "override_if_empty"도 true로 설정한다.

 

이런 형태로 입력하게 되고 나중에는 주식을 사고 팔 때 바로 업데이트 되도록 자동화 하자.

 

비슷한 정보를 하나 더 입력하겠다.

| makeresults 1 | eval code = "068270", share = 6, interest = 1
| eval _key = code
| outputlookup my_stock append=true override_if_empty=true

 

입력이 끝나면 다음과 같은 형태로 조회할 수 있다.

 

 

이제 준비가 끝났다. 이제 화면을 몇 개 만들어 보자.

우선 지금 입력된 주식을 바탕으로 현재 내 자산의 상태를 체크한다.

 

현재 자산이기 때문에 2부에서 만들어 놓은 readstock 명령을 사용하자.

 

| inputlookup my_stock 
| map search="| readstock code=$code$ | spath 
    | eval share = $share$ 
    | table code, price, share " 
| eval asset = share * price
| lookup kospi_200 code OUTPUT name
| chart sum(asset) by name

여기에서 사용한 명령은 map 명령이다.

readstock은 한 개의 종목만 조회할 수 있는데 my_stock에 있는 것을 일일히 조회하는 것은 IT인으로서 할 일이 아니다.

map 명령은 앞에 조회한 내용을 기반으로 병렬로 검색문을 수행할 수 있도록 해준다.

현재가를 조회한 내용을 기반으로 내가 보유한 주식 수를 곱해서 나의 자산을 계산한다.

 

그리고 "chart" 명령을 이용해 보기 좋게 만들어 준다.

오잉?? ㅇ.ㅇ

왜 종목이 하나밖에 안 나와!

알고보니 kospi200.csv 에 포함된 종목이 아니라서 기존 파일에 존재하지 않았던 것!

이럴 땐 룩업 에디터를 사용하여 룩업을 수정할 수 있다!

룩업 에디터는  Splunk에서 enterprise 사용자에게 무료로 제공하는 앱이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여기서 확인할 수 있고 없다면

+ Find More Apps 로 들어가서 

다운로드 받으면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

kospi 를 검색하여 클릭
마지막 행에 다음 정보를 입력한 후 save lookup 클릭

 

이제 됐다!

 

이제 시각화 탭으로 이동해서 이를 "single value" 로 보여주고 "Trellis" 를 이용해 종목별로 분리해서 표시한다.

 

포맷 부분은 여러가지 눌러보고 가장 이뻐 보이는 걸로 선택한다.

현재 보유 자산은 다음과 같이 평가 된다. 

이제 이 차트를 대시보드로 만들어서 궁금할 때 마다 꺼내 보자.

 

 

Save As의 New Dashboard 클릭

 

필요한 부분을 입력하고 저장 

오류 발생...

우측 상단의 빨간색 세모를 클릭한다.

 

 

어쨋든 돌리겠다고 Run Query Anyway를 클릭

 

짜자잔~~ 첫 화면이 만들어 졌다.

같은 방법으로 현재 주식 가격도 만들어서 저장한다.

| inputlookup my_stock 
| map search="| readstock code=$code$ | spath 
    | eval share = $share$ 
    | table code, price, share " 
| eval asset = price
| lookup kospi_200 code OUTPUT name
| chart sum(asset) by name

같은 방법으로 만들어서 이번에는 새로운 대시보드가 아닌 기존의 대시보드에 저장한다.

기존에  만든 대시보드에 추가

이렇게 두 개가 만들어 졌다.

그런데 거의 같은 쿼리인데 각 패널마다 던지는 것은 뭔가 비효율적인 것 같은 직감이 든다.

 

대시보드의 편집 버튼을 클릭한 후 "Source"를 클릭한다.

화면 UI를 구성하는 XML 파일이 출력되는데, 여기에서 중복되는 검색을 제거할 것이다.

<dashboard>
  <label>나의 자산</label>
   <!--- 추가되는 부분-->
  <search id="current_stock">
    <query>
         | inputlookup my_stock 
         | map search="| readstock code=$$code$$ 
                                 | spath 
                                 | eval share = $$share$$ 
                                 | table code, price, share " 
    </query>
  </search>
  <!---- 여기까지 -->  
  <row>
    <panel>
      <title>나의 자산 현황</title>
...

여기에서 다음처럼 앞에 <search> 태그를 추가하고 공통으로 사용하게 되는 검색문을 만들어 넣는다. 그리고 검색문에 대한 id를 할당해 준다. 기존이 $<변수명>$ 이 부분은 하나가 더 추가된 $$<변수명>$$ 이 된 것에 주의하자. 대시보드에서 $<변수명>$ 은 이미 대시보드의 변수를 입력하는 용도로 사용되고 있어서 SPL 상의 $<변수명>$ 가 $$<변수명>$$ 이 되게된다.

변경 결

# 기존 구문
...      
<title>나의 자산 현황</title>
      <single>
        <search> <-- base 속성 추가
          <query>| inputlookup my_stock |map search="| readstock code=$$code$$ | spath | eval share = $$share$$ | table code, price, share " | eval asset = share * price
| lookup kospi_200 code OUTPUT name
| chart sum(asset) by name</query> <-- 여기 변경
          <earliest>0</earliest>  <-- 여기 삭제
          <sampleRatio>1</sampleRatio> <--여기 삭제
        </search>
...
# 변경 후
      <title>나의 자산 현황</title>
      <single>
        <search base="current_stock">
          <query> eval asset = share * price
| lookup kospi_200 code OUTPUT name
| chart sum(asset) by name</query>
        </search>
        <option name="colorBy">value</option>
# 현재 주식 가격 변경 후
      <title>현재 주식 가격</title>
      <single>
        <search base="current_stock">
          <query> lookup kospi_200 code OUTPUT name
| chart sum(price) by name</query>
        </search>
...

이는 base로 설정한 쿼리가 한 번 실행 되고, 

이 결과를 기반으로 아래에 있는 쿼리들이 수행되게 해주기 때문에

검색 속도에 대한 향상을 가져다 주고 네이버에 대한 부담도 줄어들 것이다.(URL 4번 호출이 2번으로 준다.)

 

편집 모드에 있는 김에 약간의 UI도 정리해서 다음과 같은 모습으로 만들었다.

<row>
	<panel>
		...
	</panel>
	<panel>
		...
	</panel>
</row>

요런 형태로 넣으면 한 줄에 들어간다.

728x90
반응형