지금 진행중인 피드줍줍 프로젝트에서는 모니터링 환경을 Grafana로 구축해놨습니다.
효율적인 모니터링을 하기 위해 몇 가지 경보 설정을 해놨는데, 그 중 하나는 500 에러 입니다.

500 에러가 발생했을 경우 Discord 채널로 알람이 발송되는데요, 현재 상황에서는 개발자가 일일이 Grafana Dashboard에 접속해 로그를 분석해야 한다는 불편함이 존재했습니다. 이러한 문제를 해결하기 위해 n8n을 통해 에러 로그 분석을 자동화할 수 있겠다고 생각을 했고, 빠르게 구현을 해봤습니다. 구현의 결과물은 다음과 같습니다.

500 에러를 재현하기 힘들어, Grafana의 Alert 조건을 5xx -> 4xx로 바꾸고 진행한 결과인데요, 프롬프팅을 잘 해놓으니 할루시네이션 없이 직관적으로 에러 로그를 분석하는 모습을 확인할 수 있습니다.
n8n을 이용한 에러 로그 분석기 흐름
상단의 작업을 진행하려면 다음과 같은 workflow 흐름을 거쳐야합니다.
1) 500 에러가 발생하면, Loki에서 에러 발생 시점 부근의 로그를 수집한다.
2) 수집한 로그를 LLM에게 분석을 시킨다.
3) LLM의 분석 결과를 Discord에 보낸다.

그림으로 그려보자면 위와 같은 flow 인데요, 이 flow를 n8n을 사용하면 매우 쉽게 연결할 수 있습니다.
그렇다면, n8n이 무엇일까요?
n8n의 개념은 매우 단순합니다. workflow automation tool (워크플로우 자동화 도구)로, 서로 다른 서비스나 API를 연결하여 자동화된 데이터 흐름(Workflow) 을 구성할 수 있게 해주는 오픈소스 플랫폼입니다. 여러 개의 노드(작업단위)를 만들 수 있고, 이 노드들을 연결해 하나의 workflow를 만들 수 있습니다.
하단의 사진은 제가 구축한 에러 분석기의 모습인데요, 총 4개의 노드가 연결되어 하나의 workflow를 이루고 있는것을 확인할 수 있습니다.

각 노드들에 대해 설명을 해보려고 하는데요, 첫 번째는 Webhook 노드입니다.


첫 번째 사진은 Grafana Contact Point 설정에 대한 값이고, 두 번째 사진은 n8n Webhook 설정입니다.
간략히 설명하자면, Grafana에서 경보 조건이 달성되었을 때 설정한 Contact Point로 http 요청을 보내고, n8n의 webhook이 이를 수신합니다. 이 수신을 기점으로 n8n의 workflow가 실행이 됩니다. (n8n이 Active 상태로 설정되어 있어야 POST 수신이 가능합니다.)


두 번째 노드입니다. 해당 노드는 Loki의 로그를 가져오는 수행하는데요, webhook 작동 기준 5분전 ~ 현재의 로그를 가져오도록 설정했습니다. 저는 Loki와 n8n이 같은 컨테이너에 있어서 Loki의 API를 사용했는데요, 다른 인스턴스에 존재해 연결이 힘들다면, Grafana의 API를 사용할 수도 있습니다. 물론 팀에서 Grafana 대신 cloudWatch를 사용하고 계시다면, 이것 또한 커스터마이징 할 수 있을 것 같습니다. (CloudWatch의 접근 권한을 준다던지... 다른 workflow를 만들 수 있을 것 같네요)

세 번째 노드입니다. LLM을 호출하는 노드인데요, 추출한 로그 데이터 + 프롬프팅을 진행해 로그 분석을 진행했습니다. 처음에는 구체적인 정보를 주도록 프롬프팅을 진행해보기도 했는데요, 너무 TMI로 이야기를 하고 본인 마음대로 추측하는 문제가 있어, 현실적으로 답변하도록 프롬프팅을 진행해봤습니다.
방금 "피드줍줍 운영" 서비스에서 500 에러 알람이 발생했습니다.
알람 발생 시점 5분 전의 로그가 아래에 제공됩니다.
[로그 데이터]
{{ $json.data.result.flatMap(stream => stream.values.map(value => value[1])).join('\n') }}
[로그 데이터 끝]
위 로그를 분석하여 500 에러의 가장 유력한 원인을 찾아주세요.
만약 에러가 명확히 보인다면, 해당 로그 라인(Stacktrace 포함)을 인용해주세요.
에러가 명확히 보이지 않는다면, 보이지 않는다는 말을 하고 끝내면 됩니다.
하지만 에러가 명확히 보인다면, 다음과 같은 보고서를 작성해주세요.
1. **원인 요약:** (예: 'NullPointerException으로 인한 요청 처리 실패')
2. **근거 로그:** (문제가 된 핵심 로그 라인 인용)

마지막 노드입니다. 해당 노드는 LLM의 분석 결과를 Discord로 전달해주는 책임을 가지고 있습니다. 이 외에 다른 역할을 하고 있지는 않아 넘어가겠습니다.
n8n 사용후기
n8n은 정말 무궁무진한 도구 같습니다. 저는 비교적 간단한 작업을 진행해 4개의 노드만 사용했지만, 노드의 수를 늘려 더 구체적인 작업을 진행할 수도 있을 것 같습니다. 지금은 로그 정보만 분석하고 마무리했지만, 특정 조건을 달성하면 github issue를 자동으로 파줄수도 있을 것 같고, 담당자를 멘션하거나, 담당자에게 메일을 보내는 작업까지 자동화할 수 있지 않을까 싶습니다.
무엇보다, 귀찮은 작업을 자동화하기에 매우 편하다 라는 느낌을 받았습니다. 기술을 배우는 러닝커브 또한 거의 존재하지 않는다고 생각하고요. 심지어 제공하는 기능도 매우 다양합니다. pdf, excel, gmail 등등 ... 너무나도 많은 기능들을 손쉽게 통합할 수 있습니다.



이 글을 읽는다면 n8n을 꼭 사용해보시는 것을 추천드립니다. 개발자 뿐만 아니라 비개발자도 손쉽게 사용하면서 작업 능률을 정말 많이 향상시킬 수 있을 것 같거든요. 코딩이라는 러닝커브를 무너뜨린 느낌이랄까...?
추가로 하루동안 발생한 로그 기반으로 보고서를 작성해 매일 오전 10:00에 제공하도록 만들어보기도 했습니다만, 이 부분은 아직 개선이 필요한 상황입니다. 로그의 양이 꽤 많아 너무 많은 토큰을 사용하거든요ㅎ,,, 하지만 기능과 보고서의 품질이 상당히 좋아 많은 도움이 될 것 같다고 생각합니다.

이번 포스팅에서는 n8n을 통해 로그 분석에 초점을 맞췄는데요, 정말 무궁무진한 기술이라 모든 분야에서의 생산성을 늘릴 수 있을 것 같습니다. 긴 글 읽어주셔서 감사합니다.
'프로젝트 > 피드줍줍' 카테고리의 다른 글
| 반복되는 집계 쿼리 개선하기 (0) | 2025.11.27 |
|---|---|
| 다중 서버에서의 스케줄링 (feat. Lock) (0) | 2025.11.20 |
| DB CPU가 터져요 (1편) (5) | 2025.09.29 |
| 우테코/피드줍줍 운영 기록기 (0) | 2025.09.15 |
| CodeRabbit 적용기 (3) | 2025.08.26 |