Logstash 리버스 엔지니어링


초기에는 로그 수집기에 대해 일부 프로바이더는 ELK 스택 중 하나인 Logstash를 통해 로그 수집을 수행하고 있었습니다. 하지만 아래의 이유로 기존 사용 중이던 Logstash를 모두 Pure Typescript 로직으로 마이그레이션을 진행할 필요가 있었습니다.

이로 인해 Logstash를 덜어내기 전에, Logstash가 Aws, Azure, Gcp에서 로그를 수집하는 방법론과 내부 처리 로직을 파악하기 위해 1~2일 정도 Logstash의 소스코드를 까보는 시간을 가졌습니다.

https://github.com/logstash-plugins/logstash-input-s3

https://github.com/logstash-plugins/logstash-input-azure_event_hubs

https://github.com/logstash-plugins/logstash-input-google_pubsub

이틀에 걸친 리버스 엔지니어링을 통해 얻은 결과는 크게 두가지입니다.

특히 후자를 보고 기존 수집 로직에 대한 성능 개선 방안을 수립할 수 있었습니다.

성능 개선 포인트


기존에 작성되어 있던 로직의 흐름은 다음과 같습니다.

// 간단하게 로직의 흐름을 보이기 위해 작성했으며 실제 코드가 아닙니다.
class Pipeline {
  private input: Input;
  private filter: Filter:
  private output: Output;

  ...
  // 내부 타이머를 이용하여 해당 로직을 지속적으로 호출
  private async collectLog(): Promise<void> {
    const log = await this.input.collectLog();
    await this.output.sendLog(this.filter.exec(log));
  }
}