Prometheus Metric Type
Counter 카운터
Counter는 개수를 측정하거나 증가하는 값을 측정할 때 사용합니다. 카운터는 0으로 초기화는 가능하지만 값을 감소할 수 없고 증가만 할 수 있습니다. 대표적으로 함수 호출 횟수 및 접속 요청 수, 실패 개수를 측정할 때 많이 사용할 수 있습니다.
Gauge 게이지
Gauge는 현재의 값을 나타내는 데 사용합니다. 값이 증가할 수 있으며 감소할 수도 있습니다. 증가 감소 모두 가능하다 보니 여러 방면에서 사용할 수 있습니다. 대표적으로 현재 메모리 사용량, CPU 사용 시간, 저장된 데이터의 수, 스레드 개수 등 여러 방면에서 사용합니다.
Summary 서머리
Summary는 _count, _sum을 제공하여 평균을 측정할 수 있으며, 슬라이딩 시간 윈도우를 측정할 때 사용합니다.
Histogram 히스토그램
Histogram은 시간 동안의 값을 측정하고 측정한 값을 통하여 quantile을 측정할 수 있습니다.
Go언어로 Metric 생성하기
먼저 다음 명령으로 모듈을 받습니다.
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promauto
go get github.com/prometheus/client_golang/prometheus/promhttp
Counter 생성하기
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"time"
)
var (
MyCounter prometheus.Counter
)
func Init() {
MyCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "my_test_count",
Help: "my test count",
})
}
func RunCounter() {
for i := 0; ; i++ {
MyCounter.Inc()
//MyCounter.Add(10)
time.Sleep(time.Second * 2)
}
}
func main() {
Init()
go RunCounter()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":30001", nil)
}
코드설명
promauto.NewCounter를 통하여 카운터를 생성하고 카운터의 이름을 my_test_count로 만들었다. 카운터는 2초에 한 번씩 MyCounter.Inc()를 통하여 1씩 증가하고 있다. MyCounter.Add()를 이용하면 1 이상의 값을 증가시킬 수도 있다.
확인하기
Gauge 생성하기
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"time"
)
var (
MyGauge prometheus.Gauge
)
func Init() {
MyGauge = promauto.NewGauge(prometheus.GaugeOpts{
Name: "my_test_gauge",
Help: "my test gauge",
})
}
func RunGauge() {
for i := 0; ; i++ {
MyGauge.Set(float64(i))
time.Sleep(time.Second * 2)
}
}
func main() {
Init()
go RunGauge()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":30001", nil)
}
코드설명
promauto.NewGauge를 통하여 my_test_gauge를 생성하였습니다. 2초마다 i의 값으로 gauge값을 세팅합니다.
Summary 생성하기
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"math/rand"
"net/http"
"time"
)
var (
MySummary prometheus.Summary
)
func Init() {
MySummary = promauto.NewSummary(prometheus.SummaryOpts{
Name: "my_test_summary",
Help: "my test summary",
})
}
func RunSummary() {
for {
MySummary.Observe(float64(rand.Int63n(10)))
time.Sleep(time.Second * 2)
}
}
func main() {
Init()
go RunSummary()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":30001", nil)
}
코드설명
promauto.NewSummary를 통하여 my_test_summary를 생성하고 2초마다 0 ~ 10까지의 난수로 Observe를 통하여 값을 등록합니다.
확인하기
Histogram 생성하기
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"math/rand"
"net/http"
"time"
)
var (
MyHistogram prometheus.Histogram
)
func Init() {
MyHistogram = promauto.NewHistogram(prometheus.HistogramOpts{
Name: "my_test_histogram",
Help: "my test histogram",
})
}
func RunHistogram() {
for {
MyHistogram.Observe(rand.Float64())
time.Sleep(time.Second * 2)
}
}
func main() {
Init()
go RunHistogram()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":30001", nil)
}
코드설명
역시나 promauto.NewHistogram을 통해 생성합니다. 2초마다 난수를 등록합니다.
확인하기
다른 방식의 Metric 생성
지금까지 promauto를 통하여 Metric을 생성했습니다. 그러나 promauto를 사용하지 않고 다른 방식으로 Metric을 생성하는 방법을 알아보겠습니다.
package main
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"time"
)
var (
MyCounter prometheus.Counter
)
func Init() {
MyCounter = prometheus.NewCounter(prometheus.CounterOpts{
Name: "my_test_count",
Help: "my test count",
})
}
func RunFunc() {
for {
MyCounter.Inc()
time.Sleep(time.Second * 2)
}
}
func main() {
Init()
prometheus.MustRegister(MyCounter)
go RunFunc()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":30001", nil)
}
코드설명
promauto.NewCounter가 아닌 prometheus.NewCounter를 통하여 Metric을 생성했습니다. promauto를 사용하지 않으면 prometheus.MustRegister를 통하여 Collector를 등록해야 됩니다.
'Go언어' 카테고리의 다른 글
go work 사용해보기 (0) | 2023.07.06 |
---|---|
Ubuntu(Linux)에서 Go 재설치 (0) | 2022.10.30 |
Go언어 interface reflect (0) | 2021.08.15 |
Go언어 Cron (0) | 2021.06.15 |
Prometheus Go언어 Metric label (0) | 2021.06.14 |