dd-trace 5.80.0 → 5.82.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/LICENSE-3rdparty.csv +79 -88
- package/ext/tags.d.ts +1 -0
- package/ext/tags.js +1 -0
- package/index.d.ts +42 -35
- package/loader-hook.mjs +16 -4
- package/package.json +33 -56
- package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
- package/packages/datadog-esbuild/index.js +44 -26
- package/packages/datadog-esbuild/src/utils.js +14 -2
- package/packages/datadog-instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/aerospike.js +3 -2
- package/packages/datadog-instrumentations/src/ai.js +2 -2
- package/packages/datadog-instrumentations/src/amqp10.js +1 -1
- package/packages/datadog-instrumentations/src/amqplib.js +4 -4
- package/packages/datadog-instrumentations/src/anthropic.js +14 -2
- package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
- package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
- package/packages/datadog-instrumentations/src/apollo.js +3 -2
- package/packages/datadog-instrumentations/src/avsc.js +1 -1
- package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
- package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
- package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
- package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
- package/packages/datadog-instrumentations/src/bluebird.js +1 -1
- package/packages/datadog-instrumentations/src/bullmq.js +11 -0
- package/packages/datadog-instrumentations/src/bunyan.js +1 -1
- package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
- package/packages/datadog-instrumentations/src/child_process.js +2 -2
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
- package/packages/datadog-instrumentations/src/couchbase.js +1 -1
- package/packages/datadog-instrumentations/src/crypto.js +1 -1
- package/packages/datadog-instrumentations/src/cucumber.js +12 -13
- package/packages/datadog-instrumentations/src/cypress.js +1 -1
- package/packages/datadog-instrumentations/src/dns.js +1 -1
- package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
- package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
- package/packages/datadog-instrumentations/src/express.js +1 -1
- package/packages/datadog-instrumentations/src/find-my-way.js +6 -5
- package/packages/datadog-instrumentations/src/fs.js +1 -1
- package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
- package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
- package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
- package/packages/datadog-instrumentations/src/google-genai.js +120 -0
- package/packages/datadog-instrumentations/src/graphql.js +21 -1
- package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
- package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +5 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -1
- package/packages/datadog-instrumentations/src/helpers/register.js +12 -5
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +27 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +152 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +6 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langchain.js +237 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.js +9 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +11 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +139 -0
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
- package/packages/datadog-instrumentations/src/hono.js +55 -10
- package/packages/datadog-instrumentations/src/ioredis.js +1 -1
- package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
- package/packages/datadog-instrumentations/src/jest.js +2 -2
- package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
- package/packages/datadog-instrumentations/src/knex.js +1 -1
- package/packages/datadog-instrumentations/src/langchain.js +3 -109
- package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
- package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
- package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
- package/packages/datadog-instrumentations/src/lodash.js +1 -2
- package/packages/datadog-instrumentations/src/mariadb.js +1 -2
- package/packages/datadog-instrumentations/src/memcached.js +1 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
- package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
- package/packages/datadog-instrumentations/src/mongodb.js +1 -1
- package/packages/datadog-instrumentations/src/mongoose.js +1 -1
- package/packages/datadog-instrumentations/src/mquery.js +1 -1
- package/packages/datadog-instrumentations/src/mysql.js +1 -1
- package/packages/datadog-instrumentations/src/mysql2.js +2 -2
- package/packages/datadog-instrumentations/src/net.js +1 -1
- package/packages/datadog-instrumentations/src/next.js +1 -1
- package/packages/datadog-instrumentations/src/nyc.js +1 -1
- package/packages/datadog-instrumentations/src/openai.js +2 -2
- package/packages/datadog-instrumentations/src/opensearch.js +1 -1
- package/packages/datadog-instrumentations/src/oracledb.js +1 -1
- package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
- package/packages/datadog-instrumentations/src/pg.js +3 -3
- package/packages/datadog-instrumentations/src/pino.js +1 -1
- package/packages/datadog-instrumentations/src/playwright.js +46 -17
- package/packages/datadog-instrumentations/src/prisma.js +52 -37
- package/packages/datadog-instrumentations/src/process.js +1 -1
- package/packages/datadog-instrumentations/src/promise-js.js +1 -1
- package/packages/datadog-instrumentations/src/promise.js +1 -1
- package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
- package/packages/datadog-instrumentations/src/q.js +1 -1
- package/packages/datadog-instrumentations/src/redis.js +1 -1
- package/packages/datadog-instrumentations/src/rhea.js +1 -1
- package/packages/datadog-instrumentations/src/router.js +1 -1
- package/packages/datadog-instrumentations/src/selenium.js +4 -2
- package/packages/datadog-instrumentations/src/sequelize.js +1 -2
- package/packages/datadog-instrumentations/src/sharedb.js +1 -1
- package/packages/datadog-instrumentations/src/tedious.js +1 -1
- package/packages/datadog-instrumentations/src/undici.js +4 -4
- package/packages/datadog-instrumentations/src/url.js +1 -1
- package/packages/datadog-instrumentations/src/vitest.js +1 -1
- package/packages/datadog-instrumentations/src/vm.js +1 -1
- package/packages/datadog-instrumentations/src/when.js +1 -1
- package/packages/datadog-instrumentations/src/winston.js +1 -1
- package/packages/datadog-instrumentations/src/ws.js +38 -19
- package/packages/datadog-plugin-amqp10/src/index.js +1 -1
- package/packages/datadog-plugin-amqplib/src/index.js +1 -1
- package/packages/datadog-plugin-anthropic/src/index.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
- package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
- package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
- package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
- package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
- package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
- package/packages/datadog-plugin-bullmq/src/index.js +18 -0
- package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
- package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +23 -2
- package/packages/datadog-plugin-cypress/src/plugin.js +2 -2
- package/packages/datadog-plugin-cypress/src/support.js +73 -31
- package/packages/datadog-plugin-express/src/index.js +1 -1
- package/packages/datadog-plugin-fastify/src/index.js +1 -1
- package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
- package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
- package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
- package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
- package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
- package/packages/datadog-plugin-google-genai/src/index.js +17 -0
- package/packages/datadog-plugin-google-genai/src/tracing.js +41 -0
- package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +5 -4
- package/packages/datadog-plugin-grpc/src/index.js +1 -1
- package/packages/datadog-plugin-http/src/client.js +2 -1
- package/packages/datadog-plugin-http/src/index.js +25 -5
- package/packages/datadog-plugin-http2/src/client.js +2 -2
- package/packages/datadog-plugin-http2/src/index.js +1 -1
- package/packages/datadog-plugin-jest/src/util.js +1 -1
- package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
- package/packages/datadog-plugin-langchain/src/index.js +1 -1
- package/packages/datadog-plugin-langchain/src/tracing.js +7 -3
- package/packages/datadog-plugin-moleculer/src/index.js +1 -1
- package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
- package/packages/datadog-plugin-next/src/index.js +11 -3
- package/packages/datadog-plugin-openai/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
- package/packages/datadog-plugin-openai/src/tracing.js +2 -2
- package/packages/datadog-plugin-rhea/src/index.js +1 -1
- package/packages/datadog-plugin-ws/src/close.js +56 -3
- package/packages/datadog-plugin-ws/src/index.js +4 -0
- package/packages/datadog-plugin-ws/src/producer.js +39 -4
- package/packages/datadog-plugin-ws/src/receiver.js +39 -3
- package/packages/datadog-plugin-ws/src/server.js +13 -1
- package/packages/datadog-plugin-ws/src/util.js +107 -0
- package/packages/datadog-shimmer/src/shimmer.js +2 -2
- package/packages/dd-trace/src/aiguard/sdk.js +21 -13
- package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
- package/packages/dd-trace/src/appsec/graphql.js +2 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
- package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
- package/packages/dd-trace/src/appsec/iast/index.js +5 -5
- package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -16
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -4
- package/packages/dd-trace/src/appsec/index.js +8 -8
- package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
- package/packages/dd-trace/src/appsec/rc-products.js +10 -0
- package/packages/dd-trace/src/appsec/recommended.json +230 -3
- package/packages/dd-trace/src/appsec/remote_config.js +177 -0
- package/packages/dd-trace/src/appsec/reporter.js +3 -7
- package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
- package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
- package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
- package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
- package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
- package/packages/dd-trace/src/appsec/waf/index.js +17 -3
- package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
- package/packages/dd-trace/src/azure_metadata.js +8 -2
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +8 -6
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
- package/packages/dd-trace/src/config/remote_config.js +34 -0
- package/packages/dd-trace/src/config.js +109 -34
- package/packages/dd-trace/src/config_defaults.js +16 -3
- package/packages/dd-trace/src/constants.js +5 -0
- package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
- package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
- package/packages/dd-trace/src/datastreams/encoding.js +23 -6
- package/packages/dd-trace/src/datastreams/index.js +1 -1
- package/packages/dd-trace/src/datastreams/pathway.js +41 -2
- package/packages/dd-trace/src/datastreams/processor.js +3 -3
- package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
- package/packages/dd-trace/src/datastreams/writer.js +2 -2
- package/packages/dd-trace/src/debugger/config.js +1 -0
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +15 -5
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/index.js +37 -17
- package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +2 -0
- package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +24 -18
- package/packages/dd-trace/src/debugger/devtools_client/send.js +21 -11
- package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +103 -15
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +25 -0
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +56 -25
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +64 -23
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/symbols.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +404 -0
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
- package/packages/dd-trace/src/debugger/devtools_client/status.js +3 -3
- package/packages/dd-trace/src/debugger/index.js +2 -2
- package/packages/dd-trace/src/dogstatsd.js +3 -2
- package/packages/dd-trace/src/encode/0.4.js +1 -1
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
- package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
- package/packages/dd-trace/src/encode/span-stats.js +13 -2
- package/packages/dd-trace/src/exporter.js +2 -2
- package/packages/dd-trace/src/exporters/agent/index.js +1 -1
- package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
- package/packages/dd-trace/src/exporters/common/request.js +2 -2
- package/packages/dd-trace/src/exporters/common/writer.js +1 -1
- package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
- package/packages/dd-trace/src/external-logger/src/index.js +1 -2
- package/packages/dd-trace/src/flare/index.js +1 -1
- package/packages/dd-trace/src/guardrails/index.js +6 -3
- package/packages/dd-trace/src/histogram.js +1 -1
- package/packages/dd-trace/src/id.js +60 -0
- package/packages/dd-trace/src/index.js +1 -1
- package/packages/dd-trace/src/lambda/handler.js +4 -4
- package/packages/dd-trace/src/lambda/index.js +1 -1
- package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
- package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
- package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
- package/packages/dd-trace/src/llmobs/index.js +8 -9
- package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
- package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
- package/packages/dd-trace/src/llmobs/plugins/genai/index.js +104 -0
- package/packages/dd-trace/src/llmobs/plugins/genai/util.js +486 -0
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +2 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
- package/packages/dd-trace/src/llmobs/plugins/{openai.js → openai/index.js} +63 -6
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +126 -0
- package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +20 -22
- package/packages/dd-trace/src/llmobs/span_processor.js +15 -14
- package/packages/dd-trace/src/llmobs/tagger.js +4 -0
- package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
- package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
- package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
- package/packages/dd-trace/src/log/index.js +1 -1
- package/packages/dd-trace/src/noop/proxy.js +2 -2
- package/packages/dd-trace/src/noop/span.js +1 -1
- package/packages/dd-trace/src/openfeature/index.js +2 -2
- package/packages/dd-trace/src/openfeature/noop.js +14 -14
- package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
- package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
- package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
- package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
- package/packages/dd-trace/src/opentelemetry/logs/index.js +2 -2
- package/packages/dd-trace/src/opentelemetry/logs/logger.js +3 -2
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +5 -3
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +17 -16
- package/packages/dd-trace/src/opentelemetry/metrics/constants.js +34 -0
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +81 -0
- package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +225 -0
- package/packages/dd-trace/src/opentelemetry/metrics/meter.js +171 -0
- package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +54 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +62 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +251 -0
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +557 -0
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +10 -18
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +47 -32
- package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
- package/packages/dd-trace/src/opentelemetry/span.js +3 -3
- package/packages/dd-trace/src/opentelemetry/tracer.js +4 -4
- package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
- package/packages/dd-trace/src/opentracing/span.js +3 -3
- package/packages/dd-trace/src/opentracing/tracer.js +5 -5
- package/packages/dd-trace/src/payload-tagging/index.js +8 -4
- package/packages/dd-trace/src/plugin_manager.js +5 -3
- package/packages/dd-trace/src/plugins/apollo.js +1 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
- package/packages/dd-trace/src/plugins/database.js +1 -1
- package/packages/dd-trace/src/plugins/index.js +6 -1
- package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
- package/packages/dd-trace/src/plugins/outbound.js +1 -1
- package/packages/dd-trace/src/plugins/tracing.js +1 -1
- package/packages/dd-trace/src/plugins/util/ci.js +1 -1
- package/packages/dd-trace/src/plugins/util/git.js +8 -8
- package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
- package/packages/dd-trace/src/plugins/util/test.js +27 -27
- package/packages/dd-trace/src/plugins/util/url.js +119 -1
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
- package/packages/dd-trace/src/plugins/util/web.js +18 -46
- package/packages/dd-trace/src/priority_sampler.js +15 -16
- package/packages/dd-trace/src/process-tags/index.js +83 -0
- package/packages/dd-trace/src/profiling/config.js +33 -22
- package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
- package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
- package/packages/dd-trace/src/profiling/index.js +1 -1
- package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
- package/packages/dd-trace/src/profiling/profiler.js +4 -5
- package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/events.js +11 -2
- package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
- package/packages/dd-trace/src/proxy.js +17 -18
- package/packages/dd-trace/src/rate_limiter.js +1 -1
- package/packages/dd-trace/src/remote_config/index.js +541 -137
- package/packages/dd-trace/src/require-package-json.js +1 -1
- package/packages/dd-trace/src/ritm.js +50 -27
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
- package/packages/dd-trace/src/serverless.js +16 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
- package/packages/dd-trace/src/span_format.js +10 -5
- package/packages/dd-trace/src/span_processor.js +8 -3
- package/packages/dd-trace/src/span_stats.js +21 -8
- package/packages/dd-trace/src/spanleak.js +1 -1
- package/packages/dd-trace/src/standalone/index.js +1 -1
- package/packages/dd-trace/src/startup-log.js +3 -3
- package/packages/dd-trace/src/supported-configurations.json +16 -0
- package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
- package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
- package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +22 -8
- package/packages/dd-trace/src/tracer.js +3 -3
- package/packages/dd-trace/src/tracer_metadata.js +19 -15
- package/vendor/dist/@datadog/sketches-js/LICENSE +39 -0
- package/vendor/dist/@datadog/sketches-js/index.js +1 -0
- package/vendor/dist/@datadog/source-map/LICENSE +28 -0
- package/vendor/dist/@datadog/source-map/index.js +1 -0
- package/vendor/dist/@isaacs/ttlcache/LICENSE +55 -0
- package/vendor/dist/@isaacs/ttlcache/index.js +1 -0
- package/vendor/dist/@opentelemetry/core/LICENSE +201 -0
- package/vendor/dist/@opentelemetry/core/index.js +1 -0
- package/vendor/dist/@opentelemetry/resources/LICENSE +201 -0
- package/vendor/dist/@opentelemetry/resources/index.js +1 -0
- package/vendor/dist/astring/LICENSE +19 -0
- package/vendor/dist/astring/index.js +1 -0
- package/vendor/dist/crypto-randomuuid/index.js +1 -0
- package/vendor/dist/escape-string-regexp/LICENSE +9 -0
- package/vendor/dist/escape-string-regexp/index.js +1 -0
- package/vendor/dist/esquery/LICENSE +24 -0
- package/vendor/dist/esquery/index.js +1 -0
- package/vendor/dist/ignore/LICENSE +21 -0
- package/vendor/dist/ignore/index.js +1 -0
- package/vendor/dist/istanbul-lib-coverage/LICENSE +24 -0
- package/vendor/dist/istanbul-lib-coverage/index.js +1 -0
- package/vendor/dist/jest-docblock/LICENSE +21 -0
- package/vendor/dist/jest-docblock/index.js +1 -0
- package/vendor/dist/jsonpath-plus/LICENSE +22 -0
- package/vendor/dist/jsonpath-plus/index.js +1 -0
- package/vendor/dist/limiter/LICENSE +19 -0
- package/vendor/dist/limiter/index.js +1 -0
- package/vendor/dist/lodash.sortby/LICENSE +47 -0
- package/vendor/dist/lodash.sortby/index.js +1 -0
- package/vendor/dist/lru-cache/LICENSE +15 -0
- package/vendor/dist/lru-cache/index.js +1 -0
- package/vendor/dist/meriyah/LICENSE +7 -0
- package/vendor/dist/meriyah/index.js +1 -0
- package/vendor/dist/module-details-from-path/LICENSE +21 -0
- package/vendor/dist/module-details-from-path/index.js +1 -0
- package/vendor/dist/mutexify/promise/LICENSE +21 -0
- package/vendor/dist/mutexify/promise/index.js +1 -0
- package/vendor/dist/opentracing/LICENSE +201 -0
- package/vendor/dist/opentracing/binary_carrier.d.ts +11 -0
- package/vendor/dist/opentracing/constants.d.ts +61 -0
- package/vendor/dist/opentracing/examples/demo/demo.d.ts +2 -0
- package/vendor/dist/opentracing/ext/tags.d.ts +90 -0
- package/vendor/dist/opentracing/functions.d.ts +20 -0
- package/vendor/dist/opentracing/global_tracer.d.ts +14 -0
- package/vendor/dist/opentracing/index.d.ts +12 -0
- package/vendor/dist/opentracing/index.js +1 -0
- package/vendor/dist/opentracing/mock_tracer/index.d.ts +5 -0
- package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +13 -0
- package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +16 -0
- package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +50 -0
- package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +26 -0
- package/vendor/dist/opentracing/noop.d.ts +8 -0
- package/vendor/dist/opentracing/reference.d.ts +33 -0
- package/vendor/dist/opentracing/span.d.ts +147 -0
- package/vendor/dist/opentracing/span_context.d.ts +26 -0
- package/vendor/dist/opentracing/test/api_compatibility.d.ts +16 -0
- package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +3 -0
- package/vendor/dist/opentracing/test/noop_implementation.d.ts +4 -0
- package/vendor/dist/opentracing/test/opentracing_api.d.ts +3 -0
- package/vendor/dist/opentracing/test/unittest.d.ts +2 -0
- package/vendor/dist/opentracing/tracer.d.ts +127 -0
- package/vendor/dist/path-to-regexp/LICENSE +21 -0
- package/vendor/dist/path-to-regexp/index.js +1 -0
- package/vendor/dist/pprof-format/LICENSE +8 -0
- package/vendor/dist/pprof-format/index.js +1 -0
- package/vendor/dist/protobufjs/LICENSE +39 -0
- package/vendor/dist/protobufjs/index.js +1 -0
- package/vendor/dist/protobufjs/minimal/LICENSE +39 -0
- package/vendor/dist/protobufjs/minimal/index.js +1 -0
- package/vendor/dist/retry/LICENSE +21 -0
- package/vendor/dist/retry/index.js +1 -0
- package/vendor/dist/rfdc/LICENSE +15 -0
- package/vendor/dist/rfdc/index.js +1 -0
- package/vendor/dist/semifies/LICENSE +201 -0
- package/vendor/dist/semifies/index.js +1 -0
- package/vendor/dist/shell-quote/LICENSE +24 -0
- package/vendor/dist/shell-quote/index.js +1 -0
- package/vendor/dist/source-map/LICENSE +28 -0
- package/vendor/dist/source-map/index.js +1 -0
- package/vendor/dist/source-map/lib/util/LICENSE +28 -0
- package/vendor/dist/source-map/lib/util/index.js +1 -0
- package/vendor/dist/source-map/mappings.wasm +0 -0
- package/vendor/dist/tlhunter-sorted-set/LICENSE +21 -0
- package/vendor/dist/tlhunter-sorted-set/index.js +1 -0
- package/vendor/dist/ttl-set/LICENSE +21 -0
- package/vendor/dist/ttl-set/index.js +1 -0
- package/packages/dd-trace/src/remote_config/manager.js +0 -368
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const LangChainLLMObsHandler = require('.')
|
|
4
3
|
const LLMObsTagger = require('../../../tagger')
|
|
5
4
|
const { spanHasError } = require('../../../util')
|
|
5
|
+
const LangChainLLMObsHandler = require('.')
|
|
6
6
|
|
|
7
7
|
class LangChainLLMObsEmbeddingHandler extends LangChainLLMObsHandler {
|
|
8
8
|
setMetaTags ({ span, inputs, results }) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const LangChainLLMObsHandler = require('.')
|
|
4
3
|
const LLMObsTagger = require('../../../tagger')
|
|
5
4
|
const { spanHasError } = require('../../../util')
|
|
5
|
+
const LangChainLLMObsHandler = require('.')
|
|
6
6
|
|
|
7
7
|
class LangChainLLMObsLlmHandler extends LangChainLLMObsHandler {
|
|
8
8
|
setMetaTags ({ span, inputs, results }) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const LangChainLLMObsHandler = require('.')
|
|
4
3
|
const { spanHasError } = require('../../../util')
|
|
4
|
+
const LangChainLLMObsHandler = require('.')
|
|
5
5
|
|
|
6
6
|
class LangChainLLMObsVectorStoreHandler extends LangChainLLMObsHandler {
|
|
7
7
|
setMetaTags ({ span, inputs, results }) {
|
|
@@ -174,13 +174,13 @@ class BaseLLMGeneratePlugin extends BaseLangChainLLMObsPlugin {
|
|
|
174
174
|
class EmbeddingsEmbedQueryPlugin extends BaseLangChainLLMObsPlugin {
|
|
175
175
|
static id = 'llmobs_langchain_embeddings_embed_query'
|
|
176
176
|
static lcType = 'embedding'
|
|
177
|
-
static prefix = 'tracing:
|
|
177
|
+
static prefix = 'tracing:orchestrion:@langchain/core:Embeddings_embedQuery'
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
class EmbeddingsEmbedDocumentsPlugin extends BaseLangChainLLMObsPlugin {
|
|
181
181
|
static id = 'llmobs_langchain_embeddings_embed_documents'
|
|
182
182
|
static lcType = 'embedding'
|
|
183
|
-
static prefix = 'tracing:
|
|
183
|
+
static prefix = 'tracing:orchestrion:@langchain/core:Embeddings_embedDocuments'
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
class ToolInvokePlugin extends BaseLangChainLLMObsPlugin {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const INPUT_TYPE_IMAGE = 'input_image'
|
|
4
|
+
const INPUT_TYPE_FILE = 'input_file'
|
|
5
|
+
const INPUT_TYPE_TEXT = 'input_text'
|
|
6
|
+
|
|
7
|
+
const IMAGE_FALLBACK = '[image]'
|
|
8
|
+
const FILE_FALLBACK = '[file]'
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
INPUT_TYPE_IMAGE,
|
|
12
|
+
INPUT_TYPE_FILE,
|
|
13
|
+
INPUT_TYPE_TEXT,
|
|
14
|
+
IMAGE_FALLBACK,
|
|
15
|
+
FILE_FALLBACK
|
|
16
|
+
}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const LLMObsPlugin = require('
|
|
3
|
+
const LLMObsPlugin = require('../base')
|
|
4
|
+
const {
|
|
5
|
+
PROMPT_TRACKING_INSTRUMENTATION_METHOD,
|
|
6
|
+
PROMPT_MULTIMODAL,
|
|
7
|
+
INSTRUMENTATION_METHOD_AUTO
|
|
8
|
+
} = require('../../constants/tags')
|
|
9
|
+
const {
|
|
10
|
+
extractChatTemplateFromInstructions,
|
|
11
|
+
normalizePromptVariables,
|
|
12
|
+
extractTextFromContentItem,
|
|
13
|
+
hasMultimodalInputs
|
|
14
|
+
} = require('./utils')
|
|
4
15
|
|
|
5
16
|
const allowedParamKeys = new Set([
|
|
6
17
|
'max_output_tokens',
|
|
@@ -115,6 +126,10 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
|
|
|
115
126
|
metrics.cacheReadTokens = cacheReadTokens
|
|
116
127
|
}
|
|
117
128
|
}
|
|
129
|
+
// Reasoning tokens - Responses API returns `output_tokens_details`, `completion_tokens_details`
|
|
130
|
+
const reasoningOutputObject = tokenUsage.output_tokens_details ?? tokenUsage.completion_tokens_details
|
|
131
|
+
const reasoningOutputTokens = reasoningOutputObject?.reasoning_tokens ?? 0
|
|
132
|
+
if (reasoningOutputTokens !== undefined) metrics.reasoningOutputTokens = reasoningOutputTokens
|
|
118
133
|
}
|
|
119
134
|
|
|
120
135
|
return metrics
|
|
@@ -221,7 +236,8 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
|
|
|
221
236
|
#tagResponse (span, inputs, response, error) {
|
|
222
237
|
// Tag metadata - use allowlist approach for request parameters
|
|
223
238
|
|
|
224
|
-
const {
|
|
239
|
+
const { model, ...parameters } = inputs
|
|
240
|
+
let input = inputs.input
|
|
225
241
|
|
|
226
242
|
// Create input messages
|
|
227
243
|
const inputMessages = []
|
|
@@ -231,10 +247,33 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
|
|
|
231
247
|
inputMessages.push({ role: 'system', content: inputs.instructions })
|
|
232
248
|
}
|
|
233
249
|
|
|
250
|
+
// For reusable prompts, use response.instructions if no explicit input is provided
|
|
251
|
+
if (!input && inputs.prompt && response?.instructions) {
|
|
252
|
+
input = response.instructions
|
|
253
|
+
}
|
|
254
|
+
|
|
234
255
|
// Handle input - can be string or array of mixed messages
|
|
235
256
|
if (Array.isArray(input)) {
|
|
236
257
|
for (const item of input) {
|
|
237
|
-
if (item.type === '
|
|
258
|
+
if (item.type === 'message') {
|
|
259
|
+
// Handle instruction messages (from response.instructions for reusable prompts)
|
|
260
|
+
const role = item.role
|
|
261
|
+
if (!role) continue
|
|
262
|
+
|
|
263
|
+
let content = ''
|
|
264
|
+
if (Array.isArray(item.content)) {
|
|
265
|
+
const textParts = item.content
|
|
266
|
+
.map(extractTextFromContentItem)
|
|
267
|
+
.filter(Boolean)
|
|
268
|
+
content = textParts.join('')
|
|
269
|
+
} else if (typeof item.content === 'string') {
|
|
270
|
+
content = item.content
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (content) {
|
|
274
|
+
inputMessages.push({ role, content })
|
|
275
|
+
}
|
|
276
|
+
} else if (item.type === 'function_call') {
|
|
238
277
|
// Function call: convert to message with tool_calls
|
|
239
278
|
// Parse arguments if it's a JSON string
|
|
240
279
|
let parsedArgs = item.arguments
|
|
@@ -380,6 +419,27 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
|
|
|
380
419
|
|
|
381
420
|
this._tagger.tagLLMIO(span, inputMessages, outputMessages)
|
|
382
421
|
|
|
422
|
+
// Handle prompt tracking for reusable prompts
|
|
423
|
+
if (inputs.prompt && response?.prompt) {
|
|
424
|
+
const { id, version } = response.prompt // ResponsePrompt
|
|
425
|
+
// TODO: Add proper tagger API for prompt metadata
|
|
426
|
+
if (id && version) {
|
|
427
|
+
const normalizedVariables = normalizePromptVariables(inputs.prompt.variables)
|
|
428
|
+
const chatTemplate = extractChatTemplateFromInstructions(response.instructions, normalizedVariables)
|
|
429
|
+
this._tagger._setTag(span, '_ml_obs.meta.input.prompt', {
|
|
430
|
+
id,
|
|
431
|
+
version,
|
|
432
|
+
variables: normalizedVariables,
|
|
433
|
+
chat_template: chatTemplate
|
|
434
|
+
})
|
|
435
|
+
const tags = { [PROMPT_TRACKING_INSTRUMENTATION_METHOD]: INSTRUMENTATION_METHOD_AUTO }
|
|
436
|
+
if (hasMultimodalInputs(inputs.prompt.variables)) {
|
|
437
|
+
tags[PROMPT_MULTIMODAL] = 'true'
|
|
438
|
+
}
|
|
439
|
+
this._tagger.tagSpanTags(span, tags)
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
383
443
|
const outputMetadata = {}
|
|
384
444
|
|
|
385
445
|
// Add fields from response object (convert numbers to floats)
|
|
@@ -388,9 +448,6 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
|
|
|
388
448
|
if (response.tool_choice !== undefined) outputMetadata.tool_choice = response.tool_choice
|
|
389
449
|
if (response.truncation !== undefined) outputMetadata.truncation = response.truncation
|
|
390
450
|
if (response.text !== undefined) outputMetadata.text = response.text
|
|
391
|
-
if (response.usage?.output_tokens_details?.reasoning_tokens !== undefined) {
|
|
392
|
-
outputMetadata.reasoning_tokens = response.usage.output_tokens_details.reasoning_tokens
|
|
393
|
-
}
|
|
394
451
|
|
|
395
452
|
this._tagger.tagMetadata(span, outputMetadata) // update the metadata with the output metadata
|
|
396
453
|
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
INPUT_TYPE_IMAGE,
|
|
5
|
+
INPUT_TYPE_FILE,
|
|
6
|
+
IMAGE_FALLBACK,
|
|
7
|
+
FILE_FALLBACK
|
|
8
|
+
} = require('./constants')
|
|
9
|
+
|
|
10
|
+
const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Extracts chat templates from OpenAI response instructions by replacing variable values with placeholders.
|
|
14
|
+
*
|
|
15
|
+
* Performs reverse templating: reconstructs the template by replacing actual values with {{variable_name}}.
|
|
16
|
+
* For images/files: uses {{variable_name}} when values are available, falls back to [image]/[file] when stripped.
|
|
17
|
+
*
|
|
18
|
+
* @param {Array<object>} instructions - From Response.instructions (array of ResponseInputMessageItem)
|
|
19
|
+
* @param {Record<string, string>} variables - Normalized variables (output of normalizePromptVariables)
|
|
20
|
+
* @returns {Array<{role: string, content: string}>} Chat template with placeholders
|
|
21
|
+
*/
|
|
22
|
+
function extractChatTemplateFromInstructions (instructions, variables) {
|
|
23
|
+
if (!Array.isArray(instructions) || !variables) return []
|
|
24
|
+
|
|
25
|
+
const chatTemplate = []
|
|
26
|
+
|
|
27
|
+
// Build map of values to placeholders - exclude fallback markers so they remain as-is
|
|
28
|
+
const valueToPlaceholder = {}
|
|
29
|
+
for (const [varName, varValue] of Object.entries(variables)) {
|
|
30
|
+
// Exclude fallback markers - they should remain as [image]/[file] in the template
|
|
31
|
+
if (varValue && varValue !== IMAGE_FALLBACK && varValue !== FILE_FALLBACK) {
|
|
32
|
+
valueToPlaceholder[varValue] = `{{${varName}}}`
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Sort values by length (longest first) to handle overlapping values correctly
|
|
37
|
+
const sortedValues = Object.keys(valueToPlaceholder).sort((a, b) => b.length - a.length)
|
|
38
|
+
|
|
39
|
+
for (const instruction of instructions) {
|
|
40
|
+
const role = instruction.role
|
|
41
|
+
if (!role) continue
|
|
42
|
+
|
|
43
|
+
const contentItems = instruction.content
|
|
44
|
+
if (!Array.isArray(contentItems)) continue
|
|
45
|
+
|
|
46
|
+
// Extract text from all content items (uses actual values for images/files when available)
|
|
47
|
+
const textParts = contentItems
|
|
48
|
+
.map(extractTextFromContentItem)
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
|
|
51
|
+
if (textParts.length === 0) continue
|
|
52
|
+
|
|
53
|
+
// Combine text and replace variable values with placeholders (longest first)
|
|
54
|
+
let fullText = textParts.join('')
|
|
55
|
+
for (const valueStr of sortedValues) {
|
|
56
|
+
const placeholder = valueToPlaceholder[valueStr]
|
|
57
|
+
const escapedValue = valueStr.replaceAll(REGEX_SPECIAL_CHARS, String.raw`\$&`)
|
|
58
|
+
fullText = fullText.replaceAll(new RegExp(escapedValue, 'g'), placeholder)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
chatTemplate.push({ role, content: fullText })
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return chatTemplate
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Extracts text content from a content item, using actual image_url/file_id values when available.
|
|
69
|
+
*
|
|
70
|
+
* Used for both input messages and chat template extraction. Falls back to [image]/[file] markers
|
|
71
|
+
* when the actual values are stripped (e.g., by OpenAI's default URL stripping behavior).
|
|
72
|
+
*
|
|
73
|
+
* @param {object} contentItem - Content item from Response.instructions[].content (ResponseInputContentItem)
|
|
74
|
+
* @returns {string|null} Text content, URL/file reference, or [image]/[file] fallback marker
|
|
75
|
+
*/
|
|
76
|
+
function extractTextFromContentItem (contentItem) {
|
|
77
|
+
if (!contentItem) return null
|
|
78
|
+
|
|
79
|
+
if (contentItem.text) {
|
|
80
|
+
return contentItem.text
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// For image/file items, extract the actual reference value
|
|
84
|
+
if (contentItem.type === INPUT_TYPE_IMAGE) {
|
|
85
|
+
return contentItem.image_url || contentItem.file_id || IMAGE_FALLBACK
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (contentItem.type === INPUT_TYPE_FILE) {
|
|
89
|
+
return contentItem.file_id || contentItem.file_url || contentItem.filename || FILE_FALLBACK
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return null
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Normalizes prompt variables by extracting meaningful values from OpenAI SDK response objects.
|
|
97
|
+
*
|
|
98
|
+
* Converts ResponseInputText, ResponseInputImage, and ResponseInputFile objects to simple string values.
|
|
99
|
+
*
|
|
100
|
+
* @param {Record<string, string | object>} variables - From ResponsePrompt.variables
|
|
101
|
+
* @returns {Record<string, string>} Normalized variables with simple string values
|
|
102
|
+
*/
|
|
103
|
+
function normalizePromptVariables (variables) {
|
|
104
|
+
if (!variables) return {}
|
|
105
|
+
|
|
106
|
+
return Object.fromEntries(
|
|
107
|
+
Object.entries(variables).map(([key, value]) => [
|
|
108
|
+
key,
|
|
109
|
+
extractTextFromContentItem(value) ?? String(value ?? '')
|
|
110
|
+
])
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function hasMultimodalInputs (variables) {
|
|
115
|
+
if (!variables) return false
|
|
116
|
+
return Object.values(variables).some(value =>
|
|
117
|
+
value?.type === INPUT_TYPE_IMAGE || value?.type === INPUT_TYPE_FILE
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
module.exports = {
|
|
122
|
+
extractChatTemplateFromInstructions,
|
|
123
|
+
normalizePromptVariables,
|
|
124
|
+
extractTextFromContentItem,
|
|
125
|
+
hasMultimodalInputs
|
|
126
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const LLMObsPlugin = require('./base')
|
|
4
3
|
const {
|
|
5
4
|
extractModel,
|
|
6
5
|
extractSystemInstructions
|
|
7
6
|
} = require('../../../../datadog-plugin-google-cloud-vertexai/src/utils')
|
|
7
|
+
const LLMObsPlugin = require('./base')
|
|
8
8
|
|
|
9
9
|
class VertexAILLMObsPlugin extends LLMObsPlugin {
|
|
10
10
|
static integration = 'vertexai' // used for llmobs telemetry
|
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const { channel } = require('dc-polyfill')
|
|
4
4
|
|
|
5
|
+
const { isTrue, isError } = require('../util')
|
|
6
|
+
const tracerVersion = require('../../../../package.json').version
|
|
7
|
+
const logger = require('../log')
|
|
8
|
+
const { getEnvironmentVariable } = require('../config-helper')
|
|
9
|
+
const Span = require('../opentracing/span')
|
|
10
|
+
const { SPAN_KIND, OUTPUT_VALUE, INPUT_VALUE } = require('./constants/tags')
|
|
5
11
|
const {
|
|
6
12
|
getFunctionArguments,
|
|
7
13
|
validateKind
|
|
8
14
|
} = require('./util')
|
|
9
|
-
const { isTrue, isError } = require('../util')
|
|
10
|
-
|
|
11
15
|
const { storage } = require('./storage')
|
|
12
|
-
|
|
13
|
-
const Span = require('../opentracing/span')
|
|
14
|
-
|
|
15
|
-
const tracerVersion = require('../../../../package.json').version
|
|
16
|
-
const logger = require('../log')
|
|
17
|
-
const { getEnvironmentVariable } = require('../config-helper')
|
|
18
16
|
const telemetry = require('./telemetry')
|
|
19
|
-
|
|
20
17
|
const LLMObsTagger = require('./tagger')
|
|
21
18
|
|
|
22
19
|
// communicating with writer
|
|
23
|
-
const { channel } = require('dc-polyfill')
|
|
24
20
|
const evalMetricAppendCh = channel('llmobs:eval-metric:append')
|
|
25
21
|
const flushCh = channel('llmobs:writers:flush')
|
|
26
22
|
const registerUserSpanProcessorCh = channel('llmobs:register-processor')
|
|
@@ -53,23 +49,20 @@ class LLMObs extends NoopLLMObs {
|
|
|
53
49
|
|
|
54
50
|
logger.debug('Enabling LLMObs')
|
|
55
51
|
|
|
56
|
-
const { mlApp, agentlessEnabled } = options
|
|
57
|
-
|
|
58
52
|
const DD_LLMOBS_ENABLED = getEnvironmentVariable('DD_LLMOBS_ENABLED')
|
|
59
53
|
|
|
60
|
-
|
|
61
|
-
mlApp,
|
|
62
|
-
agentlessEnabled
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const enabled = DD_LLMOBS_ENABLED == null || isTrue(DD_LLMOBS_ENABLED)
|
|
66
|
-
if (!enabled) {
|
|
54
|
+
if (DD_LLMOBS_ENABLED != null && !isTrue(DD_LLMOBS_ENABLED)) {
|
|
67
55
|
logger.debug('LLMObs.enable() called when DD_LLMOBS_ENABLED is false. No action taken.')
|
|
68
56
|
return
|
|
69
57
|
}
|
|
70
58
|
|
|
71
|
-
|
|
72
|
-
|
|
59
|
+
const llmobs = {
|
|
60
|
+
mlApp: options.mlApp,
|
|
61
|
+
agentlessEnabled: options.agentlessEnabled
|
|
62
|
+
}
|
|
63
|
+
// TODO: This will update config telemetry with the origin 'code', which is not ideal when `enable()` is called
|
|
64
|
+
// based on `APM_TRACING` RC product updates.
|
|
65
|
+
this._config.configure({ llmobs })
|
|
73
66
|
|
|
74
67
|
// configure writers and channel subscribers
|
|
75
68
|
this._llmobsModule.enable(this._config)
|
|
@@ -410,6 +403,11 @@ class LLMObs extends NoopLLMObs {
|
|
|
410
403
|
}
|
|
411
404
|
}
|
|
412
405
|
|
|
406
|
+
// When OTel tracing is enabled, add source:otel tag to allow backend to wait for OTel span conversion
|
|
407
|
+
if (isTrue(getEnvironmentVariable('DD_TRACE_OTEL_ENABLED'))) {
|
|
408
|
+
evaluationTags.source = 'otel'
|
|
409
|
+
}
|
|
410
|
+
|
|
413
411
|
const payload = {
|
|
414
412
|
span_id: spanId,
|
|
415
413
|
trace_id: traceId,
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const util = require('node:util')
|
|
4
|
+
|
|
5
|
+
const tracerVersion = require('../../../../package.json').version
|
|
6
|
+
const logger = require('../log')
|
|
7
|
+
const {
|
|
8
|
+
ERROR_MESSAGE,
|
|
9
|
+
ERROR_TYPE,
|
|
10
|
+
ERROR_STACK
|
|
11
|
+
} = require('../constants')
|
|
3
12
|
const {
|
|
4
13
|
SPAN_KIND,
|
|
5
14
|
MODEL_NAME,
|
|
@@ -20,22 +29,9 @@ const {
|
|
|
20
29
|
NAME
|
|
21
30
|
} = require('./constants/tags')
|
|
22
31
|
const { UNSERIALIZABLE_VALUE_TEXT } = require('./constants/text')
|
|
23
|
-
|
|
24
|
-
const {
|
|
25
|
-
ERROR_MESSAGE,
|
|
26
|
-
ERROR_TYPE,
|
|
27
|
-
ERROR_STACK
|
|
28
|
-
} = require('../constants')
|
|
29
|
-
|
|
30
32
|
const telemetry = require('./telemetry')
|
|
31
|
-
|
|
32
33
|
const LLMObsTagger = require('./tagger')
|
|
33
34
|
|
|
34
|
-
const tracerVersion = require('../../../../package.json').version
|
|
35
|
-
const logger = require('../log')
|
|
36
|
-
|
|
37
|
-
const util = require('node:util')
|
|
38
|
-
|
|
39
35
|
class LLMObservabilitySpan {
|
|
40
36
|
constructor () {
|
|
41
37
|
this.input = []
|
|
@@ -126,6 +122,11 @@ class LLMObsSpanProcessor {
|
|
|
126
122
|
inputType = 'value'
|
|
127
123
|
}
|
|
128
124
|
|
|
125
|
+
// Handle prompt metadata for reusable prompts
|
|
126
|
+
if (mlObsTags['_ml_obs.meta.input.prompt']) {
|
|
127
|
+
input.prompt = mlObsTags['_ml_obs.meta.input.prompt']
|
|
128
|
+
}
|
|
129
|
+
|
|
129
130
|
if (spanKind === 'llm' && mlObsTags[OUTPUT_MESSAGES]) {
|
|
130
131
|
llmObsSpan.output = mlObsTags[OUTPUT_MESSAGES]
|
|
131
132
|
outputType = 'messages'
|
|
@@ -207,7 +208,7 @@ class LLMObsSpanProcessor {
|
|
|
207
208
|
const seenObjects = new WeakSet([obj])
|
|
208
209
|
|
|
209
210
|
const isCircular = value => {
|
|
210
|
-
if (typeof value !== 'object') return false
|
|
211
|
+
if (value == null || typeof value !== 'object') return false
|
|
211
212
|
if (seenObjects.has(value)) return true
|
|
212
213
|
seenObjects.add(value)
|
|
213
214
|
return false
|
|
@@ -25,6 +25,7 @@ const {
|
|
|
25
25
|
INPUT_TOKENS_METRIC_KEY,
|
|
26
26
|
OUTPUT_TOKENS_METRIC_KEY,
|
|
27
27
|
TOTAL_TOKENS_METRIC_KEY,
|
|
28
|
+
REASONING_OUTPUT_TOKENS_METRIC_KEY,
|
|
28
29
|
INTEGRATION,
|
|
29
30
|
DECORATOR,
|
|
30
31
|
PROPAGATED_ML_APP_KEY
|
|
@@ -164,6 +165,9 @@ class LLMObsTagger {
|
|
|
164
165
|
case 'cacheWriteTokens':
|
|
165
166
|
processedKey = CACHE_WRITE_INPUT_TOKENS_METRIC_KEY
|
|
166
167
|
break
|
|
168
|
+
case 'reasoningOutputTokens':
|
|
169
|
+
processedKey = REASONING_OUTPUT_TOKENS_METRIC_KEY
|
|
170
|
+
break
|
|
167
171
|
}
|
|
168
172
|
|
|
169
173
|
if (typeof value === 'number') {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const ERROR_TYPE = require('../constants')
|
|
4
|
+
|
|
5
|
+
const telemetryMetrics = require('../telemetry/metrics')
|
|
3
6
|
const {
|
|
4
7
|
SPAN_KIND,
|
|
5
8
|
MODEL_PROVIDER,
|
|
@@ -10,10 +13,6 @@ const {
|
|
|
10
13
|
DECORATOR
|
|
11
14
|
} = require('./constants/tags')
|
|
12
15
|
|
|
13
|
-
const ERROR_TYPE = require('../constants')
|
|
14
|
-
|
|
15
|
-
const telemetryMetrics = require('../telemetry/metrics')
|
|
16
|
-
|
|
17
16
|
const LLMObsTagger = require('./tagger')
|
|
18
17
|
|
|
19
18
|
const llmobsMetrics = telemetryMetrics.manager.namespace('mlobs')
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const request = require('../../exporters/common/request')
|
|
4
|
-
const { getEnvironmentVariable } = require('../../config-helper')
|
|
5
3
|
const { URL, format } = require('node:url')
|
|
6
4
|
const path = require('node:path')
|
|
5
|
+
const request = require('../../exporters/common/request')
|
|
6
|
+
const { getEnvironmentVariable } = require('../../config-helper')
|
|
7
7
|
|
|
8
8
|
const logger = require('../../log')
|
|
9
9
|
|
|
@@ -9,11 +9,10 @@ const {
|
|
|
9
9
|
} = require('../constants/writers')
|
|
10
10
|
const { DROPPED_VALUE_TEXT } = require('../constants/text')
|
|
11
11
|
const { DROPPED_IO_COLLECTION_ERROR } = require('../constants/tags')
|
|
12
|
-
const BaseWriter = require('./base')
|
|
13
12
|
const telemetry = require('../telemetry')
|
|
14
13
|
const logger = require('../../log')
|
|
15
|
-
|
|
16
14
|
const tracerVersion = require('../../../../../package.json').version
|
|
15
|
+
const BaseWriter = require('./base')
|
|
17
16
|
|
|
18
17
|
class LLMObsSpanWriter extends BaseWriter {
|
|
19
18
|
constructor (config) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
const { inspect } = require('util')
|
|
3
3
|
const { isTrue } = require('../util')
|
|
4
|
+
const { getEnvironmentVariable } = require('../config-helper')
|
|
4
5
|
const { traceChannel, debugChannel, infoChannel, warnChannel, errorChannel } = require('./channels')
|
|
5
6
|
const logWriter = require('./writer')
|
|
6
7
|
const { Log, LogConfig, NoTransmitError } = require('./log')
|
|
7
8
|
const { memoize } = require('./utils')
|
|
8
|
-
const { getEnvironmentVariable } = require('../config-helper')
|
|
9
9
|
|
|
10
10
|
const config = {
|
|
11
11
|
enabled: false,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const NoopTracer = require('./tracer')
|
|
4
3
|
const NoopAppsecSdk = require('../appsec/sdk/noop')
|
|
5
|
-
const NoopDogStatsDClient = require('./dogstatsd')
|
|
6
4
|
const NoopLLMObsSDK = require('../llmobs/noop')
|
|
7
5
|
const NoopFlaggingProvider = require('../openfeature/noop')
|
|
8
6
|
const NoopAIGuardSDK = require('../aiguard/noop')
|
|
7
|
+
const NoopDogStatsDClient = require('./dogstatsd')
|
|
8
|
+
const NoopTracer = require('./tracer')
|
|
9
9
|
|
|
10
10
|
const noop = new NoopTracer()
|
|
11
11
|
const noopAppsec = new NoopAppsecSdk()
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const NoopSpanContext = require('./span_context')
|
|
4
3
|
const id = require('../id')
|
|
5
4
|
const { storage } = require('../../../datadog-core') // TODO: noop storage?
|
|
5
|
+
const NoopSpanContext = require('./span_context')
|
|
6
6
|
|
|
7
7
|
class NoopSpan {
|
|
8
8
|
constructor (tracer, parent) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { channel } = require('dc-polyfill')
|
|
3
4
|
const log = require('../log')
|
|
4
5
|
const ExposuresWriter = require('./writers/exposures')
|
|
5
6
|
const { setAgentStrategy } = require('./writers/util')
|
|
6
|
-
const { channel } = require('dc-polyfill')
|
|
7
7
|
|
|
8
8
|
const exposureSubmitCh = channel('ffe:exposure:submit')
|
|
9
9
|
const flushCh = channel('ffe:writers:flush')
|
|
@@ -12,7 +12,7 @@ let exposuresWriter = null
|
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* @private
|
|
15
|
-
* @param {
|
|
15
|
+
* @param {object | Array<object>} exposureEvents - Exposure events channel subscriber
|
|
16
16
|
* @returns {void}
|
|
17
17
|
*/
|
|
18
18
|
function _handleExposureSubmit (exposureEvents) {
|
|
@@ -9,7 +9,7 @@ const { NOOP_REASON } = require('./constants/constants')
|
|
|
9
9
|
*/
|
|
10
10
|
class NoopFlaggingProvider {
|
|
11
11
|
/**
|
|
12
|
-
* @param {
|
|
12
|
+
* @param {object} [noopTracer] - Optional noop tracer instance
|
|
13
13
|
*/
|
|
14
14
|
constructor (noopTracer) {
|
|
15
15
|
this._tracer = noopTracer
|
|
@@ -22,8 +22,8 @@ class NoopFlaggingProvider {
|
|
|
22
22
|
/**
|
|
23
23
|
* @param {string} flagKey - Flag key
|
|
24
24
|
* @param {boolean} defaultValue - Default value to return
|
|
25
|
-
* @param {
|
|
26
|
-
* @param {
|
|
25
|
+
* @param {object} context - Evaluation context
|
|
26
|
+
* @param {object} logger - Logger instance
|
|
27
27
|
* @returns {Promise<{value: boolean, reason: string}>} Resolution details
|
|
28
28
|
*/
|
|
29
29
|
resolveBooleanEvaluation (flagKey, defaultValue, context, logger) {
|
|
@@ -36,8 +36,8 @@ class NoopFlaggingProvider {
|
|
|
36
36
|
/**
|
|
37
37
|
* @param {string} flagKey - Flag key
|
|
38
38
|
* @param {string} defaultValue - Default value to return
|
|
39
|
-
* @param {
|
|
40
|
-
* @param {
|
|
39
|
+
* @param {object} context - Evaluation context
|
|
40
|
+
* @param {object} logger - Logger instance
|
|
41
41
|
* @returns {Promise<{value: string, reason: string}>} Resolution details
|
|
42
42
|
*/
|
|
43
43
|
resolveStringEvaluation (flagKey, defaultValue, context, logger) {
|
|
@@ -50,8 +50,8 @@ class NoopFlaggingProvider {
|
|
|
50
50
|
/**
|
|
51
51
|
* @param {string} flagKey - Flag key
|
|
52
52
|
* @param {number} defaultValue - Default value to return
|
|
53
|
-
* @param {
|
|
54
|
-
* @param {
|
|
53
|
+
* @param {object} context - Evaluation context
|
|
54
|
+
* @param {object} logger - Logger instance
|
|
55
55
|
* @returns {Promise<{value: number, reason: string}>} Resolution details
|
|
56
56
|
*/
|
|
57
57
|
resolveNumberEvaluation (flagKey, defaultValue, context, logger) {
|
|
@@ -63,10 +63,10 @@ class NoopFlaggingProvider {
|
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
65
|
* @param {string} flagKey - Flag key
|
|
66
|
-
* @param {
|
|
67
|
-
* @param {
|
|
68
|
-
* @param {
|
|
69
|
-
* @returns {Promise<{value:
|
|
66
|
+
* @param {object} defaultValue - Default value to return
|
|
67
|
+
* @param {object} context - Evaluation context
|
|
68
|
+
* @param {object} logger - Logger instance
|
|
69
|
+
* @returns {Promise<{value: object, reason: string}>} Resolution details
|
|
70
70
|
*/
|
|
71
71
|
resolveObjectEvaluation (flagKey, defaultValue, context, logger) {
|
|
72
72
|
return Promise.resolve({
|
|
@@ -76,14 +76,14 @@ class NoopFlaggingProvider {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
|
-
* @returns {
|
|
79
|
+
* @returns {object} Current configuration
|
|
80
80
|
*/
|
|
81
81
|
getConfiguration () {
|
|
82
82
|
return this._config
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/**
|
|
86
|
-
* @param {
|
|
86
|
+
* @param {object} config - Configuration to set
|
|
87
87
|
*/
|
|
88
88
|
setConfiguration (config) {
|
|
89
89
|
this._config = config
|
|
@@ -91,7 +91,7 @@ class NoopFlaggingProvider {
|
|
|
91
91
|
|
|
92
92
|
/**
|
|
93
93
|
* @internal
|
|
94
|
-
* @param {
|
|
94
|
+
* @param {object} ufc - Universal Flag Configuration object
|
|
95
95
|
*/
|
|
96
96
|
_setConfiguration (ufc) {
|
|
97
97
|
this.setConfiguration(ufc)
|