@unikvs/metrics
操作の件数とバイト数、use フックの実行時間を記録し、OTel や Prometheus へ転送できるミドルウェアです。
概要
Metrics は操作の件数とバイト数、use フックの実行時間を記録し、集計と外部転送を行います。この実行時間にストレージ I/O の遅延は含みません。Middleware
性能の可視化や運用監視に使います。測定値はメモリーに保持され、必要に応じて OTel の計器やカスタム出力先へ転送されます。
nameはMetricsです。isOpenは常にtrueです。useは各操作の前段でuseフックチェーンの成否と実行時間を測定します。この実行時間にストレージ I/O の遅延は含みません。encode・decode・ストリームではバイト数も記録します。- 記録処理は決して例外を投げず、出力先の失敗は無視します。
インストールは次のコマンドで行います。
npm install @unikvs/metrics @opentelemetry/apipnpm add @unikvs/metrics @opentelemetry/apiyarn add @unikvs/metrics @opentelemetry/apibun add @unikvs/metrics @opentelemetry/apinub add @unikvs/metrics @opentelemetry/apiaube add @unikvs/metrics @opentelemetry/api@opentelemetry/api は exporter に "otel" を指定するときのみ必要です。Prometheus 形式の出力 (toPrometheusString()) やメモリー集計のみでは不要です。
使い方
Metrics は IMiddleware を実装しています。UniKvs には use() で渡します。
import { Metrics } from "@unikvs/metrics";
コンストラクターの引数は次のとおりです。
exporter?MetricsExporterKind | MetricsExporter
測定値の転送先です。組み込みのエクスポーター名かカスタム出力関数を指定します。この設定にかかわらず、測定値は常にメモリーに保持されます。
MetricsExporterKind | MetricsExportermeterProvider?MetricsMeterProvider
exporter が "otel" のときに使う OTel の MeterProvider です。
MetricsMeterProviderregistry?unknown
外部の Prometheus 連携のために保持する、不透明なレジストリーハンドルです。Prometheus の公開用テキストは toPrometheusString() から取得できます。
unknownonRecord?(record: MetricRecord) => void
測定値を記録するたびに呼び出されるコールバックです。
(record: MetricRecord) => voidclock?() => number
ミリ秒を返す時計です。既定では performance.now() を使います。
() => number以下は、操作を測定し、集計を取得する例です。
import { Memory } from "@unikvs/memory";
import { Metrics } from "@unikvs/metrics";
import * as unikvs from "unikvs";
const metrics = new Metrics();
const kvs = new unikvs.Builder<{ k1: unikvs.PlainValue<string> }>()
.use(metrics)
.persist(new Memory())
.build();
await kvs.open();
await kvs.set("k1", "hello");
console.log(metrics.getMetrics().total); // 記録件数
console.log(metrics.toPrometheusString()); // Prometheus 形式
await kvs.close();
Metrics
操作のメトリクスを記録するミドルウェアです。測定値はメモリーに保持され、getMetrics() と toPrometheusString() で取得できます。
MetricsOptions
Metrics のコンストラクターが受け取るオプションです。エクスポーターや時計を指定できます。
MetricsAction
メトリクスミドルウェアが観測する操作名です。IMiddleware.UseContext["action"] と等価です。
MetricsOutcome
観測した use フックチェーン、または encode・decode・ストリームの成否を表します。"success" か "error" です。use の場合はストレージ操作の成否ではありません。
MetricsExporterKind
名前で選択する組み込みのエクスポーターです。"otel" は計器への転送を指し、"prometheus" はメモリー保持とテキスト出力を指します。
MetricsExporter
記録されたすべての測定値を受け取るカスタム出力先です。
MetricRecord
1 回のフック実行で観測した測定値です。
actionMetricsAction
観測した操作です。
MetricsActionoutcomeMetricsOutcome
観測したフックの成否です。use フックの場合はストレージ操作の成否ではありません。
MetricsOutcomedurationMsnumber
観測したフックチェーンの経過時間 (ミリ秒) です。use の場合は use フックチェーンの実行時間で、ストレージ I/O の遅延は含みません。ストリームの場合は、ラップからソース (変換) の完了・読み取り失敗・取り消しによる確定までの時間で、ストリームの消費時間を含むことがあります。ここでの完了はソース (変換) の完了を指し、`destination` の読み切りを意味しません。
numberbytes?number | undefined
観測したバイト数です。不明な場合は undefined です。
number | undefinedkeystring | undefined
操作対象のキーです。キーを持たない clear では undefined です。
string | undefinedMetricsActionSummary
操作名ごとに集計したカウンターです。
actionstring
操作名です。
stringcountnumber
記録した測定値の総数です。
numbersuccessnumber
成功した測定値の数です。
numbererrornumber
失敗した測定値の数です。
numbertotalBytesnumber
観測したバイト数の合計です。
numbertotalDurationMsnumber
観測した経過時間の合計 (ミリ秒) です。
numberMetricsSnapshot
これまでに記録したすべての測定値のスナップショットです。
データ型
| メソッド | 入力 | 出力 |
|---|---|---|
encode |
unknown |
unknown (透過) |
decode |
unknown |
unknown (透過) |
encodeStream |
unknown (チャンク) |
unknown (チャンク、透過) |
decodeStream |
unknown (チャンク) |
unknown (チャンク、透過) |
useは操作ごとに 1 件を記録し、バイト数はundefinedです。durationMsはuseフックチェーンの実行時間で、ストレージ I/O の遅延は含みません。useフックの後に実行されるストレージ I/O の失敗は、useの記録に反映されません。プレーン値のsetの書き込み失敗、存在しないキー以外のgetの読み取り失敗、streamの取得や存在しないキーの失敗、delete・has・clear・copy・moveの失敗が該当します。- Metrics がエラーとして記録するのは、フック自体の失敗と、ラップ後のストリームの読み取り失敗・取り消しです。存在しないキーの
getもエラーとしては記録されません。プレーン値のsetがエンコード中に失敗した場合は、useのsuccessとencodeのerrorが並びます。 - ストリームの記録は、ストリームの完了、読み取り失敗、取り消しのいずれか早い時点で確定します。完了は
success、読み取り失敗と取り消しはerrorです。完了前に書き込み先の失敗などでストリームが取り消された場合もerrorになります。確定後の失敗は反映されず、ソースがラップ前にロックされていた場合は何も記録されません。 - ストリームの
durationMsは、ラップからソース (変換) の完了・読み取り失敗・取り消しによる確定までの時間で、ストリームの消費時間を含むことがあります。ここでの完了はソース (変換) の完了を指し、destinationの読み切りを意味しません。use・encode・decodeのdurationMsはフックチェーンの実行時間です。 MetricsはafterUseを実装していないため、書き込み系操作の成否を別レコードとして出力しません。コアのuseはストレージ I/O の前に実行されるため、どのミドルウェアでもuseからストレージ操作の成否を観測できません。コアには、ストレージ I/O の確定後に成否を受け取るafterUseフックがあります。encodeとdecodeはデータをそのまま通し、文字列やArrayBuffer、ArrayBufferViewではバイト数も記録します。不明な型ではundefinedです。- ストリームではチャンクをそのまま通し、確定時にそれまでの合計チャンクサイズを 1 件として記録します。
- このミドルウェアはキーラベルを意図的に省略し、
toPrometheusString()のカーディナリティーが増えないようにしています。キーごとの詳細はgetMetrics()とonRecordから取得できます。
エラー
このパッケージ固有のエラーはありません。
記録処理は例外を投げず、出力先の失敗は無視するため、メトリクスが操作のパイプラインを壊すことはありません。フックの実行中にエラーが発生したときは、error を記録してからそのエラーを再送出します。ストリームでは、読み取り中の失敗や取り消しも error として記録します。ただし、use はストレージ I/O の前に完了するため、ストレージ操作の失敗は use の記録には反映されません。