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
|
@@ -10,16 +10,35 @@ const MODEL_METADATA_KEYS = new Set([
|
|
|
10
10
|
'stop_sequences'
|
|
11
11
|
])
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {import('../../../opentracing/span')} Span
|
|
15
|
+
*
|
|
16
|
+
* @typedef {string | number | boolean | null | undefined | string[] | number[] | boolean[]} TagValue
|
|
17
|
+
* @typedef {Record<string, TagValue>} SpanTags
|
|
18
|
+
*
|
|
19
|
+
* @typedef {{ span?: Span }} CurrentStore
|
|
20
|
+
* @typedef {{ currentStore?: CurrentStore, attributes?: SpanTags }} AiPluginContext
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {{
|
|
25
|
+
* type: string,
|
|
26
|
+
* value?: unknown
|
|
27
|
+
* }} ToolCallOutput
|
|
28
|
+
*
|
|
29
|
+
* @typedef {{ output?: ToolCallOutput, result?: unknown } & Record<string, unknown>} ToolCallResultContent
|
|
30
|
+
*/
|
|
31
|
+
|
|
13
32
|
/**
|
|
14
33
|
* Get the span tags from the context (either the attributes or the span tags).
|
|
15
34
|
*
|
|
16
|
-
* @param {
|
|
17
|
-
* @returns {
|
|
35
|
+
* @param {AiPluginContext} ctx
|
|
36
|
+
* @returns {SpanTags}
|
|
18
37
|
*/
|
|
19
38
|
function getSpanTags (ctx) {
|
|
20
39
|
const span = ctx.currentStore?.span
|
|
21
40
|
const carrier = ctx.attributes ?? span?.context()._tags ?? {}
|
|
22
|
-
return carrier
|
|
41
|
+
return /** @type {SpanTags} */ (carrier)
|
|
23
42
|
}
|
|
24
43
|
|
|
25
44
|
/**
|
|
@@ -88,10 +107,11 @@ function getJsonStringValue (str, defaultValue) {
|
|
|
88
107
|
|
|
89
108
|
/**
|
|
90
109
|
* Get the model metadata from the span tags (top_p, top_k, temperature, etc.)
|
|
91
|
-
* @param {
|
|
92
|
-
* @returns {Record<string,
|
|
110
|
+
* @param {SpanTags} tags
|
|
111
|
+
* @returns {Record<string, unknown> | null}
|
|
93
112
|
*/
|
|
94
113
|
function getModelMetadata (tags) {
|
|
114
|
+
/** @type {Record<string, unknown>} */
|
|
95
115
|
const modelMetadata = {}
|
|
96
116
|
for (const metadata of MODEL_METADATA_KEYS) {
|
|
97
117
|
const metadataTagKey = `gen_ai.request.${metadata}`
|
|
@@ -106,10 +126,11 @@ function getModelMetadata (tags) {
|
|
|
106
126
|
|
|
107
127
|
/**
|
|
108
128
|
* Get the generation metadata from the span tags (maxSteps, maxRetries, etc.)
|
|
109
|
-
* @param {
|
|
110
|
-
* @returns {Record<string,
|
|
129
|
+
* @param {SpanTags} tags
|
|
130
|
+
* @returns {Record<string, unknown> | null}
|
|
111
131
|
*/
|
|
112
132
|
function getGenerationMetadata (tags) {
|
|
133
|
+
/** @type {Record<string, unknown>} */
|
|
113
134
|
const metadata = {}
|
|
114
135
|
|
|
115
136
|
for (const tag of Object.keys(tags)) {
|
|
@@ -131,7 +152,7 @@ function getGenerationMetadata (tags) {
|
|
|
131
152
|
* If the tool name is a parsable number, or is not found, null is returned.
|
|
132
153
|
* Older versions of the ai sdk would tag the tool name as its index in the tools array.
|
|
133
154
|
*
|
|
134
|
-
* @param {
|
|
155
|
+
* @param {SpanTags} tags
|
|
135
156
|
* @returns {string | null}
|
|
136
157
|
*/
|
|
137
158
|
function getToolNameFromTags (tags) {
|
|
@@ -147,7 +168,7 @@ function getToolNameFromTags (tags) {
|
|
|
147
168
|
/**
|
|
148
169
|
* Get the content of a tool call result.
|
|
149
170
|
* Version 5 of the ai sdk sets this tag as `content.output`, with a `
|
|
150
|
-
* @param {
|
|
171
|
+
* @param {{ output?: { type: string, value: unknown }, result?: unknown }} content
|
|
151
172
|
* @returns {string}
|
|
152
173
|
*/
|
|
153
174
|
function getToolCallResultContent (content) {
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const BaseLLMObsPlugin = require('./base')
|
|
4
3
|
const { storage } = require('../../../../datadog-core')
|
|
5
|
-
const llmobsStore = storage('llmobs')
|
|
6
4
|
const telemetry = require('../telemetry')
|
|
7
|
-
|
|
8
5
|
const {
|
|
9
6
|
extractRequestParams,
|
|
10
7
|
extractTextAndResponseReason,
|
|
11
8
|
parseModelId,
|
|
12
9
|
extractTextAndResponseReasonFromStream
|
|
13
10
|
} = require('../../../../datadog-plugin-aws-sdk/src/services/bedrockruntime/utils')
|
|
11
|
+
const BaseLLMObsPlugin = require('./base')
|
|
12
|
+
|
|
13
|
+
const llmobsStore = storage('llmobs')
|
|
14
14
|
|
|
15
15
|
const ENABLED_OPERATIONS = new Set(['invokeModel', 'invokeModelWithResponseStream'])
|
|
16
16
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const LLMObsPlugin = require('../base')
|
|
4
|
+
const {
|
|
5
|
+
getOperation,
|
|
6
|
+
extractMetrics,
|
|
7
|
+
extractMetadata,
|
|
8
|
+
aggregateStreamingChunks,
|
|
9
|
+
formatInputMessages,
|
|
10
|
+
formatEmbeddingInput,
|
|
11
|
+
formatOutputMessages,
|
|
12
|
+
formatEmbeddingOutput
|
|
13
|
+
} = require('./util')
|
|
14
|
+
|
|
15
|
+
class GenAiLLMObsPlugin extends LLMObsPlugin {
|
|
16
|
+
static id = 'google-genai'
|
|
17
|
+
static integration = 'google_genai'
|
|
18
|
+
static prefix = 'tracing:apm:google:genai:request'
|
|
19
|
+
|
|
20
|
+
constructor () {
|
|
21
|
+
super(...arguments)
|
|
22
|
+
|
|
23
|
+
// Subscribe to streaming chunk events
|
|
24
|
+
this.addSub('apm:google:genai:request:chunk', ({ ctx, chunk, done }) => {
|
|
25
|
+
ctx.isStreaming = true
|
|
26
|
+
ctx.chunks = ctx.chunks || []
|
|
27
|
+
|
|
28
|
+
if (chunk) ctx.chunks.push(chunk)
|
|
29
|
+
if (!done) return
|
|
30
|
+
|
|
31
|
+
// Aggregate streaming chunks into a single response
|
|
32
|
+
ctx.result = aggregateStreamingChunks(ctx.chunks)
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
getLLMObsSpanRegisterOptions (ctx) {
|
|
37
|
+
const { args, methodName } = ctx
|
|
38
|
+
if (!methodName) return
|
|
39
|
+
|
|
40
|
+
const inputs = args[0]
|
|
41
|
+
const operation = getOperation(methodName)
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
modelProvider: 'google',
|
|
45
|
+
modelName: inputs.model,
|
|
46
|
+
kind: operation,
|
|
47
|
+
name: 'google_genai.request'
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
setLLMObsTags (ctx) {
|
|
52
|
+
const { args, methodName } = ctx
|
|
53
|
+
const span = ctx.currentStore?.span
|
|
54
|
+
if (!methodName) return
|
|
55
|
+
|
|
56
|
+
const inputs = args[0]
|
|
57
|
+
const response = ctx.result
|
|
58
|
+
const error = !!span.context()._tags.error
|
|
59
|
+
|
|
60
|
+
const operation = getOperation(methodName)
|
|
61
|
+
|
|
62
|
+
if (operation === 'llm') {
|
|
63
|
+
this.#tagGenerateContent(span, inputs, response, error, ctx.isStreaming)
|
|
64
|
+
} else if (operation === 'embedding') {
|
|
65
|
+
this.#tagEmbedding(span, inputs, response, error)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!error && response) {
|
|
69
|
+
const metrics = extractMetrics(response)
|
|
70
|
+
this._tagger.tagMetrics(span, metrics)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#tagGenerateContent (span, inputs, response, error, isStreaming = false) {
|
|
75
|
+
const { config = {} } = inputs
|
|
76
|
+
|
|
77
|
+
const inputMessages = formatInputMessages(inputs.contents)
|
|
78
|
+
|
|
79
|
+
const metadata = extractMetadata(config)
|
|
80
|
+
this._tagger.tagMetadata(span, metadata)
|
|
81
|
+
|
|
82
|
+
if (error) {
|
|
83
|
+
this._tagger.tagLLMIO(span, inputMessages, [{ content: '' }])
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const outputMessages = formatOutputMessages(response, isStreaming)
|
|
88
|
+
this._tagger.tagLLMIO(span, inputMessages, outputMessages)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
#tagEmbedding (span, inputs, response, error) {
|
|
92
|
+
const embeddingInput = formatEmbeddingInput(inputs.contents)
|
|
93
|
+
|
|
94
|
+
if (error) {
|
|
95
|
+
this._tagger.tagEmbeddingIO(span, embeddingInput)
|
|
96
|
+
return
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const embeddingOutput = formatEmbeddingOutput(response)
|
|
100
|
+
this._tagger.tagEmbeddingIO(span, embeddingInput, embeddingOutput)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = GenAiLLMObsPlugin
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Constants for role mapping
|
|
4
|
+
const ROLES = {
|
|
5
|
+
MODEL: 'model',
|
|
6
|
+
ASSISTANT: 'assistant',
|
|
7
|
+
USER: 'user',
|
|
8
|
+
REASONING: 'reasoning'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get the operation type from the method name
|
|
13
|
+
* @param {string} methodName
|
|
14
|
+
* @returns {'embedding' | 'llm'}
|
|
15
|
+
*/
|
|
16
|
+
function getOperation (methodName) {
|
|
17
|
+
return methodName.includes('embed') ? 'embedding' : 'llm'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Extract text parts from an array of parts
|
|
22
|
+
* @param {Array<{text?: string}>} parts
|
|
23
|
+
* @returns {string[]}
|
|
24
|
+
*/
|
|
25
|
+
function extractTextParts (parts) {
|
|
26
|
+
return parts
|
|
27
|
+
.filter(part => part.text)
|
|
28
|
+
.map(part => part.text)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Group parts by role (reasoning vs assistant)
|
|
33
|
+
* @param {Array<{text?: string, thought?: boolean}>} parts
|
|
34
|
+
* @returns {{reasoning: string, assistant: string}}
|
|
35
|
+
*/
|
|
36
|
+
function groupPartsByRole (parts) {
|
|
37
|
+
const grouped = {
|
|
38
|
+
reasoning: '',
|
|
39
|
+
assistant: ''
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
for (const part of parts) {
|
|
43
|
+
if (!part.text) continue
|
|
44
|
+
|
|
45
|
+
if (part.thought === true) {
|
|
46
|
+
grouped.reasoning += part.text
|
|
47
|
+
} else {
|
|
48
|
+
grouped.assistant += part.text
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return grouped
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Check if parts contain thought/reasoning content
|
|
57
|
+
* @param {Array<{thought?: boolean}>} parts
|
|
58
|
+
* @returns {boolean}
|
|
59
|
+
*/
|
|
60
|
+
function hasThoughtParts (parts) {
|
|
61
|
+
return parts.some(part => part.thought === true)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Determine the role from a candidate and its parts
|
|
66
|
+
* @param {object} candidate
|
|
67
|
+
* @param {Array<{thought?: boolean}>} parts
|
|
68
|
+
* @returns {string}
|
|
69
|
+
*/
|
|
70
|
+
function determineRole (candidate, parts = []) {
|
|
71
|
+
// Check parts for thought indicators
|
|
72
|
+
if (hasThoughtParts(parts)) {
|
|
73
|
+
return ROLES.REASONING
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Extract role from various possible locations
|
|
77
|
+
const rawRole = candidate.role ||
|
|
78
|
+
candidate.content?.role ||
|
|
79
|
+
candidate[0]?.content?.role
|
|
80
|
+
|
|
81
|
+
return normalizeRole(rawRole)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Normalize role to standard values
|
|
86
|
+
* @param {string} role
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
function normalizeRole (role) {
|
|
90
|
+
if (role === ROLES.MODEL) return ROLES.ASSISTANT
|
|
91
|
+
if (role === ROLES.ASSISTANT) return ROLES.ASSISTANT
|
|
92
|
+
if (role === ROLES.USER) return ROLES.USER
|
|
93
|
+
if (role === ROLES.REASONING) return ROLES.REASONING
|
|
94
|
+
return ROLES.USER // default
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Extract metrics from response
|
|
99
|
+
* @param {object} response
|
|
100
|
+
* @returns {object}
|
|
101
|
+
*/
|
|
102
|
+
function extractMetrics (response) {
|
|
103
|
+
const metrics = {}
|
|
104
|
+
const tokenUsage = response.usageMetadata
|
|
105
|
+
|
|
106
|
+
if (!tokenUsage) return metrics
|
|
107
|
+
|
|
108
|
+
if (tokenUsage.promptTokenCount) {
|
|
109
|
+
metrics.inputTokens = tokenUsage.promptTokenCount
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (tokenUsage.candidatesTokenCount) {
|
|
113
|
+
metrics.outputTokens = tokenUsage.candidatesTokenCount
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const totalTokens = tokenUsage.totalTokenCount ||
|
|
117
|
+
(tokenUsage.promptTokenCount || 0) + (tokenUsage.candidatesTokenCount || 0)
|
|
118
|
+
if (totalTokens) {
|
|
119
|
+
metrics.totalTokens = totalTokens
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return metrics
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Extract metadata from config
|
|
127
|
+
* @param {object} config
|
|
128
|
+
* @returns {object}
|
|
129
|
+
*/
|
|
130
|
+
function extractMetadata (config) {
|
|
131
|
+
if (!config) return {}
|
|
132
|
+
|
|
133
|
+
const fieldMap = {
|
|
134
|
+
temperature: 'temperature',
|
|
135
|
+
top_p: 'topP',
|
|
136
|
+
top_k: 'topK',
|
|
137
|
+
candidate_count: 'candidateCount',
|
|
138
|
+
max_output_tokens: 'maxOutputTokens',
|
|
139
|
+
stop_sequences: 'stopSequences',
|
|
140
|
+
response_logprobs: 'responseLogprobs',
|
|
141
|
+
logprobs: 'logprobs',
|
|
142
|
+
presence_penalty: 'presencePenalty',
|
|
143
|
+
frequency_penalty: 'frequencyPenalty',
|
|
144
|
+
seed: 'seed',
|
|
145
|
+
response_mime_type: 'responseMimeType',
|
|
146
|
+
safety_settings: 'safetySettings',
|
|
147
|
+
automatic_function_calling: 'automaticFunctionCalling'
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const metadata = {}
|
|
151
|
+
for (const [metadataKey, configKey] of Object.entries(fieldMap)) {
|
|
152
|
+
metadata[metadataKey] = config[configKey] ?? null
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return metadata
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Format function call message
|
|
160
|
+
* @param {Array} parts
|
|
161
|
+
* @param {Array} functionCalls
|
|
162
|
+
* @param {string} role
|
|
163
|
+
* @returns {object}
|
|
164
|
+
*/
|
|
165
|
+
function formatFunctionCallMessage (parts, functionCalls, role) {
|
|
166
|
+
const toolCalls = functionCalls.map(part => ({
|
|
167
|
+
name: part.functionCall.name,
|
|
168
|
+
arguments: part.functionCall.args,
|
|
169
|
+
toolId: part.functionCall.id || '',
|
|
170
|
+
type: 'function_call'
|
|
171
|
+
}))
|
|
172
|
+
|
|
173
|
+
const textParts = extractTextParts(parts)
|
|
174
|
+
const content = textParts.length > 0 ? textParts.join('\n') : undefined
|
|
175
|
+
const message = { role, toolCalls }
|
|
176
|
+
|
|
177
|
+
if (content) message.content = content
|
|
178
|
+
|
|
179
|
+
return message
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Format function response message
|
|
184
|
+
* @param {Array} functionResponses
|
|
185
|
+
* @param {string} role
|
|
186
|
+
* @returns {object}
|
|
187
|
+
*/
|
|
188
|
+
function formatFunctionResponseMessage (functionResponses, role) {
|
|
189
|
+
const toolResults = functionResponses.map(part => ({
|
|
190
|
+
name: part.functionResponse.name,
|
|
191
|
+
result: JSON.stringify(part.functionResponse.response),
|
|
192
|
+
toolId: part.functionResponse.id,
|
|
193
|
+
type: 'function_response'
|
|
194
|
+
}))
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
role,
|
|
198
|
+
toolResults
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Aggregate streaming chunks into a single response
|
|
204
|
+
* @param {Array} chunks
|
|
205
|
+
* @returns {object}
|
|
206
|
+
*/
|
|
207
|
+
function aggregateStreamingChunks (chunks) {
|
|
208
|
+
const response = { candidates: [] }
|
|
209
|
+
|
|
210
|
+
for (const chunk of chunks) {
|
|
211
|
+
if (chunk.candidates) {
|
|
212
|
+
// Flatten candidates array
|
|
213
|
+
response.candidates.push(...chunk.candidates)
|
|
214
|
+
}
|
|
215
|
+
if (chunk.usageMetadata) {
|
|
216
|
+
response.usageMetadata = chunk.usageMetadata
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return response
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Format a content object into a message
|
|
225
|
+
* @param {object} content
|
|
226
|
+
* @returns {object}
|
|
227
|
+
*/
|
|
228
|
+
function formatContentObject (content) {
|
|
229
|
+
const parts = content.parts || []
|
|
230
|
+
const role = determineRole(content, parts)
|
|
231
|
+
|
|
232
|
+
// Check if this is a thought/reasoning part
|
|
233
|
+
if (hasThoughtParts(parts)) {
|
|
234
|
+
return {
|
|
235
|
+
role: ROLES.REASONING,
|
|
236
|
+
content: extractTextParts(parts).join('\n')
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Check for function calls
|
|
241
|
+
const functionCalls = parts.filter(part => part.functionCall)
|
|
242
|
+
if (functionCalls.length > 0) {
|
|
243
|
+
return formatFunctionCallMessage(parts, functionCalls, role)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Check for function responses
|
|
247
|
+
const functionResponses = parts.filter(part => part.functionResponse)
|
|
248
|
+
if (functionResponses.length > 0) {
|
|
249
|
+
return formatFunctionResponseMessage(functionResponses, role)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Regular text content
|
|
253
|
+
return {
|
|
254
|
+
role,
|
|
255
|
+
content: extractTextParts(parts).join('\n')
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Format input messages from contents
|
|
261
|
+
* @param {[string|{text: string}|{parts: Array<string|{text: string}>}]} [contents]
|
|
262
|
+
* @returns {Array}
|
|
263
|
+
*/
|
|
264
|
+
function formatInputMessages (contents) {
|
|
265
|
+
if (!contents) return []
|
|
266
|
+
|
|
267
|
+
const contentArray = Array.isArray(contents) ? contents : [contents]
|
|
268
|
+
const messages = []
|
|
269
|
+
|
|
270
|
+
for (const content of contentArray) {
|
|
271
|
+
if (typeof content === 'string') {
|
|
272
|
+
messages.push({ role: ROLES.USER, content })
|
|
273
|
+
} else if (content.text) {
|
|
274
|
+
messages.push({ role: ROLES.USER, content: content.text })
|
|
275
|
+
} else if (content.parts) {
|
|
276
|
+
const message = formatContentObject(content)
|
|
277
|
+
if (message) messages.push(message)
|
|
278
|
+
} else {
|
|
279
|
+
messages.push({ role: ROLES.USER, content: JSON.stringify(content) })
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return messages
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Format embedding input from contents
|
|
288
|
+
* @param {[string|{text: string}|{parts: Array<string|{text: string}>}]} [contents]
|
|
289
|
+
* @returns {Array}
|
|
290
|
+
*/
|
|
291
|
+
function formatEmbeddingInput (contents) {
|
|
292
|
+
if (!contents) return []
|
|
293
|
+
|
|
294
|
+
const contentArray = Array.isArray(contents) ? contents : [contents]
|
|
295
|
+
const documents = []
|
|
296
|
+
|
|
297
|
+
for (const content of contentArray) {
|
|
298
|
+
if (typeof content === 'string') {
|
|
299
|
+
documents.push({ text: content })
|
|
300
|
+
} else if (content.text) {
|
|
301
|
+
documents.push({ text: content.text })
|
|
302
|
+
} else if (content.parts) {
|
|
303
|
+
for (const part of content.parts) {
|
|
304
|
+
if (typeof part === 'string') {
|
|
305
|
+
documents.push({ text: part })
|
|
306
|
+
} else if (part.text) {
|
|
307
|
+
documents.push({ text: part.text })
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return documents
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Format a non-streaming candidate into messages
|
|
318
|
+
* @param {object} candidate
|
|
319
|
+
* @returns {Array}
|
|
320
|
+
*/
|
|
321
|
+
function formatNonStreamingCandidate (candidate) {
|
|
322
|
+
const messages = []
|
|
323
|
+
const content = Array.isArray(candidate) ? candidate[0].content : candidate.content
|
|
324
|
+
|
|
325
|
+
if (!content?.parts) return messages
|
|
326
|
+
|
|
327
|
+
const { parts } = content
|
|
328
|
+
|
|
329
|
+
// Check for function calls
|
|
330
|
+
const functionCalls = parts.filter(part => part.functionCall)
|
|
331
|
+
if (functionCalls.length > 0) {
|
|
332
|
+
messages.push(formatFunctionCallMessage(parts, functionCalls, ROLES.ASSISTANT))
|
|
333
|
+
return messages
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Check for executable code
|
|
337
|
+
const executableCode = parts.find(part => part.executableCode)
|
|
338
|
+
if (executableCode) {
|
|
339
|
+
messages.push({
|
|
340
|
+
role: ROLES.ASSISTANT,
|
|
341
|
+
content: JSON.stringify({
|
|
342
|
+
language: executableCode.executableCode.language,
|
|
343
|
+
code: executableCode.executableCode.code
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
return messages
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Check for code execution result
|
|
350
|
+
const codeExecutionResult = parts.find(part => part.codeExecutionResult)
|
|
351
|
+
if (codeExecutionResult) {
|
|
352
|
+
messages.push({
|
|
353
|
+
role: ROLES.ASSISTANT,
|
|
354
|
+
content: JSON.stringify({
|
|
355
|
+
outcome: codeExecutionResult.codeExecutionResult.outcome,
|
|
356
|
+
output: codeExecutionResult.codeExecutionResult.output
|
|
357
|
+
})
|
|
358
|
+
})
|
|
359
|
+
return messages
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Regular text content - may contain both reasoning and assistant parts
|
|
363
|
+
const partsByRole = groupPartsByRole(parts)
|
|
364
|
+
|
|
365
|
+
if (partsByRole.reasoning) {
|
|
366
|
+
messages.push({
|
|
367
|
+
role: ROLES.REASONING,
|
|
368
|
+
content: partsByRole.reasoning
|
|
369
|
+
})
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (partsByRole.assistant) {
|
|
373
|
+
messages.push({
|
|
374
|
+
role: ROLES.ASSISTANT,
|
|
375
|
+
content: partsByRole.assistant
|
|
376
|
+
})
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return messages
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Format streaming output from response
|
|
384
|
+
* @param {object} response
|
|
385
|
+
* @returns {Array}
|
|
386
|
+
*/
|
|
387
|
+
function formatStreamingOutput (response) {
|
|
388
|
+
const messages = []
|
|
389
|
+
const messagesByRole = new Map()
|
|
390
|
+
|
|
391
|
+
for (const candidate of response.candidates) {
|
|
392
|
+
const content = Array.isArray(candidate) ? candidate[0].content : candidate.content
|
|
393
|
+
if (!content?.parts) continue
|
|
394
|
+
|
|
395
|
+
// Skip special cases in streaming (handle them as non-streaming)
|
|
396
|
+
if (content.parts.some(part => part.functionCall ||
|
|
397
|
+
part.executableCode ||
|
|
398
|
+
part.codeExecutionResult)) {
|
|
399
|
+
messages.push(...formatNonStreamingCandidate(candidate))
|
|
400
|
+
continue
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Accumulate text parts by role
|
|
404
|
+
const partsByRole = groupPartsByRole(content.parts)
|
|
405
|
+
|
|
406
|
+
for (const [partRole, textContent] of Object.entries(partsByRole)) {
|
|
407
|
+
if (!textContent) continue
|
|
408
|
+
|
|
409
|
+
if (messagesByRole.has(partRole)) {
|
|
410
|
+
const index = messagesByRole.get(partRole)
|
|
411
|
+
messages[index].content += textContent
|
|
412
|
+
} else {
|
|
413
|
+
const messageIndex = messages.length
|
|
414
|
+
messages.push({ role: partRole, content: textContent })
|
|
415
|
+
messagesByRole.set(partRole, messageIndex)
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return messages.length > 0 ? messages : [{ content: '' }]
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Format non-streaming output from response
|
|
425
|
+
* @param {object} response
|
|
426
|
+
* @returns {Array}
|
|
427
|
+
*/
|
|
428
|
+
function formatNonStreamingOutput (response) {
|
|
429
|
+
const messages = []
|
|
430
|
+
|
|
431
|
+
for (const candidate of response.candidates) {
|
|
432
|
+
messages.push(...formatNonStreamingCandidate(candidate))
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
return messages.length > 0 ? messages : [{ content: '' }]
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Format output messages from response
|
|
440
|
+
* @param {object} response
|
|
441
|
+
* @param {boolean} isStreaming
|
|
442
|
+
* @returns {Array}
|
|
443
|
+
*/
|
|
444
|
+
function formatOutputMessages (response, isStreaming = false) {
|
|
445
|
+
if (!response?.candidates?.length) {
|
|
446
|
+
return [{ content: '' }]
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (isStreaming) {
|
|
450
|
+
return formatStreamingOutput(response)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
return formatNonStreamingOutput(response)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Format embedding output from response
|
|
458
|
+
* @param {object} response
|
|
459
|
+
* @returns {string}
|
|
460
|
+
*/
|
|
461
|
+
function formatEmbeddingOutput (response) {
|
|
462
|
+
if (!response?.embeddings?.length) {
|
|
463
|
+
return ''
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
const embeddingCount = response.embeddings.length
|
|
467
|
+
const firstEmbedding = response.embeddings[0]
|
|
468
|
+
|
|
469
|
+
if (firstEmbedding.values && Array.isArray(firstEmbedding.values)) {
|
|
470
|
+
const embeddingDim = firstEmbedding.values.length
|
|
471
|
+
return `[${embeddingCount} embedding(s) returned with size ${embeddingDim}]`
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
return `[${embeddingCount} embedding(s) returned]`
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
module.exports = {
|
|
478
|
+
getOperation,
|
|
479
|
+
extractMetrics,
|
|
480
|
+
extractMetadata,
|
|
481
|
+
aggregateStreamingChunks,
|
|
482
|
+
formatInputMessages,
|
|
483
|
+
formatEmbeddingInput,
|
|
484
|
+
formatOutputMessages,
|
|
485
|
+
formatEmbeddingOutput
|
|
486
|
+
}
|
|
@@ -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 LangChainLLMObsChainHandler extends LangChainLLMObsHandler {
|
|
7
7
|
setMetaTags ({ span, inputs, results }) {
|