From ee6f295f64bc07c850c56631f99b4140565cd63e Mon Sep 17 00:00:00 2001 From: bairov Date: Sat, 22 Mar 2025 14:56:09 +0200 Subject: [PATCH 1/3] Add 'metrics' flag to specify available metrics --- README.md | 4 ++-- lib/data-generator.js | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 996c74b..b891f16 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ Store data in InfluxDB from sitespeed.io. This plugin was included in sitespeed.io before sitespeed.io 37 was released. After that version you need to install it yourself. ## Install the plugin -If you use NodeJs the simplest way is to install the plugin globally: `npm install @sitespeed.io/plugin-influxdb -g` +If you use Node.js the simplest way is to install the plugin globally: `npm install @sitespeed.io/plugin-influxdb -g` ## Run the plugin -And then run sitespeed.io adding the pluging using the package name: `sitespeed.io --plugins.add @sitespeed.io/plugin-influxdb --influxdb.host YOUR_HOST https://www.sitespeed.io` +And then run sitespeed.io adding the plugin using the package name: `sitespeed.io --plugins.add @sitespeed.io/plugin-influxdb --influxdb.host YOUR_HOST https://www.sitespeed.io` ## CLI help To see the command line options using help: diff --git a/lib/data-generator.js b/lib/data-generator.js index 80b2fe6..493fa6a 100644 --- a/lib/data-generator.js +++ b/lib/data-generator.js @@ -154,7 +154,7 @@ function getAdditionalTags(key, type) { return tags; } -function getFieldAndSeriesName(key) { +function getFieldAndSeriesName(key, options) { const functions = [ 'min', 'p10', @@ -168,9 +168,14 @@ function getFieldAndSeriesName(key) { 'stddev', 'rsd' ]; + + const availableMetrics = options.influxdb.metrics + ? options.influxdb.metrics.split(',') + : functions; + const keyArray = key.split('.'); const end = keyArray.pop(); - if (functions.includes(end)) { + if (availableMetrics.includes(end)) { return { field: end, seriesName: keyArray.pop() }; } return { field: 'value', seriesName: end }; @@ -237,7 +242,7 @@ export class InfluxDBDataGenerator { } return Object.entries(flattenMessageData(message)).reduce( (entries, [key, value]) => { - const fieldAndSeriesName = getFieldAndSeriesName(key); + const fieldAndSeriesName = getFieldAndSeriesName(key, this.options); let tags = getTagsFromMessage( message, this.includeQueryParams, From e35b26fdef6fd0d68a470afeb32e827157f0589b Mon Sep 17 00:00:00 2001 From: bairov Date: Tue, 25 Mar 2025 16:38:48 +0200 Subject: [PATCH 2/3] Rewrite flag and add a test --- lib/data-generator.js | 23 +-- test/dataGenerator.js | 359 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 373 insertions(+), 9 deletions(-) diff --git a/lib/data-generator.js b/lib/data-generator.js index 493fa6a..23f4574 100644 --- a/lib/data-generator.js +++ b/lib/data-generator.js @@ -169,16 +169,19 @@ function getFieldAndSeriesName(key, options) { 'rsd' ]; - const availableMetrics = options.influxdb.metrics - ? options.influxdb.metrics.split(',') + const availableFunctions = options.influxdb.functions + ? options.influxdb.functions.split(',') : functions; const keyArray = key.split('.'); const end = keyArray.pop(); - if (availableMetrics.includes(end)) { + if (availableFunctions.includes(end)) { return { field: end, seriesName: keyArray.pop() }; } - return { field: 'value', seriesName: end }; + if (!availableFunctions.includes(end) && !functions.includes(end)) { + return { field: 'value', seriesName: end }; + } + return {}; } export class InfluxDBDataGenerator { constructor(includeQueryParameters, options) { @@ -254,11 +257,13 @@ export class InfluxDBDataGenerator { time: time.valueOf(), [fieldAndSeriesName.field]: value }; - entries.push({ - tags, - seriesName: fieldAndSeriesName.seriesName, - point - }); + if (fieldAndSeriesName.seriesName !== undefined) { + entries.push({ + tags, + seriesName: fieldAndSeriesName.seriesName, + point + }); + } return entries; }, [] diff --git a/test/dataGenerator.js b/test/dataGenerator.js index 91ed41d..50d8a4e 100644 --- a/test/dataGenerator.js +++ b/test/dataGenerator.js @@ -357,3 +357,362 @@ test(`Test influxdb dataGenerator`, t => { t.is(seriesName, 'score'); t.is(numberOfTags, 6); }); + +test(`Test limit functions `, t => { + const message = { + uuid: '33774328-e781-4152-babe-a367cee27153', + type: 'coach.summary', + timestamp: '2017-04-04T09:55:59+02:00', + source: 'coach', + data: { + score: { + median: '96', + mean: '96', + min: '96', + p90: '96', + max: '96' + }, + accessibility: { + score: { + median: '95', + mean: '95', + min: '95', + p90: '95', + max: '95' + }, + altImages: { + median: '80', + mean: '80', + min: '80', + p90: '80', + max: '80' + }, + headings: { + median: '90', + mean: '90', + min: '90', + p90: '90', + max: '90' + }, + labelOnInput: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + landmarks: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + neverSuppressZoom: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + sections: { + median: '0', + mean: '0', + min: '0', + p90: '0', + max: '0' + }, + table: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + } + }, + bestpractice: { + score: { + median: '85', + mean: '85', + min: '85', + p90: '85', + max: '85' + }, + charset: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + doctype: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + https: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + httpsH2: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + language: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + metaDescription: { + median: '50', + mean: '50', + min: '50', + p90: '50', + max: '50' + }, + optimizely: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + pageTitle: { + median: '50', + mean: '50', + min: '50', + p90: '50', + max: '50' + }, + spdy: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + url: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + } + }, + performance: { + score: { + median: '98', + mean: '98', + min: '98', + p90: '98', + max: '98' + }, + avoidScalingImages: { + median: '50', + mean: '50', + min: '50', + p90: '50', + max: '50' + }, + cssPrint: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + fastRender: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + inlineCss: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + jquery: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + spof: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + thirdPartyAsyncJs: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + assetsRedirects: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + cacheHeaders: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + cacheHeadersLong: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + compressAssets: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + connectionKeepAlive: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + cssSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + documentRedirect: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + favicon: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + fewFonts: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + fewRequestsPerDomain: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + headerSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + imageSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + javascriptSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + mimeTypes: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + optimalCssSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + pageSize: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + privateAssets: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + }, + responseOk: { + median: '100', + mean: '100', + min: '100', + p90: '100', + max: '100' + } + } + }, + group: 'www.sitespeed.io' + }; + + let generator = new DataGenerator(false, { + _: ['filename'], + browser: 'chrome', + connectivity: 'cable', + influxdb: { + tags: 'tool=sitespeed.io', + functions: 'min,mean' + } + }); + + const data = generator.dataFromMessage(message, dayjs()); + const allowedKeys = new Set(['mean', 'min', 'time']); + for (const item of data) { + const pointKeys = Object.keys(item.point); + for (const key of pointKeys) { + t.true(allowedKeys.has(key), `Unexpected key: [${key}] in point`); + } + } +}); From ca772a72f7bd554be2287bd43b52b31a903f6a75 Mon Sep 17 00:00:00 2001 From: bairov Date: Thu, 27 Mar 2025 18:51:33 +0200 Subject: [PATCH 3/3] Workflows: add a flag 'influxdb.functions' --- .github/workflows/linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index c5238c1..98c8f3f 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -45,4 +45,4 @@ jobs: - name: Run test with Influx 1.8 run: cd sitespeed.io && bin/sitespeed.js https://www.sitespeed.io -n 1 --influxdb.host 127.0.0.1 --xvfb --resultBaseUrl https://result.sitespeed.io --influxdb.annotationScreenshot=true --plugins.add ../../../lib/index.js - name: Run test with Influx 2.6.1 - run: cd sitespeed.io && bin/sitespeed.js https://www.sitespeed.io -n 1 --influxdb.host 127.0.0.1 --influxdb.port 8087 --influxdb.version 2 --influxdb.organisation sitespeed --influxdb.token sitespeed --xvfb --resultBaseUrl https://result.sitespeed.io --influxdb.annotationScreenshot=true --plugins.add ../../../lib/index.js \ No newline at end of file + run: cd sitespeed.io && bin/sitespeed.js https://www.sitespeed.io -n 1 --influxdb.host 127.0.0.1 --influxdb.port 8087 --influxdb.version 2 --influxdb.organisation sitespeed --influxdb.token sitespeed --xvfb --resultBaseUrl https://result.sitespeed.io --influxdb.annotationScreenshot=true --influxdb.functions='min,max' --plugins.add ../../../lib/index.js \ No newline at end of file