Hadoop을 사용하는 상용 솔루션인 Splunk를 정리 합니다.


Splunk 개요


로그 수집 및 로그 기반 통계 전문 솔루션인 Splunk는 간단한 ETL 및 자동으로 내용에 대한 Index를 생성 합니다.

  • Flume Architecture
    • 데이터 검색
      • [[Python]] / Django
      • [[Solr]] : Luncene를 기반으로 동작하는 검색 관리
    • 데이터 인텍싱
    • 데이터 수집
      • Hadoop의 HDFS : 분산 데이터 저장 (Object Storage)
      • [[Flume]] with avro

        http://coverall2.splunk.com/web_assets/developers/diagrams/NSAF/NSAF_Architecture.jpg
        http://1.bp.blogspot.com/-sn0wYFlSrv0/UU3Hjuq-4xI/AAAAAAAABPk/P8ttGMkMvtQ/s1600/LogAggregation.png
        http://cdn-static.zdnet.com/i/story/60/01/032704/splunk-41_press_overview_v3pptx.jpg

CentOS에 Splunk 설치



사전 준비 사항


Splunk 설치

  • 다운로드 사이트에서 설치 파일을 다운로드 합니다.
    • Splunk의 Free vs. Enterprise 기능 비교
    • 다운로드 사이트에서 Splunk 설치 파일을 다운로드 합니다.
      ### wget http://download.splunk.com/releases/5.0.3/splunk/linux/splunk-5.0.3-163460-linux-2.6-x86_64.rpm
      ### wget http://download.splunk.com/releases/6.0/splunk/linux/splunk-6.0-182037-linux-2.6-x86_64.rpm
      wget http://download.splunk.com/releases/6.0.2/splunk/linux/splunk-6.0.2-196940-linux-2.6-x86_64.rpm
      rpm -i splunk-6.0-182037-linux-2.6-x86_64.rpm
      ### rpm -i --prefix=~ splunk-5.0.3-163460-linux-2.6-x86_64.rpm   #--- 설치되는 폴더 변경시
      ### rpm -U splunk-5.0.3-163460-linux-2.6-x86_64.rpm              #--- Splunk upgrade
      ### rpm -U --prefix=~ splunk-5.0.3-163460-linux-2.6-x86_64.rpm   #--- SPlunk upgrade

  • vi .bashrc
    ### ----------------------------------------------------------------------------
    ###     Splunk 설정
    ### ----------------------------------------------------------------------------
    export SPLUNK_HOME=/opt/splunk
    export PATH=${PATH}:${SPLUNK_HOME}/bin
    CDPATH=${CDPATH}:/opt

  • Splunk 실행 및 접속
    splunk start --accept-license                                    #--- Splunk 시작 (첫 시작시)
    ### splunk enable boot-start                                     #--- CentOS 기동시 자동 시작 설정
    ### splunk enable boot-start -user splunk

Splunk Universal forwarder 설치

 wget http://download.splunk.com/releases/5.0.4/universalforwarder/linux/splunkforwarder-5.0.4-172409-linux-2.6-x86_64.rpm?ac=get_splunk_download


Splunk 정보

  • 설치 폴더 : /opt/splunk
    • SplunkWeb : /opt/splunk/var
    • Splunk DB : /opt/splunk/var/lib/splunk
    • Python 폴더 : /opt/splunk/lib/python2.7
  • 설정 파일
    • vi /opt/splunk/etc/splunk-launch.conf
    • 설정 폴더
      • cd /opt/splunk/etc/system/local/
      • cd /opt/splunk/etc/apps/~/local/
      • cd /opt/splunk/etc/apps/~/default/
      • cd /opt/splunk/etc/system/default/
    • 설정 파일 목록
      • vi web.conf
      • vi server.conf
      • vi inputs.conf
  • Version 확인
    • vi /opt/splunk/etc/splunk.version
  • Demon : /opt/splunk/bin/splunkd
  • 기동 종료 : splunk start / stop / restart / status
    • splunk start splunkd
    • splunk start splunkweb
  • Process 확인 : ps -ef | grep splunk | grep -v grep
  • Ports
    • 8000 port : splunkweb 포트
    • 8009 port : splunkd 데몬이 사용하는 포트
    • 9997 port : Forwarder에서 데이터를 수신하는 포트


Splunk 매뉴얼


  • Splunk 폴더 구조 (설치 폴더 : /opt/splunk/)
    • bin/
    • etc/
      • splunk-launch.conf : 설정 파일
      • splunk.version : 버전 정보
      • passwd : Splunk 사용자 정보 저장
      • apps/~/ : Splunk App 폴더
      • users/~/ : 사용자별 정보 저장
    • include/
    • lib/
      • python2.7/ : Python 설치 폴더
      • python2.7/site-packages/splunk/ : Splunk Application
        • appserver/mrsparkle/ : Document Root
        • appserver/mrsparkle/root.py : splunkweb 데몬, 502 라인 참조
        • appserver/mrsparkle/lib/module.py : ModuleController
        • appserver/mrsparkle/controllers/view.py : ViewController
      • python2.7/sitepackages/cherrypy/ : CherryPy Web Server
      • python2.7/sitepackages/mako/ : Mako Template Engine
    • openssl/
    • share/
      • splunk/ : Splunk 개발 프로그램 샘플
        • app_templates : Splunk App 샘플
    • var/ : SplunkWeb에서 사용하는 폴더
      • lib/splunk/ : 데이터 저장
      • log/splunk/ : 로그 저장
      • run/splunk/ : Splunk Web에서 사용하는 작업용 폴더
  • Splunk CLI 도움말
    splunk
    splunk  help cheatsheet

  • Port 설정
    splunk set web-port 9000
    splunk set splunkd-port 9089


함수

  • Unix time을 년월일 형태의 포맷으로 변환
    eval sTime=strftime(time / 1000000, "%Y-%m-%d %H:%M:%S.%6N")


Splunk 검색


 error OR failed OR severe OR (sourcetype=access_* (404 OR 500 OR 503))
 error OR failed OR severe OR (sourcetype=access_* (status=404 OR status=500 OR status=503))
 sourcetype=access_* action=purchase | top category_id


SplunkWeb


  • http://localhost:8000/locale/app/AppName/ViewName
    • 시작 프로그램 : lib/python2.7/site-packages/splunk/appserver/mrsparkle/root.py
      • run() 함수 :
    • Config 파일
      • etc/system/default/web.conf -> cherrypy.config'~'
      • etc/system/local/web.conf
    • Model : lib/python2.7/site-packages/splunk/model/
      • base.py : SplunkAppObjModel class
      • app.py : App class
      • field.py : Field class, FieldValue class
    • Module folder : share/splunk/search_mrsparkle/modules/
      • ~.html, ~.py, ~.js, ~.conf
      • lib/python2.7/site-packages/splunk/appserver/mrsparkle/lib/module.py
      • lib/python2.7/site-packages/splunk/appserver/mrsparkle/controllers/module.py
        • ModuleHandle class, ModuleController class
    • Controller : lib/python2.7/site-packages/splunk/appserver/mrsparkle
      • controllers/top.py : TopController class : URL Path에 따른 Controller 지정
      • controllers/custom.py : CustomController class : Customer Controller 사용 지원
      • controllers/init.py : BaseController class
      • root.py : RootController class의 index(self) 함수
      • controllers/view.py : ViewController class
    • Template : share/splunk/search_mrsparkle/
      • template/viw/**.html
      • exposed/js/, exposed/html/
      • CSS : exposed/css, exposed/css/skins/default/default.css, modules/*/.css
    • log folder : var/log/splunk/
      • etc/log.cfg, etc/log-local.cfg
      • web_service.log
    • static folder : share/splunk/search_mrsparkle/exposed/
    • Splunk apps : /etc/apps/
    • 다국어 지원
      • lib/python2.7/site-packages/splunk/appserver/mrsparkle/lib/i18n.py
      • share/splunk/search_mrsparkle/exposed/js/i18n.js
  • http://localhost:8000/ko_KR/moduleName/viewName
    • module : etc/apps/~/, Splunk.Module, Splunk.Module.Dispatcher
    • view : ~.xml, ~.html
    • API Call
  • CherryPy Web Server : lib/python2.7/site-packages/cherrypy/
  • Mako Template Engine : lib/python2.7/site-packages/mako/


Splunkd




Splunk App


  • Splunk에 Plug-and-Play 형태로 설치되는 모듈


Splunk App 구조

  • 폴더 구조
    • bin/ : 실행 파일
    • appserver/ : Splunk Web에서 사용되는 화면
    • local/, default/ : 로컬 설정과 디폴트 설정, 반드시 local 설정 폴더에 있는 파일만 수정 하세요.
    • metadata/ : 메타 데이터
    • logs/ : 로그 폴더


Splunk Hadoop Connect


Splunk Technology Add-on for HadoopOps


Splunk 한글화


  • POT (Portable Object Template) 파일 : PO 파일을 생성하기 위해서 사용하는 Template
    • lib/python2.7/site-packages/splunk/appserver/mrsparkle/locale/messages.pot
    • etc/apps/~/locale/messages.pot
  • PO (Portable Object) 파일 : GNU Gettext 카탈로그
    • lib/python2.7/site-packages/splunk/appserver/mrsparkle/locale/ko_KR/LC_MESSAGES/messages.po
    • etc/apps/~/locale/ko_KR/LC_MESSAGES/messages.po
  • MO (Machine Object) 파일 : PO 파일이 번역된 binary 기반의 파일
    • lib/python2.7/site-packages/splunk/appserver/mrsparkle/locale/ko_KR/LC_MESSAGES/messages.mo
    • etc/apps/~/locale/ko_KR/LC_MESSAGES/messages.mo
  • 참고 문헌

Hunk



이슈



CheckPoint

  • ERROR: SIC ERROR 119 - SIC Error for lea: Client could not choose an authentication method for service lea

    • fwasync_mux_in: 10: handler returned with error
    • opsec_auth_client_connected: connect failed (119)
    • opsec_auth_client_connected: SIC Error for lea: Client could not choose an authentication method for service lea
      splunk internal call command: $SPLUNK_HOME/bin/splunk _internal call /servicesNS/nobody/Splunk_TA_opseclea_linux22/opsec/log_status/1@opsec
      splunk output: QUERYING: 'https://127.0.0.1:8089/servicesNS/nobody/Splunk_TA_opseclea_linux22/opsec/log_status/1@opsec'
      FAILED: 'HTTP/1.1 404 Not Found'
      Content:
      
      
      
       In handler 'log_status': Could not find object id=1@opsec
      
      

  • $SPLUNK_HOME/Splunk_TA_opseclea_linux22/local/opsec.conf

    lea_server_auth_port = 18185
    lea_server_auth_type = sslca
    lea_server_ip = 10.0.xxx.5

  • $CHECKPOINT_HOME/conf/fwopsec.conf

    lea_server  auth_port   18185
    lea_server  auth_type   sslca
    • cpstop
    • cpstart
  • sslca 대신 ssl_opsec 인증 방식을 지원할 경우

    authkey.C 파일이 생성됨

    etc/apps/lea-loggrabber-splunk/bin 폴더에 authkey.C 파일 복사

    vi etc/apps/Splunk_TA_opseclea_linux22/default/lea.conf


    lea_server auth_type ssl_opsec

    lea_server auth_type auth_opsec

    Splunk restart



Splunk 관리


  • Index 데이터 삭제
    splunk stop
    splunk clean eventdata 인덱스명
    splunk start

Splunk Development



권한에 따른 파일 위치

  • 권한 설정
    • 비공개 유지 : "$SPLUNK_HOME/etc/users/사용자_아이디/CustomApp/" 폴더 아래에 파일 생성
    • 이 앱만 : "$SPLUNK_HOME/etc/apps/CustomApp/" 폴더 아래에 파일 생성
    • 모든 앱 : "$SPLUNK_HOME/etc/users/CustomApp/" 폴더 아래에 파일 생성


Splunk App 생성

  • "앱 -> 앱 관리" 메뉴에서 "앱 만들기" 버튼을 선택 합니다.
    • 이름 : CustomApp
    • 폴더 이름 : CustomApp
    • 버전 : 0.01
    • 표시 여부 : 예
    • 작성자 :
    • 설명 :
    • 템플릿 : barebones
      • $SPLUNK_HOME/share/splunk/app_templates/ 폴더에 있는 Application Template를 사용 합니다.
      • Application Template 종류 : barebones, sample_app
    • 자산 업로드 :
      • $SPLUNK_HOME/etc/apps/CustomApp/appserver/static/ 폴더로 업로드 됩니다.
  • 생성된 App 정보
    • 폴더 : $SPLUNK_HOME/etc/apps/CustomApp/
      • appserver/ : 앱 관련 데이터 저장
      • bin/ : 앱 관련 실행 파일 저장
      • default/ : 앱 관련 디폴트 설정 저장
        • app.conf : CustomApp의 기본 정보
        • data/ui/nav/default.xml : 앱의 메뉴 정보
        • data/views/ : 앱의 view 정보
      • local/ : default/ 폴더에서 customize된 정보 저장
      • metadata/ : 메타 데이터 저장
        • default.meta : 앱의 설정 정보
        • local.meta : 앱의 custom 설정 정보
  • 앱 관리
    • "앱 -> 앱 관리" 메뉴에서 권한, 속성, 개체 등을 편집 합니다.


App 메뉴 수정

  • "설정 -> 사용자 인터페이스 -> 탐색 메뉴" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.

  • "default"를 선택하여 메뉴을 수정 합니다.


  • 메뉴 관리

    • "설정 -> 사용자 인터페이스 -> 탐색 메뉴" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.
    • default 메뉴의 권한을 설정 합니다.


View 추가 및 생성

  • "설정 -> 사용자 인터페이스 -> 뷰" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.
  • "새로 만들기" 버튼을 선택 합니다.
    • 대상 앱 : CustomApp
    • 뷰 이름 : CustomView001
    • $Splunk_HOME/etc/apps/CustomApp/local/data/ui/views/CustomView001.xml 파일이 생성 됩니다.
  • View에서 사용하는 파일 업로드
    • "앱 -> 앱 관리" 메뉴를 선택 합니다.
    • CustomApp이 "속성 편집" 메뉴을 선택 합니다.
    • "자산 업로드"에서 업로드할 파일을 선택한 후 업로드 합니다.
      • $SPLUNK_HOME/etc/apps/CustomApp/appserver/static/ 폴더로 파일이 업로드 됩니다.
    • 업로드한 파일을 View에서 사용하기 위해서는 Splunk를 재기동 하여야 합니다.
      • "설정 -> 서버 컨트롤" 메뉴을 선택한 후 "Splunk 재시작" 버튼을 선택 합니다.
  • View 페이지 접속 및 편집
    • "앱 -> CustomApp" 메뉴을 선택 합니다.
    • "대시보드" 메뉴에서 CustomView001 을 선택 합니다.
  • View 관리
    • "설정 -> 사용자 인터페이스 -> 뷰" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.
    • view의 권한 설정과 복제, 이동, 삭제 등을 합니다.


View용 Template

  • Template 폴더 : $SPLUNK_HOME/share/splunk/search_mrsparkle/templates/
    • 대시보드 Template : dashboards/dashboard.html
  • 정적 파일 저장 폴더 : $SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/
  • Template 파일에 정적 파일 추가
    • CSS 파일 : css/bootstrap.min.css
    • CSS 추가 :
    • JS 파일 : js/i18n.js
    • JS 추가 :
  • RequireJS의 Base 폴더
    • $SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/js/
  • RequireJS를 위하여 JavaScript 파일의 위치를 관리
    • share/splunk/search_mrsparkle/exposed/js/build/simplexml/config.js
  • 주의 : JavaScript 추가시 config.js를 사용하여 추가하지 않을 경우, 오류가 발생할 수 있습니다.


패널 추가 및 관리

  • View 화면에서 "편집 -> 패널 편집" 메뉴를 선택 합니다.

  • "패널 추가" 버튼을 선택 합니다.

    • 콘텐츠 제목 : Panel001
    • 콘텐츠 유형 : 인라인 검색
      • 인라인 검색, 인라인 피벗, 보고서
    • 검색 문자열 : index=_internal
    • 시간 범위 : 전체시간
  • HTML Element 추가

    • "편집 -> 원본 편집" 메뉴를 선택 합니다.
      <html> <p>HTML Element</p> </html>

  • 명명 규칙

    • Element 명명 규칙 : element1, element2, element3 형태의 id로 지정 합니다.
          <div class="dashboard-cell" style="width: 50%;">
              <div class="dashboard-panel clearfix">              
      <div class="panel-element-row"> <div class="dashboard-element html" id="element2" style="width: 100%"> <div class="panel-body html"> <div><p>HTML Element

</div> </div> </div> </div> </div>
  • 검색 명명 규칙 : search1, search2, search3 형태로 지정 합니다.
  • JavaScript에서 HTML Element 노드 찾기

    require(
     ["splunkjs/mvc/utils", "splunkjs/mvc/tokenutils", "underscore", "jquery"]("splunkjs/mvc",),
     function(mvc, utils, TokenUtils, _, $) {
       var node = null;
    
       node = $("#element2 .panel-body");
       alert(node.html());
     }
    );


  • 외부 JavaScript 사용

    • JavaScript에서 d3.js 파일 사용 방법

      • RequireJS의 Base 폴더 : $SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/js/

      • $SPLUNK_HOME/share/splunk/search_mrsparkle/exposed/jslib/d3/d3.js 파일이 존재할 경우

        require(
        ["splunkjs/mvc", "splunkjs/mvc/utils", "splunkjs/mvc/tokenutils", "underscore", "jquery",
        "../jslib/d3/d3"],
        function(mvc, utils, TokenUtils, _, $, d3) {
         var node = null;
        
         viewTemplate();
         viewJavaScriptObject(window, "window");
        chart001(d3); } );


    SplunkJS로 데이터 가져오기

    • Search 생성

      var search004 = new SearchManager({
       "id": "search004 ",
       "search": "index=json | head 10 | table _time guid gubun filename maxDuration source sourcetype",
       "earliest_time": "-2400h",
       "latest_time": "now",
       "preview": true
      });

    • Search 결과 가져오기

      var manager = splunkjs.mvc.Components.getInstance('search004');   #--- SearchManager 인스턴스 생성
      var data = manager.data('results', {   #--- SplunkResultsModel 생성 (events, preview, results, summary)
         output_mode: 'json_rows',
         count: 0                     #--- 가져올 레코드 수 지정 (0. 모두 가져오기)
      });
      
      data.on('data', function(results) {    #--- results : SplunkResultsModel
         #--- 데이터를 가져올 때까지 반복적으로 호출됨
         if (!data.hasData()) {
             return;
         }
         var collection = results.collection().toJSON();
         #--- collection에 배열 형태로 레코드가 저장됨.  각 레코드는 object 형태를 가짐 ("{name: value}")
         for (var idx = 0; idx < collection.length; idx++) {
           var item = collection[idx](idx.md);
           window.alert("item[+ idx + "](") = " + JSONtoString(item));
         }
      });
      manager.startSearch();


    Splunk REST API




    SplunkJS



    SplunkJS Apps 생성

     cd /nas/appl/splunk/etc/apps/framework
     ./splunkdj createapp zzapps
     splunk stop
     splunk start
    
     cd /nas/appl/splunk/etc/apps/zzapps

    - /nas/appl/splunk/etc/apps/zzapps/default/data/ui/nav/default.xml
    ``` ```
    - /nas/appl/splunk/etc/apps/zzapps/default/data/ui/views/default.xml
    ``` ```
    - /nas/appl/splunk/etc/apps/zzapps/appserver/templates/redirect.tmpl
    ``` ```
    - http://node201.hadoop.com:8000/dj/redirector/zzapps/home
    ``` - /nas/appl/splunk/etc/apps/zzapps/django/zzapps/urls.py urlpatterns = patterns('', url(r'^home/$', 'zzapps.views.home', name='home'), )
    - /nas/appl/splunk/etc/apps/zzapps/django/zzapps/views.py def home(request): return { "message": "Hello World from zzapps!", "app_name": "zzapps" } ```
    - http://node201.hadoop.com:8000/dj/en-us/zzapps/home/
    ``` - http://node201.hadoop.com:8000/dj/static/zzapps/custom.css /nas/appl/splunk/etc/apps/zzapps/django/zzapps/static/zzapps/custom.css ```

    SplunkJS Page 추가

    • vi /nas/appl/splunk/etc/apps/zzapps/django/zzapps/templates/home001.html

      {# Boilerplate for a Django Bindings template #}
      {% extends "splunkdj:base_with_app_bar.html" %}
      
      {% load splunkmvc %}
      
      {% block title %}{ {app_name}} Your page title goes here{% endblock title %}
      {% block css %}
         <!-- Style sheets are loaded here -->
         <link rel="stylesheet" type="text/css" href="{ {STATIC_URL}}{ {app_name}}/custom.css" />
         <link rel="stylesheet" type="text/css" href="{ {STATIC_URL}}splunkjs/css/dashboard.css" />
         <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css" />
         <style>
             /* Define any page styles here*/
         </style>
      {% endblock css %}
      {% block content %}
         <!-- You can use HTML and <div> tags for layout -->
         {# Splunk views go here #} 
      
      <!-- http://dev.splunk.com/view/SP-CAAAEQA -->
      <div class="dashboard-body container-fluid main-section-body">
       <div class="row">
         <div class="dashboard-header clearfix">
           <h2>Add views to a template using Django template tags</h2>
         </div>
       </div>
      
       <div class="fieldset">
         {% dropdown id="drop_headcount" default="1" value="$headcount$"|token_safe %}
         {% radiogroup id="radio_sourcetype" managerid="search_sourcetypes"
             labelField="sourcetype" valueField="sourcetype"
             value="$sourcetype$"|token_safe
             default="splunkd"%}
         <div class="input form-submit" id="search_btn">
           <button class="btn btn-primary submit">Search</button>
         </div>
       </div>
      
       <div class="dashboard-row">
         <div class="dashboard-cell" style="width: 50%;">
           <div class="dashboard-panel">
             <div class="panel-head">
               <h3>Chart</h3>
             </div>
             <div class="panel-body">
               <p>view chart</p>
               {% chart id="chart1" managerid="search1" type="bar" %}
             </div>
           </div>
         </div>
         <div class="dashboard-cell" style="width: 50%;">
           <div class="dashboard-panel">
             <div class="panel-head">
               <h3>Chart</h3>
             </div>
             <div class="panel-body">
               <p>view chart</p>
               {% chart id="chart_sourcetype" managerid="search_chart" type="pie" %}
             </div>
           </div>
         </div>
       </div>
      
       <div class="dashboard-row">
         <div class="dashboard-cell" style="width: 100%;">
           <div class="dashboard-panel">
             <div class="panel-head">
               <h3>Table</h3>
             </div>
             <div class="panel-body">
               <p>view table : $sourcetype$</p>
               {% table id="table_searchresults" managerid="search_resulttable" %}
             </div>
           </div>
         </div>
       </div>
      
       <div class="dashboard-row">
         <div class="dashboard-cell" style="width: 30%;">
           <div class="dashboard-panel">
             <div class="panel-head">
               <h3>Timeline</h3>
             </div>
             <div class="panel-body">
               <p>view timeline</p>
               {% timeline id="timeline1" managerid="search1" %}
             </div>
           </div>
         </div>
      
         <div class="dashboard-cell" style="width: 70%;">
           <div class="dashboard-panel">
             <div class="panel-head">
               <h3>Event Viewer</h3>
             </div>
             <div class="panel-body">
               <p>view events</p>
               {% eventsviewer id="eviewer1" managerid="search1" %}
             </div>
           </div>
         </div>
       </div>
      </div>
      {% endblock content%}
      
      {% block managers %}
         {# Search managers go here #}
         {% searchmanager id="search1"
             search="index=_internal | head 1000 | stats count by sourcetype"
             preview=True
             required_field_list="*"
             status_buckets=300 %}
         {% savedsearchmanager
             id="search2"
             searchname="Top five sourcetypes"
             app="search" %}
         {% searchmanager
             id="search_resulttable"
             search="index=_internal sourcetype=$sourcetype$ | head $headcount$"|token_safe
             cache=True
         %}
         {% searchmanager
             id="search_chart"
             search="index=_internal | head 1000 | stats count by sourcetype"
             cache=True
         %}
         {% searchmanager
             id="search_sourcetypes"
             search="index=_internal | head 1000 | top sourcetype"
             cache=True
         %}
      {% endblock managers %}
      {% block js %}
         {# JavaScript goes here #}
         <script>
             var deps = [
                 "splunkjs/ready!",
                 "splunkjs/mvc/radiogroupview"
             ];
             require(deps, function(mvc) {
                 var choices_headcount = [
                     {label:"1", value: "1"},
                     {label:"2", value: "2"},
                     {label:"3", value: "3"}
                 ];
                 splunkjs.mvc.Components.getInstance("drop_headcount").settings.set("choices", choices_headcount);
             });
         </script>
      {% endblock js %}


    SplunkJS View 페이지 생성

    • local/data/ui/views/view102.xml
    • appserver/static/view102.js
      • appserver/static/view102.css
        ``` <form stylesheet="view102.css" script="view102.js">
        <label>분당 인덱싱</label> <fieldset submitButton="false" autoRun="true"> <input type="time" searchWhenChanged="true"> <default>
         <earliestTime>rt-5m</earliestTime>
         <latestTime>rt</latestTime>
        </default> </input> </fieldset> <row> <html> <h1>분당 인덱싱 건수</h1> <ul>
         <li>최대 초당 6,000개의 서비스, 서비스 당 2 이벤트</li>
         <li>
           <b>
             <font color="blue">최대 분당 720,000 인덱싱을 하여야 함</font>
           </b>
         </li>
        </ul> </html> <html> <h1>데이터부 인덱싱 자동화 방안</h1> <ul>
         <li>서비스별 IO폼 파일을 프로그램으로 자동 파싱하여 데이터베이스에 저장함</li>
         <li>
           <b>
             <font color="blue">데이터베이스 저장된 정보를 사용하여 서비스 로그 인덱싱 자동화함</font>
           </b>
         </li>
        </ul> </html> </row> <row> <chart> <title>분당 인덱싱 건수</title> <searchString>index=_internal sourcetype=splunkd series=json | eval epm = eps * 60 | stats avg(epm) as "분당 인덱싱 건수"</searchString> <earliestTime>$earliest$</earliestTime> <latestTime>$latest$</latestTime> <option name="charting.axisTitleX.visibility">visible</option> <option name="charting.axisTitleY.visibility">visible</option> <option name="charting.axisX.scale">linear</option> <option name="charting.axisY.scale">linear</option> <option name="charting.chart">radialGauge</option> <option name="charting.chart.nullValueMode">gaps</option> <option name="charting.chart.rangeValues">"0","216000","720000","936000"</option> <option name="charting.chart.sliceCollapsingThreshold">0.01</option> <option name="charting.chart.stackMode">default</option> <option name="charting.chart.style">shiny</option> <option name="charting.drilldown">all</option> <option name="charting.gaugeColors">0xFFE800,0x84E900,0x000080</option> <option name="charting.layout.splitSeries">0</option> <option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option> <option name="charting.legend.placement">right</option> </chart> <chart> <title>분당 인덱싱 건수/용량</title> <!-- <searchString>index=_internal sourcetype=splunkd series=json | bucket _time span=1m | eval epm = eps * 60 | eval kbpm = kbps * 60 | stats avg(epm) as "분당 인덱싱 건수" avg(kbpm) as "분당 인덱싱 용량(KB)" by _time</searchString>
      • ->
        <searchString>index=_internal sourcetype=splunkd series=json | bucket _time span=1m | eval epm = eps * 60 | eval kbpm = kbps * 60 | stats avg(epm) as "분당 인덱싱 건수" by _time</searchString>
        <earliestTime>$earliest$</earliestTime>
        <latestTime>$latest$</latestTime>
        <option name="charting.axisTitleX.visibility">visible</option>
        <option name="charting.axisTitleY.visibility">visible</option>
        <option name="charting.axisX.scale">linear</option>
        <option name="charting.axisY.scale">linear</option>
        <option name="charting.chart">line</option>
        <option name="charting.chart.nullValueMode">gaps</option>
        <option name="charting.chart.sliceCollapsingThreshold">0.01</option>
        <option name="charting.chart.stackMode">default</option>
        <option name="charting.chart.style">shiny</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.layout.splitSeries">0</option>
        <option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option>
        <option name="charting.legend.placement">right</option>
        </chart> </row> <row> <table>
        <title>분당 인덱싱 현황</title>
        <searchString>index=_internal sourcetype=splunkd series=json | bucket _time span=1m | eval epm = eps * 60 | eval kbpm = kbps * 60 | stats avg(epm) as "분당 인덱싱 건수" avg(kbpm) as "분당 인덱싱 용량(KB)" by _time splunk_server | rename splunk_server as "인덱스 서버"</searchString>
        <earliestTime>$earliest$</earliestTime>
        <latestTime>$latest$</latestTime>
        <option name="wrap">true</option>
        <option name="rowNumbers">false</option>
        <option name="dataOverlayMode">none</option>
        <option name="drilldown">none</option>
        <option name="count">10</option>
        </table> </row> </form>


    JavaScript SDK



    Python SDK




    참고 문헌


    공유하기