카레제육 블로그
GopherCon Korea 2024 - Golang 웹 프레임워크 Gin 모니터링 서비스 개발, 최정민 본문
10월 12일에 이루어진 고퍼콘에 대한 요약 내용이다. 세션에 직접 참여하지는 못했지만 온라인 영상을 통해 내용을 확인할 수 있었다.
네 번째 세션은 한화 비전의 최정민님의 Gin 모니터링에 대한 내용인데 개인적으로 업무 관련된 내용이라 더욱 관심이 갔다.
Gin 프레임워크의 모니터링 개발에 대한 내용이다. 현업의 애플리케이션 모니터링이고 오픈소스를 사용하지 않고 직접 만든 내용이다.
Programming Gin Monitoring Service
What's Gin. 진이 뭐야?
Golang WebFramework 중에 가장 많은 사용자를 보유하고 있으며, 성능과 규모가 크다. 압도적인 gin Github Star
Need for Gin Monitoring. 왜 진을 모니터링 해야해?
MSA가 도입되면서 복잡해진 애플리케이션 구조에서 모니터링은 매우 필수적이게 되었다.
How to Build Gin Monitoring Service. 어떻게 모니터링 할 수 있는가?
Gin 웹프레임워크 모니터링에서 중요한것은?
- Metric Monitoring
- Distributed Trace Monitoring: 분산 추적 모니터링
- Log Monitoring: 회사마다, 애플리케이션마다 매우 다양한 정책을 가진다. 모범 사례가 있기 힘듦
Gin Middleware
클라이언트의 요청이 Gin 서버(handler)에 닿기 전에 전처리를 해주는 함수
Metric Monitoring
매트릭 모니터링은 어떻게 만드는가?
- Request Duration: 요청을 보내서 답장이 오는데까지 걸리는 시간
- Request Count: 요청 수
- Status Code
Distributed Trace Monitoring
- SpanId: Trace의 작은 트리 형태로 애플리케이션의 홉마다 다른 Span을 가진다.
- TraceId: 클라이언트가 서버에 요청을 보냈을때, 전체 Id
Trace Monitoring
*RoundTripper: Go의 net/http 패키지에서 RoundTripper는 HTTP 트랜잭션을 수행하는 인터페이스이다. gin 프레임워크는 net/http 패키지를 기반으로 만들어졌기 때문에, RoundTripper 개념이 gin에서도 사용된다.
주요 특징은 다음과 같다.
- 인터페이스 정의: 단일 메서드 RoundTrip(*Request) (*Response, error)를 가진 인터페이스이다.
- 역할: HTTP 요청을 받아 HTTP 응답을 반환한다. 이 과정에서 네트워크 통신, 리다이렉션 처리, 쿠키 관리 등을 수행할 수 있다.
- 사용자 정의: 기본 http.Transport를 대체하거나 확장하여 사용자 정의 RoundTripper를 구현할 수 있다.
- 미들웨어 구현: 요청/응답을 수정하거나 로깅, 메트릭 수집 등의 미들웨어를 구현할 수 있다.
// 모든 outgoing 요청에 특정 헤더를 추가하고 싶다면
// 다음과 같이 사용자 정의 RoundTripper를 구현할 수 있다.
// 모든 outgoing 요청에 "Custom-Header"를 추가하는 예제
type CustomRoundTripper struct {
Proxied http.RoundTripper
}
func (c *CustomRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
req.Header.Add("Custom-Header", "CustomValue")
return c.Proxied.RoundTrip(req)
}
// 사용 예
client := &http.Client{
Transport: &CustomRoundTripper{Proxied: http.DefaultTransport},
}
gin에서 RoundTripper를 직접 다루는 경우는 많지 않지만, 클라이언트 측에서 HTTP 요청을 보낼 때 사용자 정의 RoundTripper를 사용하여 요청을 수정하거나 응답을 처리할 수 있습니다.
예를 들어, 모든 outgoing 요청에 특정 헤더를 추가하고 싶다면 다음과 같이 사용자 정의 RoundTripper를 구현할 수 있습니다:
클라이언트가 서버에 요청을 보내면 Trace Middleware는 TraceId, SpanId를 검사한다. 없다면 새로 생성한다. 만약 있다면, SpanId만 새로 생성한다. TraceId를 가지고 앞의 흐름과 뒤의 흐름이 하나의 요청이라는 것을 판단한다.