Closed3

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

not75743not75743

環境

構造

$ 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 --from=builder /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
not75743not75743

リクエスト

$ 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ヶ月前にクローズされました