From 98cb0c32eea6dbe17c765e077c4f1c1ab1ab1d4f Mon Sep 17 00:00:00 2001 From: Nicolas Thouvenin Date: Tue, 21 Nov 2023 14:08:38 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20enable=20[metrics]=20for?= =?UTF-8?q?=20all?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plugin-core.md | 37 +++++++++++++---- packages/core/README.md | 37 +++++++++++++---- packages/core/src/server/knownPipeline.js | 5 ++- packages/core/src/server/metrics.js | 48 +++++++++++++++-------- 4 files changed, 95 insertions(+), 32 deletions(-) diff --git a/docs/plugin-core.md b/docs/plugin-core.md index 69c37a3bd..fb4cf65e9 100644 --- a/docs/plugin-core.md +++ b/docs/plugin-core.md @@ -12,13 +12,13 @@ npm install @ezs/core Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent : -- [delegate] : 1 sous flux pour tous les éléments -- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition -- [spaw] : 1 sous flux par élément -- [loop] : 1 sous flux par élément -- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline -- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux -- [singleton] : 1 sous flux pour le premier élément +- [delegate] : 1 sous flux pour tous les éléments +- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition +- [spaw] : 1 sous flux par élément +- [loop] : 1 sous flux par élément +- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline +- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux +- [singleton] : 1 sous flux pour le premier élément ## usage @@ -44,6 +44,7 @@ Plusieurs instructions permettent de créer des sous flux (sub pipeline), à par - [keep](#keep) - [loop](#loop) - [map](#map) +- [metrics](#metrics) - [overturn](#overturn) - [pack](#pack) - [parallel](#parallel) @@ -664,6 +665,28 @@ From an array field delegate processing of each items to an external pipeline Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** +### metrics + +- **See: ../server/knownPipeline.js + ** + +Take `Object`, and throw the same object. + +This statement will only be used if : + +- EZS_METRICS is enabled +- ezs is running in server mode + +WARNING: avoid setting bucket to "input" or "output", as these labels are used by ezs. +If you do, you risk distorting the associated metrics. + +#### Parameters + +- `pathName` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** to identify the script (optional, default `auto`) +- `bucket` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** to identify the moment of measurement (optional, default `unknow`) + +Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** + ### overturn Takes an `Object` and substitute twice a field with the corresponding value found in a external pipeline diff --git a/packages/core/README.md b/packages/core/README.md index 69c37a3bd..fb4cf65e9 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -12,13 +12,13 @@ npm install @ezs/core Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent : -- [delegate] : 1 sous flux pour tous les éléments -- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition -- [spaw] : 1 sous flux par élément -- [loop] : 1 sous flux par élément -- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline -- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux -- [singleton] : 1 sous flux pour le premier élément +- [delegate] : 1 sous flux pour tous les éléments +- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition +- [spaw] : 1 sous flux par élément +- [loop] : 1 sous flux par élément +- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline +- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux +- [singleton] : 1 sous flux pour le premier élément ## usage @@ -44,6 +44,7 @@ Plusieurs instructions permettent de créer des sous flux (sub pipeline), à par - [keep](#keep) - [loop](#loop) - [map](#map) +- [metrics](#metrics) - [overturn](#overturn) - [pack](#pack) - [parallel](#parallel) @@ -664,6 +665,28 @@ From an array field delegate processing of each items to an external pipeline Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** +### metrics + +- **See: ../server/knownPipeline.js + ** + +Take `Object`, and throw the same object. + +This statement will only be used if : + +- EZS_METRICS is enabled +- ezs is running in server mode + +WARNING: avoid setting bucket to "input" or "output", as these labels are used by ezs. +If you do, you risk distorting the associated metrics. + +#### Parameters + +- `pathName` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** to identify the script (optional, default `auto`) +- `bucket` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** to identify the moment of measurement (optional, default `unknow`) + +Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** + ### overturn Takes an `Object` and substitute twice a field with the corresponding value found in a external pipeline diff --git a/packages/core/src/server/knownPipeline.js b/packages/core/src/server/knownPipeline.js index 93ff4c2be..6c0e59697 100644 --- a/packages/core/src/server/knownPipeline.js +++ b/packages/core/src/server/knownPipeline.js @@ -94,8 +94,9 @@ const knownPipeline = (ezs) => (request, response, next) => { statements.push(ezs('tracer', { print: '.', last: '!' })); } if (metricsEnable) { - statements.unshift(ezs(metricsHandle, { pathName: request.pathName, bucket: 'input' })); - statements.push(ezs(metricsHandle, { pathName: request.pathName, bucket: 'output' })); + ezs.use({metrics: metricsHandle(request.pathName)}); + statements.unshift(ezs('metrics', { bucket: 'input' })); + statements.push(ezs('metrics', { bucket: 'output' })); } const rawStream = new PassThrough(); diff --git a/packages/core/src/server/metrics.js b/packages/core/src/server/metrics.js index a77366bc9..2627e3c34 100644 --- a/packages/core/src/server/metrics.js +++ b/packages/core/src/server/metrics.js @@ -121,25 +121,41 @@ export const metrics = () => (request, response, next) => { return true; }; -export function metricsHandle(data, feed) { - const pathName = this.getParam('pathName', 'default'); - const bucket = this.getParam('bucket', 'unknow'); - - if (!this.total) { - this.total = 0; +/** + * Take `Object`, and throw the same object. + * + * This statement will only be used if : + * - EZS_METRICS is enabled + * - ezs is running in server mode + * + * WARNING: avoid setting bucket to "input" or "output", as these labels are used by ezs. + * If you do, you risk distorting the associated metrics. + * + * @name metrics + * @see ../server/knownPipeline.js + * @param {String} [pathName=auto] to identify the script + * @param {String} [bucket=unknow] to identify the moment of measurement + * @returns {Object} + */ +export const metricsHandle = (pathNameDefault) => (data, feed, ctx) => { + const pathName = ctx.getParam('pathName', pathNameDefault); + const bucket = ctx.getParam('bucket', 'unknow'); + + if (!ctx.total) { + ctx.total = 0; } - if (!this.totalBytes) { - this.totalBytes = 0; + if (!ctx.totalBytes) { + ctx.totalBytes = 0; } - this.total += 1; - this.totalBytes += JSON.stringify(data || '').length; + ctx.total += 1; + ctx.totalBytes += JSON.stringify(data || '').length; ezsStatementChunksTotal.labels(pathName, bucket).inc(); - if (this.isLast()) { - ezsStreamStatementOpen.labels(pathName, bucket).observe(this.getCounter()); - ezsStreamChunks.labels(pathName, bucket).observe(this.total); - ezsStreamSizeBytes.labels(pathName, bucket).observe(this.totalBytes); - ezsStreamDurationMicroseconds.labels(pathName, bucket).observe(this.getCumulativeTimeMS()); + if (ctx.isLast()) { + ezsStreamStatementOpen.labels(pathName, bucket).observe(ctx.getCounter()); + ezsStreamChunks.labels(pathName, bucket).observe(ctx.total); + ezsStreamSizeBytes.labels(pathName, bucket).observe(ctx.totalBytes); + ezsStreamDurationMicroseconds.labels(pathName, bucket).observe(ctx.getCumulativeTimeMS()); return feed.close(); } return feed.send(data); -} +};