エンジニア諸君、ようこそ。オブザーバビリティの深淵へ。
今日扱うのは、多くのエンジニアが「なんとなく」使い始め、そしてある日突然、Prometheusを瀕死の状態に追い込む「PromQLの正規表現」という名の劇物についてだ。
「とりあえず便利だから」と書いたその正規表現が、あなたの監視基盤のCPUを食いつぶし、アラートの遅延やクエリタイムアウトを引き起こす。今日は、そのパフォーマンスの深淵を覗き、明日から即戦力となる「高速化の奥義」を伝授しよう。
—
1. なぜ正規表現がPrometheusを「殺す」のか?
Prometheusのデータモデルを思い出してほしい。各メトリクスは時系列データの集合体だ。`=~`(マッチ)や`!~`(非マッチ)を使うと、Prometheusは内部で指定された正規表現を全ラベルセットに対してスキャンする。
正規表現は、コンパイルされ、文字列の一文字ずつをステートマシンがなぞる。もしあなたが、数万の時系列データを持つ巨大なクラスタで、安易に `regex` を投げたとしよう。Prometheusは、クエリのたびに膨大なメモリを確保し、CPUをフル回転させて正規表現エンジンを回す。
結論:正規表現は「奥の手」だ。常用してはいけない。
—
2. やってはいけない「正規表現アンチパターン」
現場でよく見る、パフォーマンスを著しく劣化させる書き方の代表例だ。
アンチパターン①:先頭にワイルドカードを置く
悪い例: 全てのラベル値に対して前方スキャンが発生する
http_requests_total{job=~”.service-name.”}
`.` や `.` を先頭に置くのは最悪だ。インデックスが効かず、全件スキャンになる。
アンチパターン②:完全一致なのに正規表現を使う
悪い例: 単なる完全一致なのに計算コストが高い
http_requests_total{status=~”200″}
これは `status=”200″` と書くべきだ。正規表現エンジンをわざわざ起動する必要はない。
—
3. 高速化の極意:正規表現を捨てて「集合」で戦え
ここからは、明日から使えるリファクタリングテクニックだ。
テクニックA:OR演算子(パイプ区切り)の活用
複数の値に一致させたい場合、正規表現 `|` を使う前に、まずは「完全一致の集合」を検討せよ。
- 遅い書き方: `http_requests_total{status=~”200|201|204″}`
- 速い書き方: `http_requests_total{status=”200″} + http_requests_total{status=”201″} + http_requests_total{status=”204″}`
実は、Prometheusのインデックスは「完全一致」に対して極めて最適化されている。特定の値を絞り込むなら、無理に正規表現でまとめず、個別に指定して足し合わせる方が、内部的なインデックスのヒット率が跳ね上がるケースが多い。
テクニックB:不要な正規表現を排除する
もし「サービス名が `api-` で始まるもの」を抽出したいなら、正規表現を使わずに、ラベル設計を見直すのが一番の近道だ。
- 設計変更の提案: `job=”api-production”` のように、正規表現に頼らずともフィルタリングできるよう、ラベルを正規化しておく。これが究極の「高速化」だ。
—
4. 初心者のための「Prometheusセットアップ」と動作確認
「まだPrometheusを触ったことがない」という君のために、最も純粋で、最も安全なHelloWorldをここに記す。
インストール(バイナリ配布を使うのが正解)
Dockerでも良いが、まずはバイナリを落として動かすことで「何がどう動いているか」が見えるようになる。
公式から最新版をダウンロード
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvf prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64
最もシンプルな設定ファイル (prometheus.yml)
自分自身を監視する設定
global:
scrape_interval: 15s
scrape_configs:
- job_name: ‘prometheus’
static_configs:
- targets: [‘localhost:9090’]
起動と動作確認
./prometheus –config.file=prometheus.yml
ブラウザで `http://localhost:9090` にアクセスせよ。
「Expression」の欄に以下を入力だ。
自分のステータスを確認(正規表現なしの完全一致)
prometheus_http_requests_total{code=”200″}
これが君の最初のクエリだ。ここから先、ラベルが増え、複雑なクエリが必要になった時、今日の「正規表現の罠」を思い出してほしい。
—
先輩エンジニアからの最後のアドバイス
オブザーバビリティとは、単にメトリクスを眺めることではない。「いかに効率的に、システムの本質的な揺らぎを捉えるか」という哲学だ。
正規表現を安易に使うことは、システムに無駄な負荷という「ノイズ」を強いる行為に等しい。まずは完全一致でクエリを書き、どうしても無理な場合だけ正規表現の扉を開くこと。
この指針を守れば、君の監視基盤は常に軽快に、そして正確に、システムの鼓動を伝えてくれるはずだ。
さあ、コードを書こう。そして、システムを誰よりも深く見通す者になれ。