InfraGuard

データベースコレクターの登録

access=database のコレクターをホストごとの db@alias 行として登録し、サービス ▸ データベースと警報を駆動します。パスワードは Crypt で保存するか、cred_ref=env:PREFIX で再利用します。

概要 — 何をする画面か

管理 ▸ コレクター は InfraGuard の コレクターレジストリ(infr_collector テーブル)です。ハードコードされた認証情報とホストマップをコードから引き上げ、データとして保存します。コレクターは アクセス方式(access) で抽象化されます。

access 目的 駆動する画面
web リモートエージェントのエンドポイント(tlx プローブ · run_report) インフラ ▸ ヘルス
database 登録済みDBへ 直接接続 して負荷指標を収集 サービス ▸ データベース · インフラ ▸ 警報
agent 内部網の代表コレクター(Redis + nginx-vts) サービス ▸ セッション(Redis) · サービス ▸ Web

本記事は access=database のコレクター を扱います。InfraGuard アプリは登録済みDBへ定期的に接続し、SHOW GLOBAL STATUS · information_schema.processlist · information_schema.tables を読み取って、時系列を infr_db_metric に書き込みます。データ行を読むことも書くこともありません — 負荷と構造の指標だけです。

DBコレクターは DB負荷監視画面 と 警報 の データ元 です。ここでDBを1つ登録すれば、両方の画面に自動的に現れます。

どんなときに使うか

画面構成

コレクター一覧は、アクセス方式ごとにグループ化されたカードで表示されます。access=database の行は 1つの「データベース」グループカード にまとめられます(カードの乱立を防ぐためです)。グループカードの [編集] で グループエディター(2タブ)が開きます。

グループエディターのタブ

タブ 内容
基本(共通の接続既定値) driver · port · database · username · 待ち行列のしきい値(slow_time) · schedule · cred_ref — すべてのDB項目に適用されます
データベース(項目の配列) 項目ごとの alias · 表示名 · host/IP · driver(上書き) · 実行トグル · パスワード(書き込み専用)

UI上は単一のグループカードに見えますが、保存すると各項目がそれぞれの db@{alias} 行として upsert されます(access=database)。収集パイプライン、サービス ▸ データベース、警報のターゲット指定は、いずれも コレクター単位 で動作します。項目を削除すると、その db@ 行も削除されます。

コレクターごとの項目(infr_collector)

カラム 意味
key 一意のキー。DB項目は db@{alias}(例:db@blue) — 変更不可(警報がキーでターゲットを指定するため)
title 表示名(既定は {alias} DB)
access database 固定
kind metrics 固定
host_alias その項目の alias(ホストのラベル)
feeds_table infr_db_metric 固定
cred_ref 認証情報の参照(例:env:STATS_DB) — 空の場合は config + secret_enc にフォールバックします
config {driver, host, port, database, username, sample:{slow_time_sec, connect_timeout}}(シークレットは含みません)
secret_enc DBのパスワード(Crypt · 書き込み専用 · ブラウザーへは決して返しません)
is_run スケジュールが有効かどうか

使い方

1. 新しいDBを登録する(グループエディター)

  1. 管理 ▸ コレクター を開きます。
  2. 「データベース」グループカードで [編集] をクリックし、基本 タブで共通の値を入力します。
    • driver:mysql または mariadb
    • port:既定は 3306
    • database:接続時の既定スキーマにすぎません — 空にすると information_schema へ接続します(収集の対象範囲はアカウントの権限で決まります)
    • username:監視用のアカウント(例:infra_ro)
    • 待ち行列のしきい値(slow_time):この秒数を超えて実行中のクエリを「待ち/滞留」として数えます(1〜60秒、既定は2)
    • cred_ref:.env の認証情報を再利用する場合は env:PREFIX
  3. データベース タブ → [DBを追加] → 項目ごとに:alias(必須) · host/IP · 任意でパスワード。
  4. [保存]。各項目が db@{alias} 行として作成/更新されます。

2. シークレットの扱い — 2つの方法

(A)パスワードを直接入力する — パスワード欄に入力すると、暗号化されて secret_enc に保存されます。一覧やAPIの応答が 平文を露出することはありません。返されるのは has_secret/has_db_pw の真偽値だけです。

パスワードは書き込み専用です。編集時に パスワード欄を空のままにすると、既存の値が保持されます(上書きされません)。明示的に削除したい場合は、クリアの操作を使ってください。

(B).env の認証情報を再利用する(cred_ref=env:PREFIX) — パスワードをDBに保存せず、すでに .env にある認証情報のセットを参照します。DbCollectorService::resolveConn() は次のキーを読み取ります。

config に入力された値が優先され、空の値は PREFIX_* の env(host/port/database/username/password)から補われます。

3. サーバー全体の待ちクエリ — PROCESS 権限

2つの中核指標(接続飽和率 = Threads_running/Threads_connected/max_connections、および QPS · スロー率 = ΔQuestions/ΔSlow_queries)は、素の(USAGE)アカウント でも収集できます。ただし、サーバー全体の待ちクエリの集計 と スキーマ全体の容量分析 には追加の権限が必要です。

対象のDBホストごとに root で一度だけ実行する、最小権限アカウント用のスクリプトです:sql/infr_db_monitor_grant.sql。

-- 専用の読み取り専用アカウント(接続元ホストは InfraGuard アプリサーバーのIPに絞ってください)
CREATE USER 'infra_ro'@'%' IDENTIFIED BY 'CHANGE_ME_TO_A_STRONG_SECRET';

-- グローバルな観測権限(データへのアクセスではありません)
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'infra_ro'@'%';

-- スキーマ容量の分析(全DB · 読み取り専用)。1つのDBだけなら design.* に絞ってください
GRANT SELECT ON *.* TO 'infra_ro'@'%';

-- 影響範囲の隔離 — 接続の独占を防ぎます(2026-08-06 の [1040] 障害からの教訓)
ALTER USER 'infra_ro'@'%' WITH MAX_USER_CONNECTIONS 5;
FLUSH PRIVILEGES;

MariaDB 10.5以降では REPLICATION CLIENT の代わりに BINLOG MONITOR を使えます。PROCESS と SELECT は同じです。

4. 収集を実行して確認する

収集は infr:collect-db artisan コマンドが行います。開発用ランチャー(composer dev)のスケジューラーペインが、毎分これを呼び出します。

# 1つのコレクターを今すぐ1回サンプリングします(運用ポリシーのゲートを迂回)
php artisan infr:collect-db --key=db@blue --force

# 登録済みの全DB(is_run=1)をポリシーに従って収集します
php artisan infr:collect-db

収集を実行するかどうかは 運用ポリシー が決めます。

ポリシーキー 既定値 意味
db_collect_mode economy economy = コンソールの利用者(プレゼンス)がいるときだけ収集 · always = 常時
db_collect_interval_sec 60 収集の間隔(秒、最小10)
presence_window_sec — 最後の操作のあと「利用者あり」とみなし続ける時間の幅

特定のデータベースコレクターをテストするには --key を使ってください。[テスト]/[コード同期] ボタンは access=web のコレクター専用で、データベースコレクターには適用されません。上記のコマンドで確認してください。

5. 状態のしきい値

DbCollectorService::statusOf() は、運用ポリシー のしきい値と照らして up/degraded を判定します。

しきい値キー 既定値 超過したとき
db_degrade_conn_pct 80 接続飽和率(%)がしきい値以上 → degraded
db_degrade_running 40 threads_running がしきい値以上 → degraded
db_degrade_waiting 5 待ちクエリ数がしきい値以上 → degraded
db_degrade_slow_qps 1 スロー率(/秒)がしきい値以上 → degraded

データソース

対象 テーブル/取得元 備考
コレクターレジストリ infr_collector(マイグレーション 000201 + 000680) access · config(JSON) · secret_enc(Crypt)
収集した時系列 infr_db_metric(マイグレーション 000681) SHOW GLOBAL STATUS から導出 · qps/slow_qps の差分
リモートDBの状態 SHOW GLOBAL STATUS · SHOW VARIABLES max_connections 登録済みの各DBへ直接接続
待ちクエリ information_schema.processlist PROCESS 権限があればサーバー全体
スキーマ容量 information_schema.tables 30分の長めのキャッシュ(スロークエリの回避)

接続リークはありません。 DbCollectorService::withConn() はサンプルごとにランタイム接続を作り、finally の中で DB::purge により即座に閉じます。PDOのタイムアウト(既定5秒)により、リモートの遅延でWebリクエストやスケジュールがブロックされることはありません。無限ループのデーモンをスケジューラーから起動してはいけません — 共有 MySQL の接続プールを枯渇させます(2026-08-06 の [1040] Too many connections 障害)。

アクセス権限

体系の全体は アクセスレベル を参照してください。

トラブルシューティングとFAQ

関連項目

수집기 관리 — 데이터베이스 그룹
수집기 관리 — 데이터베이스 그룹