Infra

[monitoring] local에서 filebeat + elasticsearch + grafana를 통해 모니터링 시스템 구축해보기

자바생 2023. 7. 6. 01:33
728x90

글을 쓰게 된 이유

 

우아한테크코스 근로 프롤로그를 맡게 되면서 초반에 코치님들에게 "꿈을 펼쳐도 되나요?"라고 여쭤봤었다.

가능한 꿈은 펼쳐도 된다라고 답변도 해주셨고,,

 

 

그래서 옛날부터 모니터링을 한번 해보고 싶어서 이번 기회에 구축해 보고자 프롤로그 코치님들을 꽤 괴롭혔다,,

DM으로 로컬에서 해보았다면서 간접적으로 인프라에 대해 여쭤보기도 하고,,

 

 

먼저 로컬에서 연습해보고 나서 나중에 AWS 권한이 생기면 DEV에 먼저 구축해보려고 한다.(7/6 ~ 진행 중)

 

 

"로컬에서 미리 연습하면 DEV 환경에서 더 편하게 할 수 있지 않을까?"라는 생각과 함께

같이 근로하는 크루원들에게 모니터링을 하면 이런 걸 볼 수 있다 

+ 어떻게 했는지 알려주기 위해 글을 작성해 봤다.

 

 

왜 이러한 툴들을 사용했나요?

 

다른 글을 통해서 적어두었지만 결국 서버 비용 == 돈입니다.

 

또한, 프롤로그는 현재 많은 사용자로 인해 서버가 견디기 어려운 상황이 아니었기 때문에 최대한 작은 서버 스펙으로 모니터링을 구축 + 기존에 ES가 구축되어 있어서 사용하게 됐습니다.

 

 

config

 

filebeat

 

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/logs/*.log

output.elasticsearch:
  hosts: ["elasticsearch:9200"]

 

먼저 파일 수집기인 filebeat입니다.

 

inputs과 output은 말 그대로 파일 수집기가 어떤 파일을 "읽고", 그 읽은 다음에 "누구에게 전달"하는지 명시합니다.

 

 

현재 filebeat는 docker 컨테이너에서 동작하기 때문에 파일 이름이 저렇게 되어있고, 읽은 파일을 elasticsearch에 전달하게 됩니다.

 

 

 

 

dockcer-compose.yml

 

 

version: '3'
services:
  filebeat:
    image: docker.elastic.co/beats/filebeat:7.14.1
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./logs:/usr/share/filebeat/logs
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
  grafana:
    image: grafana/grafana:8.2.6
    ports:
      - "3000:3000"

 

왜 최신 버전도 많은데 7.14.1을 사용했느냐면 토미에게 현재 운영되고 있는 ES 버전을 여쭤보았고, 그게 7.14.1이기 때문에 filebeat 버전을 ES에 맞춰주었습니다.

 

 

그리고 그라파나는 제일 최신 버전을 사용했는데 그 이유는 시각화 툴은 최근 배포된 것일수록 좋다고 생각이 들었습니다.

(해보니 아무 이상 없었음)

 

 

filebeat가 도커 컨테이너 위에서 동작하기 때문에 filebeat.yml과 log 파일을 마운팅 해줘야 합니다.

 

 

그래서 volumes를 보시면 해당 파일들을 지정된 path에 마운팅 시켜줍니다.

 

 

 

 

 

logback-spring.xml

 

 

 

<configuration>
  <conversionRule conversionWord="timestamp" converterClass="net.logstash.logback.composite.loggingevent.TimestampJsonProvider" />

  <appender name="JSON" class="ch.qos.logback.core.FileAppender">
    <file>/monitoring/logs/practice.log</file>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      <providers>
        <pattern>
          <pattern>
            {
            "severity": "%level",
            "rest": "%message",
            "exception": "%ex{full}",
            "class": "%logger{40}",
            "pid": "${PID:-}",
            "thread": "%thread"
            }
          </pattern>
        </pattern>
        <timestamp>
          <fieldName>@timestamp</fieldName>
          <pattern>yyyy-MM-dd'T'HH:mm:ss.SSSX</pattern>
        </timestamp>
      </providers>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="JSON" />
  </root>
</configuration>

 

 

 

위 xml 은 나중에 로깅에서 다시 다루고 이번에는 xml을 작성하면서 겪었던 어려움을 작성해 보겠습니다.

 

 

timestamp 필수

 

 

그라파나에서 data source를 ES로 선택하게 된다면 무조건 timestamp를 입력하도록 되어있습니다.

 

 

그래서 <timestamp>를 처음에 넣어주지 않고 <pattern>에만 넣어주었는데 이 부분 때문에 시간을 꽤 많이 소비했습니다.

 

 

 

spring boot

 

 

@RestController
@Slf4j
public class MyController {

  @GetMapping("/log")
  public String logger() {
    log.trace("trace Log");
    log.debug("debug Log");
    log.info("info Log");
    log.warn("warn Log");
    log.error("error Log");

    try {
      throwException();
    } catch (IllegalArgumentException e) {
      log.error("에러 트레이스", e);
      log.error("에러1", e);
      log.error("에러2", e);
      log.error("에러3", e);
      log.warn("경고1", e);
    }

    return "ok";
  }

  public void throwException() {
    throw new IllegalArgumentException("에러 로깅 되라");
  }
}

 

 

 

여러 번 log를 호출하고 파일에 로깅을 한 뒤에 docker compose를 실행시켰습니다.

 

 

 

 

Elasticsearch에서 상태 확인하기

 

 

docker compose logs -f filebeat

 

 

위의 명령어를 통해서 filebeat의 로그를 보며 WARN이나 ERROR 뜨지 않는지 확인합니다.

즉, filebeat에서 ES로 로그가 잘 도착했는지 확인하는 과정입니다.

 

 

제대로 동작한다면 이제 ES의 상태를 확인해야 합니다.

 

ES의 기본 포트는 9200으로 아래와 같은 요청으로 인덱스가 제대로 생성됐는지 확인합니다.

 

 

http://localhost:9200/_cat/indices?v

 

 

이것을 확인하는 이유는 나중에 그라파나에서도 필요하기도 하고, 상태를 확인하기 위함입니다.

 

 

filebeat 가 제대로 인덱싱 된 것을 확인할 수 있습니다.

 

http://localhost:9200/filebeat-*/_search?pretty&size=1000

 

 

 

뭐가 많이 뜨는 것을 알 수 있습니다. 바로 우리가 작성했던 로그들입니다.

 

 

 

ERROR 일 때는 에러 트레이스를 작성했기 때문에 위와 같이 작성되는 것을 알 수 있습니다.

 

 

 

 

 

그라파나 확인해 보기

 

 

 

그라파나는 기본 포트가 3000으로 들어가면 초기 화면이 나오는데 초기 아이디와 비밀번호는 admin입니다.

 

 

 

이제 어떤 것을 모니터링할지 바로 “data source”를 등록해야 합니다.

 

 

 

 

 

 

 

 

 

 

이제 ES에 관한 정보를 입력해야 합니다.

 

여기에서 꽤 많은 시간을 소비했었는데, 바로 URL에서 http://localhost:9200 이 동작하지 않았습니다.

 

 

그 이유는 현재 같은 docker container 안에서 동작하기 때문에 http://elasticsearch:9200이라고 작성해야 제대로 연결이 될 수 있었습니다.

 

 

 

그리고 index name은 아까 위에서 봤던 filebeat에 대한 index명을 작성하면 됩니다.

 

 

하지만 우리는 이미 filebeat를 사용한다라고 알고 있기 때문에 filebeat-* 로 해도 잘 동작합니다.

(처음에는 명시되어 있는 filebeat의 인덱스를 전부 복붙 했습니다.)

 

 

 

Time field name에 @timestamp 가 되어있는데 아까 로깅할 때 언급했던 이유가 바로 이 부분입니다.

 

 

Version은 현재 사용하고 있는 ES의 Version을 의미하므로 옵션에 7.10+ 을 선택합니다.

 

 

Save & test를 누르고 나서 완료됐다는 문구가 나오면 성공적으로 data source가 저장된 겁니다.

 

 

 

 

대시보드 만들기

 

 

 

이제 대시보드를 만들어야 합니다.

 

 

대시보드는 여러 패널들로 이뤄져 있는데 각 패널들 하나가 하나의 수치를 나타낸다고 생각하면 됩니다.

 

 

 

 

네모칸으로 나눠져 있는 것들이 패널입니다.

 

 

아래 그림들은 제가 직접 만든 패널들이고, 어떻게 만들었는지 나중에 다시 볼 때 기억나기 위해서 작성해 보았습니다.

 

 

 

 

 

 

ERROR 레벨은 에러 트레이스를 로깅하였습니다.

 

 

에러 트레이스는 한 줄의 문자열로 저장되기 때문에 기본적으로 모든 트레이스를 볼 수 없었습니다.

 

하지만 Call display mode의 JSON view로 하고 마우스 커서를 갖다 대면 모든 텍스트를 볼 수 있습니다.

 

 

또한, Transform을 통해서 칼럼 관리를 할 수 있습니다.

 

 

Filter by Name을 통해 특정 칼럼을 뺄 수 있고, Organize fields를 통해 칼럼의 순서를 바꾸거나 이름을 바꿀 수 있습니다.

Transform에서 제공하는 기능들이 많고, 설명이 어렵지 않아서 본인이 무엇이 필요한지에 따라서 적용해 보면 좋아 보입니다.

 

 

 

이제 특정 열에서 조건을 만족하면 색을 변경할 수 있습니다.

 

 

 

 

add value mappings를 누르고 위와 같이 조건을 입력해 주면 됩니다.

 

 

 

 

 

결론

 

 

이번 글은 docker-compose를 사용하여 filebeat, elasticsearch, grafana를 통해 에러 모니터링 시스템을 구축해 보았습니다.

 

 

그라파나를 사용하는 방법은 매우 많고, 제공해 주는 기능도 많아서 제가 사용한 가능은 빙산의 일각이라고 생각합니다.

 

그래서 모든 것을 공부할 수 없기 때문에 자신이 어떤 기능이 필요한지를 잘 생각해 보고 공식 문서를 통해 알아보는 것이 가장 좋다고 생각합니다.

 

처음 해보기도 했고, 로컬에서만 진행했기 때문에 미흡한 점이 많습니다. 그래서 다음에 프롤로그에서 구축할 때는 더 고급지게 구축해보려고 합니다.

 

프롤로그에 도입되게 되면 그 과정 또한 올려보도록 하겠습니다.

 

7/3일부터 진행 중!

 

 

 

728x90