본문 바로가기

springboot9

LOKI + Grafana를 사용한 분산 환경의 로그 수집 서버 개발을 진행하고 운영하면서 누구나 맞이하는 상황 중 하나는 로그 수집입니다. 최근 대부분의 서비스는 최소 2대 이상의 서버를 운용해 고가용성을 보장하고, 자원 사용량에 따라 오토스케일링 등의 스케일 아웃을 구성합니다. 이전에 ELK 스택을 사용해 Springboot 로그 수집하기 와 같이 ELK 스택을 사용해서 분산환경의 로그를 수집했지만, 관리포인트 증가로 인해 불편함이 있었고, 매트릭 수집을 위한 Prometheus + Grafana 도 함께 사용하기 위해 프로메테우스 제단의 로그 수집 툴 Loki를 적용했으며 이 과정을 공유합니다. Loki 설치 로그 수집 시스템을 구축하면서 가장 중요하게 생각한것은 스토리지에 대한 문제입니다. 로그 특성상 항상 새로운 데이터가 스토리지에 저장되고, 시간이 지.. 2024. 3. 3.
백엔드 서비스 운영시 고려해야할 점 지난 한 해 동안 사내에서 신규 서비스를 개발 및 오픈하게 되었습니다.🎉 보통 주니어 개발자는 입사 후 아래와 같은 상황인 경우가 많을 것이라 생각됩니다. 기존 운영되고 있던 서비스를 운영 개인(토이) 프로젝트 개발 -> 때에 따라 실제 서비스 오픈 (하지만 서비스 이용자가 많이 없어 배포까지만 완료하는 경우가 많음) 시니어 개발자가 프로젝트 설정 후 API 개발만을 담당함 저 또한 같은 주니어 개발자 입장이지만 팀 내 프로젝트 개발 표준 구성 데브옵스 & 인프라 구성 를 모두 담당하게 되면서 단순히 API 개발만 했더라면 알지 못하고 넘어갔을 내용들을 정리하여 공유하려 합니다. Java + Springboot 환경을 기준으로 작성합니다👋 요청 당 로그 트레이싱 서비스를 오픈하고 운영하는 단계 또는 그 .. 2024. 1. 21.
스프링부트 커넥션 설정도 체크하자 Issue 배치를 통해 async로 호출하는 API에서 응답시간이 60초 또는 30초, 심지어 에러까지 발생해서 정상 응답하지 않는 문제가 발생했습니다. 위 내용을 보면 HikariPool에서 커넥션을 30초동안 얻지 못해 생긴 에러임을 알 수 있습니다. TroubleShooting 첫 번째 의심 API 요청에 대한 응답이 너무 느려 타임아웃이 나는건가? 아닙니다. 직전 요청이 외부 서비스에 주문상태를 전달하는 Feign 요청이지만, 그렇다면 우리의 DB에서 커넥션을 얻지 못한다는 내용을 이렇게 상세하게 추적할 수 있을 리가 없습니다. 두 번째 의심 우리 DB가 문제가 있나? 아닙니다. 에러로그도 없고 데이터베이스 헬스체크 실패에 대한 로그도 없을 뿐더러, 동시간대 같은 API에 요청이 정상 응답한 경우.. 2024. 1. 21.
ELK 스택을 사용해 Springboot 로그 수집하기 ELK 스택을 사용해 Springboot 로그 수집하기 분산환경을 사용해 서버를 운영하고 있다면, 몇 개 또는 수십개의 서버의 로그를 한번에 보기 힘든 상황이 나타납니다. 예를 들면 터미널을 여러 개로 분할해서 각 서버에 접속 후 로그를 찾는다거나… (제가 그러고 있었죠…) 물론, cloudWatch와 같이 서버의 console에 출력되는 로그의 내용을 한번에 조회할 수 있지만, 이것 또한 불편함이 굉장히 많습니다. 이런 불편함을 해결하고자 미루고 미루던 분산된 Springboot 로그를 ELK스택을 이용해 수집하고, 조회해보고자 합니다. ELK 구축 각각의 서비스의 로그를 수집하는 방법에는 여러가지 방법이 있습니다. 그중 Logstash로 로그를 수집해 ElasticSearch 에 전달, Kibana를.. 2023. 11. 5.
[Spring] SpringBoot 기본 TimeZone 설정하기 SpringBoot 기본 TimeZone 설정하기 개발을 진행하고, 배포하는 도중 IDE에서는 정상적으로 Asia/Seoul으로 설정되던 TimeZone이 원격 서버에서 정상적으로 설정되지 않음을 알았다. 첫 번째 수정 리눅스 서버 자체의 서버시간과는 별개로 작동하는 것을 확인하였고, Spring 실행 시 argument로 Asia/Seoul으로 설정하도록 했다. java -Duser.timezone=Aisa/Seoul -jar ~~.jar 와 같이 -Duser.timezone을 추가하여 SpringBoot의 기본 TimeZone을 설정하였다. 두 번째 수정 @PostMapping public void setTimeZone() { TimeZone.setDefault(TimeZone.getTimeZone(.. 2022. 6. 13.
[QueryDSL] gradle querydsl 설정하기 gradle querydsl 설정하기 springboot 프로젝트에 querydsl을 설정하면서 기존 설정방식이 조금 효율적이지 못하며, 자동화의 필요성을 느껴 개선하였다. 기존 방식 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { ... id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" ... } dependencies { ... implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" ... } ... def queryds.. 2022. 5. 15.
[Spring] IDE에서 잘 접근되던 페이지가 서버에서는 접속되지 않을 때 IDE에서 잘 접근되던 페이지가 서버에서는 접속되지 않을 때 간간히 활동하고 있던 Holix라는 커뮤니티에서 나온 질문 spring boot로 만든 게시판 프로젝트를 ncloud에 올려서 빌드를 했더니 400 에러 뜨면서 MethodArgumentTypemismatchException이 발생하네요 로컬에선 잘 되는데 클라우드에 올리면 에러가 생깁니다 왜 이런가요 ?? 문제 질문자의 상황은 인텔리제이에서는 template 디렉토리 아래의 html이 잘 접근되는데 클라우드 서버에서 실행하면 에러가 발생하는 현상이였다. 문제가 발생한 이유 질문자의 현재 상황 @GetMaping("~~~") public String ... { ... return "/aaa/bbb" } 위 코드를 보고 첫번째로 든 생각은 왜 r.. 2022. 4. 30.
SpringBoot Jenkins 배포 자동화 2 SpringBoot Jenkins 배포 자동화 2 이전 시간에 Jenkins를 이용해 SpringBoot 프로젝트 배포를 구현했다. 여기에서 확인할 수 있다. 이번엔 원클릭 배포 시스템에서 github 원격 레포지토리에 push를 하면 github에서 자동으로 Jenkins Build를 시작하도록 설정해보자. 환경 SpringBoot, jar, gradle AWS EC2 Jenkins Docker Github Github Webhook 설정 Gihub Webhook은 사용자 지정 callback을 이용하여 일반 API와 다르게 역방향으로 요청을 보낸다. 배포할 프로젝트 레포지토리 webhook setting 진입 github 프로젝트 → Setting → Webhooks Add Webhook Payloa.. 2022. 4. 2.
SpringBoot Jenkins 배포 자동화 1 SpringBoot Jenkins 배포 자동화 1 Spring 프로젝트를 만들고, 배포를 하면서 기존 Build된 WAR 파일을 원격 서버에 전송하고, 원격 서버에서 직접 배포하는 과정이 불편하게 느껴졌다. 때문에 EC2환경에서 docker와 Jenkins를 사용하여 Github의 소스를 빌드하고, 배포하는 작업을 자동화 하려 한다. 환경 SpringBoot, jar, gradle AWS EC2 Jenkins Docker Github Jenkins 배포 과정 Jenkins를 이용한 배포 과정은 다음과 같다. SpringBoot 프로젝트 개발 Github에 push Jenkins에서 build build한 결과 jar파일을 web server에 SSH 송신 web server에서 jar파일 실행(배포) J.. 2022. 3. 23.