@prairielearn/node-metrics 2.0.12 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @prairielearn/node-metrics
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 3914bb4: Upgrade to Node 24
8
+
9
+ ## 2.0.13
10
+
11
+ ### Patch Changes
12
+
13
+ - 0900843: Switch to the `tsgo` compiler
14
+
3
15
  ## 2.0.12
4
16
 
5
17
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACf,MAAM,4BAA4B,CAAC;AASpC,UAAU,kBAAkB;IAC1B,SAAS,EAAE,sBAAsB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAiGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,QAQhD;AAED,wBAAgB,IAAI,SAEnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACf,MAAM,4BAA4B,CAAC;AASpC,UAAU,kBAAkB;IAC1B,SAAS,EAAE,sBAAsB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAiGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,QAQhD;AAED,wBAAgB,IAAI,SAEnB","sourcesContent":["import { setTimeout } from 'node:timers/promises';\n\nimport {\n CloudWatch,\n type CloudWatchClientConfig,\n type Dimension,\n} from '@aws-sdk/client-cloudwatch';\nimport loopbench from 'loopbench';\n\nconst loopbenchInstance = loopbench();\n\nlet abortController: AbortController | null = null;\nlet cpuUsage = process.cpuUsage();\nlet time = process.hrtime.bigint();\n\ninterface NodeMetricsOptions {\n awsConfig: CloudWatchClientConfig;\n intervalSeconds: number;\n namespace: string;\n dimensions: Dimension[];\n onError: (err: Error) => void;\n}\n\nasync function emit(options: NodeMetricsOptions) {\n try {\n const memoryStats = process.memoryUsage();\n\n const elapsedCpuUsage = process.cpuUsage(cpuUsage);\n // This delta is in nanoseconds.\n const elapsedTime = process.hrtime.bigint() - time;\n // This conversion should be safe, as `Number.MAX_SAFE_INTEGER` microseconds\n // corresponds to about 258 years.\n const elapsedMicroseconds = Number(elapsedTime / 1000n);\n\n const userCpuPercent = (100 * elapsedCpuUsage.user) / elapsedMicroseconds;\n const systemCpuPercent = (100 * elapsedCpuUsage.system) / elapsedMicroseconds;\n const totalCpuPercent = userCpuPercent + systemCpuPercent;\n\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n const metrics = [\n {\n MetricName: 'NodeEventLoopDelay',\n Unit: 'Milliseconds',\n Value: loopbenchInstance.delay,\n },\n {\n MetricName: 'NodeMemoryRss',\n Unit: 'Bytes',\n Value: memoryStats.rss,\n },\n {\n MetricName: 'NodeMemoryHeapTotal',\n Unit: 'Bytes',\n Value: memoryStats.heapTotal,\n },\n {\n MetricName: 'NodeMemoryHeapUsed',\n Unit: 'Bytes',\n Value: memoryStats.heapUsed,\n },\n {\n MetricName: 'NodeMemoryExternal',\n Unit: 'Bytes',\n Value: memoryStats.external,\n },\n {\n MetricName: 'NodeCpuUser',\n Unit: 'Percent',\n Value: userCpuPercent,\n },\n {\n MetricName: 'NodeCpuSystem',\n Unit: 'Percent',\n Value: systemCpuPercent,\n },\n {\n MetricName: 'NodeCpuTotal',\n Unit: 'Percent',\n Value: totalCpuPercent,\n },\n ] as const;\n\n // We must use a config passed in from outside this package.\n // eslint-disable-next-line @prairielearn/aws-client-shared-config\n const cloudwatch = new CloudWatch(options.awsConfig);\n await cloudwatch.putMetricData({\n Namespace: options.namespace,\n MetricData: metrics.map((m) => ({\n ...m,\n StorageResolution: 1,\n Timestamp: new Date(),\n Dimensions: options.dimensions,\n })),\n });\n } catch (err: any) {\n options.onError(err);\n }\n}\n\nasync function emitLoop({\n signal,\n ...options\n}: NodeMetricsOptions & {\n signal: AbortSignal;\n}) {\n try {\n while (!signal.aborted) {\n await setTimeout(options.intervalSeconds * 1000, null, { signal, ref: false });\n await emit(options);\n }\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n throw err;\n }\n}\n\nexport function start(options: NodeMetricsOptions) {\n abortController = new AbortController();\n\n // Initialize these so that we can compute a valid delta on the first run of `emit()`.\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n (() => emitLoop({ signal: abortController.signal, ...options }))();\n}\n\nexport function stop() {\n abortController?.abort();\n}\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from 'node:timers/promises';\n\nimport {\n CloudWatch,\n type CloudWatchClientConfig,\n type Dimension,\n} from '@aws-sdk/client-cloudwatch';\nimport loopbench from 'loopbench';\n\nconst loopbenchInstance = loopbench();\n\nlet abortController: AbortController | null = null;\nlet cpuUsage = process.cpuUsage();\nlet time = process.hrtime.bigint();\n\ninterface NodeMetricsOptions {\n awsConfig: CloudWatchClientConfig;\n intervalSeconds: number;\n namespace: string;\n dimensions: Dimension[];\n onError: (err: Error) => void;\n}\n\nasync function emit(options: NodeMetricsOptions) {\n try {\n const memoryStats = process.memoryUsage();\n\n const elapsedCpuUsage = process.cpuUsage(cpuUsage);\n // This delta is in nanoseconds.\n const elapsedTime = process.hrtime.bigint() - time;\n // This conversion should be safe, as `Number.MAX_SAFE_INTEGER` microseconds\n // corresponds to about 258 years.\n const elapsedMicroseconds = Number(elapsedTime / 1000n);\n\n const userCpuPercent = (100 * elapsedCpuUsage.user) / elapsedMicroseconds;\n const systemCpuPercent = (100 * elapsedCpuUsage.system) / elapsedMicroseconds;\n const totalCpuPercent = userCpuPercent + systemCpuPercent;\n\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n const metrics = [\n {\n MetricName: 'NodeEventLoopDelay',\n Unit: 'Milliseconds',\n Value: loopbenchInstance.delay,\n },\n {\n MetricName: 'NodeMemoryRss',\n Unit: 'Bytes',\n Value: memoryStats.rss,\n },\n {\n MetricName: 'NodeMemoryHeapTotal',\n Unit: 'Bytes',\n Value: memoryStats.heapTotal,\n },\n {\n MetricName: 'NodeMemoryHeapUsed',\n Unit: 'Bytes',\n Value: memoryStats.heapUsed,\n },\n {\n MetricName: 'NodeMemoryExternal',\n Unit: 'Bytes',\n Value: memoryStats.external,\n },\n {\n MetricName: 'NodeCpuUser',\n Unit: 'Percent',\n Value: userCpuPercent,\n },\n {\n MetricName: 'NodeCpuSystem',\n Unit: 'Percent',\n Value: systemCpuPercent,\n },\n {\n MetricName: 'NodeCpuTotal',\n Unit: 'Percent',\n Value: totalCpuPercent,\n },\n ] as const;\n\n // We must use a config passed in from outside this package.\n // eslint-disable-next-line @prairielearn/aws-client-shared-config\n const cloudwatch = new CloudWatch(options.awsConfig);\n await cloudwatch.putMetricData({\n Namespace: options.namespace,\n MetricData: metrics.map((m) => ({\n ...m,\n StorageResolution: 1,\n Timestamp: new Date(),\n Dimensions: options.dimensions,\n })),\n });\n } catch (err: any) {\n options.onError(err);\n }\n}\n\nasync function emitLoop({\n signal,\n ...options\n}: NodeMetricsOptions & {\n signal: AbortSignal;\n}) {\n try {\n while (!signal.aborted) {\n await setTimeout(options.intervalSeconds * 1000, null, { signal, ref: false });\n await emit(options);\n }\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n throw err;\n }\n}\n\nexport function start(options: NodeMetricsOptions) {\n abortController = new AbortController();\n\n // Initialize these so that we can compute a valid delta on the first run of `emit()`.\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n (() => emitLoop({ signal: abortController.signal, ...options }))();\n}\n\nexport function stop() {\n abortController?.abort();\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from 'node:timers/promises';\n\nimport {\n CloudWatch,\n type CloudWatchClientConfig,\n type Dimension,\n} from '@aws-sdk/client-cloudwatch';\nimport loopbench from 'loopbench';\n\nconst loopbenchInstance = loopbench();\n\nlet abortController: AbortController | null = null;\nlet cpuUsage = process.cpuUsage();\nlet time = process.hrtime.bigint();\n\ninterface NodeMetricsOptions {\n awsConfig: CloudWatchClientConfig;\n intervalSeconds: number;\n namespace: string;\n dimensions: Dimension[];\n onError: (err: Error) => void;\n}\n\nasync function emit(options: NodeMetricsOptions) {\n try {\n const memoryStats = process.memoryUsage();\n\n const elapsedCpuUsage = process.cpuUsage(cpuUsage);\n // This delta is in nanoseconds.\n const elapsedTime = process.hrtime.bigint() - time;\n // This conversion should be safe, as `Number.MAX_SAFE_INTEGER` microseconds\n // corresponds to about 258 years.\n const elapsedMicroseconds = Number(elapsedTime / 1000n);\n\n const userCpuPercent = (100 * elapsedCpuUsage.user) / elapsedMicroseconds;\n const systemCpuPercent = (100 * elapsedCpuUsage.system) / elapsedMicroseconds;\n const totalCpuPercent = userCpuPercent + systemCpuPercent;\n\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n const metrics = [\n {\n MetricName: 'NodeEventLoopDelay',\n Unit: 'Milliseconds',\n Value: loopbenchInstance.delay,\n },\n {\n MetricName: 'NodeMemoryRss',\n Unit: 'Bytes',\n Value: memoryStats.rss,\n },\n {\n MetricName: 'NodeMemoryHeapTotal',\n Unit: 'Bytes',\n Value: memoryStats.heapTotal,\n },\n {\n MetricName: 'NodeMemoryHeapUsed',\n Unit: 'Bytes',\n Value: memoryStats.heapUsed,\n },\n {\n MetricName: 'NodeMemoryExternal',\n Unit: 'Bytes',\n Value: memoryStats.external,\n },\n {\n MetricName: 'NodeCpuUser',\n Unit: 'Percent',\n Value: userCpuPercent,\n },\n {\n MetricName: 'NodeCpuSystem',\n Unit: 'Percent',\n Value: systemCpuPercent,\n },\n {\n MetricName: 'NodeCpuTotal',\n Unit: 'Percent',\n Value: totalCpuPercent,\n },\n ] as const;\n\n // We must use a config passed in from outside this package.\n // eslint-disable-next-line @prairielearn/aws-client-shared-config\n const cloudwatch = new CloudWatch(options.awsConfig);\n await cloudwatch.putMetricData({\n Namespace: options.namespace,\n MetricData: metrics.map((m) => ({\n ...m,\n StorageResolution: 1,\n Timestamp: new Date(),\n Dimensions: options.dimensions,\n })),\n });\n } catch (err: any) {\n options.onError(err);\n }\n}\n\nasync function emitLoop({\n signal,\n ...options\n}: NodeMetricsOptions & {\n signal: AbortSignal;\n}) {\n try {\n while (!signal.aborted) {\n await setTimeout(options.intervalSeconds * 1000, null, { signal, ref: false });\n await emit(options);\n }\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n throw err;\n }\n}\n\nexport function start(options: NodeMetricsOptions) {\n abortController = new AbortController();\n\n // Initialize these so that we can compute a valid delta on the first run of `emit()`.\n cpuUsage = process.cpuUsage();\n time = process.hrtime.bigint();\n\n (() => emitLoop({ signal: abortController.signal, ...options }))();\n}\n\nexport function stop() {\n abortController?.abort();\n}\n"]}
package/package.json CHANGED
@@ -1,25 +1,29 @@
1
1
  {
2
2
  "name": "@prairielearn/node-metrics",
3
- "version": "2.0.12",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/PrairieLearn/PrairieLearn.git",
8
8
  "directory": "packages/node-metrics"
9
9
  },
10
+ "engines": {
11
+ "node": ">=24.0.0"
12
+ },
10
13
  "main": "./dist/index.js",
11
14
  "scripts": {
12
- "build": "tsc",
13
- "dev": "tsc --watch --preserveWatchOutput"
15
+ "build": "tsgo",
16
+ "dev": "tsgo --watch --preserveWatchOutput"
14
17
  },
15
18
  "dependencies": {
16
- "@aws-sdk/client-cloudwatch": "^3.958.0",
19
+ "@aws-sdk/client-cloudwatch": "^3.969.0",
17
20
  "loopbench": "^2.0.0"
18
21
  },
19
22
  "devDependencies": {
20
23
  "@prairielearn/tsconfig": "^0.0.0",
21
24
  "@types/loopbench": "^1.2.4",
22
- "@types/node": "^22.19.3",
25
+ "@types/node": "^24.10.9",
26
+ "@typescript/native-preview": "^7.0.0-dev.20260106.1",
23
27
  "typescript": "^5.9.3"
24
28
  }
25
29
  }