システム

メモリ使用量、ガベージコレクション統計、CPU詳細、プロセスメタデータを含むランタイムシステム情報のクエリ。

ロード

local system = require("system")

シャットダウン

終了コード付きでシステムシャットダウンをトリガー。ターミナルアプリに便利。実行中のアクターから呼び出すとシステム全体が終了:

local ok, err = system.exit(0)
パラメータ 説明
code integer 終了コード(0 = 成功)、デフォルトは0

戻り値: boolean, error

モジュールの一覧

メタデータ付きでロード済みのすべてのLuaモジュールを取得:

local mods, err = system.modules()

戻り値: table[], error

各モジュールテーブルの内容:

フィールド 説明
name string モジュール名
description string モジュール説明
class string[] モジュール分類タグ

メモリ統計

詳細なメモリ統計を取得:

local stats, err = system.memory.stats()

戻り値: table, error

統計テーブルの内容:

フィールド 説明
alloc number 割り当てられ使用中のバイト数
total_alloc number 累積割り当てバイト数
sys number システムから取得したバイト数
heap_alloc number ヒープに割り当てられたバイト数
heap_sys number ヒープ用にシステムから取得したバイト数
heap_idle number アイドルスパン内のバイト数
heap_in_use number 非アイドルスパン内のバイト数
heap_released number OSに解放されたバイト数
heap_objects number 割り当て済みヒープオブジェクト数
stack_in_use number スタックアロケータが使用するバイト数
stack_sys number スタック用にシステムから取得したバイト数
mspan_in_use number 使用中のmspan構造のバイト数
mspan_sys number mspan用にシステムから取得したバイト数
num_gc number 完了したGCサイクル数
next_gc number 次のGCのターゲットヒープサイズ

現在の割り当て

現在割り当てられているバイト数を取得:

local bytes, err = system.memory.allocated()

戻り値: number, error

ヒープオブジェクト

割り当て済みヒープオブジェクト数を取得:

local count, err = system.memory.heap_objects()

戻り値: number, error

メモリ制限

メモリ制限を設定(以前の値を返す):

local prev, err = system.memory.set_limit(1024 * 1024 * 100)
パラメータ 説明
limit integer バイト単位のメモリ制限、無制限は-1

戻り値: number, error

現在のメモリ制限を取得:

local limit, err = system.memory.get_limit()

戻り値: number, error

GCの強制実行

ガベージコレクションを強制実行:

local ok, err = system.gc.collect()

戻り値: boolean, error

GCターゲットパーセンテージ

GCターゲットパーセンテージを設定(以前の値を返す)。100の値はヒープが2倍になるとGCがトリガーされることを意味します:

local prev, err = system.gc.set_percent(200)
パラメータ 説明
percent integer GCターゲットパーセンテージ

戻り値: number, error

現在のGCターゲットパーセンテージを取得:

local percent, err = system.gc.get_percent()

戻り値: number, error

Goroutine数

アクティブなgoroutine数を取得:

local count, err = system.runtime.goroutines()

戻り値: number, error

GOMAXPROCS

GOMAXPROCS値を取得または設定:

-- 現在の値を取得
local current, err = system.runtime.max_procs()

-- 新しい値を設定
local prev, err = system.runtime.max_procs(4)
パラメータ 説明
n integer 指定した場合、GOMAXPROCSを設定(0より大きい必要あり)

戻り値: number, error

CPU数

論理CPU数を取得:

local cpus, err = system.runtime.cpu_count()

戻り値: number, error

プロセスID

現在のプロセスIDを取得:

local pid, err = system.process.pid()

戻り値: number, error

ホスト名

システムホスト名を取得:

local hostname, err = system.process.hostname()

戻り値: string, error

作業ディレクトリ

ランタイムの現在の作業ディレクトリを取得:

local dir, err = system.process.cwd()

戻り値: string, error

プロセスホスト

ワーカーとキューの統計情報とともにすべてのプロセスホストを一覧:

local hosts, err = system.hosts.list()

戻り値: table[], error

各ホストテーブルの内容:

フィールド 説明
id string ホストレジストリID
workers number ワーカープールサイズ
processes number このホスト上のアクティブなプロセス数
executed number 実行された総ステップ数
stolen number 他のホストから奪取したステップ数
queue_depth number ホストキュー内の保留アイテム数

特定のホストで実行中のプロセスを一覧:

local procs, err = system.hosts.processes("app:host")
パラメータ 説明
host_id string ホストレジストリID

戻り値: table[], error

各プロセステーブルの内容:

フィールド 説明
pid string プロセスID
host string ホストID
source string ソースエントリID
state string プロセス状態
steps number 実行されたステップ数
started_at number 開始タイムスタンプ(ナノ秒)
parent string 親PID(なしの場合は省略)
actor_id string アクターID(なしの場合は省略)
stats table プロセス固有の統計(オプション)

サービス状態

特定の監視対象サービスの状態を取得:

local state, err = system.supervisor.state("namespace:service")
パラメータ 説明
service_id string サービスID(例: "namespace:service")

戻り値: table, error

状態テーブルの内容:

フィールド 説明
id string サービスID
status string 現在の状態
desired string 望ましい状態
retry_count number リトライ回数
last_update number 最終更新タイムスタンプ(ナノ秒)
started_at number 開始タイムスタンプ(ナノ秒)
details string オプションの詳細(フォーマット済み)

すべてのサービス状態

すべての監視対象サービスの状態を取得:

local states, err = system.supervisor.states()

戻り値: table[], error

各状態テーブルは system.supervisor.state() と同じ形式。

クラスタプリミティブ

system.nodesystem.clustersystem.raftsystem.lock サブテーブルはクラスタリング層を公開します。クラスタリングが有効な場合に最も役立ちます。スタンドアロンノードでは予測可能な形で機能が制限されます — system.raft.* は "raft not available" を報告し、system.cluster はローカルノードのみを報告し、system.lock はクラスタリングが提供するグローバルレジストリを必要とします。

すべての読み取り呼び出しはローカルかつ安価です: このノードのコミット済み状態のビューを報告し、ネットワークをブロックしません。

ノードアイデンティティ

system.node はクラスタ内のこのノード自身のアイデンティティを報告します。

local id, err = system.node.id()      -- このノードのID
local addr, err = system.node.addr()  -- 通知されたネットワークアドレス
local role, err = system.node.role()  -- "leader" | "voter" | "standby" | "non-member"
関数 戻り値 備考
system.node.id() string, error リレーコンテキストからのノードID
system.node.addr() string, error 通知されたアドレス(例: 10.0.0.1:7946)。メンバーシップが利用不可の場合エラー
system.node.role() string, error このノードの Raft ロール。Raft が実行されていない場合は "non-member" を返す(エラーなし)

権限: node に対する system.read

クラスタメンバーシップ

system.cluster はクラスタ全体のビューを報告します: メンバーと誰がリーダーかを報告します。

local members, err = system.cluster.members()  -- ノードテーブルの配列
local leader, err = system.cluster.leader()    -- リーダーノードID、不明な場合は ""
local n, err = system.cluster.size()           -- 見えているメンバー数

system.cluster.members() はノードテーブルの配列を返します。ローカルノードは一度含まれ先頭にソートされます。

フィールド 説明
id string ノードID
is_local boolean 呼び出しノードの場合はtrue
addr string 通知されたアドレス(不明の場合は省略)
meta table 文字列から文字列へのゴシップメタデータ(なしの場合は省略)
関数 戻り値 備考
system.cluster.members() table[], error メンバーシップ情報に到達できない場合エラー
system.cluster.leader() string, error 現在の Raft リーダーのID。リーダーが不明または Raft が存在しない場合は "" (エラーなし)
system.cluster.size() number, error 見えているメンバー数。メンバーシップ情報が利用できない場合は 0

権限: cluster に対する system.read

Raft状態

system.raft はこのノードの Raft コンセンサスコアのローカルビューを読み取ります。このノードで Raft が実行されていない場合、すべての関数は nil, error("raft not available")を返します。

local leader, err = system.raft.is_leader()      -- boolean
local member, err = system.raft.is_member()      -- boolean: 投票ノードまたはスタンバイ
local role, err = system.raft.role()             -- system.node.role() と同じ値
local term, err = system.raft.term()             -- 現在の Raft ターム
local idx, err = system.raft.commit_index()      -- 最高コミット済みログインデックス
local stats, err = system.raft.stats()           -- 生の統計マップ(文字列 -> 文字列)
関数 戻り値 備考
system.raft.is_leader() boolean, error このノードが現在のリーダーの場合はtrue
system.raft.is_member() boolean, error このノードがコミット済み設定の投票ノードまたはスタンバイの場合はtrue
system.raft.role() string, error "leader" / "voter" / "standby" / "non-member"
system.raft.term() number, error 現在のターム。統計から利用できない場合は 0
system.raft.commit_index() number, error このノードの最高コミット済みログインデックス
system.raft.stats() table, error 完全な生の統計マップ。キーと値は文字列

権限: raft に対する system.read。ただし system.raft.stats()raft_stats に対する system.read が必要。

分散ロック

system.lock はクラスタ全体の排他制御を提供します。ロックは呼び出しプロセスが所有するグローバルに一意な名前です。Strong 名前スコープ上に構築されているため、クラスタ全体で最大1つの保持者しか存在できません。保持者プロセスが終了またはそのノードが離脱するとロックは自動解放されます — スタックしたロックのクリーンアップは不要です。

local ok, err = system.lock.acquire("orders.migration")
if ok then
  -- クリティカルセクション: クラスタ全体で保持者は1つだけ
  system.lock.release("orders.migration")
end

取得はフェイルファスト: ロックが既に保持されている場合はブロックせず即座に false を返します。呼び出し側は独自のリトライとバックオフを実装します。現在の保持者のみが解放できます。保持していないロックを解放しても安全なno-opです。

関数 戻り値 結果
system.lock.acquire(name) boolean, error true, nil 取得成功。false, error 既に保持中(種別 errors.ALREADY_EXISTS)。nil, error 失敗
system.lock.release(name) boolean, error true, nil 解放成功。false, nil 保持していないか別プロセスが保持中。nil, error 失敗
パラメータ 説明
name string クラスタ全体のロック名

権限: ロック name に対する system.lock(ポリシーで呼び出し元がロックできる名前を制限できる)。

権限

システム操作はセキュリティポリシー評価の対象。

アクション リソース 説明
system.read memory メモリ統計を読み取り
system.read memory_limit メモリ制限を読み取り
system.control memory_limit メモリ制限を設定
system.read gc_percent GCパーセンテージを読み取り
system.gc gc ガベージコレクションを強制実行
system.gc gc_percent GCパーセンテージを設定
system.read goroutines goroutine数を読み取り
system.read gomaxprocs GOMAXPROCSを読み取り
system.control gomaxprocs GOMAXPROCSを設定
system.read cpu CPU数を読み取り
system.read pid プロセスIDを読み取り
system.read hostname ホスト名を読み取り
system.read cwd 作業ディレクトリを読み取り
system.read hosts ホスト / ホストプロセスを一覧
system.read modules ロード済みモジュールを一覧
system.read supervisor スーパーバイザー状態を読み取り
system.read node このノードのアイデンティティを読み取り
system.read cluster クラスタメンバーシップとリーダーを読み取り
system.read raft Raft 状態を読み取り
system.read raft_stats 生の Raft 統計マップを読み取り
system.lock <ロック名> 分散ロックを取得または解放
system.exit - システムシャットダウンをトリガー

エラー

条件 種別 再試行可能
権限拒否 errors.INVALID no
無効な引数 errors.INVALID no
必須引数がない errors.INVALID no
コードマネージャが利用不可 errors.INTERNAL no
サービス情報が利用不可 errors.INTERNAL no
OSエラー (hostname, cwd) errors.INTERNAL no
このノードで Raft が実行されていない errors.INTERNAL no
メンバーシップが利用不可 errors.INTERNAL no
ロックが既に保持中 errors.ALREADY_EXISTS no

エラーの処理についてはエラー処理を参照。