From 66de9c09de5a4cdf167846b90b8c627c734c4660 Mon Sep 17 00:00:00 2001 From: Arthur Pastel Date: Mon, 31 Jul 2023 20:00:12 +0200 Subject: [PATCH 01/17] feat: integrate CodSpeed Mongo Tracer --- .prettierignore | 1 + packages/benchmark.js-plugin/src/index.ts | 5 + packages/core/.gitignore | 3 +- packages/core/moon.yml | 8 + packages/core/package.json | 2 + packages/core/src/index.ts | 4 + packages/core/src/mongoMeasurement.ts | 42 +++ packages/core/tracer.spec.json | 260 ++++++++++++++++++ packages/tinybench-plugin/src/index.ts | 5 + .../tests/index.integ.test.ts | 15 + pnpm-lock.yaml | 73 ++++- 11 files changed, 404 insertions(+), 14 deletions(-) create mode 100644 packages/core/src/mongoMeasurement.ts create mode 100644 packages/core/tracer.spec.json diff --git a/.prettierignore b/.prettierignore index 05dd937e..98463e2d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ node_modules .rollup.cache dist +generated diff --git a/packages/benchmark.js-plugin/src/index.ts b/packages/benchmark.js-plugin/src/index.ts index 7c413b06..d241abbe 100644 --- a/packages/benchmark.js-plugin/src/index.ts +++ b/packages/benchmark.js-plugin/src/index.ts @@ -1,5 +1,6 @@ import { Measurement, + mongoMeasurement, optimizeFunction, optimizeFunctionSync, setupCore, @@ -192,18 +193,22 @@ async function runBenchmarks({ if (isAsync) { await optimizeFunction(benchPayload); + await mongoMeasurement.start(uri); await (async function __codspeed_root_frame__() { Measurement.startInstrumentation(); await benchPayload(); Measurement.stopInstrumentation(uri); })(); + await mongoMeasurement.stop(uri); } else { optimizeFunctionSync(benchPayload); + await mongoMeasurement.start(uri); (function __codspeed_root_frame__() { Measurement.startInstrumentation(); benchPayload(); Measurement.stopInstrumentation(uri); })(); + await mongoMeasurement.stop(uri); } if (typeof bench.options.teardown === "function") { diff --git a/packages/core/.gitignore b/packages/core/.gitignore index 577caf8f..a39a3e02 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -1,2 +1,3 @@ build -prebuilds \ No newline at end of file +prebuilds +generated \ No newline at end of file diff --git a/packages/core/moon.yml b/packages/core/moon.yml index 17bb0f81..51d81f92 100644 --- a/packages/core/moon.yml +++ b/packages/core/moon.yml @@ -2,6 +2,7 @@ tasks: clean: args: - build + - generated/openapi build: deps: - "build-native-addon" @@ -14,3 +15,10 @@ tasks: - "binding.gyp" outputs: - "prebuilds" + + build-tracer-client: + inputs: + - "./tracer.spec.json" + outputs: + - "src/generated/openapi" + command: openapi --client axios --input ./tracer.spec.json --name MongoTracer --output ./src/generated/openapi diff --git a/packages/core/package.json b/packages/core/package.json index 67179845..6b17d1c5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,9 +23,11 @@ "@types/find-up": "^4.0.0", "node-addon-api": "^5.1.0", "node-gyp": "^9.3.1", + "openapi-typescript-codegen": "^0.23.0", "prebuildify": "^5.0.1" }, "dependencies": { + "axios": "^1.4.0", "find-up": "^6.3.0", "node-gyp-build": "^4.6.0" } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 72c75b2e..2476e097 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,5 @@ import { checkV8Flags } from "./introspection"; +import { MongoMeasurement } from "./mongoMeasurement"; import native_core from "./native_core"; import { initOptimization } from "./optimization"; @@ -8,6 +9,8 @@ const linuxPerf = new native_core.LinuxPerf(); export const isBound = native_core.isBound; +export let mongoMeasurement: MongoMeasurement; + export const setupCore = () => { initOptimization(); native_core.Measurement.stopInstrumentation( @@ -15,6 +18,7 @@ export const setupCore = () => { ); linuxPerf.start(); checkV8Flags(); + mongoMeasurement = new MongoMeasurement(); }; export const teardownCore = () => { diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts new file mode 100644 index 00000000..74973d71 --- /dev/null +++ b/packages/core/src/mongoMeasurement.ts @@ -0,0 +1,42 @@ +import { MongoTracer } from "./generated/openapi"; + +export class MongoMeasurement { + private tracerClient: MongoTracer | undefined; + + constructor() { + const serverUrl = process.env.CODSPEED_MONGO_INSTR_SERVER_ADDRESS; + // TODO + const mongoUriEnvName = process.env.CODSPEED_MONGO_INSTR_URI_ENV_NAME; + if (mongoUriEnvName === undefined) { + throw new Error("CODSPEED_MONGO_INSTR_URI_ENV_NAME is not defined"); + } + const mongoUri = process.env[mongoUriEnvName]; + if (mongoUri === undefined) { + throw new Error(`Environment variable ${mongoUriEnvName} is not defined`); + } + process.env[mongoUriEnvName] = + "mongodb://localhost:27018?directConnection=true"; + + if (serverUrl !== undefined) { + this.tracerClient = new MongoTracer({ + BASE: serverUrl, + }); + } + } + + public async start(uri: string) { + if (this.tracerClient !== undefined) { + await this.tracerClient.instrumentation.start({ + uri, + }); + } + } + + public async stop(uri: string) { + if (this.tracerClient !== undefined) { + await this.tracerClient.instrumentation.stop({ + uri, + }); + } + } +} diff --git a/packages/core/tracer.spec.json b/packages/core/tracer.spec.json new file mode 100644 index 00000000..5b0a931b --- /dev/null +++ b/packages/core/tracer.spec.json @@ -0,0 +1,260 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "CodSpeed MongoDB Tracer", + "description": "Instrumentation API for CodSpeed Tracer", + "version": "0.1.0" + }, + "paths": { + "/benchmark/start": { + "post": { + "tags": ["instrumentation"], + "operationId": "start", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstrumentationRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstrumentationStatus" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/benchmark/stop": { + "post": { + "tags": ["instrumentation"], + "operationId": "stop", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstrumentationRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstrumentationStatus" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/status": { + "get": { + "tags": ["instrumentation"], + "operationId": "status", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstrumentationStatus" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/terminate": { + "post": { + "tags": ["instrumentation"], + "operationId": "terminate", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregatorStore" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + } + }, + "components": { + "responses": { + "Error": { + "description": "Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "schemas": { + "AggregatorMetadata": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": ["name", "version"] + }, + "AggregatorStore": { + "type": "object", + "properties": { + "metadata": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/AggregatorMetadata" + } + ] + }, + "queries": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MongoQuery" + } + } + } + }, + "required": ["queries"] + }, + "Document": { + "type": "object" + }, + "Error": { + "description": "Error information from a response.", + "type": "object", + "properties": { + "error_code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "request_id": { + "type": "string" + } + }, + "required": ["message", "request_id"] + }, + "InstrumentationRequestBody": { + "type": "object", + "properties": { + "uri": { + "type": "string" + } + }, + "required": ["uri"] + }, + "InstrumentationStatus": { + "type": "object", + "properties": { + "currentUri": { + "nullable": true, + "type": "string" + } + } + }, + "MongoQuery": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "database": { + "type": "string" + }, + "explanation": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/Document" + } + ] + }, + "op": { + "type": "string" + }, + "query_documents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Document" + } + }, + "response_documents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Document" + } + } + }, + "required": [ + "collection", + "database", + "op", + "query_documents", + "response_documents" + ] + } + } + }, + "tags": [ + { + "name": "instrumentation" + } + ] +} diff --git a/packages/tinybench-plugin/src/index.ts b/packages/tinybench-plugin/src/index.ts index 65fb6fe9..adc308d9 100644 --- a/packages/tinybench-plugin/src/index.ts +++ b/packages/tinybench-plugin/src/index.ts @@ -1,6 +1,7 @@ import { getGitDir, Measurement, + mongoMeasurement, optimizeFunction, setupCore, teardownCore, @@ -65,11 +66,15 @@ export function withCodSpeed(bench: Bench): Bench { // run instrumented benchmark await task.opts.beforeEach?.call(task); + + await mongoMeasurement.start(uri); await (async function __codspeed_root_frame__() { Measurement.startInstrumentation(); await task.fn(); Measurement.stopInstrumentation(uri); })(); + await mongoMeasurement.stop(uri); + await task.opts.afterEach?.call(task); await task.opts.afterAll?.call(task); diff --git a/packages/tinybench-plugin/tests/index.integ.test.ts b/packages/tinybench-plugin/tests/index.integ.test.ts index 2fbbabcf..c704e9aa 100644 --- a/packages/tinybench-plugin/tests/index.integ.test.ts +++ b/packages/tinybench-plugin/tests/index.integ.test.ts @@ -29,6 +29,8 @@ describe("Benchmark.Suite", () => { await bench.run(); expect(onComplete).toHaveBeenCalled(); + expect(mockCore.mongoMeasurement.start).not.toHaveBeenCalled(); + expect(mockCore.mongoMeasurement.stop).not.toHaveBeenCalled(); expect(mockCore.Measurement.startInstrumentation).not.toHaveBeenCalled(); expect(mockCore.Measurement.stopInstrumentation).not.toHaveBeenCalled(); }); @@ -39,6 +41,11 @@ describe("Benchmark.Suite", () => { /o/.test("Hello World!"); }) .run(); + + expect(mockCore.mongoMeasurement.start).toHaveBeenCalledWith( + "packages/tinybench-plugin/tests/index.integ.test.ts::RegExp" + ); + expect(mockCore.mongoMeasurement.stop).toHaveBeenCalledTimes(1); expect(mockCore.Measurement.startInstrumentation).toHaveBeenCalled(); expect(mockCore.Measurement.stopInstrumentation).toHaveBeenCalledWith( "packages/tinybench-plugin/tests/index.integ.test.ts::RegExp" @@ -54,6 +61,14 @@ describe("Benchmark.Suite", () => { /o/.test("Hello World!"); }) .run(); + + expect(mockCore.mongoMeasurement.start).toHaveBeenCalledWith( + "packages/tinybench-plugin/tests/index.integ.test.ts::RegExp" + ); + expect(mockCore.mongoMeasurement.start).toHaveBeenCalledWith( + "packages/tinybench-plugin/tests/index.integ.test.ts::RegExp2" + ); + expect(mockCore.mongoMeasurement.stop).toHaveBeenCalledTimes(2); expect(mockCore.Measurement.stopInstrumentation).toHaveBeenCalledWith( "packages/tinybench-plugin/tests/index.integ.test.ts::RegExp" ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07b7b57f..b66da1b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,6 +258,9 @@ importers: packages/core: dependencies: + axios: + specifier: ^1.4.0 + version: 1.4.0 find-up: specifier: ^6.3.0 version: 6.3.0 @@ -274,6 +277,9 @@ importers: node-gyp: specifier: ^9.3.1 version: 9.3.1 + openapi-typescript-codegen: + specifier: ^0.23.0 + version: 0.23.0 prebuildify: specifier: ^5.0.1 version: 5.0.1 @@ -326,6 +332,15 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true + /@apidevtools/json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==} + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.11 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + dev: true + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: @@ -2583,6 +2598,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true + /@lerna/child-process@6.6.1: resolution: {integrity: sha512-yUCDCcRNNbI9UUsUB6FYEmDHpo5Tn/f0q5D7vhDP4i6Or8kBj82y7+e31hwfLvK2ykOYlDVs2MxAluH/+QUBOQ==} engines: {node: ^14.15.0 || >=16.0.0} @@ -4113,7 +4132,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -4125,15 +4143,14 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.3.5: - resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==} + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true /babel-jest@29.5.0(@babel/core@7.21.4): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} @@ -4421,6 +4438,10 @@ packages: get-intrinsic: 1.2.0 dev: true + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -4642,6 +4663,10 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} dev: true /common-ancestor-path@1.0.1: @@ -4965,7 +4990,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -5731,7 +5755,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -5746,12 +5769,20 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -5766,7 +5797,7 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -7175,6 +7206,14 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /json-schema-ref-parser@9.0.9: + resolution: {integrity: sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==} + engines: {node: '>=10'} + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.9 + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -7396,7 +7435,7 @@ packages: resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} engines: {node: '>=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 5.2.0 strip-bom: 4.0.0 type-fest: 0.6.0 @@ -7662,14 +7701,12 @@ packages: /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -8219,7 +8256,7 @@ packages: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.42 '@zkochan/js-yaml': 0.0.6 - axios: 1.3.5 + axios: 1.4.0 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -8319,6 +8356,17 @@ packages: is-wsl: 2.2.0 dev: true + /openapi-typescript-codegen@0.23.0: + resolution: {integrity: sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==} + hasBin: true + dependencies: + camelcase: 6.3.0 + commander: 9.5.0 + fs-extra: 10.1.0 + handlebars: 4.7.7 + json-schema-ref-parser: 9.0.9 + dev: true + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -8848,7 +8896,6 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} From 008b810cea57fd3354906547ada4f4a780287117 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Tue, 1 Aug 2023 10:36:06 +0200 Subject: [PATCH 02/17] chore(core): add missing dependency --- packages/core/package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/packages/core/package.json b/packages/core/package.json index 6b17d1c5..55a23ecc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -29,6 +29,7 @@ "dependencies": { "axios": "^1.4.0", "find-up": "^6.3.0", + "form-data": "^4.0.0", "node-gyp-build": "^4.6.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b66da1b8..90f8c11c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -264,6 +264,9 @@ importers: find-up: specifier: ^6.3.0 version: 6.3.0 + form-data: + specifier: ^4.0.0 + version: 4.0.0 node-gyp-build: specifier: ^4.6.0 version: 4.6.0 From fb7909ded629653d29f42efb589a13ee00ae8687 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Tue, 1 Aug 2023 10:36:29 +0200 Subject: [PATCH 03/17] feat(core): add mongo instrumentation terminate --- packages/core/src/index.ts | 6 ++++++ packages/core/src/mongoMeasurement.ts | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 2476e097..1d4ddbc9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -23,6 +23,12 @@ export const setupCore = () => { export const teardownCore = () => { linuxPerf.stop(); + const aggregate = mongoMeasurement.terminate(); + if (aggregate !== undefined) { + console.log(`[CodSpeed] Mongo Aggregate: ${aggregate}`); + return; + } + console.log(`[CodSpeed] Mongo Aggregate: no aggregate`); }; export { getV8Flags, tryIntrospect } from "./introspection"; diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index 74973d71..f337453d 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -39,4 +39,10 @@ export class MongoMeasurement { }); } } + + public async terminate() { + if (this.tracerClient !== undefined) { + return await this.tracerClient.instrumentation.terminate(); + } + } } From 2e1c827aa5d3d101edfe8ca00454c0596ad259bc Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Tue, 1 Aug 2023 10:46:54 +0200 Subject: [PATCH 04/17] chore(core): add build-tracer-client as deps of lint and typecheck --- packages/core/moon.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/core/moon.yml b/packages/core/moon.yml index 51d81f92..cca3c7ab 100644 --- a/packages/core/moon.yml +++ b/packages/core/moon.yml @@ -22,3 +22,11 @@ tasks: outputs: - "src/generated/openapi" command: openapi --client axios --input ./tracer.spec.json --name MongoTracer --output ./src/generated/openapi + + typecheck: + deps: + - build-tracer-client + + lint: + deps: + - build-tracer-client From 84f9b52ea6a82e1775fabe89e3baa47bad607762 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Tue, 1 Aug 2023 16:15:20 +0200 Subject: [PATCH 05/17] chore: fix teardownCore with aggregate --- packages/core/src/index.ts | 6 +++--- packages/tinybench-plugin/src/index.ts | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1d4ddbc9..9727c612 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -21,12 +21,12 @@ export const setupCore = () => { mongoMeasurement = new MongoMeasurement(); }; -export const teardownCore = () => { +export const teardownCore = async () => { linuxPerf.stop(); - const aggregate = mongoMeasurement.terminate(); + const aggregate = await mongoMeasurement.terminate(); if (aggregate !== undefined) { console.log(`[CodSpeed] Mongo Aggregate: ${aggregate}`); - return; + return aggregate; } console.log(`[CodSpeed] Mongo Aggregate: no aggregate`); }; diff --git a/packages/tinybench-plugin/src/index.ts b/packages/tinybench-plugin/src/index.ts index adc308d9..3f749ff8 100644 --- a/packages/tinybench-plugin/src/index.ts +++ b/packages/tinybench-plugin/src/index.ts @@ -82,7 +82,10 @@ export function withCodSpeed(bench: Bench): Bench { // print results console.log(` ✔ Measured ${uri}`); } - teardownCore(); + const aggregate = await teardownCore(); + console.log( + `[CodSpeed] Mongo Aggregate: ${JSON.stringify(aggregate, null, 2)}` + ); console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`); return bench.tasks; }; From a31ae7d4a0cf5fa249762b7f7ff6d48df0903e75 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Mon, 4 Dec 2023 17:14:49 +0100 Subject: [PATCH 06/17] feat(vitest-runner): add mongo-measurement integration --- packages/core/moon.yml | 3 ++- .../vitest-plugin/src/__tests__/runner.test.ts | 16 ++++++++++++++++ packages/vitest-plugin/src/runner.ts | 8 +++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/core/moon.yml b/packages/core/moon.yml index cca3c7ab..c72d7bf4 100644 --- a/packages/core/moon.yml +++ b/packages/core/moon.yml @@ -5,7 +5,8 @@ tasks: - generated/openapi build: deps: - - "build-native-addon" + - build-native-addon + - build-tracer-client build-native-addon: command: prebuildify --napi --strip diff --git a/packages/vitest-plugin/src/__tests__/runner.test.ts b/packages/vitest-plugin/src/__tests__/runner.test.ts index 9b92534b..6391e968 100644 --- a/packages/vitest-plugin/src/__tests__/runner.test.ts +++ b/packages/vitest-plugin/src/__tests__/runner.test.ts @@ -11,6 +11,10 @@ const coreMocks = vi.hoisted(() => { }, setupCore: vi.fn(), teardownCore: vi.fn(), + mongoMeasurement: { + start: vi.fn(), + stop: vi.fn(), + }, }; }); @@ -44,7 +48,13 @@ describe("CodSpeedRunner", () => { ); // run + expect(coreMocks.mongoMeasurement.start).toHaveBeenCalledWith( + "packages/vitest-plugin/src/__tests__/runner.test.ts::test bench" + ); + expect(coreMocks.Measurement.startInstrumentation).toHaveBeenCalledTimes(1); expect(benchFn).toHaveBeenCalledTimes(2); + expect(coreMocks.Measurement.stopInstrumentation).toHaveBeenCalledTimes(1); + expect(coreMocks.mongoMeasurement.stop).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( "[CodSpeed] packages/vitest-plugin/src/__tests__/runner.test.ts::test bench done" ); @@ -89,7 +99,13 @@ describe("CodSpeedRunner", () => { ); // run + expect(coreMocks.mongoMeasurement.start).toHaveBeenCalledWith( + "packages/vitest-plugin/src/__tests__/runner.test.ts::nested suite::test bench" + ); + expect(coreMocks.Measurement.startInstrumentation).toHaveBeenCalledTimes(1); expect(benchFn).toHaveBeenCalledTimes(2); + expect(coreMocks.Measurement.stopInstrumentation).toHaveBeenCalledTimes(1); + expect(coreMocks.mongoMeasurement.stop).toHaveBeenCalledTimes(1); expect(console.log).toHaveBeenCalledWith( "[CodSpeed] packages/vitest-plugin/src/__tests__/runner.test.ts::nested suite::test bench done" ); diff --git a/packages/vitest-plugin/src/runner.ts b/packages/vitest-plugin/src/runner.ts index 3890d76c..bd56aa41 100644 --- a/packages/vitest-plugin/src/runner.ts +++ b/packages/vitest-plugin/src/runner.ts @@ -2,6 +2,7 @@ import { getGitDir, logDebug, Measurement, + mongoMeasurement, optimizeFunction, setupCore, teardownCore, @@ -48,12 +49,14 @@ async function runBenchmarkSuite(suite: Suite, parentSuiteName?: string) { const fn = getBenchFn(benchmark); await optimizeFunction(fn); + await mongoMeasurement.start(uri); await (async function __codspeed_root_frame__() { Measurement.startInstrumentation(); // @ts-expect-error we do not need to bind the function to an instance of tinybench's Bench await fn(); Measurement.stopInstrumentation(uri); })(); + await mongoMeasurement.stop(uri); logCodSpeed(`${uri} done`); } @@ -82,7 +85,10 @@ class CodSpeedRunner extends NodeBenchmarkRunner { await runBenchmarkSuite(suite); logCodSpeed(`running suite ${suite.name} done`); - teardownCore(); + const mongoAggregate = await teardownCore(); + logCodSpeed( + `[CodSpeed] Mongo Aggregate: ${JSON.stringify(mongoAggregate, null, 2)}` + ); } } From 88b960a7289b3f905e503dddffc732293ee41ab7 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Mon, 4 Dec 2023 19:18:40 +0100 Subject: [PATCH 07/17] fix(core): handle mongo terminate fail --- packages/core/src/mongoMeasurement.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index f337453d..9ea50bbe 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -1,4 +1,4 @@ -import { MongoTracer } from "./generated/openapi"; +import { ApiError, MongoTracer } from "./generated/openapi"; export class MongoMeasurement { private tracerClient: MongoTracer | undefined; @@ -42,7 +42,15 @@ export class MongoMeasurement { public async terminate() { if (this.tracerClient !== undefined) { - return await this.tracerClient.instrumentation.terminate(); + try { + return await this.tracerClient.instrumentation.terminate(); + } catch (e) { + // TODO handle terminate killing the server instead of returning a response first + if (e instanceof ApiError) { + console.error("Terminate failed with error"); + console.log(e.body); + } + } } } } From 525bd32bfa814d6348194b25c37312cd96579d4e Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Thu, 7 Dec 2023 16:08:58 +0100 Subject: [PATCH 08/17] feat: remove mongo instrumentation terminate as it is done in the runner --- packages/core/src/index.ts | 8 +------- packages/core/src/mongoMeasurement.ts | 16 +--------------- packages/tinybench-plugin/src/index.ts | 5 +---- packages/vitest-plugin/src/runner.ts | 5 +---- 4 files changed, 4 insertions(+), 30 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9727c612..2476e097 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -21,14 +21,8 @@ export const setupCore = () => { mongoMeasurement = new MongoMeasurement(); }; -export const teardownCore = async () => { +export const teardownCore = () => { linuxPerf.stop(); - const aggregate = await mongoMeasurement.terminate(); - if (aggregate !== undefined) { - console.log(`[CodSpeed] Mongo Aggregate: ${aggregate}`); - return aggregate; - } - console.log(`[CodSpeed] Mongo Aggregate: no aggregate`); }; export { getV8Flags, tryIntrospect } from "./introspection"; diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index 9ea50bbe..74973d71 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -1,4 +1,4 @@ -import { ApiError, MongoTracer } from "./generated/openapi"; +import { MongoTracer } from "./generated/openapi"; export class MongoMeasurement { private tracerClient: MongoTracer | undefined; @@ -39,18 +39,4 @@ export class MongoMeasurement { }); } } - - public async terminate() { - if (this.tracerClient !== undefined) { - try { - return await this.tracerClient.instrumentation.terminate(); - } catch (e) { - // TODO handle terminate killing the server instead of returning a response first - if (e instanceof ApiError) { - console.error("Terminate failed with error"); - console.log(e.body); - } - } - } - } } diff --git a/packages/tinybench-plugin/src/index.ts b/packages/tinybench-plugin/src/index.ts index 3f749ff8..adc308d9 100644 --- a/packages/tinybench-plugin/src/index.ts +++ b/packages/tinybench-plugin/src/index.ts @@ -82,10 +82,7 @@ export function withCodSpeed(bench: Bench): Bench { // print results console.log(` ✔ Measured ${uri}`); } - const aggregate = await teardownCore(); - console.log( - `[CodSpeed] Mongo Aggregate: ${JSON.stringify(aggregate, null, 2)}` - ); + teardownCore(); console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`); return bench.tasks; }; diff --git a/packages/vitest-plugin/src/runner.ts b/packages/vitest-plugin/src/runner.ts index bd56aa41..38b80088 100644 --- a/packages/vitest-plugin/src/runner.ts +++ b/packages/vitest-plugin/src/runner.ts @@ -85,10 +85,7 @@ class CodSpeedRunner extends NodeBenchmarkRunner { await runBenchmarkSuite(suite); logCodSpeed(`running suite ${suite.name} done`); - const mongoAggregate = await teardownCore(); - logCodSpeed( - `[CodSpeed] Mongo Aggregate: ${JSON.stringify(mongoAggregate, null, 2)}` - ); + teardownCore(); } } From 4319e3541ad1d37a2826b34f4404e19595baf7ac Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Thu, 7 Dec 2023 17:15:51 +0100 Subject: [PATCH 09/17] feat(core): remove handling of mongo env var --- packages/core/src/mongoMeasurement.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index 74973d71..c800bda1 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -5,17 +5,6 @@ export class MongoMeasurement { constructor() { const serverUrl = process.env.CODSPEED_MONGO_INSTR_SERVER_ADDRESS; - // TODO - const mongoUriEnvName = process.env.CODSPEED_MONGO_INSTR_URI_ENV_NAME; - if (mongoUriEnvName === undefined) { - throw new Error("CODSPEED_MONGO_INSTR_URI_ENV_NAME is not defined"); - } - const mongoUri = process.env[mongoUriEnvName]; - if (mongoUri === undefined) { - throw new Error(`Environment variable ${mongoUriEnvName} is not defined`); - } - process.env[mongoUriEnvName] = - "mongodb://localhost:27018?directConnection=true"; if (serverUrl !== undefined) { this.tracerClient = new MongoTracer({ From 5d4ecd7d6d9caed44402a3739dbe799585cd03d7 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Fri, 12 Jan 2024 14:03:50 +0100 Subject: [PATCH 10/17] chore: bump moon --- .moon/toolchain.yml | 1 - package.json | 2 +- pnpm-lock.yaml | 50 ++++++++++++++++++++++----------------------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/.moon/toolchain.yml b/.moon/toolchain.yml index 7e64e698..6e8a77c8 100644 --- a/.moon/toolchain.yml +++ b/.moon/toolchain.yml @@ -6,7 +6,6 @@ node: pnpm: version: "8.6.3" - aliasPackageNames: "name-only" dedupeOnLockfileChange: false dependencyVersionFormat: "workspace" inferTasksFromScripts: true diff --git a/package.json b/package.json index 57511be4..2b1bd535 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "devDependencies": { "@commitlint/cli": "^17.5.1", "@commitlint/config-conventional": "^17.4.4", - "@moonrepo/cli": "^1.15.4", + "@moonrepo/cli": "^1.19.3", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.0.1", "@rollup/plugin-node-resolve": "^15.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90f8c11c..487a30f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^17.4.4 version: 17.4.4 '@moonrepo/cli': - specifier: ^1.15.4 - version: 1.15.4 + specifier: ^1.19.3 + version: 1.19.3 '@rollup/plugin-commonjs': specifier: ^25.0.7 version: 25.0.7(rollup@4.4.1) @@ -2709,72 +2709,72 @@ packages: - supports-color dev: true - /@moonrepo/cli@1.15.4: - resolution: {integrity: sha512-VbI39HnK++HTsDzCd7/Rc71wc/+BNvAdeewtOA3dKl5yS2haxbc5VH7XtPFkX8Cdqodvc7LkEtD1Is4NkS/DpQ==} + /@moonrepo/cli@1.19.3: + resolution: {integrity: sha512-K/i80oiE68c6zYVBDS8bLSMdrf7VvG1vn/sLNc/VUJIQ/cnl4xPa8MYQzgaOR4BGD/K8jfFklOY7BQXM4/G63g==} hasBin: true requiresBuild: true dependencies: detect-libc: 2.0.2 optionalDependencies: - '@moonrepo/core-linux-arm64-gnu': 1.15.4 - '@moonrepo/core-linux-arm64-musl': 1.15.4 - '@moonrepo/core-linux-x64-gnu': 1.15.4 - '@moonrepo/core-linux-x64-musl': 1.15.4 - '@moonrepo/core-macos-arm64': 1.15.4 - '@moonrepo/core-macos-x64': 1.15.4 - '@moonrepo/core-windows-x64-msvc': 1.15.4 + '@moonrepo/core-linux-arm64-gnu': 1.19.3 + '@moonrepo/core-linux-arm64-musl': 1.19.3 + '@moonrepo/core-linux-x64-gnu': 1.19.3 + '@moonrepo/core-linux-x64-musl': 1.19.3 + '@moonrepo/core-macos-arm64': 1.19.3 + '@moonrepo/core-macos-x64': 1.19.3 + '@moonrepo/core-windows-x64-msvc': 1.19.3 dev: true - /@moonrepo/core-linux-arm64-gnu@1.15.4: - resolution: {integrity: sha512-+0djE35qWnicZ3ANgzdM6jLIKGu/mE+zYmtXIpYV1lgcWcUqX/ssTVQ9l0VHHUC1e4qSAhZUe9GAjMTZ6FYq5w==} + /@moonrepo/core-linux-arm64-gnu@1.19.3: + resolution: {integrity: sha512-Gip7AtFQnlqL6uEvfKGEKiHfWwI7u3T6tXbfXc1vE1DdjHED15slO1yKZfj4qwFmVXwsF6zkDk7CMWLSgR6t9g==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@moonrepo/core-linux-arm64-musl@1.15.4: - resolution: {integrity: sha512-AYU/8AFaou4ugtkBD5hMnjukP1MB6cR+J8TDGor01Cx6+nCC8bOCkPlUmc9EjeBJmG3mQwJCCbsybu745mNpfw==} + /@moonrepo/core-linux-arm64-musl@1.19.3: + resolution: {integrity: sha512-GdUxhdwzwv71t/agEvjPuGcAdmElxs26GlxK8PwT1yAvqT1cGmfE+fRMH7tlH3bYpWMEs0Ezv6QY1VtgFkLoxQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@moonrepo/core-linux-x64-gnu@1.15.4: - resolution: {integrity: sha512-7az1ePM4OsCGp4XR8axAwLJU5C0ujExL8OoQxaF2nJMbkDuLFUP77gPdvX8AzNi1W0kMTNIzgOY9dlbkJ2Yakw==} + /@moonrepo/core-linux-x64-gnu@1.19.3: + resolution: {integrity: sha512-YmL7hpVbq7rjRqY42PDnTbAnbZe0gLJo/ClaCiNwPdpEDCqqHSahBLigyoAbF5RnZ/J8zjN4TOdE5dtrFjF/jg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@moonrepo/core-linux-x64-musl@1.15.4: - resolution: {integrity: sha512-xXd/LKlbo7+I0MaD4zaXnH+0UO0/EYrDB+llpAQeUinrl7NAxMTeogothiKZBD1pYOnfMmESyerhxLHVlM4t1w==} + /@moonrepo/core-linux-x64-musl@1.19.3: + resolution: {integrity: sha512-FptrjWciMA32UhpAtzEQEwcz722mZzjMTb4QDFvCa33QUix2661RX6f8VKlCknNhXikqAEN4sR0LA9jBZKr3oA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@moonrepo/core-macos-arm64@1.15.4: - resolution: {integrity: sha512-MCqKcf3u7NiJY2RmP9Zua+5fjLiblPgXX9yE7lBNyRyt62C93x9lCWYeoFPeuPHkPU8MxhusftkKkJIi8T66fQ==} + /@moonrepo/core-macos-arm64@1.19.3: + resolution: {integrity: sha512-lgKh6v5NQqtPdQ8vpC5BKfs1pmFHjAUnM0CaX3XyV1Wbvqq2EmgpmcczjXcegTV5XI7w8wx4WthqIuF7UJ05gQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@moonrepo/core-macos-x64@1.15.4: - resolution: {integrity: sha512-IoFxPJeIOs9ox8BS4UR8TC61ZITJfoqZy/yCR16iQK2GXASnNAoHxk2UaTaLGCNJQu75XPO7Ie/XYg4Vv1P6BQ==} + /@moonrepo/core-macos-x64@1.19.3: + resolution: {integrity: sha512-AFKHoO+daa+TZhXypmTB7bAxD4E31FQD5aUyDepvoD0ArWXwkBSO6EbVxlqfgym3WKX8WgBTmp9anvRWytpcDw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@moonrepo/core-windows-x64-msvc@1.15.4: - resolution: {integrity: sha512-EfIllI+iG0ZivIg++hu/Qvjj+kUsgHiGiP27KmRi5FZbCE6CALSLt2Q+1C/BgH/+xzE0Y5pL/IWcSXeEqEFr+g==} + /@moonrepo/core-windows-x64-msvc@1.19.3: + resolution: {integrity: sha512-O7FYQ+XDq+Nts2jF9GINJa/jflzAnUjRCygdzQqIB15S6YG8PasXUCMofUQqhHxQjETIddzSra9lblgzfgxAuw==} cpu: [x64] os: [win32] requiresBuild: true From e0fa17e802e7c4426782857070c99896bd5601f3 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Fri, 12 Jan 2024 14:04:29 +0100 Subject: [PATCH 11/17] feat(core): add mongo start instruments --- packages/core/src/index.ts | 4 ++ packages/core/src/mongoMeasurement.ts | 17 +++++++- packages/core/tracer.spec.json | 59 ++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 2476e097..3025b8c3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -25,6 +25,10 @@ export const teardownCore = () => { linuxPerf.stop(); }; +export type { + StartInstrumentsRequestBody, + StartInstrumentsResponse, +} from "./generated/openapi"; export { getV8Flags, tryIntrospect } from "./introspection"; export { optimizeFunction, optimizeFunctionSync } from "./optimization"; export * from "./utils"; diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index c800bda1..4307b6e0 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -1,4 +1,10 @@ -import { MongoTracer } from "./generated/openapi"; +import { + MongoTracer, + StartInstrumentsRequestBody, + StartInstrumentsResponse, +} from "./generated/openapi"; + +export type { StartInstrumentsRequestBody }; export class MongoMeasurement { private tracerClient: MongoTracer | undefined; @@ -13,6 +19,15 @@ export class MongoMeasurement { } } + public async startInstruments( + body: StartInstrumentsRequestBody + ): Promise { + if (this.tracerClient === undefined) { + throw new Error("MongoDB Instrumentation is not enabled"); + } + return await this.tracerClient.instruments.start(body); + } + public async start(uri: string) { if (this.tracerClient !== undefined) { await this.tracerClient.instrumentation.start({ diff --git a/packages/core/tracer.spec.json b/packages/core/tracer.spec.json index 5b0a931b..5b582a73 100644 --- a/packages/core/tracer.spec.json +++ b/packages/core/tracer.spec.json @@ -3,7 +3,7 @@ "info": { "title": "CodSpeed MongoDB Tracer", "description": "Instrumentation API for CodSpeed Tracer", - "version": "0.1.0" + "version": "0.1.1-beta.4" }, "paths": { "/benchmark/start": { @@ -74,6 +74,40 @@ } } }, + "/instruments/start": { + "post": { + "tags": ["instruments"], + "operationId": "start", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StartInstrumentsRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StartInstrumentsResponse" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + } + } + }, "/status": { "get": { "tags": ["instrumentation"], @@ -249,12 +283,35 @@ "query_documents", "response_documents" ] + }, + "StartInstrumentsRequestBody": { + "type": "object", + "properties": { + "mongoUrl": { + "description": "The full `MONGO_URL` that is usually used to connect to the database.", + "type": "string" + } + }, + "required": ["mongoUrl"] + }, + "StartInstrumentsResponse": { + "type": "object", + "properties": { + "remoteAddr": { + "description": "The patched `MONGO_URL` that should be used to connect to the database.", + "type": "string" + } + }, + "required": ["remoteAddr"] } } }, "tags": [ { "name": "instrumentation" + }, + { + "name": "instruments" } ] } From 676473d1d721bc01f7fa63282cd65ae1679d1585 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Fri, 12 Jan 2024 14:04:45 +0100 Subject: [PATCH 12/17] feat(tinybench-plugin): add dynamic startInstruments function --- packages/tinybench-plugin/src/index.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/tinybench-plugin/src/index.ts b/packages/tinybench-plugin/src/index.ts index adc308d9..30032a93 100644 --- a/packages/tinybench-plugin/src/index.ts +++ b/packages/tinybench-plugin/src/index.ts @@ -4,6 +4,8 @@ import { mongoMeasurement, optimizeFunction, setupCore, + StartInstrumentsRequestBody, + StartInstrumentsResponse, teardownCore, tryIntrospect, } from "@codspeed/core"; @@ -101,3 +103,18 @@ function getCallingFile(): string { } return path.relative(gitDir, callingFile); } + +/** + * Dynamically starts the CodSpeed instruments. + */ +export async function startInstruments( + body: StartInstrumentsRequestBody +): Promise { + if (!Measurement.isInstrumented()) { + console.warn("[CodSpeed] No instrumentation found, using default mongoUrl"); + + return { remoteAddr: body.mongoUrl }; + } + + return await mongoMeasurement.startInstruments(body); +} From f5788e2472d11a6dc541b34b52ccf7440a2522ba Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Fri, 12 Jan 2024 14:26:53 +0100 Subject: [PATCH 13/17] feat(core): initialize mongoMeasurement client as a side-effect --- packages/core/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3025b8c3..00cb0bfa 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -9,7 +9,7 @@ const linuxPerf = new native_core.LinuxPerf(); export const isBound = native_core.isBound; -export let mongoMeasurement: MongoMeasurement; +export const mongoMeasurement = new MongoMeasurement(); export const setupCore = () => { initOptimization(); @@ -18,7 +18,6 @@ export const setupCore = () => { ); linuxPerf.start(); checkV8Flags(); - mongoMeasurement = new MongoMeasurement(); }; export const teardownCore = () => { From 823cae5a7e2e55b1e13b81ba48fa71f58d66cb9c Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Tue, 16 Jan 2024 17:36:43 +0100 Subject: [PATCH 14/17] feat: update mongo-tracer and change startInstruments into setupInstruments --- packages/core/src/index.ts | 4 ++-- packages/core/src/mongoMeasurement.ts | 14 +++++++------- packages/core/tracer.spec.json | 16 +++++++++------- packages/tinybench-plugin/src/index.ts | 14 +++++++------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 00cb0bfa..e5360082 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -25,8 +25,8 @@ export const teardownCore = () => { }; export type { - StartInstrumentsRequestBody, - StartInstrumentsResponse, + SetupInstrumentsRequestBody, + SetupInstrumentsResponse, } from "./generated/openapi"; export { getV8Flags, tryIntrospect } from "./introspection"; export { optimizeFunction, optimizeFunctionSync } from "./optimization"; diff --git a/packages/core/src/mongoMeasurement.ts b/packages/core/src/mongoMeasurement.ts index 4307b6e0..642d2c19 100644 --- a/packages/core/src/mongoMeasurement.ts +++ b/packages/core/src/mongoMeasurement.ts @@ -1,10 +1,10 @@ import { MongoTracer, - StartInstrumentsRequestBody, - StartInstrumentsResponse, + SetupInstrumentsRequestBody, + SetupInstrumentsResponse, } from "./generated/openapi"; -export type { StartInstrumentsRequestBody }; +export type { SetupInstrumentsRequestBody }; export class MongoMeasurement { private tracerClient: MongoTracer | undefined; @@ -19,13 +19,13 @@ export class MongoMeasurement { } } - public async startInstruments( - body: StartInstrumentsRequestBody - ): Promise { + public async setupInstruments( + body: SetupInstrumentsRequestBody + ): Promise { if (this.tracerClient === undefined) { throw new Error("MongoDB Instrumentation is not enabled"); } - return await this.tracerClient.instruments.start(body); + return await this.tracerClient.instruments.setup(body); } public async start(uri: string) { diff --git a/packages/core/tracer.spec.json b/packages/core/tracer.spec.json index 5b582a73..42abb5f0 100644 --- a/packages/core/tracer.spec.json +++ b/packages/core/tracer.spec.json @@ -3,7 +3,7 @@ "info": { "title": "CodSpeed MongoDB Tracer", "description": "Instrumentation API for CodSpeed Tracer", - "version": "0.1.1-beta.4" + "version": "0.2.0" }, "paths": { "/benchmark/start": { @@ -74,15 +74,17 @@ } } }, - "/instruments/start": { + "/instruments/setup": { "post": { "tags": ["instruments"], - "operationId": "start", + "summary": "Start the instruments (proxy and aggregator) for the given `body.mongo_url`.", + "description": "If other endpoints of the instrumentation server are called before this one, they will likely fail as the proxy and aggregator are not running yet.", + "operationId": "setup", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/StartInstrumentsRequestBody" + "$ref": "#/components/schemas/SetupInstrumentsRequestBody" } } }, @@ -94,7 +96,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/StartInstrumentsResponse" + "$ref": "#/components/schemas/SetupInstrumentsResponse" } } } @@ -284,7 +286,7 @@ "response_documents" ] }, - "StartInstrumentsRequestBody": { + "SetupInstrumentsRequestBody": { "type": "object", "properties": { "mongoUrl": { @@ -294,7 +296,7 @@ }, "required": ["mongoUrl"] }, - "StartInstrumentsResponse": { + "SetupInstrumentsResponse": { "type": "object", "properties": { "remoteAddr": { diff --git a/packages/tinybench-plugin/src/index.ts b/packages/tinybench-plugin/src/index.ts index 30032a93..e573bd44 100644 --- a/packages/tinybench-plugin/src/index.ts +++ b/packages/tinybench-plugin/src/index.ts @@ -4,8 +4,8 @@ import { mongoMeasurement, optimizeFunction, setupCore, - StartInstrumentsRequestBody, - StartInstrumentsResponse, + SetupInstrumentsRequestBody, + SetupInstrumentsResponse, teardownCore, tryIntrospect, } from "@codspeed/core"; @@ -105,16 +105,16 @@ function getCallingFile(): string { } /** - * Dynamically starts the CodSpeed instruments. + * Dynamically setup the CodSpeed instruments. */ -export async function startInstruments( - body: StartInstrumentsRequestBody -): Promise { +export async function setupInstruments( + body: SetupInstrumentsRequestBody +): Promise { if (!Measurement.isInstrumented()) { console.warn("[CodSpeed] No instrumentation found, using default mongoUrl"); return { remoteAddr: body.mongoUrl }; } - return await mongoMeasurement.startInstruments(body); + return await mongoMeasurement.setupInstruments(body); } From 4b66b8f4ae920c3d19f39bc153c58826ddcfe08a Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Wed, 17 Jan 2024 12:16:48 +0100 Subject: [PATCH 15/17] feat(benchmark.js-plugin): add dynamic startInstruments function --- packages/benchmark.js-plugin/src/index.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/benchmark.js-plugin/src/index.ts b/packages/benchmark.js-plugin/src/index.ts index d241abbe..0ffe5a75 100644 --- a/packages/benchmark.js-plugin/src/index.ts +++ b/packages/benchmark.js-plugin/src/index.ts @@ -4,6 +4,8 @@ import { optimizeFunction, optimizeFunctionSync, setupCore, + SetupInstrumentsRequestBody, + SetupInstrumentsResponse, teardownCore, tryIntrospect, } from "@codspeed/core"; @@ -221,3 +223,18 @@ async function runBenchmarks({ teardownCore(); console.log(`[CodSpeed] Done running ${benches.length} benches.`); } + +/** + * Dynamically setup the CodSpeed instruments. + */ +export async function setupInstruments( + body: SetupInstrumentsRequestBody +): Promise { + if (!Measurement.isInstrumented()) { + console.warn("[CodSpeed] No instrumentation found, using default mongoUrl"); + + return { remoteAddr: body.mongoUrl }; + } + + return await mongoMeasurement.setupInstruments(body); +} From 4662ad73f2b7b622e99950e332f7bd89758fb644 Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Wed, 17 Jan 2024 12:17:25 +0100 Subject: [PATCH 16/17] feat(vitest-plugin): add dynamic startInstruments function --- packages/vitest-plugin/src/index.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/vitest-plugin/src/index.ts b/packages/vitest-plugin/src/index.ts index 403f3488..1fbdd5c9 100644 --- a/packages/vitest-plugin/src/index.ts +++ b/packages/vitest-plugin/src/index.ts @@ -1,4 +1,10 @@ -import { getV8Flags, Measurement } from "@codspeed/core"; +import { + getV8Flags, + Measurement, + mongoMeasurement, + SetupInstrumentsRequestBody, + SetupInstrumentsResponse, +} from "@codspeed/core"; import { join } from "path"; import { Plugin } from "vite"; import { UserConfig } from "vitest/config"; @@ -45,3 +51,18 @@ export default function codspeedPlugin(): Plugin { }, }; } + +/** + * Dynamically setup the CodSpeed instruments. + */ +export async function setupInstruments( + body: SetupInstrumentsRequestBody +): Promise { + if (!Measurement.isInstrumented()) { + console.warn("[CodSpeed] No instrumentation found, using default mongoUrl"); + + return { remoteAddr: body.mongoUrl }; + } + + return await mongoMeasurement.setupInstruments(body); +} From 169a5e1a6fc6f3af81649e5358e7cba7a318767f Mon Sep 17 00:00:00 2001 From: Adrien Cacciaguerra Date: Thu, 18 Jan 2024 11:58:35 +0100 Subject: [PATCH 17/17] chore: make sure vitest bench does not hand in local --- examples/with-typescript-esm/package.json | 2 +- packages/vitest-plugin/moon.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/with-typescript-esm/package.json b/examples/with-typescript-esm/package.json index e7026be1..bdfc5fbb 100644 --- a/examples/with-typescript-esm/package.json +++ b/examples/with-typescript-esm/package.json @@ -5,7 +5,7 @@ "scripts": { "bench-benchmark-js": "node --loader esbuild-register/loader -r esbuild-register bench/benchmark.js/index.bench.ts", "bench-tinybench": "node --loader esbuild-register/loader -r esbuild-register bench/tinybench/index.bench.ts", - "bench-vitest": "vitest bench" + "bench-vitest": "vitest bench --run" }, "devDependencies": { "@codspeed/benchmark.js-plugin": "workspace:*", diff --git a/packages/vitest-plugin/moon.yml b/packages/vitest-plugin/moon.yml index e6b2cba1..64f92547 100644 --- a/packages/vitest-plugin/moon.yml +++ b/packages/vitest-plugin/moon.yml @@ -1,6 +1,6 @@ tasks: bench: - command: vitest bench + command: vitest bench --run inputs: - "benches/**" local: true