
monitor v0.44.0
Valkey および Redis データベース向けのリアルタイム監視とスローログ分析。異常検知、ACL 監査、Prometheus メトリクスのエクスポートを備えています。
BetterDB Monitor
Valkey にふさわしいモニタリングレイヤー。
BetterDB は Valkey が捨ててしまうもの — スローログ、コマンドパターン、クライアントアクティビティ、異常シグナル — を永続化します。だからこそ、今何が起きているかだけでなく、午前3時に何が起きたのかをデバッグできます。Valkey 8.x 向けに構築され、COMMANDLOG、CLUSTER SLOT-STATS、スレッドごとの I/O メトリクスをネイティブにサポートします。それ以外のすべてについては Redis 6+ と互換性があります。
Website | Docker Hub | npm | Documentation | Blog
BetterDB は BetterDB Inc. によって開発されています。同社は OCV Open Charter の下で運営される public benefit company です。

クイックスタート (Docker)```bash
docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
ブラウザで `http://localhost:3001` にアクセスしてください。特定のインスタンスを監視するには:```bash
docker run -d \
--name betterdb \
-p 3001:3001 \
-e DB_HOST=your-valkey-host \
-e DB_PORT=6379 \
-e DB_PASSWORD=your-password \
betterdb/monitor:latest
ホストマシン上のデータベースに接続しますか? コンテナ内では
localhostはコンテナ自身を指し、ホストではありません。そのため データベースのホストとしてhost.docker.internalを使用してください。Docker Desktop (macOS/Windows) ではそのまま動作します。Linux ではdocker runコマンドに--add-host=host.docker.internal:host-gatewayを追加して 名前が解決されるようにしてください。ダッシュボードのワンクリック「ローカルインスタンスに接続」 ボタンはこれを自動検出し、適切なホストを事前入力します。
2 つのイメージバリアントが公開されており、どちらもマルチアーキテクチャ(linux/amd64、linux/arm64)です:
| タグ | 内容 |
|---|---|
latest、X.Y.Z-no-ai | デフォルトイメージ - すべての監視機能を含み、実験的なローカル LLM AI Helper の依存関係は含まない |
X.Y.Z | 実験的な AI Helper を追加(独自の Ollama を持ち込み、デフォルトでは AI_ENABLED により無効化) |
永続ストレージ、カスタムポート、ライセンス、エアギャップ環境のセットアップについては Docker Production Deployment を参照してください。
クイックスタート (Kubernetes / Helm)```bash
helm repo add betterdb https://docs.betterdb.com/charts
helm repo update
helm install betterdb-monitor betterdb/betterdb-monitor
--namespace betterdb --create-namespace
--set db.host=my-valkey.default.svc.cluster.local
--set db.password=yourpassword
次に `kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001` を実行して `http://localhost:3001` を開くか、チャートの ingress を有効にします。PostgreSQL をバックエンドにした履歴、bring-your-own Secrets、エアギャップ環境でのライセンスは、[Kubernetes ガイド](https://docs.betterdb.com/kubernetes)と[チャート README](https://github.com/betterdb-inc/monitor/blob/master/charts/betterdb-monitor/README.md)で説明されています。
## クイックスタート (CLI)
Docker なしで BetterDB Monitor を実行します:```bash
npx @betterdb/monitor
初回実行時には、対話形式のセットアップウィザードがデータベース接続、ストレージバックエンド(SQLite、PostgreSQL、またはインメモリ)、およびサーバー設定を順に案内します。設定は ~/.betterdb/config.json に保存されます。```bash
npm install -g @betterdb/monitor # global install
betterdb --setup # re-run setup wizard
betterdb --port 8080 # override server port
betterdb --db-host 1.2.3.4 # override database host
betterdb --help # all options
監視対象としてNode.js >= 20.0.0とValkeyまたはRedisインスタンスが必要です。SQLiteストレージを使用する場合は、`npm install -g better-sqlite3`も必要です。
## 得られるもの
### すべてを見て、すべてを保持
- **履歴分析** - 任意の期間にわたってスローログ、コマンドパターン、クライアントアクティビティ、レイテンシをクエリできます。ログローテーション後に消えてしまっていたデータです。
- **COMMANDLOGサポート** - Valkey 8.1+専用。遅いリクエストだけでなく、大きなリクエストや大きなリプライも対象です。
- **MONITORキャプチャセッション** - オンデマンドで実際のトラフィックを記録: ライブテール、フィルタ、リプレイ、JSON/CSVへのエクスポート、接続履歴とのクロスリファレンス。
- **ホットキー追跡** - アクセス頻度順のトップキーと、時間経過に伴う順位変動。Key Analytics (Pro、早期アクセスでは無料) は、ライブサンプリングによる型、TTL、サイズ分布を追加します。
- **クラスタ可視化** - トポロジグラフ、SLOT-STATSヒートマップ、スロットごとのCPUとキー分布。
- **CPU & I/Oスレッドメトリクス** - 他のどのRedisツールも提供できないスレッドごとの可視化。
- **クライアント分析** - どのサービスが何の原因かを正確に把握。クライアント名とパターンで属性付けされます。
- **ACL監査証跡** - 誰が何にアクセスしたかを追跡し、コンプライアンスとインシデント後のデバッグのために永続化します。
### 理解して行動する
- **異常検知** (Pro、早期アクセスでは無料) - 相関イベントと平易な言葉による診断を伴う自動ベースライン学習。20以上の検出器、手動しきい値は不要です。
- **容量予測** - メモリ、ops/sec、CPU、フラグメンテーションの上限到達までの予測時間。
- **Webhook** - リトライと完全な配信ログを備えたHMAC署名付きアラート配信。
- **ライブマイグレーション** - 3フェーズの分析、実行、検証ワークフローでRedisとValkey間を移動できます。
### AI時代のために構築
- **ベクトル検索オブザーバビリティ** - [valkey-search](https://github.com/valkey-io/valkey-search)とRediSearchのFT.SEARCH ops/secとレイテンシ、インデックスごとのヘルス。詳細は[docs/vector-ai](https://github.com/betterdb-inc/monitor/blob/master/docs/vector-ai/README.md)を参照してください。
- **推論レイテンシ** - インデックスごとのp50/p95/p99、SLA違反アラート付き (Pro、早期アクセスでは無料)。
- **セマンティックキャッシュインテリジェンス** (Pro、早期アクセスでは無料) - ヒット率のヘルス、類似度しきい値の推奨、承認/却下の提案ワークフロー。エージェントメモリのオブザーバビリティも含まれます。
- **AIトレース** - AIアプリケーションからのOTLPスパンウォーターフォール。各リクエストの下にあるライブValkey状態と相関付けられます。詳細は[docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md)を参照してください。
### あらゆるものに接続
- **MCPサーバー** - [`@betterdb/mcp`](https://github.com/betterdb-inc/monitor/blob/master/packages/mcp)経由でClaude Code、Cursor、または任意のMCPクライアント向けの60のツール。
- **Prometheusエンドポイント** - 100以上の`betterdb_*`メトリクス。詳細は[docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md)を参照してください。
- **OpenTelemetry** - OTLPトレースを取り込み、メトリクスとイベントを任意のOTLPバックエンドにミラーリングします。詳細は[docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md)を参照してください。
- **REST API** - UIのすべてがAPI呼び出しであり、OpenAPIで文書化されています。
## 自分のデータに自分の方法でアクセス
| インターフェース | 詳細 |
|-----------|---------|
| Web UI | `http://localhost:3001` |
| MCPサーバー | `npx @betterdb/mcp` (stdio) - Settings → MCP Tokensでトークンを作成 |
| Prometheus | `http://localhost:3001/api/prometheus/metrics` |
| REST API (OpenAPI) | `http://localhost:3001/docs` |
| ヘルスチェック | `http://localhost:3001/api/health` |
> **注意**: 本番ビルド (Docker、CLI) では、APIルートは`/api`プレフィックスの下で提供されます。ローカル開発 (`pnpm dev`) ではプレフィックスはありません - 例: `http://localhost:3001/health`。
## サポートされるデータベース
| データベース | 最小バージョン | サポートされる機能 |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | COMMANDLOG (8.1+) とCLUSTER SLOT-STATSを含むすべての機能 |
| **Redis** | 6+ | Valkey専用のCOMMANDLOGとCLUSTER SLOT-STATSを除くすべての機能 |
バックエンドは、ワイヤ互換の`iovalkey`クライアント上の統合アダプタを使用し、`INFO`レスポンスからValkeyかRedisかを自動検出します (`DB_TYPE=auto`)。COMMANDLOGやSLOT-STATSなどの機能はバージョンごとに検出され、機能が利用できない場合、UIは適切に機能を縮退させます。
マネージドサービスもサポートされています - AWS ElastiCache、MemoryDB、Redis Cloud、Upstashのガイドは[docs/providers](https://github.com/betterdb-inc/monitor/blob/master/docs/providers)にあり、[`@betterdb/agent`](https://github.com/betterdb-inc/monitor/blob/master/packages/agent)はアウトバウンドWebSocket経由でVPC専用インスタンスに到達します。
## Docker本番デプロイメント
Dockerイメージには監視アプリケーション (バックエンド + フロントエンド) が含まれています。必要なもの:
1. 監視対象のValkey/Redisインスタンス
2. データ永続化用のPostgreSQLインスタンス (またはメモリストレージを使用)
### PostgreSQLストレージで実行する```bash
docker run -d \
--name betterdb-monitor \
-p 3001:3001 \
-e DB_HOST=your-valkey-host \
-e DB_PORT=6379 \
-e DB_PASSWORD=your-password \
-e STORAGE_TYPE=postgres \
-e STORAGE_URL=postgresql://user:pass@postgres-host:5432/dbname \
betterdb/monitor
カスタムポートで実行
PORT 環境変数を設定し、-p マッピングを一致させます:```bash
docker run -d
--name betterdb-monitor
-p 8080:8080
-e PORT=8080
-e DB_HOST=your-valkey-host
betterdb/monitor
### ホストネットワークで実行する(localhost サービスにアクセス)
Valkey と PostgreSQL が同じホスト上で動作している場合:```bash
docker run -d \
--name betterdb-monitor \
--network host \
-e DB_HOST=localhost \
-e DB_PORT=6380 \
-e DB_PASSWORD=devpassword \
-e STORAGE_TYPE=postgres \
-e STORAGE_URL=postgresql://dev:devpass@localhost:5432/postgres \
betterdb/monitor
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
DB_HOST | はい | localhost | 監視対象の Valkey/Redis ホスト |
DB_PORT | いいえ | 6379 | Valkey/Redis ポート |
DB_PASSWORD | いいえ | - | Valkey/Redis パスワード |
DB_USERNAME | いいえ | default | Valkey/Redis ACL ユーザー名 |
DB_TYPE | いいえ | auto | データベース種別: auto、valkey、または redis |
STORAGE_TYPE | いいえ | memory | ストレージバックエンド: memory または postgres |
STORAGE_URL | 条件付き | - | PostgreSQL 接続 URL (STORAGE_TYPE=postgres の場合は必須) |
PORT | いいえ | 3001 | アプリケーション HTTP ポート |
NODE_ENV | いいえ | production | Node 環境 |
ANOMALY_DETECTION_ENABLED | いいえ | true | 異常検知を有効化 |
ANOMALY_PROMETHEUS_INTERVAL_MS | いいえ | 30000 | Prometheus サマリー更新間隔 (ms) |
BETTERDB_LICENSE_KEY | いいえ | - | オンラインライセンスキー (Pro/Enterprise)、ネットワーク経由で検証される |
BETTERDB_OFFLINE_LICENSE_FILE | いいえ | - | エアギャップホスト向けの署名済みオフラインライセンス .jwt へのパス (下記参照) |
BETTERDB_OFFLINE_LICENSE | いいえ | - | インライン JWT 文字列としてのオフラインライセンストークン |
BETTERDB_DATA_DIR | いいえ | /app/data | 永続化されたライセンス状態用ディレクトリ (書き込み可能なボリュームをマウントすること) |
ENCRYPTION_KEY | いいえ | - | 保存された接続パスワードと SSH トンネルシークレットを保存時にエンベロープ暗号化するために使用されるキー (最低 16 文字)。これがない場合、シークレットは平文で保存される |
BETTERDB_SSH_KEY_DIR | いいえ | - | サーバー側 SSH 秘密鍵が存在しなければならないディレクトリ。SSH トンネルの「サーバーファイルパス」キーソースを有効化する。接続のキーパスはこのディレクトリ内に解決されなければならない。未設定の場合、ファイルベースのキーは無効化される (インラインで貼り付けたキーは引き続き機能する) |
BETTERDB_TELEMETRY | いいえ | true | 匿名テレメトリを無効化するには false を設定 |
AI、Webhook チューニング、ヘルスゲートしきい値を含む完全なリファレンス: docs/configuration.md。OTLP トレース取り込みとメトリクス/イベントエクスポートについては、docs/opentelemetry.md を参照してください。
SSH トンネル
接続は、直接接続する代わりに SSH 踏み台/ジャンプホストを経由してデータベースに到達できます。プライベートサブネット内の Valkey/Redis、ElastiCache、MemoryDB などに便利です。接続を追加する際に Connect via SSH tunnel を有効化し、SSH ホスト、ポート、ユーザー名を指定します。単一ホップがサポートされています。
認証はパスワードまたは秘密鍵のいずれかです。秘密鍵は次の 2 つのソースのいずれかから取得されます:
- キーの貼り付け (インライン): PEM キーの内容が接続とともに送信されます。
ENCRYPTION_KEYが設定されている場合にのみ保存時に暗号化され (エンベロープ暗号化)、このキーがない場合は接続パスワードと同様に平文で保存されます。マネージド/クラウドデプロイを含むあらゆる環境で機能します。 - サーバーファイルパス: キーがすでに監視サーバーのファイルシステム上に存在し、パスで参照されます。これには、許可されたキーを保持するディレクトリを
BETTERDB_SSH_KEY_DIR環境変数に設定する必要があり、参照されるパスはそのディレクトリ内に解決されなければならないため、API が任意のファイルを読み取るように誘導されることはありません。このオプションを無効化するにはBETTERDB_SSH_KEY_DIRを未設定のままにします。
オプションで、接続に SSH サーバーのホストキーフィンガープリント (SHA256:...) を固定できます。設定すると、サーバーが一致するキーを提示しない限りトンネルは拒否され、踏み台経路に対する中間者攻撃を防ぎます。空白のままにすると、サーバー ID は検証されません (警告がログに記録されます)。
トンネルは 127.0.0.1 経由でデータベースに転送します。TLS が有効な場合、証明書は実際のデータベースホスト名に対して引き続き検証されます。SSH パスワード、キーパスフレーズ、インラインキーが保存時に暗号化されるように ENCRYPTION_KEY を設定してください。
既知の制限 — クラスター/Sentinel トポロジー: トンネルされるのは設定した接続のみです。クラスターおよび Sentinel の監視は、それらのノードがアドバタイズするアドレス (CLUSTER NODES / Sentinel) を使用して他のノードにファンアウトし、それらのノードごとの接続はトンネルを経由せず直接行われます。他のノードが踏み台経由でのみ到達可能な場合 (例: プライベートサブネット内の ElastiCache/MemoryDB)、ノードごとのビューは利用できません。単一ノード/プライマリの監視には SSH トンネルを使用するか、クラスターノードに直接到達できる場所にモニターを配置してください。
ライセンスとエアギャップサポート
BetterDB Monitor は、ホストがインターネットアクセスを持っているかどうかに応じて、 2 つの方法のいずれかで Pro/Enterprise 機能をアンロックします:
- オンラインライセンスキー -
BETTERDB_LICENSE_KEYを設定します。モニターは それをbetterdb.comに対して検証し、ローカルで検証済みの署名済みトークンを キャッシュするため、短時間の障害や再起動を経てもティアが機能し続けます。 - オフライン/エアギャップライセンストークン - インターネットアクセスが まったくないホスト向けです (下記参照)。
エアギャップライセンスの仕組み
すべてのエンタイトルメントは署名済み RS256 JWT です。モニターはイメージに 埋め込まれた公開鍵に対してそれをローカルで検証します - トークンを信頼するために ライセンスサーバーに到達する必要は決してありません。したがって、エアギャップ ホストはゼロ接続で有料ティアを実行できます:
- インターネット接続されたマシンで、
betterdb.com/account/licenses に
サインインし、オフラインライセンストークンをダウンロードします (
.jwt、Pro/Enterprise)。これには シークレットは含まれず、改ざんできません - 編集すると署名が壊れます。 - USB、構成管理、Docker/Kubernetes シークレットマウントなど、好きな方法で エアギャップホストに転送します。
BETTERDB_OFFLINE_LICENSE_FILE(パス)、BETTERDB_OFFLINE_LICENSE(インライン文字列) で提供するか、UI の Settings → License → "Air-gapped environment? Activate an offline license." で貼り付けます。
オフライントークンが設定され、BETTERDB_LICENSE_KEY が設定されていない場合、
モニターはアウトバウンドリクエストを一切行いません - ライセンスチェック、テレメトリ、
更新 ping はすべて無効化されます。付与されたティアをトークンが期限切れになるまで
実行し (永久ライセンスは毎年再ダウンロード)、その後 Community に戻ります。```bash
fully offline - no network required
docker volume create betterdb-data docker run --rm -v betterdb-data:/d alpine chown 1001:1001 /d # volume writable by UID 1001 (one-time)
docker run -d --name betterdb-monitor -p 3001:3001
-e DB_HOST=your-valkey-host -e DB_PORT=6379 -e DB_PASSWORD=your-password
-v /path/to/betterdb-license.jwt:/run/secrets/betterdb-license.jwt:ro
-e BETTERDB_OFFLINE_LICENSE_FILE=/run/secrets/betterdb-license.jwt
-v betterdb-data:/app/data
betterdb/monitor
`GET /api/license/status` で確認 → `source: offline-token`、`mode: offline`、
`airGapped: true`。
> **永続化:** 書き込み可能なボリュームを `/app/data` にマウントして、オフラインライセンスと
> オンライン障害猶予トークンが再起動後も保持されるようにします。コンテナは **UID 1001** で
> 実行されるため、新しく作成したボリュームはその UID に `chown` する必要があります(上記参照) -
> そうしないと永続化が `EACCES … license.jwt` で失敗します。
完全なフロー、検証の優先順位、鍵ローテーションのランブックについては
**[オフライン & エアギャップライセンス](https://github.com/betterdb-inc/monitor/blob/master/docs/offline-licenses.md)** および
**[設定リファレンス](https://github.com/betterdb-inc/monitor/blob/master/docs/configuration.md#license-configuration)** を参照してください。
### Docker イメージの詳細
- **ベースイメージ**: `node:20-alpine`
- **圧縮サイズ**: 約360MB(`latest` / `-no-ai`)/ 約640MB(実験的な AI Helper のローカル LLM 依存関係を含むバージョン付きイメージ)
- **プラットフォーム**: `linux/amd64`、`linux/arm64`
- **含まれるもの**: バックエンド API + フロントエンド静的ファイル(Fastify により配信)
- **除外**: SQLite サポート(PostgreSQL または Memory ストレージを使用)
### コンテナ操作```bash
docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
ストレージバックエンド
BetterDB Monitor は、監査証跡、分析、キャプチャ、および異常データを 4 つのバックエンドのいずれかに永続化します:
| バックエンド | ユースケース | 備考 |
|---|---|---|
memory | テスト、一時的な環境 | Docker でのデフォルト。再起動時にすべてのデータが失われます |
postgres | 本番環境 | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
turso | 本番環境 / サーバーレス SQLite | STORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN。Docker で動作します |
sqlite | ローカル開発 / CLI | ネイティブモジュールは latest Docker イメージから削除されています。STORAGE_SQLITE_FILEPATH はオプションです |
Prometheus メトリクス
メトリクスは GET /api/prometheus/metrics で Prometheus テキスト形式で公開されます: ACL 監査、クライアント接続、slowlog/commandlog パターン、メモリ、スループット、キースペース、レプリケーション、クラスタスロット統計、および Node.js ランタイムメトリクス - すべて betterdb_ というプレフィックスが付きます。```yaml
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
完全なメトリクスリファレンス: [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md) および [docs/prometheus-integration.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-integration.md)。
## 開発
### プロジェクト構成```
betterdb-monitor/
├── apps/
│ ├── api/ # NestJS backend (Fastify)
│ └── web/ # React frontend (Vite)
├── packages/ # Published packages (see below)
├── docs/ # Documentation site (Jekyll)
├── docker-compose.yml # Local Valkey (port 6380) and Redis (port 6382) for testing
└── package.json # Workspace root
パッケージ
このモノレポには複数のスタンドアロンパッケージが含まれています。完全なリストは packages/ を参照してください。
| パッケージ | 言語 | レジストリ |
|---|---|---|
@betterdb/monitor | TypeScript | npm |
@betterdb/mcp | TypeScript | npm |
@betterdb/agent | TypeScript | npm |
@betterdb/semantic-cache | TypeScript | npm |
betterdb-semantic-cache | Python | PyPI |
@betterdb/agent-cache | TypeScript | npm |
betterdb-agent-cache | Python | PyPI |
cache-benchmark | Python | セマンティックキャッシュのベンチマーク用リプレイハーネス |
技術スタック
- バックエンド: Fastify アダプターを備えた NestJS、Valkey/Redis 接続用の
iovalkey、TypeScript strict モード。ポート 3001。 - フロントエンド: React + TypeScript、Vite、TailwindCSS、Recharts。開発サーバーはポート 5173。
- モノレポ: pnpm ワークスペース + Turborepo。
ローカルセットアップ
前提条件: Node.js >= 20.0.0、pnpm >= 9.0.0、Docker。```bash pnpm install cp .env.example .env pnpm docker:dev # local Valkey (6380) and Redis (6382) pnpm dev # web on :5173, api on :3001
Redis に接続するには、Valkey の代わりに `.env` で `DB_PORT=6382` を設定します。```bash
pnpm dev:api # API only
pnpm dev:web # frontend only
pnpm docker:dev:down # stop local databases
pnpm build # production build
pnpm test # API tests
Dockerイメージのビルド:```bash pnpm docker:build # local build pnpm docker:publish # multi-arch build & push (requires buildx)
### 新機能の追加
1. `apps/api/src/` に新しいエンドポイントを追加する
2. `apps/web/src/api/` に対応する API 呼び出しを追加する
3. `packages/shared/src/types/` に共有型を追加する
### コードスタイル
- TypeScript strict モード、明示的な戻り値の型、`any` は使用しない
- ESLint + Prettier を設定済み
## ライセンス
- `docs/` 配下のコンテンツは CC BY-SA 4.0 の下でライセンスされています。
- `proprietary/` 配下のコンテンツは商用ライセンスの対象です(`proprietary/LICENSE` を参照)。これらの機能はアーリーアクセス期間中は無料です。
- それ以外はすべて [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE) です。