Prometheus
Prometheus는 CNCF의 오픈 소스 프로젝트로 System과 Service 모니터링 시스템입니다. 특정 주기를 기준으로 사용자가 구성한 target으로부터 metric을 수집합니다. 또한 사용자가 정의한 rule expression을 계산하여 해당 결과를 보여주고 특정 조건을 만족하는 상황에 도달하면 알람을 울리는 등의 기능을 수행합니다. Prometheus는 시계열(time-series) 데이터를 처리하는 데에 특화되어 있습니다.
Prometheus Exporter
Prometheus는 여러 방법으로 metric을 수집합니다. 특히 Exporter라는 구성 요소를 통해 target 시스템 및 서비스의 Expose된 metric을 수집해올 수 있습니다. Prometheus Exporter는 Prometheus Server가 Metric 데이터를 수집해갈 수 있도록 Metric을 외부로 노출시켜주는 역할을 수행합니다. 따라서 우리가 작성한 Application을 Prometheus가 모니터링할 수 있도록 해주려면, 우리의 Application에 Prometheus Exporter를 연동해주면 됩니다. 이번 포스트에선 Go Application에 Prometheus Exporter를 연동하는 방법을 소개해보겠습니다.
Installation
$ go get "github.com/prometheus/client_golang/prometheus/promhttp"
다른 라이브러리들과 마찬가지로 go get
명령을 사용해 promhttp
라이브러리를 받아옵니다. 그리고 필요한 코드에 import 해주세요.
Usage
사용하는 방법도 굉장히 단순합니다. 이번 포스트에선 Echo
프레임워크와 Gin
프레임워크에서 promhttp
를 사용하는 방법을 소개해드리겠습니다.
promhttp.Handler()
는 http.Handler
타입의 오브젝트를 리턴합니다. 이 오브젝트를 각각의 프레임워크가 지원하는 Wrap 메서드를 이용해서 변환하면 됩니다.
Echo
Echo 프레임워크를 사용하는 경우, echo.WrapHandler()
메서드를 이용해주세요. 다음의 코드를 참고하시면 됩니다.
func main() {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.GET("/", func(c echo.Context) {
c.String(http.StatusOK, "Hello, World!")
}
e.GET("/metrics", echo.WrapHandler(promhttp.Handler()))
e.Start(":3000")
}
Gin
Gin 프레임워크를 사용하고 계신 경우, 아래의 코드를 참조해주세요. Echo와 유사하게 gin.WrapH()
메서드를 활용해서 Wrapping을 수행할 수 있습니다.
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello, World!")
}
router.GET("/metrics", gin.WrapH(promhttp.Handler()))
router.Run(":3000")
}
Example
위 예제를 작성한 후 실행 및 http://localhost:3000/metrics
에 접속하시면 다음 화면처럼 현재 Application의 상태 Metric을 확인하실 수 있습니다.
마무리
여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.
혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊
참고
'IT > Go' 카테고리의 다른 글
[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기 (0) | 2021.05.13 |
---|---|
[Go/Golang] Zap과 시간 기반 파일 로테이션 로깅 수행하기 (0) | 2021.03.29 |
[Go/Golang] Map 자료형을 Struct로 변환하기(mapstructure) (0) | 2021.03.15 |
[Go/Golang] Go의 HTTP & REST Client 라이브러리 - Resty (0) | 2021.03.10 |
[Go/Golang] Echo 프레임워크에서 Swagger 사용하기 (0) | 2021.03.09 |