Splunk

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

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

Splunk 개요

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

  • Flume Architecture
  • 데이터 검색
  • 데이터 인텍싱
  • 데이터 수집

NSAF_Architecture.jpg

LogAggregation.png

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

  • 시작 프로그램 : 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
  • 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

  • etc/users/admin/HadoopConnect/
  • history/ : HadoopConnect에서 작업한 history 저장
  • metadata/
start-dfs.sh
  • 참고 문헌

Splunk Technology Add-on for HadoopOps

  • 설치 폴더 : /opt/splunk/etc/apps/Splunk_TA_hadoopops/
  • Hadoop Operations

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:
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <messages>
    <msg type="ERROR">In handler 'log_status': Could not find object id=1@opsec</msg>
  </messages>
</response>
  • $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 인증 방식을 지원할 경우
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"를 선택하여 메뉴을 수정 합니다.
<nav search_view="search" color="#65A637">
  <view name="search" default='true' />            #--- 검색
  <view name="data_models" />                      #--- 피벗
  <view name="reports" />                          #--- 보고서
  <view name="alerts" />                           #--- 경고
  <view name="dashboards" />                       #--- 대시보드
 
  <collection label="분석 요건 I">                 #--- View 모음
    <view name="view101"/>                         #--- 개별 view
    <view name="view102"/>
    <view name="view103"/>
    <view name="view104"/>
  </collection>
 
  <collection label="발생 서비스 분석">
    <view name="view211"/>
    <view name="view212"/>
  </collection>
 
  <collection label="운영자 요청 분석">
    <view name="view221"/>
  </collection>

  <collection label="발생 데이터 분석">
    <view name="view232"/>
  </collection>
</nav>
  • 메뉴 관리
  • "설정 -> 사용자 인터페이스 -> 탐색 메뉴" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.
  • default 메뉴의 권한을 설정 합니다.

View 추가 및 생성

  • "설정 -> 사용자 인터페이스 -> 뷰" 메뉴에서 앱 컨텍스트로 "CustomApp(CustomApp)"을 선택 합니다.
  • "새로 만들기" 버튼을 선택 합니다.
  • 대상 앱 : CustomApp
  • 뷰 이름 : CustomView001
<form script="CustomView001.js" stylesheet="CustomView001.css">
  <label>CustomView001</label>
</form>
  • $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 추가 : <link rel="stylesheet" type="text/css" href="${url('/static/css/bootstrap.min.css')}" />
  • JS 파일 : js/i18n.js
  • JS 추가 : <script src="${url('/static/js/i18n.js')}"></script>
  • 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 추가
  • "편집 -> 원본 편집" 메뉴를 선택 합니다.
<form script="CustomView001.js" stylesheet="CustomView001.css">
  <label>CustomView001</label>
  <row>
    <html>
      <p>HTML Element</p>
    </html>
  </row>
</form>
  • 명명 규칙
  • 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", "splunkjs/mvc/utils", "splunkjs/mvc/tokenutils", "underscore", "jquery"],
  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];
      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
   <nav>
       <view name="default" default="true"/>
       <a href="/dj/redirector/zzapps/home">Home</a>
   </nav>
  • /nas/appl/splunk/etc/apps/zzapps/default/data/ui/views/default.xml
   <view template="zzapps:/templates/redirect.tmpl" isVisible="false"><label>Home</label></view>
  • /nas/appl/splunk/etc/apps/zzapps/appserver/templates/redirect.tmpl
   <script>
     var root = "/dj/redirector/";
     var path = document.location.pathname;
     var appName = path.match(/\/app\/(.*)\/default/)[1]
     window.alert(path);                                   //---   /en-US/app/zzapps/default
     window.alert(root + appName + "/home");               //---   /dj/redirector/zzapps/home
     document.location = root + appName + "/home";
   </script>
   -   /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"]</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

yum install httpd httpd-*
yum install mod_ssl
  • vi /etc/httpd/conf/httpd.conf
<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

    SSLProxyEngine On
    ProxyPass          /proxy   https://node201.hadoop.com:8089/   retry=0 timeout=5
    ProxyPassReverse   /proxy/   https://node201.hadoop.com:8089/
</IfModule>
  • 같은 장비의 다른 서비스 호출시 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

참고 문헌

  • 매뉴얼
  • 리셀러 등