Hyun
Hyun
웹서비스 만들기를 좋아하는 개발자입니다.

Telegraf - InfluxDB - Grafana 로 로그 모니터링 시스템 구축

AWS Spot 인스턴스를 활용한 데이터 수집 업무를 진행하면서
실행시에만 인스턴스가 실행되었다가 사라지는 Spot 인스턴스의 특성상
로그 모니터링을 하기가 힘든 점이 있었다.

편의를 위해 서비스가 실행될 때 로그를 수집할 수 없을까? 에 대한 고민을 하다가
동료와 함께 Telegraf - InfluxDB - Grafana 를 활용하여
모니터링 시스템을 구축해보기로 하였다.

Telegraf는 influxdata 에서 제공하는 오픈소스이며 수집기로 사용된다.
기본적으로 시스템 지표(cpu, disk, mem 등)을 모니터링 할 수 있게 제공하며,
telegraf.conf 의 inputs 항목을 설정함에 따라 다양한 루트로 수집이 가능하다.
파일 전체 내용은 아래 링크에서 확인할 수 있다.
https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf

처음에는 inputs.file 방식과 inputs.tail 방식도 고려해보았으나,
정해진 data_format 에 맞게 컨버팅을 해줘야 하는 번거로움이 있어서
로그 그대로를 모니터링 하려는 목적에 맞지 않아 inputs.docker_log 방식을
사용하기로 하였다.

Springboot 서비스는 도커로 실행되고 있다는 전제하에 글을 작성합니다.

우선 해당 서비스 내에 telegraf 라는 폴더를 생성한 후,
docker-compose.yml, telegraf.conf, telegraf_env
3가지 파일을 준비한다.

docker-compose.yml

telegraf 실행시 사용할 docker-compose 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3'

services:
  telegraf:
    container_name: telegraf
    image: telegraf:latest
    env_file:
      - ./telegraf_env
    environment:
      HOST_PROC: /rootfs/proc
      HOST_SYS: /rootfs/sys
      HOST_ETC: /rootfs/etc
    hostname: ${HOSTNAME}
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf
      - /var/run/docker.sock:/var/run/docker.sock
      - /sys:/rootfs/sys:ro
      - /proc:/rootfs/proc:ro
      - /etc:/rootfs/etc:ro
    links:
      - application

  application:
    container_name: ${APP_NAME}
    image: ${APP_NAME}
    ports:
      - 80:8080

telegraf.conf

기본 설정 외에는 모두 주석처리 되어있는데, 필요한 것만 주석제외 후 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[[inputs.docker_log]]
    endpoint = "unix:///var/run/docker.sock"
    from_beginning = false
    container_name_include = ["${CONTAINER_NAME}"]
    container_state_include = ["running"]
    source_tag = true
    insecure_skip_verify = false

[[outputs.influxdb]]
	urls = ["${INFLUX_URL}"]
	database = "${INFLUX_DATABASE}"
	username = "${INFLUX_USERNAME}"
	password = "${INFLUX_PASSWORD}"

telegraf_env

telegraf.conf 에서 참조할 환경변수

1
2
3
4
5
6
INFLUX_DATABASE=데이터베이스명
CONTAINER_NAME=컨테이너명

INFLUX_URL=주소
INFLUX_USERNAME=유저이름
INFLUX_PASSWORD=비밀번호

위와 같이 설정 후에 서비스 docker 실행 및 telegraf docker-compose 를 실행하면 된다.
ex) 실행 스크립트

위를 통해 2개의 도커가 생성된 것을 확인할 수 있을 것이고,
influxdb 에 지정한 database의 measurements를 확인해보면 아래와 같이 자동으로
생성된 것을 확인할 수 있다.

field

tag

이제 influxdb에 쿼리를 해서 데이터가 들어있는 것을 확인하면 Telegraf 연동이 완료된다.
데이터가 잘 들어온 것을 확인한 후에, Grafana 와 연동하여 필요한 데이터를 시각화하면
로그 모니터링 시스템 구축이 완료된다.

이제 Spot 인스턴스에서 무슨 일이 있었는지 면밀히 볼 수 있게 되었다!!