Skip to content

[DRAFT] NOT MERGING POC: Send Node.js runtime metrics via OTLP using OTel-native naming#7869

Closed
link04 wants to merge 19 commits into
masterfrom
maximo/otlp-runtime-metrics-poc
Closed

[DRAFT] NOT MERGING POC: Send Node.js runtime metrics via OTLP using OTel-native naming#7869
link04 wants to merge 19 commits into
masterfrom
maximo/otlp-runtime-metrics-poc

Conversation

@link04

@link04 link04 commented Mar 27, 2026

Copy link
Copy Markdown

Do not review — initial POC only.

Sends v8js.memory.heap., process.cpu.utilization, process.memory.usage, nodejs.eventloop.delay. via OTLP. Related: DataDog/dd-trace-dotnet#8299

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Mar 27, 2026

Copy link
Copy Markdown
Contributor

Overall package size

Self size: 5.79 MB
Deduped: 6.63 MB
No deduping: 6.63 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.0.1 | 82.56 kB | 817.39 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@datadog-prod-us1-5

datadog-prod-us1-5 Bot commented Mar 27, 2026

Copy link
Copy Markdown

Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

🎯 Code Coverage (details)
Patch Coverage: 90.70%
Overall Coverage: 86.62% (-0.00%)

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: f0615c5 | Docs | Datadog PR Page | Give us feedback!

@link04 link04 changed the title POC: Send Node.js runtime metrics via OTLP using OTel-native naming [DRAFT] NOT MERGING POC: Send Node.js runtime metrics via OTLP using OTel-native naming Mar 27, 2026
@codecov

codecov Bot commented Mar 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.45455% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.78%. Comparing base (baeb045) to head (f0615c5).
⚠️ Report is 13 commits behind head on master.

Files with missing lines Patch % Lines
packages/dd-trace/src/proxy.js 66.66% 2 Missing ⚠️
packages/dd-trace/src/runtime_metrics/index.js 66.66% 1 Missing ⚠️
...-trace/src/runtime_metrics/otlp_runtime_metrics.js 98.73% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #7869      +/-   ##
==========================================
+ Coverage   89.75%   89.78%   +0.03%     
==========================================
  Files         836      837       +1     
  Lines       44285    44568     +283     
  Branches     8136     8212      +76     
==========================================
+ Hits        39746    40017     +271     
- Misses       4539     4551      +12     
Flag Coverage Δ
aiguard-integration-active 40.59% <22.22%> (+<0.01%) ⬆️
aiguard-integration-latest 40.54% <22.22%> (+<0.01%) ⬆️
aiguard-integration-maintenance 40.59% <22.22%> (+<0.01%) ⬆️
aiguard-macos 35.28% <28.57%> (-0.08%) ⬇️
aiguard-ubuntu 35.38% <28.57%> (-0.08%) ⬇️
aiguard-windows 35.19% <28.57%> (-0.08%) ⬇️
apm-capabilities-tracing-macos 49.18% <96.51%> (-0.07%) ⬇️
apm-capabilities-tracing-ubuntu-active 49.39% <96.51%> (+0.11%) ⬆️
apm-capabilities-tracing-ubuntu-latest 49.18% <96.51%> (+0.11%) ⬆️
apm-capabilities-tracing-ubuntu-maintenance 49.21% <96.51%> (-0.07%) ⬇️
apm-capabilities-tracing-ubuntu-oldest 49.20% <96.51%> (+0.11%) ⬆️
apm-capabilities-tracing-windows 49.19% <96.51%> (+0.29%) ⬆️
apm-integrations-aerospike-18-gte.5.2.0 34.27% <28.57%> (-0.09%) ⬇️
apm-integrations-aerospike-20-gte.5.5.0 34.29% <28.57%> (-0.09%) ⬇️
apm-integrations-aerospike-22-gte.5.12.1 34.29% <28.57%> (-0.09%) ⬇️
apm-integrations-aerospike-22-gte.6.0.0 34.29% <28.57%> (-0.09%) ⬇️
apm-integrations-aerospike-eol- 34.19% <28.57%> (-0.09%) ⬇️
apm-integrations-child-process 35.31% <28.57%> (-0.08%) ⬇️
apm-integrations-confluentinc-kafka-javascript-18 41.15% <28.57%> (-0.09%) ⬇️
apm-integrations-confluentinc-kafka-javascript-20 41.17% <28.57%> (-0.09%) ⬇️
apm-integrations-confluentinc-kafka-javascript-22 41.17% <28.57%> (-0.09%) ⬇️
apm-integrations-confluentinc-kafka-javascript-24 41.10% <28.57%> (-0.09%) ⬇️
apm-integrations-couchbase-18 34.46% <28.57%> (-0.08%) ⬇️
apm-integrations-couchbase-eol 34.57% <28.57%> (-0.11%) ⬇️
apm-integrations-dns 34.18% <28.57%> (-0.08%) ⬇️
apm-integrations-elasticsearch 34.93% <28.57%> (-0.08%) ⬇️
apm-integrations-http-latest 42.13% <28.57%> (-0.04%) ⬇️
apm-integrations-http-maintenance 42.19% <28.57%> (-0.04%) ⬇️
apm-integrations-http-oldest 42.20% <28.57%> (-0.04%) ⬇️
apm-integrations-http2 39.51% <28.57%> (-0.09%) ⬇️
apm-integrations-kafkajs-latest 41.04% <28.57%> (-0.09%) ⬇️
apm-integrations-kafkajs-oldest 41.09% <28.57%> (-0.09%) ⬇️
apm-integrations-net 34.88% <28.57%> (-0.08%) ⬇️
apm-integrations-next-11.1.4 29.32% <28.57%> (-0.06%) ⬇️
apm-integrations-next-13.2.0 30.76% <28.57%> (-0.07%) ⬇️
apm-integrations-next-gte.10.2.0.and.lt.11 22.99% <0.00%> (-0.12%) ⬇️
apm-integrations-next-gte.11.0.0.and.lt.13 30.77% <28.57%> (-0.07%) ⬇️
apm-integrations-next-gte.13.0.0.and.lt.14 31.02% <28.57%> (-0.07%) ⬇️
apm-integrations-next-gte.14.0.0.and.lte.14.2.6 30.83% <28.57%> (-0.07%) ⬇️
apm-integrations-next-gte.14.2.7.and.lt.15 30.83% <28.57%> (-0.07%) ⬇️
apm-integrations-next-gte.15.0.0 30.90% <28.57%> (-0.07%) ⬇️
apm-integrations-oracledb 34.57% <28.57%> (-0.07%) ⬇️
apm-integrations-prisma-18-gte.6.16.0.and.lt.7.0.0 34.91% <28.57%> (-0.06%) ⬇️
apm-integrations-prisma-latest-all 35.23% <28.57%> (-0.05%) ⬇️
apm-integrations-restify 36.38% <28.57%> (-0.14%) ⬇️
apm-integrations-sharedb 33.86% <28.57%> (-0.08%) ⬇️
apm-integrations-tedious 34.37% <28.57%> (-0.07%) ⬇️
appsec-express 51.99% <28.57%> (-0.03%) ⬇️
appsec-fastify 48.65% <28.57%> (-0.02%) ⬇️
appsec-graphql 48.95% <28.57%> (-0.03%) ⬇️
appsec-integration-active 37.26% <22.22%> (-0.14%) ⬇️
appsec-integration-latest 37.23% <22.22%> (-0.14%) ⬇️
appsec-integration-maintenance 37.25% <22.22%> (-0.14%) ⬇️
appsec-integration-oldest 37.25% <22.22%> (-0.14%) ⬇️
appsec-kafka 41.45% <28.57%> (-0.12%) ⬇️
appsec-ldapjs 40.70% <28.57%> (-0.06%) ⬇️
appsec-lodash 40.81% <28.57%> (-0.06%) ⬇️
appsec-macos 55.80% <28.57%> (-0.25%) ⬇️
appsec-mongodb-core 45.07% <28.57%> (-0.05%) ⬇️
appsec-mongoose 45.93% <28.57%> (-0.09%) ⬇️
appsec-mysql 48.02% <28.57%> (-0.02%) ⬇️
appsec-next-latest-11.1.4 29.44% <28.57%> (-0.06%) ⬇️
appsec-next-latest-13.2.0 30.90% <28.57%> (-0.07%) ⬇️
appsec-next-latest-gte.10.2.0.and.lt.11 28.66% <0.00%> (-0.06%) ⬇️
appsec-next-latest-gte.11.0.0.and.lt.13 30.89% <28.57%> (-0.07%) ⬇️
appsec-next-latest-gte.13.0.0.and.lt.14 31.13% <28.57%> (-0.06%) ⬇️
appsec-next-latest-gte.14.0.0.and.lte.14.2.6 30.98% <28.57%> (-0.07%) ⬇️
appsec-next-latest-gte.14.2.7.and.lt.15 30.98% <28.57%> (-0.07%) ⬇️
appsec-next-latest-gte.15.0.0 30.98% <28.57%> (-0.07%) ⬇️
appsec-next-oldest-11.1.4 29.45% <28.57%> (-0.06%) ⬇️
appsec-next-oldest-13.2.0 31.19% <28.57%> (-0.07%) ⬇️
appsec-next-oldest-gte.10.2.0.and.lt.11 28.78% <0.00%> (-0.06%) ⬇️
appsec-next-oldest-gte.11.0.0.and.lt.13 30.90% <28.57%> (-0.07%) ⬇️
appsec-next-oldest-gte.13.0.0.and.lt.14 31.37% <28.57%> (-0.06%) ⬇️
appsec-next-oldest-gte.14.0.0.and.lte.14.2.6 31.22% <28.57%> (-0.07%) ⬇️
appsec-next-oldest-gte.14.2.7.and.lt.15 31.22% <28.57%> (-0.07%) ⬇️
appsec-next-oldest-gte.15.0.0 31.22% <28.57%> (-0.07%) ⬇️
appsec-node-serialize 40.02% <28.57%> (-0.06%) ⬇️
appsec-passport 43.68% <28.57%> (-0.03%) ⬇️
appsec-postgres 47.56% <28.57%> (-0.04%) ⬇️
appsec-sourcing 39.36% <28.57%> (-0.06%) ⬇️
appsec-stripe 41.46% <28.57%> (-0.03%) ⬇️
appsec-template 40.18% <28.57%> (-0.06%) ⬇️
appsec-ubuntu 55.89% <28.57%> (-0.24%) ⬇️
appsec-windows 55.75% <28.57%> (-0.21%) ⬇️
debugger-ubuntu-active 43.23% <22.22%> (+0.02%) ⬆️
debugger-ubuntu-latest 43.18% <22.22%> (+0.02%) ⬆️
debugger-ubuntu-maintenance 43.25% <22.22%> (+0.02%) ⬆️
debugger-ubuntu-oldest 43.68% <22.22%> (+0.02%) ⬆️
instrumentations-instrumentation-bluebird 29.30% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-body-parser 36.91% <28.57%> (-0.07%) ⬇️
instrumentations-instrumentation-child_process 34.79% <28.57%> (-0.08%) ⬇️
instrumentations-instrumentation-cookie-parser 31.14% <28.57%> (-0.06%) ⬇️
instrumentations-instrumentation-express 31.35% <28.57%> (-0.06%) ⬇️
instrumentations-instrumentation-express-mongo-sanitize 31.25% <28.57%> (-0.06%) ⬇️
instrumentations-instrumentation-express-session 36.60% <28.57%> (-0.07%) ⬇️
instrumentations-instrumentation-fs 28.98% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-generic-pool 29.89% <0.00%> (-0.35%) ⬇️
instrumentations-instrumentation-http 36.27% <28.57%> (-0.07%) ⬇️
instrumentations-instrumentation-knex 29.27% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-light-my-request 36.53% <28.57%> (-0.07%) ⬇️
instrumentations-instrumentation-mongoose 30.29% <28.57%> (-0.12%) ⬇️
instrumentations-instrumentation-multer 36.70% <28.57%> (-0.07%) ⬇️
instrumentations-instrumentation-mysql2 34.78% <28.57%> (-0.08%) ⬇️
instrumentations-instrumentation-passport 40.32% <28.57%> (-0.02%) ⬇️
instrumentations-instrumentation-passport-http 40.10% <28.57%> (-0.03%) ⬇️
instrumentations-instrumentation-passport-local 40.58% <28.57%> (-0.03%) ⬇️
instrumentations-instrumentation-pg 34.33% <28.57%> (-0.08%) ⬇️
instrumentations-instrumentation-promise 29.23% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-promise-js 29.24% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-q 29.27% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-url 29.24% <28.57%> (-0.09%) ⬇️
instrumentations-instrumentation-when 29.25% <28.57%> (-0.09%) ⬇️
instrumentations-integration-esbuild-active 19.51% <0.00%> (-0.08%) ⬇️
instrumentations-integration-esbuild-latest 19.50% <0.00%> (-0.08%) ⬇️
instrumentations-integration-esbuild-maintenance 19.51% <0.00%> (-0.08%) ⬇️
instrumentations-integration-esbuild-oldest 19.50% <0.00%> (-0.08%) ⬇️
llmobs-ai 37.75% <28.57%> (-0.07%) ⬇️
llmobs-anthropic 37.80% <28.57%> (-0.07%) ⬇️
llmobs-bedrock 36.50% <28.57%> (-0.04%) ⬇️
llmobs-google-genai 36.82% <28.57%> (-0.06%) ⬇️
llmobs-langchain 36.53% <28.57%> (-0.07%) ⬇️
llmobs-openai 40.58% <28.57%> (-0.05%) ⬇️
llmobs-sdk-active 45.40% <28.57%> (-0.06%) ⬇️
llmobs-sdk-latest 45.33% <28.57%> (-0.06%) ⬇️
llmobs-sdk-maintenance 45.40% <28.57%> (-0.06%) ⬇️
llmobs-sdk-oldest 45.38% <28.57%> (-0.06%) ⬇️
llmobs-vertex-ai 36.97% <28.57%> (-0.08%) ⬇️
openfeature-macos 37.95% <22.22%> (-0.01%) ⬇️
openfeature-ubuntu 38.03% <22.22%> (-0.01%) ⬇️
openfeature-unit-active 48.48% <0.00%> (-0.14%) ⬇️
openfeature-unit-latest 48.32% <0.00%> (-0.14%) ⬇️
openfeature-unit-maintenance 48.48% <0.00%> (-0.14%) ⬇️
openfeature-unit-oldest 48.48% <0.00%> (-0.14%) ⬇️
openfeature-windows 37.83% <22.22%> (-0.01%) ⬇️
platform-core 37.27% <0.00%> (-0.18%) ⬇️
platform-esbuild 40.61% <0.00%> (-0.20%) ⬇️
platform-instrumentations-misc 30.73% <28.57%> (+0.01%) ⬆️
platform-integration-active 46.99% <66.66%> (+0.02%) ⬆️
platform-integration-latest 46.96% <66.66%> (+0.03%) ⬆️
platform-integration-maintenance 46.99% <66.66%> (+0.01%) ⬆️
platform-integration-oldest 47.17% <66.66%> (+0.03%) ⬆️
platform-shimmer 42.29% <0.00%> (-0.18%) ⬇️
platform-unit-guardrails 36.12% <0.00%> (-0.12%) ⬇️
platform-webpack 20.63% <0.00%> (-0.05%) ⬇️
plugins-azure-durable-functions 36.97% <22.22%> (+<0.01%) ⬆️
plugins-azure-event-hubs 34.81% <22.22%> (+<0.01%) ⬆️
plugins-azure-service-bus 35.27% <22.22%> (+0.01%) ⬆️
plugins-bullmq 40.07% <28.57%> (-0.20%) ⬇️
plugins-cassandra 34.58% <28.57%> (-0.19%) ⬇️
plugins-cookie 26.65% <0.00%> (-0.01%) ⬇️
plugins-cookie-parser 26.46% <0.00%> (-0.01%) ⬇️
plugins-crypto 27.69% <0.00%> (-0.04%) ⬇️
plugins-dd-trace-api 34.72% <28.57%> (-0.08%) ⬇️
plugins-express-mongo-sanitize 26.59% <0.00%> (-0.01%) ⬇️
plugins-express-session 26.42% <0.00%> (-0.01%) ⬇️
plugins-fastify 38.68% <28.57%> (-0.08%) ⬇️
plugins-fetch 35.01% <28.57%> (-0.08%) ⬇️
plugins-fs 35.07% <28.57%> (-0.08%) ⬇️
plugins-generic-pool 25.58% <0.00%> (-0.01%) ⬇️
plugins-google-cloud-pubsub 42.40% <28.57%> (-0.09%) ⬇️
plugins-grpc 37.45% <28.57%> (-0.06%) ⬇️
plugins-handlebars 26.63% <0.00%> (-0.01%) ⬇️
plugins-hapi 36.58% <28.57%> (-0.07%) ⬇️
plugins-hono 36.86% <28.57%> (-0.07%) ⬇️
plugins-ioredis 35.15% <28.57%> (-0.08%) ⬇️
plugins-knex 26.31% <0.00%> (-0.01%) ⬇️
plugins-langgraph 34.43% <28.57%> (-0.08%) ⬇️
plugins-ldapjs 24.20% <0.00%> (+<0.01%) ⬆️
plugins-light-my-request 26.06% <0.00%> (-0.01%) ⬇️
plugins-limitd-client 29.53% <28.57%> (-0.09%) ⬇️
plugins-lodash 25.65% <0.00%> (-0.01%) ⬇️
plugins-mariadb 36.06% <28.57%> (-0.08%) ⬇️
plugins-memcached 34.81% <28.57%> (-0.09%) ⬇️
plugins-microgateway-core 35.70% <28.57%> (-0.07%) ⬇️
plugins-modelcontextprotocol-sdk 33.71% <28.57%> (-0.08%) ⬇️
plugins-moleculer 37.54% <28.57%> (-0.06%) ⬇️
plugins-mongodb 35.96% <28.57%> (-0.07%) ⬇️
plugins-mongodb-core 35.57% <28.57%> (-0.10%) ⬇️
plugins-mongoose 35.45% <28.57%> (-0.11%) ⬇️
plugins-multer 26.42% <0.00%> (-0.01%) ⬇️
plugins-mysql 35.67% <28.57%> (-0.08%) ⬇️
plugins-mysql2 35.83% <28.57%> (-0.08%) ⬇️
plugins-node-serialize 26.69% <0.00%> (-0.02%) ⬇️
plugins-opensearch 34.46% <28.57%> (-0.06%) ⬇️
plugins-passport-http 26.47% <0.00%> (-0.01%) ⬇️
plugins-pino 31.24% <28.57%> (-0.10%) ⬇️
plugins-postgres 33.76% <28.57%> (-0.26%) ⬇️
plugins-process 27.69% <0.00%> (-0.04%) ⬇️
plugins-pug 26.65% <0.00%> (-0.01%) ⬇️
plugins-redis 35.15% <28.57%> (-0.15%) ⬇️
plugins-router 39.15% <28.57%> (+0.05%) ⬆️
plugins-sequelize 25.36% <0.00%> (-0.01%) ⬇️
plugins-test-and-upstream-amqp10 35.05% <28.57%> (-0.08%) ⬇️
plugins-test-and-upstream-amqplib 40.29% <28.57%> (-0.09%) ⬇️
plugins-test-and-upstream-apollo 35.91% <28.57%> (-0.06%) ⬇️
plugins-test-and-upstream-avsc 34.39% <28.57%> (-0.08%) ⬇️
plugins-test-and-upstream-bunyan 30.61% <28.57%> (-0.09%) ⬇️
plugins-test-and-upstream-connect 37.18% <28.57%> (-0.13%) ⬇️
plugins-test-and-upstream-graphql 36.83% <28.57%> (-0.08%) ⬇️
plugins-test-and-upstream-koa 36.84% <28.57%> (-0.07%) ⬇️
plugins-test-and-upstream-protobufjs 34.60% <28.57%> (-0.08%) ⬇️
plugins-test-and-upstream-rhea 40.30% <28.57%> (-0.09%) ⬇️
plugins-undici 35.74% <28.57%> (-0.08%) ⬇️
plugins-url 27.69% <0.00%> (-0.04%) ⬇️
plugins-valkey 34.82% <28.57%> (-0.09%) ⬇️
plugins-vm 27.69% <0.00%> (-0.04%) ⬇️
plugins-winston 31.26% <28.57%> (+0.06%) ⬆️
plugins-ws 38.38% <28.57%> (-0.06%) ⬇️
profiling-macos 42.79% <22.22%> (-0.03%) ⬇️
profiling-ubuntu 43.19% <22.22%> (-0.04%) ⬇️
profiling-windows 40.01% <22.22%> (-0.04%) ⬇️
serverless-aws-sdk-latest-aws-sdk 34.80% <28.57%> (-0.16%) ⬇️
serverless-aws-sdk-latest-bedrockruntime 33.32% <28.57%> (-0.01%) ⬇️
serverless-aws-sdk-latest-client 22.38% <0.00%> (+0.10%) ⬆️
serverless-aws-sdk-latest-dynamodb 35.75% <28.57%> (+<0.01%) ⬆️
serverless-aws-sdk-latest-eventbridge 28.80% <28.57%> (-0.18%) ⬇️
serverless-aws-sdk-latest-kinesis 38.67% <28.57%> (-0.02%) ⬇️
serverless-aws-sdk-latest-lambda 35.94% <28.57%> (+0.04%) ⬆️
serverless-aws-sdk-latest-s3 33.87% <28.57%> (-0.03%) ⬇️
serverless-aws-sdk-latest-serverless-peer-service 40.06% <28.57%> (-0.04%) ⬇️
serverless-aws-sdk-latest-sns 39.93% <28.57%> (+0.02%) ⬆️
serverless-aws-sdk-latest-sqs 39.16% <28.57%> (+0.11%) ⬆️
serverless-aws-sdk-latest-stepfunctions 34.51% <28.57%> (+0.02%) ⬆️
serverless-aws-sdk-latest-util 47.71% <0.00%> (+0.01%) ⬆️
serverless-aws-sdk-oldest-aws-sdk 34.85% <28.57%> (-0.16%) ⬇️
serverless-aws-sdk-oldest-bedrockruntime 33.36% <28.57%> (-0.01%) ⬇️
serverless-aws-sdk-oldest-client 22.75% <0.00%> (+0.09%) ⬆️
serverless-aws-sdk-oldest-dynamodb 35.80% <28.57%> (+<0.01%) ⬆️
serverless-aws-sdk-oldest-eventbridge 28.85% <28.57%> (-0.18%) ⬇️
serverless-aws-sdk-oldest-kinesis 38.79% <28.57%> (-0.02%) ⬇️
serverless-aws-sdk-oldest-lambda 35.99% <28.57%> (+0.04%) ⬆️
serverless-aws-sdk-oldest-s3 33.93% <28.57%> (-0.03%) ⬇️
serverless-aws-sdk-oldest-serverless-peer-service 40.13% <28.57%> (-0.04%) ⬇️
serverless-aws-sdk-oldest-sns 40.10% <28.57%> (+0.14%) ⬆️
serverless-aws-sdk-oldest-sqs 39.11% <28.57%> (+<0.01%) ⬆️
serverless-aws-sdk-oldest-stepfunctions 34.56% <28.57%> (+0.02%) ⬆️
serverless-aws-sdk-oldest-util 48.03% <0.00%> (+0.01%) ⬆️
serverless-azure-functions-eventhubs 38.46% <22.22%> (+<0.01%) ⬆️
serverless-azure-functions-servicebus 38.51% <22.22%> (+<0.01%) ⬆️
serverless-lambda 32.81% <28.57%> (-0.25%) ⬇️
test-optimization-cucumber-latest-7.0.0 50.36% <22.22%> (+0.20%) ⬆️
test-optimization-cucumber-latest-latest 52.98% <22.22%> (+0.30%) ⬆️
test-optimization-cucumber-oldest-7.0.0 50.29% <22.22%> (+0.20%) ⬆️
test-optimization-cypress-latest-12.0.0-commonJS 48.25% <22.22%> (+0.06%) ⬆️
test-optimization-cypress-latest-12.0.0-esm 48.28% <22.22%> (+0.06%) ⬆️
test-optimization-cypress-latest-14.5.4-commonJS 48.10% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-latest-14.5.4-esm 48.13% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-latest-latest-commonJS 48.60% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-latest-latest-esm 48.63% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-oldest-12.0.0-commonJS 48.29% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-oldest-12.0.0-esm 48.32% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-oldest-14.5.4-commonJS 48.14% <22.22%> (+0.09%) ⬆️
test-optimization-cypress-oldest-14.5.4-esm 48.17% <22.22%> (+0.09%) ⬆️
test-optimization-jest-latest-latest 54.39% <22.22%> (+0.09%) ⬆️
test-optimization-jest-latest-oldest 53.53% <22.22%> (+0.06%) ⬆️
test-optimization-jest-oldest-latest 54.40% <22.22%> (+0.09%) ⬆️
test-optimization-jest-oldest-oldest 53.49% <22.22%> (+0.09%) ⬆️
test-optimization-mocha-latest-latest 53.26% <22.22%> (+0.37%) ⬆️
test-optimization-mocha-latest-oldest 50.88% <22.22%> (+0.38%) ⬆️
test-optimization-mocha-oldest-latest 53.33% <22.22%> (+0.37%) ⬆️
test-optimization-mocha-oldest-oldest 50.82% <22.22%> (+0.38%) ⬆️
test-optimization-playwright-latest-latest-playwright-active-test-span 43.69% <22.22%> (+0.30%) ⬆️
test-optimization-playwright-latest-latest-playwright-atr 42.44% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-latest-latest-playwright-efd 42.70% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-latest-latest-playwright-final-status 42.93% <22.22%> (+0.15%) ⬆️
test-optimization-playwright-latest-latest-playwright-impacted-tests 42.33% <22.22%> (+0.01%) ⬆️
test-optimization-playwright-latest-latest-playwright-reporting 42.48% <22.22%> (+0.10%) ⬆️
test-optimization-playwright-latest-latest-playwright-test-management 44.42% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-latest-oldest-playwright-active-test-span 43.72% <22.22%> (+0.30%) ⬆️
test-optimization-playwright-latest-oldest-playwright-atr 42.62% <22.22%> (+0.13%) ⬆️
test-optimization-playwright-latest-oldest-playwright-efd 42.72% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-latest-oldest-playwright-final-status 42.96% <22.22%> (+0.15%) ⬆️
test-optimization-playwright-latest-oldest-playwright-impacted-tests 42.36% <22.22%> (+0.01%) ⬆️
test-optimization-playwright-latest-oldest-playwright-reporting 42.52% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-latest-oldest-playwright-test-management 44.47% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-oldest-latest-playwright-active-test-span 43.72% <22.22%> (+0.32%) ⬆️
test-optimization-playwright-oldest-latest-playwright-atr 42.47% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-oldest-latest-playwright-efd 42.72% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-oldest-latest-playwright-final-status 42.95% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-oldest-latest-playwright-impacted-tests 42.38% <22.22%> (+0.01%) ⬆️
test-optimization-playwright-oldest-latest-playwright-reporting 42.49% <22.22%> (+0.10%) ⬆️
test-optimization-playwright-oldest-latest-playwright-test-management 44.43% <22.22%> (+0.12%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-active-test-span 43.76% <22.22%> (+0.30%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-atr 42.66% <22.22%> (+0.13%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-efd 42.74% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-final-status 42.97% <22.22%> (+0.13%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-impacted-tests ?
test-optimization-playwright-oldest-oldest-playwright-reporting 42.53% <22.22%> (+0.11%) ⬆️
test-optimization-playwright-oldest-oldest-playwright-test-management 44.48% <22.22%> (+0.12%) ⬆️
test-optimization-selenium-latest 45.49% <22.22%> (-0.03%) ⬇️
test-optimization-selenium-oldest 44.98% <22.22%> (+<0.01%) ⬆️
test-optimization-testopt-active 47.00% <22.22%> (-0.06%) ⬇️
test-optimization-testopt-latest 46.96% <22.22%> (-0.06%) ⬇️
test-optimization-testopt-maintenance 47.00% <22.22%> (-0.06%) ⬇️
test-optimization-testopt-oldest 47.89% <22.22%> (+0.06%) ⬆️
test-optimization-vitest-latest 50.93% <22.22%> (+0.33%) ⬆️
test-optimization-vitest-oldest 47.66% <22.22%> (+0.57%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pr-commenter

pr-commenter Bot commented Mar 27, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-05-07 21:33:58

Comparing candidate commit f0615c5 in PR branch maximo/otlp-runtime-metrics-poc with baseline commit baeb045 in branch master.

Found 0 performance improvements and 1 performance regressions! Performance is the same for 1748 metrics, 95 unstable metrics.

scenario:shimmer-runtime-asyncdeclared-wrapfn-20

  • 🟥 cpu_user_time [+3.499ms; +7.565ms] or [+8.200%; +17.728%]

link04 added a commit to DataDog/system-tests that referenced this pull request Apr 9, 2026
New scenario OTLP_RUNTIME_METRICS that sets DD_METRICS_OTEL_ENABLED=true
alongside DD_RUNTIME_METRICS_ENABLED=true. Tests verify OTel-native metric
names (dotnet.*, jvm.*, go.*, v8js.*) appear in OTLP payloads and that
DD-proprietary names (runtime.dotnet.*, runtime.go.*) do not.

All languages marked as missing_feature in manifests until POC PRs are merged:
- .NET: DataDog/dd-trace-dotnet#8299
- Go: DataDog/dd-trace-go#4611
- Node.js: DataDog/dd-trace-js#7869
- Java: DataDog/dd-trace-java#10985

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@link04 link04 added open-telemetry ai-generated PR created with AI assistance semver-minor labels May 6, 2026
link04 and others added 15 commits May 7, 2026 09:42
Adds v8js.memory.heap.*, process.cpu.utilization, process.memory.usage,
nodejs.eventloop.delay.* as OTel instruments on the existing OTLP
metrics pipeline.

Routes to OTLP when config.otelMetricsEnabled is true, skipping
DogStatsD to avoid double-reporting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove unused sinon import
- Remove unused DEFAULT_INTERVAL constant
- Use ternary in router per lint rule
- Break long lines under 120 char limit
- Add trailing commas per style

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds the mapped metric (nodejs.eventloop.utilization) and higher
percentiles. Fixes lint errors. Total: 13 OTel metrics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add assertions for nodejs.eventloop.delay.p90, p99, and
nodejs.eventloop.utilization. Verify disabled state for
new event loop metrics. Matches existing runtime_metrics.spec.js
pattern of verifying every metric by name.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The rest of the tracer (agent writer) calls increment(), gauge(), etc.
on the runtime metrics module. When OTLP replaces DogStatsD, these
methods must exist as noops to avoid TypeError crashes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Assert exactly 13 instruments
- Assert no DD-proprietary names (runtime.node.*)
- Matches .NET PR #8457 test pattern

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dd-trace-js custom MeterProvider does not implement
addBatchObservableCallback. Switch to per-instrument addCallback
which is the pattern used by all existing OTel metrics in the repo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mirrors the .NET PR's SystemRuntimeMetricsFlowThroughOtlpPipeline test:
builds a real MeterProvider + PeriodicMetricReader, registers our 13
runtime instruments via otlp_runtime_metrics.start(), forces a flush,
and asserts the captured export contains all expected metric names,
the correct scope name, and positive observed values.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Audited each instrument against the upstream Node-specific OTel semantic
convention YAMLs (model/v8js, model/nodejs, model/process) and the
@opentelemetry/instrumentation-runtime-node community implementation.
Findings + fixes:

- 5 memory metrics had wrong instrument type. v8js.memory.heap.used,
  v8js.memory.heap.limit, v8js.memory.heap.space.available_size,
  v8js.memory.heap.space.physical_size, and process.memory.usage are
  updowncounters per spec (state metrics that can go up or down).
  Switched from createObservableGauge to createObservableUpDownCounter.
  This matches the spec; OTel contrib still uses gauge here, mirroring
  the same drift the .NET PR addressed.

- nodejs.eventloop.delay.* used unit 'ns' and multiplied by 1e6.
  perf_hooks.monitorEventLoopDelay returns nanoseconds, so the old
  conversion inflated values by 1e6. Switched to unit 's' and divide
  by 1e9, matching both the spec and OTel contrib's
  EventLoopDelayCollector.

- nodejs.eventloop.utilization reported the cumulative-since-startup
  ratio, which converges to an average rather than reflecting recent
  utilization. Now computes a delta vs the last sample, mirroring
  OTel contrib's EventLoopUtilizationCollector.

Tests now cover instrument types per metric, the unit fixes, and the
sum-vs-gauge wire shape after the OtlpTransformer. End-to-end flow
test is unchanged in shape but now passes a fourth assertion that
exercises the OTLP serialization path.
The Node.js OTel semantic conventions list 7 event loop delay metrics
(min, max, mean, stddev, p50, p90, p99). We were emitting 6, missing
stddev. The histogram already exposes the value, so this is a single
ObservableGauge in seconds, matching the unit and instrument type the
spec defines and the @opentelemetry/instrumentation-runtime-node
contrib package uses.

Bumps unit-test and pipeline-flow expected counts to 14.

Co-authored-by: Cursor <cursoragent@cursor.com>
…NERS

The previous layout put new test files under test/runtime_metrics/, a new
subdirectory that fell outside both the test:trace:core glob and any
CODEOWNERS rule. Existing convention is flat: src/runtime_metrics/foo.js
is tested by test/foo.spec.js, mirroring how runtime_metrics.spec.js
sits next to runtime_metrics.js's test root, not in a subdir.

- Move both spec files up one level (path adjusts in proxyquire/require).
- CODEOWNERS gets two specific entries paralleling the existing
  runtime_metrics.spec.js line, owned by apm-sdk-capabilities-js.
- Picks up packages/dd-trace/test/*.spec.js glob in test:trace:core
  automatically, so verify-exercised-tests stops flagging.
Replaces the per-file entry for runtime_metrics.spec.js (and would-be
extra lines for otlp_runtime_metrics.spec.js and .flow.spec.js) with a
single glob /packages/dd-trace/test/*runtime_metrics*.spec.js owned by
apm-sdk-capabilities-js. Net: -2 lines, same coverage.
…ec.js

Three things at once, all keyed off the existing repo trend rather than
adding new infrastructure:

1. Move the OTLP unit + flow tests into runtime_metrics.spec.js (the
   existing test file for the runtime_metrics module) instead of the
   separate test/runtime_metrics/*.spec.js files I had under a new
   subdirectory. Drops the new directory, no CODEOWNERS / package.json
   glob update needed — the existing entry covers everything.

2. Trim from 13 OTLP tests to 4 with the same coverage:
   - registers all 14 OTel-native metrics with spec-correct types,
     units, and callbacks (locks in the spec partition)
   - observes positive values + emits required attributes
     (v8js.heap.space.name, process.cpu.state)
   - skips event loop metrics when disabled and is restartable
   - flushes all 14 metrics with correct wire shape and scope name
     end-to-end through MeterProvider + PeriodicMetricReader +
     OtlpTransformer

   Each one consolidates a previously per-behavior assertion. Same
   spec coverage, ~210 fewer lines.

3. Add JSDoc to start(config) / stop() in otlp_runtime_metrics.js per
   CLAUDE.md.
Source directory was never owned (legacy runtime_metrics.js included).
Mergegate flagged the new otlp_runtime_metrics.js as unowned. One
directory entry covers both the legacy file and the new OTLP module,
parallels the existing test-side ownership rule, owned by the same
team that owns the corresponding test file.
Master invokes runtimeMetrics.start before initializeOpenTelemetryMetrics,
so when our OTLP runtime metrics module calls metrics.getMeterProvider(),
it gets the noop provider — instruments register against it and never
export. Move the OTel logs/metrics init blocks to fire before
runtimeMetrics.start.
@link04 link04 force-pushed the maximo/otlp-runtime-metrics-poc branch from b037585 to 78a5949 Compare May 7, 2026 13:47
link04 added 3 commits May 7, 2026 15:30
- Drop verbose JSDoc and section markers; keep only comments that
  explain non-obvious behavior (ns→s conversion, noop method contract,
  ELU baseline capture).
- Drop cross-language references in test descriptions.
- Extract three multi-callsite helpers (defineHeapStat,
  defineHeapSpaceStat, defineEventLoopDelay) — the event-loop helper
  collapses 7 near-identical blocks. Single-callsite cases stay inline.
track, boolean, histogram, count, gauge each had zero production
callers across the whole codebase. They were mirroring the legacy
runtime_metrics.js interface for safety — but per the no-fallbacks-for-
scenarios-that-cant-happen rule, leaving them in is just dead weight.
Only increment and decrement remain (17 + 6 real callers in
opentracing/span.js and opentracing/tracer.js).
- Fix dispatcher reading config.otelMetricsEnabled (renamed to
  config.DD_METRICS_OTEL_ENABLED in master 7209b4f).
- Cache os.cpus().length once at start instead of per-callback.
- Drop unreachable null guard on getMeterProvider() (always returns at
  least the noop provider).
- Tighten increment/decrement noop comment.
- Add JSDoc with v8/perf_hooks types on the three file-private helpers
  per CLAUDE.md "all new methods should receive a full JSDoc comment".
@link04 link04 closed this May 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant