Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 🎸 enable [metrics] for all #383

Merged
merged 1 commit into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 30 additions & 7 deletions docs/plugin-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
37 changes: 30 additions & 7 deletions packages/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions packages/core/src/server/knownPipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
48 changes: 32 additions & 16 deletions packages/core/src/server/metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
};