Skip to content

Commit

Permalink
Merge pull request #383 from Inist-CNRS/enable-metrics-for-all
Browse files Browse the repository at this point in the history
feat: 🎸 enable [metrics] for all
  • Loading branch information
touv authored Nov 21, 2023
2 parents f13276c + 98cb0c3 commit e07a048
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 32 deletions.
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);
}
};

0 comments on commit e07a048

Please sign in to comment.