gokeyless キーサーバーは Prometheus ↗ のメトリクスエンドポイントを公開します。署名の性能、エラー率、接続の健全性、証明書の期限切れを監視できます。このエンドポイントは OpenTelemetry Collector の Prometheus レシーバーでもスクレイプできるため、OpenTelemetry 対応の任意のバックエンドへメトリクスを渡せます。
デフォルトでは、メトリクスは次の URL で提供されます。
http://<host>:2406/metricsポートは、設定ファイルの metrics_port、--metrics-port フラグ、または KEYLESS_METRICS_PORT 環境変数で変更できます。
このエンドポイントが提供するのは /metrics だけです。/health や /debug などの追加の HTTP エンドポイントはありません。
ヒストグラムメトリクスは、すべて同じバケット設定を使います。100 マイクロ秒から始まり、各ステップで 2 倍になる指数バケットが 15 個あり、およそ 1.64 秒まで続きます。最後に +Inf バケットがあります。
| バケット | 上限 |
|---|---|
| 1 | 100 µs |
| 2 | 200 µs |
| 3 | 400 µs |
| 4 | 800 µs |
| 5 | 1.6 ms |
| 6 | 3.2 ms |
| 7 | 6.4 ms |
| 8 | 12.8 ms |
| 9 | 25.6 ms |
| 10 | 51.2 ms |
| 11 | 102 ms |
| 12 | 205 ms |
| 13 | 410 ms |
| 14 | 819 ms |
| 15 | 約 1.64 s |
| +Inf | 約 1.64 s を超える値 |
Type: Counter
Labels: opcode
確立済み接続で受け取ったリクエストを、結果に関係なくすべて数えます。処理を始める前に、リクエストごとに 1 回インクリメントします。
opcode ラベルには、gokeyless プロトコルの定数名をそのまま使います。
opcode ラベル |
ワイヤ値 | 説明 |
|---|---|---|
OpRSADecrypt |
0x01 |
RSA の生の復号です。TLS の RSA 鍵交換で使います(TLS 1.3 では非推奨) |
OpRSASignMD5SHA1 |
0x02 |
MD5+SHA1 の結合ハッシュに対する RSA PKCS#1 v1.5 署名です。TLS 1.0/1.1 のハンドシェイクで使います |
OpRSASignSHA1 |
0x03 |
SHA1 に対する RSA PKCS#1 v1.5 署名です |
OpRSASignSHA224 |
0x04 |
SHA224 に対する RSA PKCS#1 v1.5 署名です |
OpRSASignSHA256 |
0x05 |
SHA256 に対する RSA PKCS#1 v1.5 署名です |
OpRSASignSHA384 |
0x06 |
SHA384 に対する RSA PKCS#1 v1.5 署名です |
OpRSASignSHA512 |
0x07 |
SHA512 に対する RSA PKCS#1 v1.5 署名です |
OpRSAPSSSignSHA256 |
0x35 |
SHA256 に対する RSASSA-PSS 署名です。TLS 1.3 での主要な RSA 操作です |
OpRSAPSSSignSHA384 |
0x36 |
SHA384 に対する RSASSA-PSS 署名です |
OpRSAPSSSignSHA512 |
0x37 |
SHA512 に対する RSASSA-PSS 署名です |
opcode ラベル |
ワイヤ値 | 説明 |
|---|---|---|
OpECDSASignMD5SHA1 |
0x12 |
MD5+SHA1 の結合ハッシュに対する ECDSA 署名です |
OpECDSASignSHA1 |
0x13 |
SHA1 に対する ECDSA 署名です |
OpECDSASignSHA224 |
0x14 |
SHA224 に対する ECDSA 署名です |
OpECDSASignSHA256 |
0x15 |
SHA256 に対する ECDSA 署名です。TLS 1.2 と TLS 1.3 で最もよく使います |
OpECDSASignSHA384 |
0x16 |
SHA384 に対する ECDSA 署名です |
OpECDSASignSHA512 |
0x17 |
SHA512 に対する ECDSA 署名です |
opcode ラベル |
ワイヤ値 | 説明 |
|---|---|---|
OpEd25519Sign |
0x18 |
任意長のペイロードに対する Ed25519 署名です(事前ハッシュしたダイジェストではありません) |
opcode ラベル |
ワイヤ値 | 説明 |
|---|---|---|
OpSeal |
0x21 |
サーバーのシーリングキーで blob を暗号化します。TLS セッションチケットに使います |
OpUnseal |
0x22 |
OpSeal で以前暗号化した blob を復号します。シーリングキーがローテーション済みの場合は ErrExpired を返します |
OpRPC |
0x23 |
サーバーに登録された名前付き関数を実行します。すべての接続種別で利用できます |
OpCustom |
0x24 |
サーバー設定で指定したカスタム関数を実行します。制限なしの接続でのみ利用できます |
OpPing |
0xF1 |
ヘルスチェックです。HSM や鍵の検索は行わず、サーバーはペイロードを OpPong としてそのまま返します |
Type: Histogram
Labels: type, error
処理開始から応答生成までの、1 回の操作の実行時間を測ります。PKCS#11 HSM を使う操作では、プールからのセッション待ち時間と、HSM 上の暗号操作時間の両方が含まれます。
このメトリクスには、リクエストが接続セマフォのスロットを待つ時間は含まれません。その時間は keyless_request_total_duration_per_opcode で記録します。
このラベルでは、opcode をより粗いカテゴリにまとめます。
type ラベル |
含まれる opcode |
|---|---|
rsa |
OpRSADecrypt、すべての OpRSASign*、すべての OpRSAPSSSign* |
ecdsa |
すべての OpECDSASign* |
ed25519 |
OpEd25519Sign |
rpc |
OpRPC |
custom |
OpCustom |
other |
OpSeal、OpUnseal、OpPing、OpPong、OpResponse、OpError |
unknown |
認識できない opcode バイト |
成功したリクエストの値は no error です。それ以外は失敗した操作です。
error ラベル |
説明 | よくある原因 |
|---|---|---|
no error |
操作は正常に完了しました | — |
cryptography error |
HSM または署名操作が失敗しました | PKCS#11 セッションプールの枯渇(resource pool timed out)、HSM がエラーを返した、鍵種別の不一致 |
key not found due to no matching SKI/SNI/ServerIP |
鍵の検索結果が空でした | キーストアに鍵が読み込まれていない、リクエストの SKI が正しくない |
read failure |
操作中の I/O 読み取りエラーです | 鍵ファイル読み取り時のディスクエラー |
version mismatch |
プロトコルバージョンが未対応です | クライアントとサーバーのバージョンずれ |
bad opcode |
未知の opcode を受け取りました | カスタムハンドラー未設定のまま OpCustom が送られた |
unexpected opcode |
応答用 opcode がリクエストとして使われました | クライアントが OpPong、OpResponse、OpError をリクエストとして送った |
malformed message |
TLV の解析に失敗しました | 破損または途中で切れたパケット |
internal error |
暗号以外のサーバー側障害です | Sealer が nil、RPC ディスパッチエラー |
certificate not found |
証明書の検索に失敗しました | 証明書が読み込まれていない |
sealing key expired |
OpUnseal の blob が古すぎて復号できません |
TLS セッションチケットの鍵ローテーション。すでに破棄された鍵でシーリングされた blob です |
remote configuration error |
リモートキーサーバーの設定が誤っています | 到達できない、または設定が誤ったリモートキーサーバーを鍵が指している |
Type: Histogram
Labels: type、error(keyless_request_exec_duration_per_opcode と同じ値)
リクエストパケットをワイヤから読み取ってから、応答バイトをクライアントへ書き戻すまでの、リクエスト全体の所要時間を測ります。
total_duration = exec_duration + response_write_time両方のタイムスタンプは、接続セマフォを取得したあとに記録します。そのため、セマフォのキュー待ち時間はどちらのヒストグラムにも含まれません。通常の負荷では、total duration と exec duration はほぼ同じです。差が広がっている場合は、クライアントへの書き戻しが遅いことを示します。たとえば、キーサーバーと Cloudflare エッジの間のネットワークバックプレッシャーです。
Type: Histogram
Labels: なし
キーストアが各リクエストの秘密鍵を探して返すまでの時間を測ります。キーは SKI、SNI、サーバー IP です。
- ファイルベースのキーストアではマップ検索であり、通常は 1 ミリ秒未満です。
- PKCS#11 または HSM キーストアでは、鍵参照がメモリにキャッシュされていない場合、HSM へのネットワーク往復が含まれることがあります。
このメトリクスは、署名と復号の操作すべてで記録します。対象は OpRSADecrypt、すべての OpRSASign*、すべての OpRSAPSSSign*、すべての OpECDSASign*、および OpEd25519Sign です。
OpPing、OpSeal、OpUnseal、OpRPC、OpCustom では記録しません。これらは秘密鍵の検索が不要です。
Type: Counter
Labels: なし
接続レベルのトランスポート障害を数えます。このメトリクスはネットワーク層または TLS 層の問題を表します。署名エラーや鍵の検索失敗は数えません。それらは duration ヒストグラムの error ラベルで報告します。
| シナリオ | 計上するか |
|---|---|
| TLS ハンドシェイクの失敗 | しない |
| TLS ハンドシェイク前のクライアント切断(EOF) | しない |
| TLS 後に接続の信頼レベルを判定できなかった | する |
| 確立済み接続での EOF 以外の読み取りエラー | する |
| 応答配信時の書き込みエラー | する |
| 読み取りタイムアウト(接続のグレースフルドレイン) | しない |
| PKCS#11 プールタイムアウトを含む署名エラー | しない |
| 鍵が見つからない | しない |
Type: Gauge
Labels: source、serial_no、cn、hostnames、ca、server、client
キーサーバーが読み込んだ各証明書の有効期限(NotAfter)を Unix タイムスタンプで報告します。証明書ごとに 1 つの時系列を出力します。
このメトリクスは次のタイミングで更新されます。
- 起動時。サーバー認証証明書(
auth_cert)と Cloudflare CA 証明書(cloudflare_ca_cert)。 - 受信 TLS 接続が成功するたび。接続クライアントが提示したピア証明書。
| ラベル | 説明 |
|---|---|
source |
起動時証明書はファイルパス。受信接続のピア証明書は listener: <addr> |
serial_no |
証明書のシリアル番号 |
cn |
Subject の Common Name |
hostnames |
DNS Subject Alternative Name をソートし、カンマ区切りにした一覧 |
ca |
CA 証明書なら 1、それ以外は 0 |
server |
証明書に ExtKeyUsageServerAuth があれば 1、なければ 0 |
client |
証明書に ExtKeyUsageClientAuth があれば 1、なければ 0 |
sum by (opcode) (rate(keyless_requests[1m]))sum by (error) (
rate(keyless_request_exec_duration_per_opcode_count{error!="no error"}[5m])
)histogram_quantile(
0.99,
rate(keyless_request_exec_duration_per_opcode_bucket{type="rsa"}[5m])
)値が 10 秒に近づいている場合は、PKCS#11 セッションプールの枯渇を示します。セッションプールサイズの増やし方は、スケーリングとベンチマーク と HSM のドキュメントを参照してください。
histogram_quantile(0.99, rate(keyless_key_load_duration_bucket[5m]))exec duration に対応する急増がなく、ここだけが急増している場合は、キーストアの検索自体が遅い可能性があります。ディスク I/O の問題や、PKCS#11 オブジェクト列挙の遅延が考えられます。
rate(keyless_failed_connection_total[5m])0 以外の値が続く場合は、Cloudflare ネットワークとキーサーバーの間にネットワークまたは TLS の問題があります。
(certificate_expiration_timestamp_seconds - time()) / 86400 < 30