Présentation

Les bibliothèques de tracing Datadog (dd-trace) ne sont malheureusement pas compatibles avec les bundlers tels que Webpack ou esbuild,, en raison de l’utilisation d’importations conditionnelles ainsi que d’autres problèmes. Bien que les bundlers ne puissent pas générer dd-trace, votre application peut tout de même utiliser les bibliothèques dd-trace et datadog-lambda-js fournies par la couche Lambda Datadog prédéfinie. Pour ce faire, suivez les instructions ci-dessous.

Webpack

  1. Suivez les instructions d’installation pour Node.js et vérifiez que la couche Lambda Datadog pour Node.js a bien été ajoutée à votre fonction Lambda.

  2. Excluez datadog-lambda-js et dd-trace, soit en les supprimant de votre package.json, soit en définissant une règle dʼexclusion. Cela indique au bundler qu’il n’est pas nécessaire de les générer en tant que dépendances, puisqu’ils sont déjà disponibles dans le runtime Lambda fourni par la couche Lambda Datadog.

  3. Marquez vos dépendances comme étant externes. Cela indique au bundler de les exclure du bundle de sortie. Elles seront alors mises en paquets dans node_modules.

    webpack.config.js

    const nodeExternals = require("webpack-node-externals");
    
    module.exports = {
      // Use webpack-node-externals to exclude all node dependencies.
      // You can manually set the externals too.
      externals: [nodeExternals()],
      module: {
        rules: [
          {
            // Provided by the Datadog Lambda layer and the Lambda Runtime.
            exclude: [
              // AWS SDK v3
              /^@aws-sdk.*/,
              // AWS SDK v2
              /aws-sdk/,
              /datadog-lambda-js/,
              /dd-trace/
            ],
          }
        ]
      },
    }
    

    Si vous utilisez le plugin serverless-webpack et que vous avez défini l’option includeModules sur une valeur autre que false, le plugin regroupe automatiquement les modules externes sous node_modules. Vous devez donc forcer l’exclusion de datadog-lambda-js et dd-trace. Ignorez cette étape si vous n’utilisez pas serverless-webpack ou que l’option includeModules n’est pas définie dans votre fichier serverless.yml.

    serverless.yml

    custom:
      webpack:
        # You only need the following if you already have the includeModules option configured.
        includeModules:
          # ... your existing configuration for includeModules
          forceExclude:
            # @aws-sdk for the AWS SDK v3
            - @aws-sdk
            # aws-sdk for the AWS SDK v2
            - aws-sdk
            - datadog-lambda-js
            - dd-trace
        packagerOptions:
          scripts:
            # Optional, only needed when they are included as transitive dependencies 
            - rm -rf node_modules/datadog-lambda-js node_modules/dd-trace
    

    Pour mieux contrôler les dépendances qui sont incluses, vous pouvez également inclure votre webpack.config.js dans votre configuration serverless-webpack :

    custom:
      webpack:
        forceExclude:
          # @aws-sdk for the AWS SDK v3
          - @aws-sdk
          # aws-sdk for the AWS SDK v2
          - aws-sdk
          - datadog-lambda-js
          - dd-trace
        webpackConfig: 'webpack.config.js'
    

esbuild

  1. Suivez les instructions d’installation pour Node.js et vérifiez que la couche Lambda Datadog pour Node.js a bien été ajoutée à votre fonction Lambda.

  2. Supprimez datadog-lambda-js et dd-trace de votre package.json et du processus de build, puisqu’ils sont déjà disponibles dans le runtime Lambda fourni par la couche Lambda Datadog.

  3. Marquez vos dépendances comme étant externes. Cela indique au bundler de les exclure du bundle de sortie. Elles seront alors mises en paquets dans node_modules.

    esbuild.config.js

    const esbuild = require('esbuild');
    
    esbuild.build({
      // ... your existing esbuild configuration
      // Same effect as manually passing each dependency to `external`
      packages: 'external'
    })
    

    Si vous utilisez le plugin serverless-esbuild, vous pouvez externaliser toutes les dépendances avec esbuild-node-externals en tant que plugin esbuild. Cela met automatiquement en paquet les modules externes sous node_modules.

    serverless.yml

    custom:
      esbuild:
        exclude: 
          # @aws-sdk for the AWS SDK v3
          - @aws-sdk
          # aws-sdk for the AWS SDK v2
          - aws-sdk
          - datadog-lambda-js
          - dd-trace
        plugins: plugins.js
        # You can also set the specific dependencies to externalize instead of using `plugins`
        external: [...]
    
    // plugins.js
    const { nodeExternalsPlugin } = require('esbuild-node-externals')
    
    module.exports = [nodeExternalsPlugin()]
    

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles:

PREVIEWING: safchain/fix-custom-agent