## Fluent Bit & Grafana (로그 분석) 이 문서에서는 Fluent bit와 Grafana를 이용하여 log를 수집하고 전처리하여 전송하는 과정을 설명한다. Fluent Bit, influxDB, Grafana 의 설치과정은 공식 doc의 설치과정을 참고한다. <br> ### Fluent Bit ![](https://i.imgur.com/ogI9mNV.png) <br> 오픈소스 멀티플랫폼 로그 프로세서로 초기 임베디드 리눅스환경을 위하여 개발되었다. <br> ### Fluent d 와의 차이점 <img src="https://i.imgur.com/C57yI36.png" width="75%"> <br> <br> | | Fluentd | Fluent Bit | | -------- | -------- | -------- | | 언어 | C & Ruby | C | | 의존성 | Gem이 필요함 | X | | 최대 메모리 사용 | 40MB | 450KB | | 플러그인 | 650+ | 35 | *Gem? 리눅스에서 apt, yum 과 같은 Ruby의 패키지 <br> ### influx DB ![](https://i.imgur.com/TqHz6vU.png) 시계열 데이터베이스 (TSDB: Time-series Database) 수집된 데이터를 시간 순서에 따라 저장하고 조회하는 기능을 제공하는 DB go언어로 작성되었다. <br> ### Grafana ![](https://i.imgur.com/jBBN1jK.png) 시계열 메트릭 정보를 시각화 하기 편한 대쉬보드를 제공하는 오픈소스 툴킷이다. <br> Fluent Bit (전처리) > influxDB > Grafana(시각화)의 과정을 거치며, 1. Fluent Bit를 사용하여 로그를 수집, 분석하는 전처리 2. 처리된 데이터를 넘겨받아 저장하는 influxDB 3. influxDB의 데이터를 조회하여 시각화하는 Grafana 라고 볼 수 있겠다. ![](https://i.imgur.com/Z8DGYon.jpg) ![](https://i.imgur.com/Cl2PrQM.jpg) <br> ### Connect Fluent Bit to InfluxDB ``` /etc/td-agent-bit/td-agent-bit.conf ``` 설정 파일을 열면 fluent bit의 설정을 변경할 수 있다. ``` [SERVICE] # Flush # ===== # set an interval of seconds before to flush records to a destination flush 5 # Daemon # ====== # instruct Fluent Bit to run in foreground or background mode. daemon Off ... http_listen 0.0.0.0 http_port 2020 # Storage # ======= # Fluent Bit can use memory and filesystem buffering based mechanisms # # - https://docs.fluentbit.io/manual/administration/buffering-and-storage # # storage metrics # --------------- # publish storage pipeline metrics in '/api/v1/storage'. The metrics are # exported only if the 'http_server' option is enabled. # storage.metrics on ``` <br> 기본 설정은 그대로 두고 fluent bit에서 수집 할 data 인 [INPUT]이 있다. ``` [INPUT] name cpu tag local.cpu interval_sec 1 [INPUT] name mem tag local.mem [INPUT] name tail tag local.tail2 path /var/log/syslog ``` <br> 위 설정을 확인해보면 cpu, mem 메트릭 정보와 시스템 로그를 가져오고 있다는 것을 알 수 있다. 또한 [INPUT]이 있으면 [OUTPUT]도 있어야한다. fluent bit 에서는 어떤 db에 data를 보낼지 정하게 된다. ``` [OUTPUT] name influxdb match * host 127.0.0.1 port 8086 database local_log_db http_user admin http_passwd ***nplab ``` <br> 특정 포트를 사용하여 influxdb로 data를 보내는 것을 확인할 수 있다. 이렇게 fluent bit의 기본적인 설정을 마치면 이제 정해놓은 [OUTPUT]으로 data를 보내는데 우리가 사용하는 db로 가서 설정을 해주어야 한다. ``` $ sudo service influxdb start ``` <br> 명령어를 사용하여 설치한 influxdb를 실행을 해주고 ``` $ influx > show databases > create database local_log_db > use local_log_db ``` <br> 이전 fluent bit 설정때 정해놓은 이름으로 db를 생성한다. ``` $ sudo service td-agent-bit start ``` <br> fluent bit 를 실행시키면 influxdb에 시스템 메트릭을 적재하기 시작한다. <br> ### Grafana 시각화 db에 적재되기 시작한 시스템 메트릭을 시각화 하여야한다. grafana는 이러한 시스템 메트릭을 시각화 하기 매우 좋은 도구이다. ``` $ sudo service grafana-server start ``` <br> grafana 서버를 실행해준 뒤 웹 브라우저에서 localhost:3000 으로 접속을 해보자. ![](https://i.imgur.com/kDwPkrS.png) Grafana 메인으로 접속이 가능하다. 이제 우리는 influxDB를 연결하기 위해서 data source를 생성해주어야 한다. ![](https://i.imgur.com/Hu8dep6.png) 원하는 이름을 적어넣고 HTTP란에 로컬호스트와 influxDB의 포트를 적는다. ![](https://i.imgur.com/HEqzZSy.png) 그리고 하단에 db 명과 id/pw를 입력해주면 자동으로 연결이된다. 이렇게 간단한 연결을 사용하면 cpu 사용률을 표시하는 등 간단한 메트릭 정보를 시각화 할 수 있다. 하지만 이번에 해볼 것은 Regex 정규표현식을 사용하여 시스템 로그를 분석하는 것이다. ### Regex? ![](https://i.imgur.com/RiePOWP.png) ![](https://i.imgur.com/BlKcMOI.png) <br> Regular Expression의 줄임 말로 정규표현식이다. POSIX의 정규표현식이 표준이며, 확장된 Perl방식의 PCRE가 대표적이다. ### Regex on fluent bit? 우리는 이전 fluent bit configuration 파일을 편집하여 설정을 할 때 [INPUT], [OUTPUT] 설정을 추가하였지만 이번에는 [FILTER] 차례이다. [FILTER]는 문장의 구조를 분석하는 parser를 미리 등록해놓고 이것을 위의 [INPUT]중 텍스트 기반의 data에 적용하여 말 그대로 필터링 하는 것이다. ``` [FILTER] name parser match local.tail2 key_name log parser regex_log ``` 현재 conf 파일 내에서 시스템 로그 [INPUT]에 regex_log parser를 적용한 필터이다. ![](https://i.imgur.com/n77RGsy.png) 이 것은 Regex를 통하여 분류하기 이전의 시스템 로그의 모습으로 어떠한 정보를 담고 있는지에 대한 확인이 어렵다. ![](https://i.imgur.com/gS3RplF.png) 필터를 적용하면 이런식으로 시스템 로그의 각 부분들을 따와서 원하는 정보만 나열이 가능하다. ``` [PARSER] name regex_log format regex regex ^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<pname>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<mes>.*)$ ``` fluent bit의 conf 파일과 같은 곳에 위치한 parsers.conf 파일 내의 일부분 적용된 parser, 즉 Regex의 식을 적어 놓은 모습이다. (time, host, process name, process id, mesg) 로 분류하는 것을 확인 할 수 있다. 유지보수에 활용 가능하게 하기위하여 로그를 출력하고 log로 저장하여 불러와 parser를 적용해보았다. ### Wireshark 로그 분석 <img src="https://i.imgur.com/Iq0Ob8O.png" width="30%"> <br> <br> Wireshark는 네트워크 분석 프로그램으로 expert info 기능을 제공한다. 4가지 분류 (Error, Warning, Chat, Note)로 나누어 패킷을 분석하여 보여준다. 유지보수 활용면에서 응용하기 위해 Wireshark Expert info 로그를 따와 분석 하는 예시를 보도록 하자. 1. 터미널로 tshark의 명령어를 사용하여 출력 2. log 파일로 realtime 저장 3. fluent bit로 수집 위 과정을 거쳐 grafana에 출력되는 로그는 아래와 같다. ![](https://i.imgur.com/c6WLIaq.png) 이러한 raw 상태의 로그는 유지보수를 위해 활용하기에는 어려운 부분이있다. ``` [PARSER] name shark_log format regex regex ^(?<no>[^ ]*) (?<time>[^ ]*) (?<type>[^ ]*) (?<address>[^ ]*) ?(?:[^\→]*\→)? *(?<mes>.*)$ ``` wireshark의 로그에 적용할 수 있도록 regex 식을 만들어 parser로 저장한다. ``` [FILTER] name parser match local.tshark key_name log parser shark_log ``` fluent bit 설정에서 수집된 로그에 위 parser를 적용하는 필터를 생성한다. 그렇게 하면 grafana에서 분석된 로그의 원하는 부분만 사용할 수 있게된다. ![](https://i.imgur.com/7YOvzSq.png) ![](https://i.imgur.com/PFLeCs4.png) 이제 grafana의 시각화 툴을 활용하여 각 메시지가 시간에 따라 얼마만큼 생성되었는지 확인 할 수 있게된다. ![](https://i.imgur.com/zxG4bza.png) ### ex) ![](https://i.imgur.com/wtNw4j5.png) ![](https://i.imgur.com/6jpnEWk.png) ![](https://i.imgur.com/e6aNGuE.png)