2025-06-13
アプリケーションをデプロイして終わり、ではプロフェッショナルとは言えません。「正常に動いているか」「パフォーマンスは落ちていないか」を客観的なデータで把握することが、現代のエンジニアには不可欠です。
本記事では、Go、Prometheus、Grafanaという強力なトリオを使い、実践的なモニタリングシステムを構築する第一歩をガイドします。読み終える頃には、基本的なモニタリングの概念を理解し、自分のGoアプリケーションを計測・可視化する具体的な手法が身についていることでしょう。
ユーザーからの問い合わせで問題に気づく「受動的な対応」から、メトリクスの異常を基に問題発生前に手を打つ「能動的な対応」へ。これがプロフェッショナルなシステム運用の基本です。
レスポンスタイムの悪化、メモリ使用量の増大などをデータで特定し、的確な改善に繋げることができます。勘に頼らない、データドリブンな改善が可能になります。
機能追加後のリクエスト数やエラー率の変化を把握し、ビジネス的なインパクトを測定できます。技術的な変更がビジネスにどう影響するかを定量的に示せるエンジニアは重宝されます。
自身のコードが本番環境でどう振る舞うかに責任を持つ姿勢は、クライアントからの信頼を大きく向上させます。運用まで見据えた開発ができるエンジニアは、より高く評価され、高単価案件に繋がります。
具体的な構築手順に入る前に、各ツールが何を担うのかを明確にしましょう。
自らの状態(例:HTTPリクエスト数、レスポンスタイム)をメトリクスとして外部に公開する役割を担います。アプリケーション自身が「自分の健康状態」を報告する仕組みです。
Prometheusは、Goアプリケーションが公開するメトリクスを定期的に取得(プル)し、時系列データとして蓄積する役割を担います。データの収集と保存を一手に引き受ける中核システムです。
Grafanaは、Prometheusに蓄積されたデータをクエリし、人間が理解しやすいグラフやダッシュボードとして表示する役割を担います。数値の羅列を直感的に理解できる形に変換します。
シンプルなWebサーバーを例に、具体的なコードと設定を示しながら解説します。
まず、GoアプリケーションからPrometheus形式のメトリクスを公開する方法を実装します。
go1package main 2 3import ( 4 "log" 5 "net/http" 6 "github.com/prometheus/client_golang/prometheus" 7 "github.com/prometheus/client_golang/prometheus/promhttp" 8) 9 10var ( 11 httpRequestsTotal = prometheus.NewCounterVec( 12 prometheus.CounterOpts{ 13 Name: "http_requests_total", 14 Help: "Total number of HTTP requests", 15 }, 16 []string{"method", "endpoint"}, 17 ) 18) 19 20func init() { 21 prometheus.MustRegister(httpRequestsTotal) 22} 23 24func handler(w http.ResponseWriter, r *http.Request) { 25 httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path).Inc() 26 w.Write([]byte("Hello, World!")) 27} 28 29func main() { 30 http.HandleFunc("/", handler) 31 http.Handle("/metrics", promhttp.Handler()) 32 log.Fatal(http.ListenAndServe(":8080", nil)) 33}
prometheus/client_golangライブラリを使用し、promhttp.Handler()で/metrics
エンドポイントでメトリクスを公開します。このエンドポイントはContent-Type: text/plain; version=0.0.4; charset=utf-8
でPrometheus形式のメトリクスを返します。HTTPリクエストの総数をカウントするカスタムメトリクス(カウンター)も作成しています。
Dockerを使ってPrometheusを起動し、作成したGoアプリケーションを監視対象として設定します。
yaml1# prometheus.yml 2global: 3 scrape_interval: 15s 4 5scrape_configs: 6 - job_name: "go-app" 7 static_configs: 8 - targets: ["host.docker.internal:8080"]
bash1docker run -d -p 9090:9090 \ 2 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ 3 prom/prometheus
PrometheusのUIで、ターゲットが正常に認識され、メトリクスが収集できていることを確認できます。Status > Targetsページで監視対象の状態を確認しましょう。prom/prometheusの公式Dockerイメージを使用しています。
最後に、Grafanaを起動してPrometheusのデータを可視化します。
bash1docker run -d -p 3000:3000 grafana/grafana
Grafana、初期ログイン:admin/admin)にアクセスし、以下の手順でダッシュボードを作成します:
rate(http_requests_total[1m])
これで、HTTPリクエスト数の変化をリアルタイムでグラフ化できます。grafana/grafanaの公式Dockerイメージを使用しています。
ここまでが基本です。さらに探求すべき領域として、Alertmanagerによるアラート通知、HistogramやSummaryを使ったレイテンシの計測、Grafanaの高度な機能(テンプレート変数、アノテーションなど)があります。
モニタリングシステムを自ら構築できるスキルが、単なる「コーダー」から、システムの信頼性に責任を持つ「エンジニア」へとステップアップさせます。データに基づいた改善サイクルを回せるエンジニアの市場価値は非常に高く、特にフリーランス市場では重宝されます。
システムの運用や信頼性向上まで見据えた開発スキルは、高単価なフリーランス案件や、やりがいのあるプロジェクトで特に求められます。自身のスキルを新しいステージで試したい方は、ぜひGoエンジニア専門の弊社GoForceにご相談ください。あなたの挑戦をサポートします。
最適なGo案件を今すぐチェック!