상단

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 설치

 
 ### 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

 
 start-dfs.sh
 
 
 

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
 
 cd etc/apps/Splunk_TA_opseclea_linux22/opsec-tools
 ./opsec_putkey port 18185 CMA_IP
 
 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

 
    
 
 
    -   /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/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"]("0","216000","720000","936000".md)</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](0xFFE800,0x84E900,0x000080.md)</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


 
 yum install httpd httpd-*
 yum install mod_ssl
 
  • vi /etc/httpd/conf/httpd.conf

 
 
 ProxyRequests On
 ProxyVia On
 
 
     Order deny,allow
     Allow from all
 
 
     SSLProxyEngine On
     ProxyPass          /proxy   https://node201.hadoop.com:8089/   retry=0 timeout=5
     ProxyPassReverse   /proxy/   https://node201.hadoop.com:8089/
 
 
  • 같은 장비의 다른 서비스 호출시 SELinux에 의해 차단됨

    • 오류 메시지

 
 Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8888 (*) failed
  • 조치 방안

 
 /usr/sbin/setsebool httpd_can_network_connect true
 
 
 

Python SDK


 

참고 문헌


 
 

분류: BigData

최종 수정일: 2024-09-30 12:26:18

이전글 :
다음글 :