본문 바로가기
Fluentd

Fluent Bit -> Fluentd -> elasticsearch

1.Fluent Bit?


Fluentd와  Fluent Bit 이름에서도 알 수 있는것 처럼  유사한 기능을 하고 있다. 둘다  Treasure Data 에서 제작/후원 하고 데이터 수집을 목적으로 개발 되고 있다.

Fluentd가 server 범위에서 사용 된다면 Fluent Bit 는 좀더 경량화 되어 Embedded & IoT devices 같은 범위에서 사용 된다.



Fluentd
Fluent Bit
ScopeServersEmbedded & IoT devices
LanguageC & RubyC
Memory~20MB~150KB
PerformanceHigh PerformanceHigh Performance
DependenciesBuilt as a Ruby Gem, it requires a certain number of gems.Zero dependencies, unless some special plugin requires them.
PluginsMore than 300 plugins availableAround 15 plugins available
LicenseApache License v2.0Apache License v2.0

Ref: https://fluentbit.io/documentation/0.8/about/fluentd_and_fluentbit.html



2.Fluent Bit install

fluentbit repo 구성 

/etc/yum.repos.d/td-agent-bit.repo
[td-agent-bit]
name = TD Agent Bit
gpgcheck=1
enabled=1


fluentbit 는 fluentd 와 같이td-agent 를 기반으로 동작 하며  td-agent-bit 를  위에서 추가한 repo를 통하여 설치 한다.

Install td-agent-bit
# yum install td-agent-bit -y
# systemctl enable  td-agent-bit
# systemctl start  td-agent-bit


td-agent-bit 기본 구성은 CPU사용량 메트릭을 수집하고 표준 출력으로 레코드를 보내는 것이며,/var/log/messages 에서 확인 할 수 있다.

tail -n 10 /var/log/messages
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [0cpu.local: [1528430405.000371347, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [1cpu.local: [1528430406.000197713, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [2cpu.local: [1528430407.000182055, {"cpu_p"=>0.500000"user_p"=>0.500000"system_p"=>0.000000"cpu0.p_cpu"=>1.000000"cpu0.p_user"=>1.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [3cpu.local: [1528430408.000158378, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [4cpu.local: [1528430409.000191423, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [0cpu.local: [1528430410.000214930, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [1cpu.local: [1528430411.000144269, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [2cpu.local: [1528430412.000250820, {"cpu_p"=>0.500000"user_p"=>0.000000"system_p"=>0.500000"cpu0.p_cpu"=>1.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>1.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [3cpu.local: [1528430413.000142128, {"cpu_p"=>0.500000"user_p"=>0.500000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]
Jun  8 04:00:20 cy-monitor-agent td-agent-bit: [4cpu.local: [1528430414.000122810, {"cpu_p"=>0.000000"user_p"=>0.000000"system_p"=>0.000000"cpu0.p_cpu"=>0.000000"cpu0.p_user"=>0.000000"cpu0.p_system"=>0.000000"cpu1.p_cpu"=>0.000000"cpu1.p_user"=>0.000000"cpu1.p_system"=>0.000000}]



3.Fluent Bit output elasticsearch 


기본적으로 Fluentbit의 설정은  [SERVICE] 지시자와 [INPUT],[OUTPUT] 구성되어 있다.

Fluent 와 기본 설정 파일의 컨셉은 비슷하나 약간 차이가 있어 보인다.

[SERVICE]  에서 Flush는 flush 되는 시간을 의미 하며 기본 5초 간격으로 flush 된다.(input이나 filter된 데이터를 output 으로 5초마다 보낸다는 의미가 정확하다.)

Log_Level, Log_File 에서는 Fluentbit 가 작동시 발생 하는 log를 지정 하며 설정 하지 않을 경우 별도의 로그를 남기지 않기때문에  에러를 확인 하기 힘들다.

Parsers_File,Plugins_File 에서는 각각의 설정파일을 지정 한다.(filter plugin 문서 참조)

/etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    Flush        5
    Daemon       Off
    Log_Level    info
    Parsers_File parsers.conf
    Plugins_File plugins.conf
    HTTP_Server  Off
    HTTP_Listen  0.0.0.0
    HTTP_Port    2020
 
[INPUT]
    Name cpu
    Tag  cpu.local
    Interval_Sec 1
 
[OUTPUT]
    Name  stdout
    Match *

HTTP_Server On을 할 경우 아래와 같은 agent의 상태 정보를 확인 가능 하다.(정확한 용도는 모르겠지만, 사용 곳이 있어서 만든것 으로 보임... 경량화 했는데도 넣은거라면...)

HTTP_Server On
# curl localhost:2020
{"fluent-bit":{"version":"0.13.2""edition":"Community""flags":["FLB_HAVE_TLS""FLB_HAVE_SQLDB""FLB_HAVE_BUFFERING""FLB_HAVE_TRACE""FLB_HAVE_METRICS""FLB_HAVE_HTTP_SERVER""FLB_HAVE_FLUSH_LIBCO""FLB_HAVE_SYSTEMD""FLB_HAVE_FORK""FLB_IS_TD_AGENT""FLB_HAVE_PROXY_GO""FLB_HAVE_JEMALLOC""FLB_HAVE_LIBBACKTRACE""FLB_HAVE_REGEX""FLB_HAVE_C_TLS""FLB_HAVE_ACCEPT4""FLB_HAVE_INOTIFY"]}}[


 아래와같이 간단하게 input→output 구조로 cpu 자원을 fluentbit-tag 라는 tag를 추가하여 output으로 es(elasticsearch) plugin으로 보내는 설정이다.

이때, host와 port는 외부에서 es에 접근 가능한 정보를 넣으며 index와type설정을 진행 한다.

Name은 사용 할 plugin의 이름 이며, elasticseach는 es 라는 plugin을 사용 한다.

/etc/td-agent-bit/td-agent-bit.conf
[INPUT]
    Name  cpu
    Tag   fluentbit-tag
 
[OUTPUT]
    Name  es
    Match *
    Host  192.168.10.202
    Port  9200
    Index fluentbit
    Type  doc


td-agent-bit 재시작 

Restart td-agent-bit
# systemctl restart td-agent-bit


추가된 인덱스를 확인 한다.


추가된 인덱스에서 지정한 tag와 type으로 store되는지 확인 한다.




4. Fluentbit Grep Filter


Grep Filter 아래와 같이 Regex, Exclude  두개의 key를 갖는다. grep 을 통하여 포함한 문자열만 output으로 보낼지, 아니면 제외 시킬지를 filter 한다.

Key
Value Format
Description
ExcludeFIELD REGEX

Exclude records which field matches the regular expression.

(grep -v)

RegexFIELD REGEX

Keep records which field matches the regular expression.

(grep )


아래 와 같은 형태의 로그중   뒷부분에 os  부분을 filter 하려고 한다.(대부분 linux or windows로 랜덤하게 되어 있음)

access log
16.4.247.147 - - [09/Jun/2018:10:14:59 +0900"GET /apps/cart.jsp?appID=3735 HTTP/1.0" 200 4920 "http://www.calderon.com/home/" "Mozilla/5.0 (iPod; U; CPU iPhone OS 3_3 like Mac OS X; sl-SI) AppleWebKit/533.20.3 (KHTML, like Gecko) Version/4.0.5 Mobile/8B114 Safari/6533.20.3"
220.2.9.115 - - [09/Jun/2018:10:17:26 +0900"GET /apps/cart.jsp?appID=3681 HTTP/1.0" 200 5075 "http://woods.com/post/" "Mozilla/5.0 (Windows 98 5.1; en-US; rv:1.9.1.20) Gecko/2013-05-19 04:20:09 Firefox/3.6.11"
149.76.192.156 - - [09/Jun/2018:10:20:53 +0900"PUT /app/main/posts HTTP/1.0" 200 5008 "http://www.cooke.net/main/" "Mozilla/5.0 (Windows NT 5.01; sl-SI; rv:1.9.0.20) Gecko/2015-01-23 13:02:54 Firefox/5.0"
148.116.95.72 - - [09/Jun/2018:10:25:01 +0900"GET /search/tag/list HTTP/1.0" 200 5058 "http://www.hubbard-blanchard.org/category/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/5341 (KHTML, like Gecko) Chrome/15.0.887.0 Safari/5341"
39.105.5.37 - - [09/Jun/2018:10:25:42 +0900"GET /wp-admin HTTP/1.0" 200 5103 "http://www.perez.com/main/privacy.php" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/5330 (KHTML, like Gecko) Chrome/14.0.879.0 Safari/5330"


Exclude Linux  형태의 filter 를 추가 한다.


/etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    Flush        5
 
[INPUT]
    Name         tail
    Path         /root/log_gen/access_log.log
 
 
[FILTER]
    Name   grep
    Match  *
    Exclude log Linux
 
[OUTPUT]
    Name  es
    Match *
    Host  192.168.10.202
    Port  9200
    Index fluentbit
    Type  doc


kibana 에서 linux 로 검색시, 찾을 수 없음을 확인 할 수 있다.

5. Fluentd bit forward Fluentd


Fluentd bit는 경량화 되어 있기때문에 plugin의 제한과 함께 filter를 grok와 같은 추가 적인 작업과 함께 aggregation 과 같은 작업을 하는 것은 좋지 않다.

그렇기 때문에 Fluentd bit 에서output으로 별도의 Fluentd 로 forward하여 aggregation 이나,  grok와 같은 filter를 진행 하는 것이 agent node의 부하를 줄일 수 있다.

아래와 같이 Fluentd bit 의 OUTPUT 의 plugin value를  forward 로 진행 하며 Fluentd 의 tcp port 로 전송 하도록 설정 한다.

/etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    Flush        5
 
[INPUT]
    Name         tail
    Path         /root/log_gen/access_log.log
 
[OUTPUT]
    Name          forward
    Host          192.168.10.202
    Port          24224


Fluentd 가 설치된 node 에서  source tcp 24224 port 로 binding  하여 모든 match되는 로그에 

stdout 으로 진행 하여 로그가 수집 되는지 확인 한다.
test.conf
<source>
 
  type forward
  bind 0.0.0.0
  port 24224
</source>
 
<match **>
 @type stdout
</match>


아래 그림 처럼 forground형태로 실행시 fluentd 에서 로그가 화면에 나오는 것을 확인 한다.

td-agent 실행
# /opt/td-agent/embedded/bin/fluentd -c test.conf



이제 데몬형식으로 실행 하여 elasticsearch 로 output 을 진행 하기 위해 td-agnet.conf 을 수정 한다.

logstash_format true 를 해야 timestamp 필드가 추가 되며, logstash_prefix 를 통하여 output 할 index 를 선택한다.

/etc/td-agent/td-agent.conf
<source>
 
  @type forward
  bind 0.0.0.0
  port 24224
</source>
 
<match **>
 
  @type elasticsearch
  host 192.168.10.202
  port 9200
  logstash_format true
  logstash_prefix fluentd
 
</match>


td-agent 데몬을 재시작 한다.

Restart td-agent
# systemctl restart  td-agent


  tg-agent-bit가 설치된 node 에서  20000줄의 log를 생성한다.

log 생성
#  python log-gen.py -n 20000 -o LOG


정상적으로 elasticsearch에 저장 될 경우 index이름이  l


ogstash_prefix 에 설정된 이름에  logstash와 동일하게 날짜별로 저장 된다.


또한 kinana를 통하여 20000 개의 log가hits 된 것을 확인 할 수 있다.

이제 저장되고 있는 로그를  grok 형태로 파싱 하기 위해서 fluent-plugin-grok-parser 을 설치 한다.

grok 플러그인 설치
# td-agent-gem install fluent-plugin-grok-parser
Fetching: fluent-plugin-grok-parser-2.1.6.gem (100%)
Successfully installed fluent-plugin-grok-parser-2.1.6
Parsing documentation for fluent-plugin-grok-parser-2.1.6
Installing ri documentation for fluent-plugin-grok-parser-2.1.6
Done installing documentation for fluent-plugin-grok-parser after 0 seconds
1 gem installed


아래와 같이   grokdebug를 통하여 해당 로그를 grok형태로 파싱 될 수 있도록 패턴을 생성한다.




filter 에 아래와 같이 parser plugin을 이용 하여 filter 하는데 , 이때 grok 패턴을 filter 할 수 있도록 한 뒤

 output 할 수 있도록 한다.

/etc/td-agent/td-agent.conf
<source>
  @type forward
  bind 0.0.0.0
  port 24224
</source>
 
 
 
<filter **>
  @type parser
  key_name log
    <parse>
      @type grok
        <grok>
          pattern  %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
        </grok>
    </parse>
</filter>
 
 
<match **>
  @type elasticsearch
  host 192.168.10.202
  port 9200
  logstash_format true
  logstash_prefix fluentd
</match>


서비스 재시작 후 kibana 에서  logstash 로 파싱한것과 동일 한 결과를 확인 할 수 있다.

반응형

'Fluentd' 카테고리의 다른 글

Fluentd output for kafka  (0) 2017.09.30
Fluentd Overview/ Default install  (0) 2017.09.30