본문 바로가기
open source

fluentbit - open source log processor

by 혜리루 2020. 12. 20.

1. fluent bit란

fluentbit은 오픈소스 멀티플랫폼 로그 프로세서입니다.

fluentbit은 초기에 임베디드 리눅스 환경을 위해 개발되었는데요 그만큼 가볍고 빠른 속도가 특징입니다.

현재는 임베디드뿐 아니라 클라우드 환경에서 널리 사용되는 툴입니다.

 

2. fluent bit의 중요 keywords

1) event 또는 record

fluent bit가 log나 metric으로부터 가져오는 모든 데이터를 event, 혹은 record라고 합니다.

내부적으로 모든 event는 Timestamp와 Message 이렇게 두개의 컴퍼넌트로 이루어져있습니다.

 

2)filtering

로깅을 하다보면 event의 내용을 변경하거나, 삭제하거나, 뭔가를 더 추가하는 등 편집해야하는 경우도 있습니다.

이것을 filtering이라고 합니다.

예시)

* ip주소나 metadata등의 정보를 이벤트에 추가한다.

* 특정한 이벤트만 선택해서 적재한다.

* 특정한 패턴을 가진 이벤트를 삭제한다.

 

3)tag

fluentbit으로 들어가는 모든 event에는 tag가 부여됩니다. 이 태그를 보고 어떤 filtering을 해야할지,

혹은 어떻게 최종 출력을할지 결정할 수 있습니다,

 

 거의 모든 태그는 수동으로 설정됩니다. 태그가 설정되지않으면 fluentbit은 자동으로 해당 이벤트가 발생한

input plugin의 인스턴스명으로 태그를 부여합니다.(forward plugin 제외. 이미 tag set이 부여됨)

 

4)timestamp

event가 생성된 시간을 말합니다. 모든 event는 timestamp를 가지고 있습니다.

timestamp의 형식은 아래처럼 unix time으로 표현됩니다.

SECONDS.NANOSECONDS

timestamp는 input plugin으로부터, 혹은 data parsing 처리를 할때 부여됩니다.

 

5)match

fluentbit에는서 event를 한개 이상의 destination으로 전달할 수 있는데요 해당 작업은 routing 단계에서 실행이됩니다.

match는 부여된 tag를 보고 event를 선택하는 간단한 규칙입니다.

[INPUT]
    Name mem
    Tag  my_mem
[OUTPUT]
    Name   stdout
    Match  my_*

위는 설정파일의 예시입니다. my_*는 my_로 시작하는 모든 tag에 match됩니다.

 

6)structured messages

source event는 structure을 가질수도있고 안가질수도 있습니다. structure은 event 메시지 안에 있는 key value set을 말합니다.

 

no structured

"Project Fluent Bit created on 1398289291"

structured

{"project": "Fluent Bit", "created": 1398289291}

structure이 있으면 데이터를 수정할때 더 빠르게 처리가 가능합니다.

 

3. buffering(성능과 데이터 안전성)

buffering은 record들을 어딘가에 저장해놓고, 이것들을 처리하는동안에도 계속 저장을 할 수 있는 기능입니다. 

buffering은 메모리 안에서 가장 빠른 메커니즘이지만, backpressure, 데이터 안전성, 메모리 최적화를 위해서 특별한 작업이 필요할 때도 있습니다. 

 

fluentbit의 buffering은 일차적으로 메모리 위에서 이루어지지만 선택적으로 file system을 이용할 수도 있습니다.

두개의 메커니즘은 배타적이지않습니다. 데이터가 처리되거나 전달될 준비를 마치면 이 데이터는 memory 위에 존재합니다. 그러는동안  다른 데이터는 처리 및 memory로 이동할 준비가 될 때까지 파일 시스템에있을 수 있습니다. 

 

 

4.Data pipeline

1) input

fluentbit은 다양한 input plugin을 제공합니다.

input plugin이 적재되면 internal instance가 생성됩니다. 이렇게 생성된 모든 instance는 독립적인 configuration을 갖고있습니다.

 

간단하게 적용할 수 있는 input의 한 예로 tail이 있습니다. tail은 tail -f 쉘 커맨드와 비슷한 기능을 합니다.

tail  plugin은 path 패턴에 맞는 파일을 읽어서 새로운 라인이 발견될때 마다 새로운 record를 생성합니다.

 

input plugin을 사용하기 위해서는 쉘 커맨드를 사용하거나 configuration file을 사용하는 두가지 방법이 있습니다.

$ fluent-bit -i tail -p path=/var/log/syslog -o stdout
[INPUT]
    Name        tail
    Path        /var/log/syslog

[OUTPUT]
    Name   stdout
    Match  *

 

2)parser

parser가 여러분의 structure가 없는 데이터(raw 데이터)를 structured data로 만들어줍니다.

 

예를들어 아래와같은 raw string apache 로그를

192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395

아래처럼 json 형식의 structured data로 만들 수 있습니다.

{
  "host":    "192.168.2.20",
  "user":    "-",
  "method":  "GET",
  "path":    "/cgi-bin/try/",
  "code":    "200",
  "size":    "3395",
  "referer": "",
  "agent":   ""
 }

parser은 input plugin별로 독립적, 선택적으로 설정이 가능합니다.

 

3) filter

filter는 데이터를 최종 목적지에 전달하기 전에 데이터를 변경합니다.

input plugin과 마찬가지로 filter 또한 instace context에서 실행되고, 독립적인 configuration을 가지고있습니다.

 

fluentbit는 다양한 filter들을 지원한는데요, 가장 많이 이용되는 필터 중 하나는 Kubernetes deployments입니다.

태그를 분석하거나 k8s api 서버를 이용해서 pod name, container name들의 metadata를  가져올 수 있습니다.

이에 대한 자세한 설명은 다음 포스팅에서 다루겠습니다.

 

 

4) buffer

buffer단계에서의 데이터는 immutable한 상태입니다. 이미 데이터는 raw text가 아니라 binary형식이기 때문입니다.

즉 더이상의 수정(filtering)이 불가합니다.

fluent bit에서는 file system을 이용한 buffering mechanism을 이용해서 system failure로 인한 데이터의 손실을 막을 수 있습니다.

 

5)Router

routing은 필터를 거친 데이터를 최종적으로 다수의 목적지에 전달하는 핵심 기능입니다.

routing은 tag와 match의 규칙에 의해 작동을 하는데요,

data를 어디로 routing할지 정의하기 위해서는 아래처럼 output configuration에 match 룰을 명시해주어야합니다.

[INPUT]
    Name cpu
    Tag  my_cpu

[INPUT]
    Name mem
    Tag  my_mem

[OUTPUT]
    Name   es
    Match  my_cpu

[OUTPUT]
    Name   stdout
    Match  my_mem

만일 어떤 데이터의 tag가 routing 할때 명시된 configuration과 맞지않는다면 해당 데이터는 삭제됩니다.

 

6)Output

output 인터페이스는 data의 최종 목적지(destination)를 결정합니다. 자주 쓰이는 목적지로는 remote services, local file system 등이 있습니다.

input과 마찬가지로 다양한 plugin을 제공합니다.

 

아래는 로그를 aws kinesis data firehose로 전달하는 shell comman와 configuration의 예시입니다.

$ fluent-bit -i cpu -o kinesis_firehose -p delivery_stream=my-stream -p region=us-west-2 -m '*' -f 1
[OUTPUT]
    Name  kinesis_firehose
    Match *
    region us-east-1
    delivery_stream my-stream

 

출처:

docs.fluentbit.io/manual/

'open source' 카테고리의 다른 글

Thumbor - open source imaging service  (1) 2020.10.22

댓글