Closed3
golangでメトリクスを出し、prometheusでモニタリングするチュートリアル

これをやる
環境はdocker-compose

環境
構造
$ tree
.
├── docker-compose.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── main.go
└── prometheus.yml
Dockerfile
# Buildステージ
FROM golang:1.23 AS builder
WORKDIR /app
# go.mod/go.sumがある場合は先にコピーして依存関係を取得
# ※ go.mod/go.sumがない場合はmain.goのみコピーしてください
COPY go.mod go.sum ./
RUN go mod download
# ソースコードのコピーとビルド
COPY . .
RUN CGO_ENABLED=0 go build -o server .
# 実行ステージ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY /app/server .
EXPOSE 8080
CMD ["./server"]
docker-compose
services:
app:
build: .
ports:
- "8080:8080"
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
main.go
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// HTTPリクエスト数をカウントするメトリクス
var requestsCounter = prometheus.NewCounter(prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests processed.",
})
func init() {
// デフォルトレジストリにメトリクスを登録
prometheus.MustRegister(requestsCounter)
}
// ハンドラー例:アクセスがあるたびにカウンタをインクリメント
func helloHandler(w http.ResponseWriter, r *http.Request) {
requestsCounter.Inc()
w.Write([]byte("Hello, Prometheus!"))
}
func main() {
http.HandleFunc("/", helloHandler)
// /metricsエンドポイントでPrometheus用のメトリクスを公開
http.Handle("/metrics", promhttp.Handler())
log.Println("Starting server on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatalf("Error starting server: %v", err)
}
}
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'go_app'
static_configs:
- targets: ['app:8080']
立ち上げ
docker compose up -d --build

リクエスト
$ curl localhost:8080
Hello, Prometheus!
$ curl localhost:8080/metrics
# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 3.6911e-05
go_gc_duration_seconds{quantile="0.25"} 8.8001e-05
go_gc_duration_seconds{quantile="0.5"} 0.000182398
... 略
メトリクス
このスクラップは5ヶ月前にクローズされました