可観測性
Wippy は、ロギング、メトリクス、分散トレーシング、ランタイム統計を通じて、アプリケーションとランタイムの動作を公開します。
概要
起動時に 3 つの可観測性領域を設定します:
| 柱 | バックエンド | 設定 |
|---|---|---|
| ロギング | Zap(JSON構造化) | loggerとlogmanager |
| メトリクス | Prometheus | prometheus |
| トレーシング | OpenTelemetry | otel |
ロガー設定
ロガーのエンコーディング
logger:
encoding: json # json or console
レベルと出力は CLI フラグ(-v、-c、-s)で制御されます — yaml から読み取られるのは encoding のみです。
ログマネージャ
ログマネージャはログの伝播とイベントストリーミングを制御します:
logmanager:
propagate_downstream: true # 子コンポーネントに伝播
stream_to_events: false # ログをイベントバスに転送
min_level: 0 # -1=debug, 0=info, 1=warn, 2=error(wippy run は 0、-v 指定時は -1 を設定)
stream_to_eventsが有効な場合、ログエントリはイベントになり、プロセスはイベントバス経由でサブスクライブできます。
組み込みログマネージャのデフォルトは -1 ですが、wippy run は起動時に CLI のログ設定を適用します。通常は info(0)、-v または --very-verbose を指定すると debug(-1)になります。
自動コンテキスト
Lua からlogger モジュール経由で出力されるログには、以下が自動的に含まれます:
pid- 現在のプロセスのPIDlocation- エントリIDと呼び出し行(例:app.api:handler:45)
Prometheusメトリクス
prometheus:
enabled: true
address: "localhost:9090"
メトリクスは設定されたアドレスの/metricsで公開されます。同じリスナーが/livezも提供します。max_cardinality(デフォルト1024)はエクスポーターごとに保持されるラベルセット数の上限です。これを超えると、最後に更新された時刻が最も古い系列から削除されます。
スクレイプ設定
# prometheus.yml
scrape_configs:
- job_name: 'wippy'
static_configs:
- targets: ['localhost:9090']
scrape_interval: 15s
Lua メトリクス API についてはメトリクスモジュールを参照してください。
OpenTelemetry
OpenTelemetry(OTEL)は、分散トレーシングと任意のメトリクスエクスポートを提供します。
基本設定
otel:
enabled: true
endpoint: "localhost:4318"
protocol: http/protobuf # grpc or http/protobuf
service_name: my-app
service_version: "1.0.0"
insecure: true # Use plaintext for a local collector
sample_rate: 1.0 # 0.0 to 1.0
traces_enabled: true
metrics_enabled: false
propagators:
- tracecontext
- baggage
トレースソース
otel.enabledが true になると、すべてのトレースソースがデフォルトで有効になります。各ソースは個別に無効化できます:
otel:
enabled: true
endpoint: "localhost:4318"
service_name: my-app
# HTTP request tracing
http:
enabled: true
extract_headers: true # Read incoming trace context
inject_headers: true # Write trace context to the HTTP response
# Process lifecycle tracing
process:
enabled: true
trace_lifecycle: true # Trace spawn/exit events
# Queue message tracing
queue:
enabled: true
# Function call tracing
interceptor:
enabled: true
order: 100 # インターセプター実行順序
OTEL が有効な場合、HTTP のトレーシングと伝播、プロセスのトレーシングとライフサイクルスパン、関数インターセプト、キュートレーシング、トレースエクスポートはデフォルトで有効です。Temporal トレーシングとメトリクスエクスポートはデフォルトで無効です。固定されたランタイムは関数インターセプターを order 100 で登録します。設定から interceptor.order の値をデコードできても、その登録順序は変わりません。
Temporalワークフロー
Temporalワークフローのトレーシングを有効化:
otel:
enabled: true
endpoint: "localhost:4318"
service_name: my-app
temporal:
enabled: true
有効な場合、Temporal SDKのトレーシングインターセプターがクライアントとワーカーの両方の操作に登録されます。
トレースされる操作は次のとおりです:
- ワークフローの開始と完了
- アクティビティ実行
- 子ワークフロー呼び出し
- シグナルとクエリ処理
トレースされるもの
| コンポーネント | スパン名 | 属性 |
|---|---|---|
| HTTPリクエスト | {METHOD} {route} |
http.method, http.url, http.host, http.route |
| 関数呼び出し | 関数ID | process.pid, frame.id |
| プロセスライフサイクル | {source}.started/terminated |
process.pid |
| キューメッセージ | {queue}.publish |
messaging.operation, messaging.destination.name |
| Temporalワークフロー | ワークフロー/アクティビティ名 | workflow.id, run.id |
コンテキスト伝播
設定された統合では、トレースコンテキストが次の経路で伝播されます:
- HTTP → 関数: W3C Trace Contextヘッダー
- 関数 → 関数: フレームコンテキスト継承
- プロセス → プロセス: spawnコンテキスト
- キュー publish → consume: メッセージヘッダー
環境変数
OTELは環境変数で設定できます:
| 変数 | 説明 |
|---|---|
OTEL_SDK_DISABLED |
trueに設定してOTELを無効化 |
OTEL_EXPORTER_OTLP_ENDPOINT |
コレクターエンドポイント。エクスポーター設定前に http:// または https:// スキームは除去されます |
OTEL_EXPORTER_OTLP_PROTOCOL |
grpcまたはhttp/protobuf |
OTEL_EXPORTER_OTLP_INSECURE |
true に設定すると平文のコレクター接続を使用 |
OTEL_SERVICE_NAME |
サービス名 |
OTEL_SERVICE_VERSION |
サービスバージョン |
OTEL_TRACES_SAMPLER |
always_on、always_off、traceidratio、parentbased_traceidratio |
OTEL_TRACES_SAMPLER_ARG |
サンプルレート(0.0-1.0) |
OTEL_TRACES_SAMPLER |
always_on、always_off、traceidratio、parentbased_traceidratio(比率はOTEL_TRACES_SAMPLER_ARGから) |
OTEL_EXPORTER_OTLP_INSECURE |
非TLS接続を許可するにはtrueに設定 |
OTEL_PROPAGATORS |
プロパゲーターリスト |
ランタイム統計
systemモジュールは内部ランタイム統計を提供します:
local system = require("system")
-- Memory statistics
local mem, mem_err = system.memory.stats()
-- mem.alloc, mem.heap_alloc, mem.heap_objects, etc.
-- Goroutine count
local count, count_err = system.runtime.goroutines()
-- Supervisor states
local states, states_err = system.supervisor.states()
これらの関数は value, error を返します。現在のセキュリティスコープに system.read 権限が必要です。
関連項目
- ロガーモジュール — Lua ロギング API
- メトリクスモジュール — Lua メトリクス API
- システムモジュール — ランタイム統計