From 9ce27d37e3d0738d4a3b85328720950fca12abb7 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 31 Mar 2022 21:18:01 -0400 Subject: [PATCH 01/35] "serverless-plugin-datadog": "0.7.0", Serverless configuration in a single page --- config/_default/menus/menus.en.yaml | 43 +- .../tagging/unified_service_tagging.md | 117 +--- content/en/serverless/_index.md | 38 +- content/en/serverless/configuration/_index.md | 557 +++++++++++++++ .../collect_lambda_payloads.md | 84 --- .../serverless/guide/extension_motivation.md | 30 +- content/en/serverless/installation/_index.md | 35 +- content/en/serverless/installation/python.md | 639 ++++++------------ .../libraries_integrations/extension.md | 74 +- .../lambda_code_signing.md | 25 - .../metrics/distributions/percentile_QVW.jpg | Bin 599457 -> 0 bytes 11 files changed, 854 insertions(+), 788 deletions(-) create mode 100644 content/en/serverless/configuration/_index.md delete mode 100644 content/en/serverless/distributed_tracing/collect_lambda_payloads.md delete mode 100644 content/en/serverless/libraries_integrations/lambda_code_signing.md delete mode 100644 static/images/metrics/distributions/percentile_QVW.jpg diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index 150d2539b08f7..14cdc2ef31c8e 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -812,89 +812,94 @@ main: parent: serverless_installation identifier: serverless_installation_dotnet weight: 106 + - name: Configuration + url: serverless/configuration + parent: serverless + identifier: serverless_configuration + weight: 2 - name: Libraries & Integrations url: serverless/libraries_integrations parent: serverless identifier: libraries_integrations - weight: 2 + weight: 3 - name: Datadog Lambda Extension url: serverless/libraries_integrations/extension/ parent: libraries_integrations - weight: 201 + weight: 301 - name: Datadog Lambda Library url: serverless/libraries_integrations/library/ parent: libraries_integrations - weight: 202 + weight: 302 - name: Datadog Forwarder url: serverless/libraries_integrations/forwarder/ parent: libraries_integrations - weight: 203 + weight: 303 - name: Datadog Serverless Plugin url: serverless/libraries_integrations/plugin/ parent: libraries_integrations - weight: 204 + weight: 304 - name: Datadog Serverless Macro url: serverless/libraries_integrations/macro/ parent: libraries_integrations - weight: 205 + weight: 305 - name: Datadog Serverless CLI url: serverless/libraries_integrations/cli/ parent: libraries_integrations - weight: 206 + weight: 306 - name: Lambda Code Signing url: serverless/libraries_integrations/lambda_code_signing/ parent: libraries_integrations - weight: 207 + weight: 307 - name: Distributed Tracing url: serverless/distributed_tracing identifier: serverless_distributed_tracing parent: serverless - weight: 3 + weight: 4 - name: Collect Lambda Payloads url: serverless/distributed_tracing/collect_lambda_payloads parent: serverless_distributed_tracing - weight: 301 + weight: 401 - name: Trace Merging (Advanced) url: serverless/distributed_tracing/serverless_trace_merging parent: serverless_distributed_tracing - weight: 302 + weight: 402 - name: Trace Propagation (Advanced) url: serverless/distributed_tracing/serverless_trace_propagation parent: serverless_distributed_tracing - weight: 303 + weight: 403 - name: Custom Metrics url: serverless/custom_metrics parent: serverless identifier: custom_metrics - weight: 4 + weight: 5 - name: Enhanced Lambda Metrics url: serverless/enhanced_lambda_metrics parent: serverless - weight: 5 + weight: 6 - name: Deployment Tracking url: serverless/deployment_tracking parent: serverless - weight: 6 + weight: 7 - name: Troubleshooting url: serverless/troubleshooting parent: serverless identifier: serverless_troubleshooting - weight: 7 + weight: 8 - name: Azure App Service Extension url: serverless/azure_app_services parent: serverless identifier: serverless_app_services - weight: 8 + weight: 9 - name: Glossary url: serverless/glossary parent: serverless identifier: serverless_glossary - weight: 9 + weight: 10 - name: Guides url: serverless/guide/ identifier: serverless_guides parent: serverless - weight: 10 + weight: 11 - name: Metrics url: metrics/ identifier: metrics_top_level diff --git a/content/en/getting_started/tagging/unified_service_tagging.md b/content/en/getting_started/tagging/unified_service_tagging.md index dd551f2c0c469..8adb0ea76bb39 100644 --- a/content/en/getting_started/tagging/unified_service_tagging.md +++ b/content/en/getting_started/tagging/unified_service_tagging.md @@ -379,120 +379,7 @@ instances: #### AWS Lambda functions -Depending on how you build and deploy your AWS Lambda-based serverless applications, you may have several options available for applying the `env`, `service` and `version` tags to metrics, traces and logs. - -*Note*: These tags are specified through AWS resource tags instead of environment variables. - -{{< tabs >}} - -{{% tab "Serverless Framework" %}} - -Tag your Lambda functions using the [tags][1] option: - -```yaml -# serverless.yml -service: service-name -provider: - name: aws - # to apply the tags to all functions - tags: - env: "" - service: "" - version: "" - -functions: - hello: - # this function will inherit the service level tags config above - handler: handler.hello - world: - # this function will overwrite the tags - handler: handler.users - tags: - env: "" - service: "" - version: "" -``` - -If you have installed the [Datadog serverless plugin][2], the plugin automatically tags the Lambda functions with the `service` and `env` tags using the `service` and `stage` values from the serverless application definition, unless a `service` or `env` tag already exists. - -[1]: https://www.serverless.com/framework/docs/providers/aws/guide/functions#tags -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin -{{% /tab %}} - -{{% tab "AWS SAM" %}} - -Tag your Lambda functions using the [Tags][1] option: - -```yaml -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Resources: - MyLambdaFunction: - Type: AWS::Serverless::Function - Properties: - Tags: - env: "" - service: "" - version: "" -``` - -If you have installed the [Datadog serverless macro][2], you can also specify a `service` and `env` tag as parameters: - -```yaml -Transform: - - AWS::Serverless-2016-10-31 - - Name: DatadogServerless - Parameters: - service: "" - env: "" -``` - - -[1]: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-tags -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/macro -{{% /tab %}} - -{{% tab "AWS CDK" %}} - -Tag your app, stack, or individual Lambda functions using the [Tags class][1]. If you have installed the [Datadog serverless macro][2], you can also specify a `service` and `env` tag as parameters: - -```javascript -import * as cdk from "@aws-cdk/core"; - -class CdkStack extends cdk.Stack { - constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - this.addTransform("DatadogServerless"); - - new cdk.CfnMapping(this, "Datadog", { - mapping: { - Parameters: { - service: "", - env: "", - }, - }, - }); - } -} -``` - - -[1]: https://docs.aws.amazon.com/cdk/latest/guide/tagging.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/macro -{{% /tab %}} - -{{% tab "Custom" %}} - -Apply the `env`, `service` and `version` tags following the AWS instructions for [Tagging Lambda Functions][1]. - - -[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-tags.html -{{% /tab %}} - -{{< /tabs >}} - -Ensure the `DdFetchLambdaTags` option is set to `true` on the CloudFormation stack for your [Datadog Forwarder][13]. This option defaults to `true` since version `3.19.0`. - +See [how to connect your Lambda telemetry using tags][13]. ## Further Reading {{< partial name="whats-next/whats-next.html" >}} @@ -510,4 +397,4 @@ Ensure the `DdFetchLambdaTags` option is set to `true` on the CloudFormation sta [10]: /integrations/statsd/ [11]: https://www.chef.io/ [12]: https://www.ansible.com/ -[13]: /serverless/forwarder/ +[13]: /serverless/configuration/#connect-telemetry-using-tags diff --git a/content/en/serverless/_index.md b/content/en/serverless/_index.md index 2f692da5ddb7d..2887453e69de6 100644 --- a/content/en/serverless/_index.md +++ b/content/en/serverless/_index.md @@ -15,9 +15,12 @@ further_reading: - link: "https://www.datadoghq.com/state-of-serverless" tag: "Blog" text: "The State of Serverless" -- link: "/integrations/amazon_xray/" +- link: "/serverless/installation/" tag: "Documentation" - text: "AWS X-Ray Integration" + text: "Installing Serverless Monitoring" +- link: '/serverless/configuration/' + tag: 'Documentation' + text: 'Configure Serverless Monitoring' - link: "/integrations/amazon_lambda/" tag: "Documentation" text: "AWS Lambda Integration" @@ -48,18 +51,6 @@ further_reading: The following section outlines Datadog's solution for monitoring AWS serverless applications and Lambda functions. You can also learn more about support for monitoring [Azure serverless][2] and [Google serverless][3] applications. -## Quick start - -If you are new to Datadog, you can get started by [signing up for a Datadog account][4], then following the instructions for [installing Datadog's Lambda Extension][5]. These steps configure your Lambda functions to send real-time metrics, logs, and traces to Datadog: - -{{< img src="serverless/aws-fully-managed-services-serverless-monitoring-hero.png" alt="Datadog Serverless Monitoring" style="width:100%;" >}} - -## Installation instructions - -For more detailed installation instructions, select the Lambda runtime below for instructions to instrument your serverless application: - -{{< partial name="serverless/getting-started-languages.html" >}} - ## Explore Datadog Serverless Monitoring ### Monitor your entire serverless stack in the Serverless view @@ -90,13 +81,17 @@ Easily correlate serverless code, configuration, and deployment changes with met {{< img src="serverless/serverless_deployment_tracking.jpeg" alt="Datadog Serverless Monitoring" style="width:100%;" >}} +## Getting Started + +Getting started to monitor your serverless application is quick and easy. See the [installation instructions][4]. + ## Other serverless clouds ### Azure App Service The Datadog extension for Azure App Service provides tracing capabilities for Azure Web Apps. -Use the [Azure App Service view][6] to: +Use the [Azure App Service view][5] to: - Quickly identify apps with high latency or errors @@ -106,11 +101,11 @@ Use the [Azure App Service view][6] to: - Map the apps running on your App Service Plans to identify apps that may be impacting costs or performance -The Datadog extension for Azure App Service provides tracing capabilities for Azure Web Apps. For more information about setting up tracing in Azure, see the [Azure App Service Extension documentation][7]. +The Datadog extension for Azure App Service provides tracing capabilities for Azure Web Apps. For more information about setting up tracing in Azure, see the [Azure App Service Extension documentation][6]. ### Google Cloud Functions -Google Cloud Functions is a lightweight, event-based, asynchronous compute solution that allows you to create small, single-purpose functions. To monitor serverless functions running on Google Cloud Platform, enable the [Google Cloud Platform integration][8]. +Google Cloud Functions is a lightweight, event-based, asynchronous compute solution that allows you to create small, single-purpose functions. To monitor serverless functions running on Google Cloud Platform, enable the [Google Cloud Platform integration][7]. ## Further Reading @@ -119,8 +114,7 @@ Google Cloud Functions is a lightweight, event-based, asynchronous compute solut [1]: http://app.datadoghq.com/functions [2]: /serverless/#azure-app-service [3]: /serverless/#google-cloud-functions -[4]: https://app.datadoghq.com/signup/ -[5]: https://app.datadoghq.com/signup/agent#lambda -[6]: https://app.datadoghq.com/functions?cloud=azure&config_serverless-azure-app=true&group=service -[7]: /infrastructure/serverless/azure_app_services/#overview -[8]: /integrations/google_cloud_platform/ +[4]: /serverless/installation +[5]: https://app.datadoghq.com/functions?cloud=azure&config_serverless-azure-app=true&group=service +[6]: /infrastructure/serverless/azure_app_services/#overview +[7]: /integrations/google_cloud_platform/ diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md new file mode 100644 index 0000000000000..7ddd52210a1b2 --- /dev/null +++ b/content/en/serverless/configuration/_index.md @@ -0,0 +1,557 @@ +--- +title: Configure Serverless Monitoring +kind: documentation +further_reading: + - link: '/serverless/installation/' + tag: 'Documentation' + text: 'Installing Serverless Monitoring' + - link: '/serverless/troubleshooting/' + tag: 'Documentation' + text: 'Troubleshoot Serverless Monitoring' +aliases: + - /serverless/distributed_tracing/collect_lambda_payloads + - /serverless/libraries_integrations/lambda_code_signing +--- + +After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring. + +## Table of contents + +- [Connect telemetry using tags](#connect-telemetry-using-tags) +- [Collect the request and response payloads](#collect-the-request-and-response-payloads) +- [Collect metrics from non-Lambda resources](#collect-metrics-from-non-lambda-resources) +- [Collect logs from non-Lambda resources](#collect-logs-from-non-lambda-resources) +- [Collect traces from non-Lambda resources](#collect-traces-from-non-lambda-resources) +- [Configure logs collection](#configure-logs-collection) +- [Configure trace collection](#configure-trace-collection) +- [Connect logs and traces](#connect-logs-and-traces) +- [Link errors to your source code](#link-errors-to-your-source-code) +- [Create monitors](#create-monitors) +- [Create synthetic tests](#create-synthetic-tests) +- [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) +- [Migrate to the Datadog Lambda extension](#migrate-to-the-datadog-lambda-extension) +- [Troubleshoot](#troubleshoot) + +## Connect telemetry using tags + +Connect Datadog telemetry together through the use of reserved (`env`, `service`, and `version`) and custom tags. With these tags you can navigate seamlessly across metrics, traces, and logs. Add the extra parameters below for the installation method you use. + +{{< tabs >}} +{{% tab "Datadog CLI" %}} + +Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with the extra arguments. For example: + +```sh +datadog-ci lambda instrument \ + --env dev \ + --service web \ + --version v1.2.3 \ + --extra-tags "team:avengers,project:marvel" + # ... other required arguments, such as function names +``` + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/cli +{{% /tab %}} +{{% tab "Serverless Framework" %}} + +Ensure you are using the latest version of the [Datadog serverless plugin][1] and apply the tags using the `env`, `service`, `version` and `tags` parameters. For example: + +```yaml +custom: + datadog: + # ... other required parameters, such as the Datadog site and API key + env: dev + service: web + version: v1.2.3 + tags: "team:avengers,project:marvel" +``` + +By default, if you don't define `env` and `service`, the plugin automatically uses the `stage` and `service` values from the serverless application definition. To disable this feature, set `enableTags` to `false`. + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin +{{% /tab %}} +{{% tab "AWS SAM" %}} + +Ensure you are using the latest version of the [Datadog serverless macro][1] and apply the tags using the `env`, `service`, `version` and `tags` parameters. For example: + +```yaml +Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + # ... other required parameters, such as the Datadog site and API key + env: dev + service: web + version: v1.2.3 + tags: "team:avengers,project:marvel" +``` + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/macro +{{% /tab %}} +{{% tab "AWS CDK" %}} + +Ensure you are using the latest version of the [Datadog serverless cdk construct][1] and apply the tags using the `env`, `service`, `version` and `tags` parameters. For example: + +```typescript +const datadog = new Datadog(this, "Datadog", { + // ... other required parameters, such as the Datadog site and API key + env: "dev", + service: "web", + version: "v1.2.3", + tags: "team:avengers,project:marvel" +}); +datadog.addLambdaFunctions([]); +``` + +[1]: https://github.com/DataDog/datadog-cdk-constructs +{{% /tab %}} +{{% tab "Others" %}} + +If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][1], set the following environment variables to your Lambda functions. For example: +- DD_ENV: dev +- DD_SERVICE: web +- DD_VERSION: v1.2.3 +- DD_TAGS: team:avengers,project:marvel + +If you are collecting telemetry from your Lambda functions using the [Datadog Forwarder Lambda function][2], set the `env`, `service`, `version` and additional tags as AWS resource tags on your Lambda functions and ensure the `DdFetchLambdaTags` option is set to `true` on the CloudFormation stack for your Datadog Forwarder. This option defaults to true since version 3.19.0. + +[1]: /serverless/libraries_integrations/extension/ +[2]: /serverless/libraries_integrations/forwarder/ +{{% /tab %}} +{{< /tabs >}} + +Datadog can also enrich the collected telemetry with existing AWS resource tags defined on your Lambda functions. + +- If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][2], you just need to enable the [Datadog AWS integration][3]. + +- If you are collecting telemetry from your Lambda functions using the [Datadog Forwarder Lambda function][4], set the `DdFetchLambdaTags` option to `true` on the CloudFormation stack for your Datadog Forwarder. This option defaults to true since version 3.19.0. + +## Collect the request and response payloads + +Datadog can [collect and visualize the JSON request and response payloads of AWS Lambda functions][5], giving you deeper insight into your serverless applications and helping troubleshoot Lambda function failures. + +This feature is disabled by default, follow the instructions below for the installation method you use. + +{{< tabs >}} +{{% tab "Datadog CLI" %}} + +Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with the extra `--capture-lambda-payload` argument. For example: + +```sh +datadog-ci lambda instrument \ + --capture-lambda-payload true + # ... other required arguments, such as function names +``` + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/cli +{{% /tab %}} +{{% tab "Serverless Framework" %}} + +Ensure you are using the latest version of the [Datadog serverless plugin][1] and set the `captureLambdaPayload` to `true`. For example: + +```yaml +custom: + datadog: + # ... other required parameters, such as the Datadog site and API key + captureLambdaPayload: true +``` + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin +{{% /tab %}} +{{% tab "AWS SAM" %}} + +Ensure you are using the latest version of the [Datadog serverless macro][1] and set the `captureLambdaPayload` parameter to `true`. For example: + +```yaml +Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + # ... other required parameters, such as the Datadog site and API key + captureLambdaPayload: true +``` + +[1]: https://docs.datadoghq.com/serverless/serverless_integrations/macro +{{% /tab %}} +{{% tab "AWS CDK" %}} + +Ensure you are using the latest version of the [Datadog serverless cdk construct][1] and set the `captureLambdaPayload` parameter to `true`. For example: + +```typescript +const datadog = new Datadog(this, "Datadog", { + // ... other required parameters, such as the Datadog site and API key + captureLambdaPayload: true +}); +datadog.addLambdaFunctions([]); +``` + +[1]: https://github.com/DataDog/datadog-cdk-constructs +{{% /tab %}} +{{% tab "Others" %}} + +Set the environment variable `DD_CAPTURE_LAMBDA_PAYLOAD` to `true` on your Lambda functions. + +{{% /tab %}} +{{< /tabs >}} + +To prevent any sensitive data within request or response JSON objects from being sent to Datadog, you can to scrub specific parameters from being sent to Datadog. + +To do this, add a new file `datadog.yaml` in the same folder as your Lambda function code. Obfuscation of fields in the Lambda payload is then available through [the replace_tags block][6] within `apm_config` settings in `datadog.yaml`: + +```yaml +apm_config: + replace_tags: + # Replace all the occurrences of "foobar" in any tag with "REDACTED": + - name: "*" + pattern: "foobar" + repl: "REDACTED" + # Replace "auth" from request headers with an empty string + - name: "function.request.headers.auth" + pattern: "(?s).*" + repl: "" + # Replace "apiToken" from response payload with "****" + - name: "function.response.apiToken" + pattern: "(?s).*" + repl: "****" +``` + +As an alternative, you can also populate the `DD_APM_REPLACE_TAGS` environment variable on your Lambda function to obfuscate specific fields: + +```yaml +DD_APM_REPLACE_TAGS=[ + { + "name": "*", + "pattern": "foobar", + "repl": "REDACTED" + }, + { + "name": "function.request.headers.auth", + "pattern": "(?s).*", + "repl": "" + }, + { + "name": "function.response.apiToken", + "pattern": "(?s).*" + "repl": "****" + } +] +``` + +## Collect metrics from non-Lambda resources + +In addition to the real-time [Datadog Lambda enhanced metrics][7], Datadog can also help you collect metrics for AWS managed resources, such as [API Gateway][8], [AppSync][9] and [SQS][10], to help you monitor your entire serverless application. The metrics also get enriched with the corresponding AWS resource tags. + +It only takes a few clicks to set up the [Datadog AWS integration][3]. + +## Collect logs from non-Lambda resources + +Logs generated by managed resources besides AWS Lambda functions can be hugely valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you [collect logs][11] from the following AWS managed resources in your environment: +- API's: API Gateway, AppSync, ALB +- Queues & Streams: SQS, SNS, Kinesis +- Data Stores: DynamoDB, S3, RDS, etc. + +## Collect traces from non-Lambda resources + +Datadog can infer APM spans based on the incoming Lambda events for the AWS managed resources that trigger the Lambda function. This can be hugely valuable in helping visualize the relationship between the AWS managed resources and identify performance issues in your serverless applications. See [additional product details][12]. + +The following resources are currently supported: + +- API Gateway (REST API, HTTP API and WebSocket) +- Function URLs +- SQS +- SNS (SNS messaged delivered via SQS are also supported) +- Kinesis Streams (if data is a JSON string or base64 encoded JSON string) +- EventBridge (custom events, where `Details` is a JSON string) +- S3 +- DynamoDB + +For unsupported resources, you can [propagate the trace context with a small piece of code][13]. + +To disable this feature, set `DD_TRACE_MANAGED_SERVICES` to `false`. + +## Configure logs collection + +### Filter or scrub information from logs + +To exclude the `START` and `END` logs, set the environment variable `DD_LOGS_CONFIG_PROCESSING_RULES` to `[{"type": "exclude_at_match", "name": "exclude_start_and_end_logs", "pattern": "(START|END) RequestId\\s"}]`. Alternatively, you can add a `datadog.yaml` file in your project root directory with the following content: + +```yaml +logs_config: + processing_rules: + - type: exclude_at_match + name: exclude_start_and_end_logs + pattern: (START|END) RequestId\s +``` + +Datadog recommends keeping the `REPORT` logs, as they are used to populate the invocations list in the serverless function views. + +To scrub or filter other logs before sending them to Datadog, see [Advanced Log Collection][14]. + +### Disable logs collection + +Logs collection through the Datadog Lambda extension is enabled by default. If you want to stop collecting logs using the Datadog Forwarder Lambda function, simply remove the subscription filter from your own Lambda function's CloudWatch log group. If you want to stop collecting logs using the Datadog Lambda extension, follow the instructions below for the installation method you use.: + +{{< tabs >}} +{{% tab "Serverless Framework" %}} + +```yaml +custom: + datadog: + # ... other required parameters, such as the Datadog site and API key + enableDDLogs: false +``` + +{{% /tab %}} +{{% tab "AWS SAM" %}} + +```yaml +Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + # ... other required parameters, such as the Datadog site and API key + enableDDLogs: false +``` + +{{% /tab %}} +{{% tab "AWS CDK" %}} + +```typescript +const datadog = new Datadog(this, "Datadog", { + // ... other required parameters, such as the Datadog site and API key + enableDatadogLogs: false +}); +datadog.addLambdaFunctions([]); +``` + +{{% /tab %}} +{{% tab "Others" %}} + +Set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false` on your Lambda functions. + +{{% /tab %}} +{{< /tabs >}} + +## Configure trace collection + +To see what libraries and frameworks are automatically instrumented by Datadog APM client, see [Compatibility Requirements for APM][15]. To instrument custom applications, see Datadog APM guide for [custom instrumentation][16]. + +### Filter or scrub sensitive information from traces + +To filter traces before sending them to Datadog, see [Ignoring Unwanted Resources in APM][17]. + +To scrub trace attributes for data security, see [Configure the Datadog Agent or Tracer for Data Security][18]. + +### Disable trace collection + +Trace collection through the Datadog Lambda extension is enabled by default, if you want to stop collecting traces from your Lambda functions follow the instructions below: + +{{< tabs >}} +{{% tab "Datadog CLI" %}} + +```sh +datadog-ci lambda instrument \ + --tracing false + # ... other required arguments, such as function names +``` +{{% /tab %}} +{{% tab "Serverless Framework" %}} + +```yaml +custom: + datadog: + # ... other required parameters, such as the Datadog site and API key + enableDDTracing: false +``` + +{{% /tab %}} +{{% tab "AWS SAM" %}} + +```yaml +Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + # ... other required parameters, such as the Datadog site and API key + enableDDTracing: false +``` + +{{% /tab %}} +{{% tab "AWS CDK" %}} + +```typescript +const datadog = new Datadog(this, "Datadog", { + // ... other required parameters, such as the Datadog site and API key + enableDatadogTracing: false +}); +datadog.addLambdaFunctions([]); +``` + +{{% /tab %}} +{{% tab "Others" %}} + +Set the environment variable `DD_TRACE_ENABLED` to `false` on your Lambda functions. + +{{% /tab %}} +{{< /tabs >}} + +## Connect logs and traces + +If you are using the [Lambda extension][2] to collect traces and logs, Datadog automatically adds the AWS Lambda request id to the `aws.lambda` span under the `request_id` tag as well as the Lambda logs for the same request under the `lambda.request_id` attribute. The Datadog trace and log views are connected using the AWS Lambda request ID. + +If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs. The Datadog trace and log views are connected using the Datadog trace ID. This should work when using the default or a popular logger. If you are using a custom logger that isn't supported: +- When logging in JSON, you need to obtain the Datadog trace ID using `dd-trace` and add it to your logs under the `dd.trace_id` field: + ```javascript + { + "message": "This is a log", + "dd": { + "trace_id": "4887065908816661012" + } + // ... the rest of your log + } + ``` +- When logging in plaintext, you need to: + 1. obtain the Datadog trace ID using `dd-trace` and add it to your log + 2. clone the default Lambda log pipeline, which is read-only + 3. enable the cloned pipeline while disable the default one + 4. update the cloned pipeline to [parse][19] the Datadog trace ID into the `dd.trace_id` attribute. For example, `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}` matches `[INFO] dd.trace_id=4887065908816661012`. + +## Link errors to your source code + +[Datadog source code integration][20] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. + +{{< tabs >}} +{{% tab "Datadog CLI" %}} + +Run `datadog-ci lambda instrument` with `--source-code-integration true` will automatically send Git metadata in the current local directory and add the required tags to your Lambda functions. + +**Note**: You must set environment variable `DATADOG_API_KEY` for `datadog-ci` to upload Git metadata. `DATADOG_API_KEY` will also be set on your Lambda functions to send telemetry unless you also have `DATADOG_API_KEY_SECRET_ARN` defined, which takes precedence over `DATADOG_API_KEY`. + + +```sh +# ... other required environment variables, such as DATADOG_SITE + +# required, to upload git metadata +export DATADOG_API_KEY= + +# optional, DATADOG_API_KEY will be used if undefined +export DATADOG_API_KEY_SECRET_ARN= + +datadog-ci lambda instrument \ + --source-code-integration true + # ... other required arguments, such as function names +``` +{{% /tab %}} +{{% tab "Serverless Framework" %}} + +With `enableSourceCodeIntegration` set to `true`, the Datadog serverless plugin will automatically send Git metadata in the current local directory and add the required tags to your Lambda functions. + +**Note**: You must set the `apiKey` parameter for the plugin to upload Git metadata. `apiKey` will also be set on your Lambda functions to send telemetry unless you also have `apiKeySecretArn` defined, which takes precedence over `apiKey`. + +```yaml +custom: + datadog: + # ... other required parameters, such as the Datadog site + apiKey: # required, to upload git metadata + apiKeySecretArn: # optional, apiKey will be used if undefined + enableSourceCodeIntegration: true # default is true +``` + +{{% /tab %}} +{{% tab "AWS CDK" %}} + +Change your initialization function as follows to pass the gitHash value to the CDK stack: + +```typescript +async function main() { + // Make sure to add @datadog/datadog-ci via your package manager + const datadogCi = require("@datadog/datadog-ci"); + const gitHash = await datadogCi.gitMetadata.uploadGitCommitHash('{Datadog_API_Key}', '') + + const app = new cdk.App(); + // Pass in the hash to the ExampleStack constructor + new ExampleStack(app, "ExampleStack", {}, gitHash); +} +``` + +In your stack constructor, add an optional `gitHash` parameter, and call `addGitCommitMetadata()`: + +```typescript +export class ExampleStack extends cdk.Stack { + constructor(scope: cdk.App, id: string, props?: cdk.StackProps, gitHash?: string) { + ... + ... + datadog.addGitCommitMetadata([], gitHash) + } +} +``` + +{{% /tab %}} +{{% tab "Others" %}} + +1. Set the environment variable `DD_TAGS="git.commit.sha:,git.repository_url="` on your Lambda functions +2. Run [datadog-ci git-metadata upload][1] in your CI pipeline to upload Git metadata +3. Optionally, [install a GitHub App][2] to display inline source code snippets + +[1]: https://github.com/DataDog/datadog-ci/tree/master/src/commands/git-metadata +[2]: https://app.datadoghq.com/account/settings#integrations/github-apps +{{% /tab %}} +{{< /tabs >}} + +## Create monitors + +Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][21]. If you are using the Datadog serverless plugin, see [how to enable default and custom monitors in serverless.yml][22]. + +## Create synthetic tests + +If your serverless application powers an API or webpage, consider setting up Datadog [synthetic tests][23]. +## Enable AWS Lambda code signing + +[Code signing for AWS Lambda][24] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. + +If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. + +``` +arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc +``` + +## Migrate to the Datadog Lambda extension + +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. For existing installations using the Forwarder, see [Deciding to migrate to the Datadog Lambda extension][25] for why you should [migrate][26]. + +## Troubleshoot + +If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][27]. + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + + +[1]: /serverless/installation/ +[2]: /serverless/libraries_integrations/extension/ +[3]: /integrations/amazon_web_services/ +[4]: /serverless/libraries_integrations/forwarder/ +[5]: https://www.datadoghq.com/blog/troubleshoot-lambda-function-request-response-payloads/ +[6]: /tracing/setup_overview/configure_data_security/#scrub-sensitive-data-from-your-spans +[7]: /serverless/enhanced_lambda_metrics +[8]: /integrations/amazon_api_gateway/#data-collected +[9]: /integrations/amazon_appsync/#data-collected +[10]: /integrations/amazon_sqs/#data-collected +[11]: /integrations/amazon_web_services/#log-collection +[12]: https://www.datadoghq.com/blog/monitor-aws-fully-managed-services-datadog-serverless-monitoring/ +[13]: /serverless/distributed_tracing/serverless_trace_propagation/ +[14]: /agent/logs/advanced_log_collection/ +[15]: /tracing/setup_overview/compatibility_requirements/ +[16]: /tracing/setup_overview/custom_instrumentation/ +[17]: /tracing/guide/ignoring_apm_resources/ +[18]: /tracing/setup_overview/configure_data_security/ +[19]: /logs/log_configuration/parsing/ +[20]: /integrations/guide/source-code-integration +[21]: https://app.datadoghq.com/functions +[22]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors +[23]: /synthetics/ +[24]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html +[25]: /serverless/guide/extension_motivation/ +[26]: /serverless/guide/forwarder_extension_migration +[27]: /serverless/guide/troubleshoot_serverless_monitoring/ diff --git a/content/en/serverless/distributed_tracing/collect_lambda_payloads.md b/content/en/serverless/distributed_tracing/collect_lambda_payloads.md deleted file mode 100644 index 4690776e8f8ca..0000000000000 --- a/content/en/serverless/distributed_tracing/collect_lambda_payloads.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Collect AWS Lambda Payloads -kind: documentation -description: 'Resolve AWS Lambda function failures faster by monitoring invocation payloads' -further_reading: - - link: 'serverless' - text: 'Serverless Monitoring with Datadog' - - link: 'https://www.datadoghq.com/blog/troubleshoot-lambda-function-request-response-payloads/' - text: 'Resolve AWS Lambda function failures faster by monitoring invocation payloads' - tag: 'Blog' ---- - -{{< img src="serverless/serverless_collect_lambda_payloads.png" alt="Collect AWS Lambda Payloads" style="width:100%;" >}} - -## Overview - -You can use Datadog to collect and visualize the JSON request and response payloads of AWS Lambda functions, giving you [deeper insight into your serverless applications and helping troubleshoot Lambda function failures][1]. - -## Configuration - -To instrument your Lambda functions for the first time, follow the [serverless installation instructions][2]. AWS Lambda payload ingestion requires [APM to be configured on your functions][3] and is available for the following Lambda runtimes: -- Python ([v49+][4]) -- Node.js ([v64+][5]) - -Set the `DD_CAPTURE_LAMBDA_PAYLOAD` environment variable to `true` on each of your functions send Lambda request and response payloads to Datadog. - -This functionality is also compatible with AWS X-Ray. Follow the steps in the [Datadog-AWS X-Ray integration][6] to enrich AWS Lambda function X-Ray segments with Datadog's Lambda Libraries. - -## Obfuscating payload contents - -To prevent any sensitive data within request or response JSON objects from being sent to Datadog (like account IDs or addresses), you can to scrub specific parameters from being sent to Datadog. - -To do this, add a new file `datadog.yaml` in the same folder as your Lambda function code. Obfuscation of fields in the Lambda payload is then available through [the replace_tags block][7] within `apm_config` settings in `datadog.yaml`: - -```yaml -apm_config: - replace_tags: - # Replace all the occurrences of "foobar" in any tag with "REDACTED": - - name: "*" - pattern: "foobar" - repl: "REDACTED" - # Remove all headers with key "auth" and replace with an empty string - - name: "function.request.headers.auth" - pattern: "(?s).*" - repl: "" - # Remove "apiToken" from any response payload, and replace with "****" - - name: "function.response.apiToken" - pattern: "(?s).*" - repl: "****" -``` - -As an alternative, you can also populate the `DD_APM_REPLACE_TAGS` environment variable on your Lambda function to obfuscate specific fields: - -```yaml -DD_APM_REPLACE_TAGS=[ - { - "name": "*", - "pattern": "foobar", - "repl": "REDACTED" - }, - { - "name": "function.request.headers.auth", - "pattern": "(?s).*", - "repl": "" - }, - { - "name": "function.response.apiToken", - "pattern": "(?s).*" - "repl": "****" - } -] -``` - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://www.datadoghq.com/blog/troubleshoot-lambda-function-request-response-payloads -[2]: /serverless/installation -[3]: /serverless/distributed_tracing -[4]: https://github.com/DataDog/datadog-lambda-python/releases/tag/v49 -[5]: https://github.com/DataDog/datadog-lambda-js/releases/tag/v4.64.0 -[6]: https://docs.datadoghq.com/integrations/amazon_xray/?tab=nodejs#enriching-xray-segments-with-datadog-libraries -[7]: /tracing/setup_overview/configure_data_security/?tab=mongodb#replace-rules-for-tag-filtering diff --git a/content/en/serverless/guide/extension_motivation.md b/content/en/serverless/guide/extension_motivation.md index 9c0b801db23d6..b3144d4f6ae18 100644 --- a/content/en/serverless/guide/extension_motivation.md +++ b/content/en/serverless/guide/extension_motivation.md @@ -1,6 +1,10 @@ --- title: Deciding to migrate to the Datadog Lambda extension kind: guide +further_reading: + - link: '/serverless/guide/forwarder_extension_migration' + tag: 'Documentation' + text: 'Migrating from the Datadog Forwarder to the Datadog Lambda Extension' --- ## Should I migrate to the Datadog Lambda extension? @@ -15,34 +19,28 @@ There are some key differences between the Lambda extension and the Forwarder, a {{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} -The Lambda extension only supports sending Lambda function telemetry for specific runtimes. The Forwarder is required to collect and add metadata to other AWS service logs, including those from API Gateway, AppSync, and Lambda@Edge. - -| Runtime | Extension support | Forwarder support | -| ------- | ----------------- | ----------------- | -| Python | {{< X >}} | {{< X >}} | -| Node.js | {{< X >}} | {{< X >}} | -| Go | {{< X >}} | {{< X >}} | -| Java | {{< X >}} | {{< X >}} | -| .NET | {{< X >}} | | -| Ruby | | {{< X >}} | -| PHP | | | - -The Lambda extension can submit Lambda logs, Lambda traces generated by `dd-trace` (not X-Ray), real-time enhanced Lambda metrics, and custom metrics generated by Lambda functions. +Although Lambda extension replaces the Forwarder as the recommended way to collect telemetry from Lambda functions. The Forwarder is required to collect and add metadata to other AWS service logs, including those from API Gateway, AppSync, and Lambda@Edge. ### Advantages The Datadog Lambda Extension offers the following advantages over the Datadog Forwarder: -- **Simple to set up**: The Forwarder requires triggers to be set up for every new Lambda function. The Datadog Lambda extension can be added as a Lambda layer. Unlike with the Forwarder, configuring the Lambda extension does not require permissions to install third-party AWS CloudFormation stacks. Also, the Lambda extension sends telemetry directly to Datadog, so you do not need to manage CloudWatch Log group subscriptions for your Lambda functions. -- **Less infrastructure to manage**: The simpler configuration of the Lambda extension saves time on infrastructure management. For non-Lambda AWS integrations, the Forwarder is still required. -- **Skip CloudWatch Logs**: The Forwarder converts logs to metrics and traces, which are then sent to Datadog. The Datadog Lambda Extension sends traces, metrics, and logs directly to Datadog, enabling you to reduce the cost associated with CloudWatch Logs. +- **Skip CloudWatch Logs**: The Forwarder extracts telemetry from logs, which are then sent to Datadog. The Datadog Lambda Extension sends telemetry directly to Datadog, enabling you to reduce the cost associated with CloudWatch Logs. +- **Simple to set up**: The Datadog Lambda extension can be added as a Lambda layer and sends telemetry directly to Datadog, so you do not need to set up a subscription filter for every new Lambda function's CloudWatch log group. ### Trade-offs The extension [adds overhead to your Lambda functions][4], compared to functions that have zero instrumentation. The added overhead affects your AWS bill and Lambda concurrency, and could cause worse cold starts. The majority of the added duration **does not** affect your function's performance. Based on Datadog's latest benchmarking results, the cost overhead is always lower (or about the same when reporting data from remote regions) when using the Lambda extension versus the Forwarder. +## Migrate to the Datadog Lambda Extension + +To migrate from the the Datadog Forwarder to the Datadog Lambda Extension, follow these [instructions][5]. +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} [1]: /serverless/libraries_integrations/extension/ [2]: /serverless [3]: /serverless/libraries_integrations/forwarder/ [4]: /serverless/libraries_integrations/extension/#overhead +[5]: /serverless/guide/forwarder_extension_migration diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index 1baa7a0175ab4..81d83c4cfb7ee 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -4,25 +4,38 @@ kind: documentation aliases: - /serverless/installation/installing_the_library/ further_reading: - - link: 'serverless/installation/node' + - link: '/serverless/configuration/' tag: 'Documentation' - text: 'Installing Node.js Serverless Monitoring' - - link: 'serverless/installation/ruby' - tag: 'Documentation' - text: 'Installing Ruby Serverless Monitoring' + text: 'Configure Serverless Monitoring' + - link: "/integrations/amazon_lambda/" + tag: "Documentation" + text: "AWS Lambda Integration" --- ## Quick start -If you are new to Datadog, you can get started by [signing up for a Datadog account][5], then following the instructions for [installing Datadog's Lambda Extension][6]. Completing these steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog: - -{{< img src="serverless/aws-fully-managed-services-serverless-monitoring-hero.png" alt="Datadog Serverless Monitoring" style="width:100%;" >}} +If you are new to Datadog, [sign up for a Datadog account][1], then follow the installation instructions for [AWS Lambda][2]. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. ## Installation instructions -For more detailed installation instructions, select the Lambda runtime below for instructions to instrument your serverless application: +For more detailed installation instructions, select the Lambda runtime below: {{< partial name="serverless/getting-started-languages.html" >}} -[5]: https://app.datadoghq.com/signup/ -[6]: https://app.datadoghq.com/signup/agent#lambda +## Advanced Configurations + +After the installation and collecting the telemetry, follow the [advanced configurations][3] to: + +- connect your metrics, traces, and logs using tags +- collect metrics, traces, and logs from AWS API Gateway, SQS, etc. +- collect the request and response payloads for individual Lambda invocations +- link errors of your Lambda functions to your source code +- filter or scrub sensitive information from logs or traces + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: https://app.datadoghq.com/signup/ +[2]: https://app.datadoghq.com/signup/agent#lambda +[3]: /serverless/configuration/ diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 3475612d7033f..2dc37836bcd31 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -2,9 +2,6 @@ title: Instrumenting Python Serverless Applications kind: documentation further_reading: -- link: 'serverless/datadog_lambda_library/python' - tag: 'Documentation' - text: 'Datadog Lambda Library for Python' - link: 'serverless/distributed_tracing/' tag: 'Documentation' text: 'Tracing Serverless Applications' @@ -21,514 +18,303 @@ aliases:
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Python guide.
-## Configuration +## Installation -Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI, which does not require redeploying your whole application. The CLI can also be added to your CI/CD pipelines to enable instrumentation for applications across your entire organization. +Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI. {{< tabs >}} {{% tab "Datadog CLI" %}} The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. -You can also add the command to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command *after* your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. +1. Install the Datadog CLI client -### Install + ```sh + npm install -g @datadog/datadog-ci + ``` -Install the Datadog CLI with NPM or Yarn: +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines *after* your normal deployment. -```sh -# NPM -npm install -g @datadog/datadog-ci + ```sh + datadog-ci lambda instrument -i + ``` -# Yarn -yarn global add @datadog/datadog-ci -``` +3. Configure the AWS credentials -### Configure credentials + Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. -For a quick start, configure Datadog and [AWS credentials][1] using the [instrumentation command](#instrument). For production applications, provide credentials in a more secure manner by using environment variables. For example: +4. Configure the Datadog site -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` + Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. -### Instrument + ```sh + export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com + ``` -**Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. +5. Configure the Datadog API key -To instrument your Lambda functions, run the following command: + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. -```sh -datadog-ci lambda instrument -f -f -r -v -e -``` + ```sh + export DATADOG_API_KEY_SECRET_ARN="" + ``` -To fill in the placeholders: -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Library. The latest version is `{{< latest-lambda-layer-version layer="python" >}}`. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. + For quick testing purposes, you can also set the Datadog API key in plaintext: -For example: + ```sh + export DATADOG_API_KEY="" + ``` -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -v {{< latest-lambda-layer-version layer="python" >}} -e {{< latest-lambda-layer-version layer="extension" >}} -``` +6. Instrument your Lambda functions + + **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. + + To instrument your Lambda functions, run the following command. + + ```sh + datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="python" >}} -e {{< latest-lambda-layer-version layer="extension" >}} + ``` + + To fill in the placeholders: + - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. + - Replace `` with the AWS region name. -More information and additional parameters can be found in the [CLI documentation][2]. + Additional parameters can be found in the [CLI documentation][3]. [1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli {{% /tab %}} {{% tab "Serverless Framework" %}} -The [Datadog Serverless Plugin][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+ +The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. To install and configure the Datadog Serverless Plugin, follow these steps: 1. Install the Datadog Serverless Plugin: - ```sh - yarn add --dev serverless-plugin-datadog - ``` -2. In your `serverless.yml`, add the following: - ```yaml - plugins: - - serverless-plugin-datadog + + ```sh + serverless plugin install --name serverless-plugin-datadog ``` -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+2. Update your `serverless.yml`: -3. In your `serverless.yml`, also add the following section: ```yaml custom: datadog: - addExtension: true - apiKey: # Your Datadog API Key goes here. + site: + apiKeySecretArn: ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. + To fill in the placeholders: + - Replace `` with your [Datadog site][3] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + + For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "AWS SAM" %}} The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to add the Datadog Lambda library to your functions using layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. -### Install +1. Install the Datadog CloudFormation macro -Run the following command with your [AWS credentials][3] to deploy a CloudFormation stack that installs the macro AWS resource. You only need to install the macro **once** for a given region in your account. Replace `create-stack` with `update-stack` to update the macro to the latest version. + Run the following command with your [AWS credentials][3] to deploy a CloudFormation stack that installs the macro AWS resource. You only need to install the macro **once** for a given region in your account. Replace `create-stack` with `update-stack` to update the macro to the latest version. -```sh -aws cloudformation create-stack \ - --stack-name datadog-serverless-macro \ - --template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \ - --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM -``` + ```sh + aws cloudformation create-stack \ + --stack-name datadog-serverless-macro \ + --template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \ + --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM + ``` -The macro is now deployed and ready to use. + The macro is now deployed and ready to use. -### Instrument +2. Instrument your Lambda functions -To instrument your function, add the following to `template.yml` under the `Transform` section, **after** the `AWS::Serverless` transform for SAM. + Add the `DatadogServerless` transform **after** the `AWS::Serverless` transform under the `Transform` section in your for SAM `template.yml`. -```yaml -Transform: - - AWS::Serverless-2016-10-31 - - Name: DatadogServerless - Parameters: - stackName: !Ref "AWS::StackName" - apiKey: - pythonLayerVersion: {{< latest-lambda-layer-version layer="python" >}} - extensionLayerVersion: {{< latest-lambda-layer-version layer="extension" >}} - service: "" # Optional - env: "" # Optional -``` + ```yaml + Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + stackName: !Ref "AWS::StackName" + pythonLayerVersion: {{< latest-lambda-layer-version layer="python" >}} + extensionLayerVersion: {{< latest-lambda-layer-version layer="extension" >}} + site: "" + apiKeySecretArn: "" + ``` -To fill in the placeholders: -- Replace `` with your Datadog API key from the [API Management page][4]. -- Replace `` and `` with appropriate values. + To fill in the placeholders: + - Replace `` with your [Datadog site][4] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. -More information and additional parameters can be found in the [macro documentation][1]. + More information and additional parameters can be found in the [macro documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/macro [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension [3]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html -[4]: https://app.datadoghq.com/organization-settings/api-keys +[4]: https://docs.datadoghq.com/getting_started/site/ +[5]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "AWS CDK" %}} +The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. -The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. - -### Install the Datadog CDK constructs library - -Run the following command in your CDK project: - -```sh -#PyPI -pip install datadog-cdk-constructs -``` - -### Instrument the function - -Import the `datadog-cdk-construct` module in your AWS CDK app and add the following configuration: - -```python -from datadog_cdk_constructs import Datadog - -datadog = Datadog(self, "Datadog", - python_layer_version={{< latest-lambda-layer-version layer="python" >}}, - extension_layer_version={{< latest-lambda-layer-version layer="extension" >}}, - api_key= -) -datadog.add_lambda_functions([]) -``` - -Replace `` with your Datadog API key on the [API Management page][1]. - -More information and additional parameters can be found on the [Datadog CDK NPM page][2]. - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: https://www.npmjs.com/package/datadog-cdk-constructs -{{% /tab %}} -{{% tab "Zappa" %}} - -### Update settings - -1. Add the following settings to your `zappa_settings.json`: - - {{< site-region region="us,us3,us5,eu" >}} - ```json - { - "dev": { - "layers": [ - "arn:aws:lambda::464622532012:layer:Datadog-:", "arn:aws:lambda::464622532012:layer:Datadog-Extension:" - ], - "lambda_handler": "datadog_lambda.handler.handler", - "aws_environment_variables": { - "DD_LAMBDA_HANDLER": "handler.lambda_handler", - "DD_TRACE_ENABLED": "true", - "DD_API_KEY": "", - } - } - } - ``` - {{< /site-region >}} - {{< site-region region="gov" >}} - ```json - { - "dev": { - "layers": [ - "arn:aws-us-gov:lambda::002406178527:layer:Datadog-:", "arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:" - ], - "lambda_handler": "datadog_lambda.handler.handler", - "aws_environment_variables": { - "DD_LAMBDA_HANDLER": "handler.lambda_handler", - "DD_TRACE_ENABLED": "true", - "DD_API_KEY": "" - }, - } - } - ``` - {{< /site-region >}} -2. Replace the following placeholders with appropriate values: - -- Replace `` with the AWS region to which your Lambda functions are deployed. -- Replace `` with the appropriate Python runtime. The available `RUNTIME` options are `Python27`, `Python36`, `Python37`, and `Python38`. -- Replace `` with the desired version of the Datadog Lambda Library. The latest version is `{{< latest-lambda-layer-version layer="python" >}}`. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. -- Replace `` with your Datadog API key on the [API Management page][1]. -- If the lambda is using the arm64 architecture, add -ARM to the layer name. +1. Install the Datadog CDK constructs library -For example: - -{{< site-region region="us,us3,us5,eu" >}} -``` -// For x86 architecture -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python38:{{< latest-lambda-layer-version layer="python" >}} -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} -// For arm64 architecture -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python38-ARM:{{< latest-lambda-layer-version layer="python" >}} -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -// For x86 architecture -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python38:{{< latest-lambda-layer-version layer="python" >}} -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} -// For arm64 architecture -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python38-ARM:{{< latest-lambda-layer-version layer="python" >}} -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} -``` -{{< /site-region >}} + ```sh + # For AWS CDK v1 + pip install datadog-cdk-constructs -[1]: https://app.datadoghq.com/organization-settings/api-keys -{{% /tab %}} -{{% tab "Chalice" %}} - -### Update the project - -1. Add the [Datadog Lambda Extension][1] and the following environment variables in your `config.json`: - {{< site-region region="us,us3,us5,eu" >}} - ```json - { - "version": "2.0", - "app_name": "hello-chalice", - "stages": { - "dev": { - "api_gateway_stage": "api", - "environment_variables": { - "DD_TRACE_ENABLED": "true", - "DD_API_KEY": "", - }, - "layers": ["arn:aws:lambda::464622532012:layer:Datadog-Extension:"], - } - } - } - ``` - {{< /site-region >}} - {{< site-region region="gov" >}} - ```json - { - "version": "2.0", - "app_name": "hello-chalice", - "stages": { - "dev": { - "api_gateway_stage": "api", - "environment_variables": { - "DD_TRACE_ENABLED": "true", - "DD_API_KEY": "", - }, - "layers": ["arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:"], - } - } + # For AWS CDK v2 + pip install datadog-cdk-constructs-v2 ``` - {{< /site-region >}} - - **Note**: For security, you may wish to store your Datadog API key in AWS Secrets Manager. In this case, set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the Secrets Manager secret containing your Datadog API key. In other words, you can replace the line `"DD_API_KEY": ""` in the configuration above with `"DD_API_KEY_SECRET_ARN": ""`. Accessing this key during a cold start adds extra latency. - -2. Replace the following placeholders with appropriate values: -- Replace `` with the AWS region to which your Lambda functions are deployed. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. -- If the lambda is using the arm64 architecture, add -ARM to the layer name. +2. Instrument your Lambda functions -3. Add `datadog_lambda` to your `requirements.txt`. -4. Register `datadog_lambda_wrapper` as a [middleware][2] in your `app.py`: ```python - from chalice import Chalice, ConvertToMiddleware - from datadog_lambda.wrapper import datadog_lambda_wrapper - - app = Chalice(app_name='hello-chalice') - - app.register_middleware(ConvertToMiddleware(datadog_lambda_wrapper)) - - @app.route('/') - def index(): - return {'hello': 'world'} + # For AWS CDK v1 + from datadog_cdk_constructs import Datadog + + # For AWS CDK v2 + from datadog_cdk_constructs_v2 import Datadog + + datadog = Datadog(self, "Datadog", + python_layer_version={{< latest-lambda-layer-version layer="python" >}}, + extension_layer_version={{< latest-lambda-layer-version layer="extension" >}}, + site="", + apiKeySecretArn="", + ) + datadog.add_lambda_functions([]) ``` -[1]: /serverless/libraries_integrations/extension/ -[2]: https://aws.github.io/chalice/topics/middleware.html?highlight=handler#registering-middleware -{{% /tab %}} -{{% tab "Terraform" %}} - -### Update configurations - -1. Add the following configurations to the `aws_lambda_function` resources in your .tf files: - -{{< site-region region="us,us3,us5,eu" >}} -```hcl -variable "dd_api_key" { - type = string - description = "Datadog API key" -} -resource "aws_lambda_function" "my_func" { - function_name = "my_func" - handler = "datadog_lambda.handler.handler" - layers = [ - "arn:aws:lambda::464622532012:layer:Datadog-:", - "arn:aws:lambda::464622532012:layer:Datadog-Extension:", - ] - environment { - variables = { - DD_LAMBDA_HANDLER = "my_func.handler" - DD_TRACE_ENABLED = true - DD_API_KEY = var.dd_api_key - } - } -} -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -```hcl -variable "dd_api_key" { - type = string - description = "Datadog API key" -} -resource "aws_lambda_function" "my_func" { - function_name = "my_func" - handler = "datadog_lambda.handler.handler" - layers = [ - "arn:aws-us-gov:lambda::002406178527:layer:Datadog-:", - "arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:", - ] - environment { - variables = { - DD_LAMBDA_HANDLER = "my_func.handler" - DD_TRACE_ENABLED = true - DD_API_KEY = var.dd_api_key - } - } -} -``` -{{< /site-region >}} + To fill in the placeholders: + - Replace `` with your [Datadog site][2] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. -2. Replace the following placeholders with appropriate values: + More information and additional parameters can be found on the [Datadog CDK documentation][1]. - - Replace `` with the AWS region to which your Lambda functions are deployed. - - Replace `` with the appropriate Python runtime. The available `RUNTIME` options are `Python27`, `Python36`, `Python37`, and `Python38`. - - Replace `` with the desired version of the Datadog Lambda Library. The latest version is `{{< latest-lambda-layer-version layer="python" >}}`. - - Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. - -3. Apply the Terraform configuration with your Datadog API key that can be found on the [API Management page][1]: - - ```bash - terraform apply -var "dd_api_key=" - ``` - -[1]: https://app.datadoghq.com/organization-settings/api-keys +[1]: https://github.com/DataDog/datadog-cdk-constructs +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Container Image" %}} -### Install +1. Install the Datadog Lambda Library for Python -If you are deploying your Lambda function as a container image, you cannot use the Datadog Lambda Library as a Lambda Layer. Instead, you must install the Datadog Lambda library as a dependency of your function within the image. + If you are deploying your Lambda function as a container image, you cannot use the Datadog Lambda library as a Lambda Layer. Instead, you must install the Datadog Lambda library as a dependency of your function within the image. -```sh -pip install datadog-lambda -``` + ```sh + pip install datadog-lambda + ``` -Note that the minor version of the `datadog-lambda` package always matches the layer version. For example, `datadog-lambda v0.5.0` matches the content of layer version 5. + Note that the minor version of the `datadog-lambda` package always matches the layer version. For example, `datadog-lambda v0.5.0` matches the content of layer version 5. -### Install the Datadog Lambda Extension +2. Install the Datadog Lambda Extension -Add the Datadog Lambda Extension to your container image by adding the following to your Dockerfile: + Add the Datadog Lambda Extension to your container image by adding the following to your Dockerfile: -```dockerfile -COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions -``` + ```dockerfile + COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions + ``` -Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. + Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -### Configure the function +3. Configure your Lambda functions -1. Set your image's `CMD` value to `datadog_lambda.handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. -2. Set the following environment variables in AWS: - - Set `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - - Set `DD_TRACE_ENABLED` to `true`. - - Set `DD_API_KEY` with your Datadog API key on the [API Management page][2]. -3. Optionally add `service` and `env` tags with appropriate values to your function. + - Set your image's `CMD` value to `datadog_lambda.handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. + - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. + - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_TRACE_ENABLED` to `true`. [1]: https://gallery.ecr.aws/datadog/lambda-extension -[2]: https://app.datadoghq.com/organization-settings/api-keys +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} -
If you are not using a serverless development tool that Datadog supports, such as the Serverless Framework or AWS CDK, Datadog strongly encourages you instrument your serverless applications with the Datadog CLI.
+
If you are not using a serverless development tool that Datadog supports, such as the Serverless Framework or AWS CDK, Datadog strongly encourages you instrument your serverless applications with the Datadog CLI.
-### Install the Datadog Lambda library +1. Install the Datadog Lambda library -The Datadog Lambda Library can be imported either as a layer (recommended) _OR_ as a Python package. + The Datadog Lambda Library can be imported either as a layer (recommended) _OR_ as a Python package. -The minor version of the `datadog-lambda` package always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. + The minor version of the `datadog-lambda` package always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. -#### Using the layer + - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format: -[Configure the layers][1] for your Lambda function using the ARN in the following format: + ```sh + # AWS commercial regions (x86 and arm64, respectively) + arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="python" >}} + arn:aws:lambda::464622532012:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="python" >}} -{{< site-region region="us,us3,us5,eu" >}} -``` -arn:aws:lambda::464622532012:layer:Datadog-: -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -arn:aws-us-gov:lambda::002406178527:layer:Datadog-: -``` -{{< /site-region >}} + # AWS GovCloud regions (x86 and arm64, respectively) + arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="python" >}} + arn:aws-us-gov:lambda::002406178527:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="python" >}} + ``` -The available `RUNTIME` options are `Python27`, `Python36`, `Python37`, and `Python38`. The latest `VERSION` is `{{< latest-lambda-layer-version layer="python" >}}`. For example: + Replace `` with a valid AWS region, such as `us-east-1`. The available `RUNTIME` options are `Python37`, `Python38` and `Python39`. -{{< site-region region="us,us3,us5,eu" >}} -``` -// If using x86 architecture -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python37:{{< latest-lambda-layer-version layer="python" >}} + - Option B: If you cannot use the prebuilt Datadog Lambda layer for some reason, alternatively install the `datadog-lambda` package and its dependencies locally to your function project folder using your favorite Python package manager, such as `pip`. -// If using arm64 architecture -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python37-ARM:{{< latest-lambda-layer-version layer="python" >}} -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -// If using x86 architecture -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python37:{{< latest-lambda-layer-version layer="python" >}} -// If using arm64 architecture -arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python37-ARM:{{< latest-lambda-layer-version layer="python" >}} + ```sh + pip install datadog-lambda -t ./ + ``` -``` -{{< /site-region >}} + **Note**: `datadog-lambda` depends on `ddtrace`, which uses native extensions; therefore they must be installed and compiled in a Linux environment on the right architecture (`x86_64` or `arm64`). For example, you can use [dockerizePip][2] for the Serverless Framework and [--use-container][3] for AWS SAM. For more details, see [how to add dependencies to your function deployment package][4]. -#### Using the package + See the [latest release][5]. -If you cannot use the prebuilt Datadog Lambda layer for some reason, alternatively install the `datadog-lambda` package and its dependencies locally to your function project folder using your favorite Python package manager, such as `pip`. +2. Install the Datadog Lambda Extension -```sh -pip install datadog-lambda -t ./ -``` + [Configure the layers][1] for your Lambda function using the ARN in the following format: -**Note**: `datadog-lambda` depends on `ddtrace`, which uses native extensions; therefore they must be installed and compiled in a Linux environment on the right architecture (`x86_64` or `arm64`). For example, you can use [dockerizePip][2] for the Serverless Framework and [--use-container][3] for AWS SAM. For more details, see [how to add dependencies to your function deployment package][4]. + ```sh + # AWS commercial regions (x86 and arm64, respectively) + arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} -See the [latest release][5]. + # AWS GovCloud regions (x86 and arm64, respectively) + arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} + ``` -### Install the Datadog Lambda Extension + Replace `` with a valid AWS region, such as `us-east-1`. -[Configure the layers][1] for your Lambda function using the ARN in the following format: +3. Configure your Lambda functions -{{< site-region region="us,us3,us5,eu" >}} -``` -// For x86 architecture -arn:aws:lambda::464622532012:layer:Datadog-Extension: -// For arm64 architecture -arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM: -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -// For x86 architecture -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension: -// For arm64 architecture -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM: -``` -{{< /site-region >}} + - Set your function's handler to `datadog_lambda.handler.handler`. + - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. + - Set the environment variable `DD_SITE` with your [Datadog site][6] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][7] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_TRACE_ENABLED` to `true`. + +4. (AWS Chalice only) Register the middleware -The latest `EXTENSION_VERSION` is {{< latest-lambda-layer-version layer="extension" >}}. + If you are using [AWS Chalice][8], you must install `datadog-lambda` using `pip`, and register `datadog_lambda_wrapper` as a [middleware][9] in your `app.py`: + + ```python + from chalice import Chalice, ConvertToMiddleware + from datadog_lambda.wrapper import datadog_lambda_wrapper -### Configure + app = Chalice(app_name='hello-chalice') -Follow these steps to configure the function: + app.register_middleware(ConvertToMiddleware(datadog_lambda_wrapper)) -1. Set your function's handler to `datadog_lambda.handler.handler`. -2. Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. -3. Set the environment variable `DD_TRACE_ENABLED` to `true`. -4. Set the environment variable `DD_API_KEY` to your Datadog API key on the [API Management page][6]. -5. Optionally add a `service` and `env` tag with appropriate values to your function. + @app.route('/') + def index(): + return {'hello': 'world'} + ``` [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html @@ -536,30 +322,34 @@ Follow these steps to configure the function: [3]: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html [4]: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies [5]: https://pypi.org/project/datadog-lambda/ -[6]: https://app.datadoghq.com/organization-settings/api-keys +[6]: https://docs.datadoghq.com/getting_started/site/ +[7]: https://app.datadoghq.com/organization-settings/api-keys +[8]: https://aws.github.io/chalice/ +[9]: https://aws.github.io/chalice/topics/middleware.html {{% /tab %}} {{< /tabs >}} -## Explore Datadog serverless monitoring - -After you have configured your function following the steps above, you can view metrics, logs and traces on the [Serverless Homepage][1]. - -### Unified service tagging +### PrivateLink and Proxy -Datadog recommends tagging your serverless applications with `DD_ENV`, `DD_SERVICE`, `DD_VERSION`, and `DD_TAGS`. See the [Lambda extension documentation][2] for more details. +The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][1] to the US1 (`datadoghq.com`) [Datadog site][2], or [send data over a proxy][3] for all other sites. -### Collect logs from AWS serverless resources +## Explore Datadog serverless monitoring -Serverless logs generated by managed resources besides AWS Lambda functions can be hugely valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you forward logs from the following managed resources in your environment: -- API's: API Gateway, AppSync, ALB -- Queues & Streams: SQS, SNS, Kinesis -- Data Stores: DynamoDB, S3, RDS, etc. +Congratulations! Once you complete all the installation steps above, you can now view metrics, logs, and traces on the [Serverless Homepage][4]. -To collect logs from non-Lambda AWS resources, install and configure the [Datadog Forwarder][3] to subscribe to each of your managed resource CloudWatch log groups. +What's next? +- See the sample code to [monitor custom business logic](#monitor-custom-business-logic) +- See the [troubleshooting guide][5] if you have trouble collecting the telemetry +- See the [advanced configurations][6] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces -### Monitor custom business logic +## Monitor custom business logic -If you would like to submit a custom metric or span, see the sample code below: +To monitor your custom business logic, submit a custom metric or span using the sample code below. For additional options, see [custom metric submission for serverless applications][7] and the APM guide for [custom instrumentation][8]. ```python import time @@ -595,22 +385,15 @@ def get_message(): return 'Hello from serverless!' ``` -For more information on custom metric submission, see [here][4]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][5]. - -If your Lambda function is running in a VPC, follow these [instructions][6] to ensure that the extension can reach Datadog API endpoints. - -## Troubleshooting - -If you have trouble collecting monitoring data after following the instructions above, see the [serverless monitoring troubleshooting guide][7]. - ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: https://app.datadoghq.com/functions -[2]: /serverless/libraries_integrations/extension/#tagging -[3]: /serverless/libraries_integrations/forwarder -[4]: /serverless/custom_metrics?tab=python -[5]: /tracing/custom_instrumentation/python/ -[6]: /serverless/libraries_integrations/extension/#vpc -[7]: /serverless/guide/troubleshoot_serverless_monitoring/ +[1]: /agent/guide/private-link/ +[2]: /getting_started/site/ +[3]: /agent/proxy/ +[4]: https://app.datadoghq.com/functions +[5]: /serverless/guide/troubleshoot_serverless_monitoring/ +[6]: /serverless/configuration/ +[7]: /serverless/custom_metrics?tab=python +[8]: /tracing/custom_instrumentation/python/ diff --git a/content/en/serverless/libraries_integrations/extension.md b/content/en/serverless/libraries_integrations/extension.md index e8b3217b4b928..bfa216ce1c514 100644 --- a/content/en/serverless/libraries_integrations/extension.md +++ b/content/en/serverless/libraries_integrations/extension.md @@ -17,73 +17,19 @@ aliases: AWS Lambda extensions are companion processes that augment your Lambda functions. They run within the Lambda execution environment, alongside your Lambda function code. The Datadog extension is a lightweight version of the Datadog Agent built to run alongside your code with minimal performance overhead. -{{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} - -The Datadog Lambda Extension is responsible for: -- Pushing real-time [enhanced Lambda metrics][1], [custom metrics][2], and [traces][3] from the Datadog Lambda Library to Datadog. -- Forwarding logs from your Lambda function to Datadog. +The Datadog extension submits [enhanced Lambda metrics][1], [custom metrics][2], [traces][3], and logs asynchronously. Submitting Lambda logs with the extension is supported in all Lambda runtimes. Submitting custom metrics, enhanced metrics and traces is supported in Node.js, Python, Go, and .NET Lambda runtimes. -The Datadog extension submits custom metrics, enhanced metrics, traces, and logs [asynchronously][4]. Submitting Lambda logs with the extension is supported in all Lambda runtimes. Submitting custom metrics, enhanced metrics and traces is supported in Node.js, Python, Go, and .NET Lambda runtimes. +{{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} ## Installation -To install the Datadog Lambda Extension, instrument your AWS serverless applications, and review supported runtimes, see the [serverless installation instructions][5]. - -## Log collection - -To disable submission of your AWS Lambda logs to Datadog using the extension, set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false` in your Lambda function. - -To exclude the `START` and `END` logs, set the environment variable `DD_LOGS_CONFIG_PROCESSING_RULES` to `[{"type": "exclude_at_match", "name": "exclude_start_and_end_logs", "pattern": "(START|END) RequestId\\s"}]`. Alternatively, you can add a `datadog.yaml` file in your project root directory with the following content: - -```yaml -logs_config: - processing_rules: - - type: exclude_at_match - name: exclude_start_and_end_logs - pattern: (START|END) RequestId\s -``` - -Datadog recommends keeping the `REPORT` logs, as they are used to populate the invocations list in the serverless function views. - -To scrub or filter other logs before sending them to Datadog, see [Advanced Log Collection][6]. - - -## Trace collection - -To disable submission of your AWS Lambda traces to Datadog using the extension, set the environment variable `DD_TRACE_ENABLED` to `false` in your Lambda function. - -To filter traces before sending them to Datadog, see [Ignoring Unwanted Resources in APM][7]. - -To scrub trace attributes for data security, see [Configure the Datadog Agent or Tracer for Data Security][8]. - -## Tagging - -When using the Extension, Datadog recommends you apply tags by adding the following environment variables to your Lambda functions: - -- `DD_ENV`: This sets the `env` tag in Datadog. Use it to separate out your staging, development, and production environments. -- `DD_SERVICE`: This sets the `service` tag in Datadog. Use it to group related Lambda functions into a service. -- `DD_VERSION`: This sets the `version` tag in Datadog. Use it to enable [Deployment Tracking][9]. -- `DD_TAGS`: This sets custom tags in Datadog. Must be a list of `:` separated by commas such as: `layer:api,team:intake`. - -If you have the Datadog AWS integration enabled, any AWS resource tag applied to your AWS Lambda function also gets applied in Datadog automatically. - -## VPC - -The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in a VPC private subnet without access to public internet, see the options below. - -### Using AWS PrivateLink - -If you are sending data to the Datadog site US1, then you can [send data over AWS PrivateLink][10]. See [Datadog Sites][11] if you are unsure about your Datadog site. - -### Using a proxy - -If you are sending data to a Datadog site that is _NOT_ hosted on AWS, such as EU1, then you need to [send data over a proxy][12]. +To install the Datadog Lambda Extension, see the [serverless installation instructions][4]. ## Overhead The Datadog Lambda Extension introduces a small amount of overhead to your Lambda function's cold starts (that is, the higher init duration), as the Extension needs to initialize. Datadog is continuously optimizing the Lambda extension performance and recommend always using the latest release. -You may notice an increase of your Lambda function's reported duration. This is because the Datadog Lambda Extension needs to flush data back to the Datadog API. Although the time spent by the extension flushing data is reported as part of the duration, it's done *after* AWS returns your function's response back to the client. In other words, the added duration does not slow down your Lambda function. See this [AWS blog post][13] for more technical information. To monitor your function's actual performance and exclude the duration added by the Datadog extension, use the metric `aws.lambda.enhanced.runtime_duration`. +You may notice an increase of your Lambda function's reported duration. This is because the Datadog Lambda Extension needs to flush data back to the Datadog API. Although the time spent by the extension flushing data is reported as part of the duration, it's done *after* AWS returns your function's response back to the client. In other words, the added duration does not slow down your Lambda function. See this [AWS blog post][5] for more technical information. To monitor your function's actual performance and exclude the duration added by the Datadog extension, use the metric `aws.lambda.enhanced.runtime_duration`. By default, the Extension sends data back to Datadog at the end of each invocation. This avoids delays of data arrival for sporadic invocations from low-traffic applications, cron jobs, and manual tests. Once the Extension detects a steady and frequent invocation pattern (more than once per minute), it batches data from multiple invocations and flushes periodically at the beginning of the invocation when it's due. This means that *the busier your function is, the lower the average duration overhead per invocation*. @@ -97,13 +43,5 @@ For Lambda functions deployed in a region that is far from the Datadog site, for [1]: /serverless/enhanced_lambda_metrics [2]: /serverless/custom_metrics [3]: /serverless/distributed_tracing -[4]: /serverless/custom_metrics?tab=python#synchronous-vs-asynchronous-custom-metrics -[5]: /serverless/installation -[6]: /agent/logs/advanced_log_collection/ -[7]: /tracing/guide/ignoring_apm_resources/ -[8]: /tracing/setup_overview/configure_data_security/ -[9]: /tracing/deployment_tracking/ -[10]: /agent/guide/private-link/ -[11]: /getting_started/site/ -[12]: /agent/proxy/ -[13]: https://aws.amazon.com/blogs/compute/performance-and-functionality-improvements-for-aws-lambda-extensions/ +[4]: /serverless/installation +[5]: https://aws.amazon.com/blogs/compute/performance-and-functionality-improvements-for-aws-lambda-extensions/ diff --git a/content/en/serverless/libraries_integrations/lambda_code_signing.md b/content/en/serverless/libraries_integrations/lambda_code_signing.md deleted file mode 100644 index 55375fb786de3..0000000000000 --- a/content/en/serverless/libraries_integrations/lambda_code_signing.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Lambda Code Signing -kind: documentation ---- - -[Code signing for AWS Lambda][1] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your [Code Signing Configuration][2]. - -# Configuration - -If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN (`arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc`) to your function's [Code Signing Configuration][2] before you can deploy Lambda functions using Lambda Layers published by Datadog. The following libraries & integrations add Lambda Layers to your functions: -- [Datadog Lambda Library][3] -- [Datadog Lambda Extension][4] -- [Datadog Serverless Plugin][5] -- [Datadog CloudFormation Macro][6] -- [Datadog CLI][7] -- [Datadog CDK Construct Library][8] - -[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html -[2]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-config-updates -[3]: /serverless/libraries_integrations/library -[4]: /serverless/libraries_integrations/extension -[5]: /serverless/libraries_integrations/plugin -[6]: /serverless/libraries_integrations/macro -[7]: /serverless/libraries_integrations/cli -[8]: https://www.npmjs.com/package/datadog-cdk-constructs diff --git a/static/images/metrics/distributions/percentile_QVW.jpg b/static/images/metrics/distributions/percentile_QVW.jpg deleted file mode 100644 index 1153a51d440bf28dc2b61bf3329316fccce7fb4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599457 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%0AO3eG4HTxVTnNqLhJ2B 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�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

sdr;kfcL7k>Kb~v)j!Zv?SdZrhS#b<(@ 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

(^H}nH@kDeJe_TK_I7lUNgTf=4m7j02 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

5+o`M!%whii5_6wsY}{{#*eN_}3C$gu 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 From d8988df5fb7bb0d9e204164bde2485ebd737c5e2 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Tue, 12 Apr 2022 17:57:17 -0400 Subject: [PATCH 02/35] mark runtime support --- content/en/serverless/configuration/_index.md | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index e3eabcc9b98dc..62d4705e99361 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -128,6 +128,8 @@ Datadog can also enrich the collected telemetry with existing AWS resource tags ## Collect the request and response payloads +

+ Datadog can [collect and visualize the JSON request and response payloads of AWS Lambda functions][5], giving you deeper insight into your serverless applications and helping troubleshoot Lambda function failures. This feature is disabled by default, follow the instructions below for the installation method you use. @@ -252,6 +254,8 @@ Logs generated by managed resources besides AWS Lambda functions can be hugely v ## Collect traces from non-Lambda resources +
This feature is currently supported for Python, Node.js, Java, and .NET.
+ Datadog can infer APM spans based on the incoming Lambda events for the AWS managed resources that trigger the Lambda function. This can be hugely valuable in helping visualize the relationship between the AWS managed resources and identify performance issues in your serverless applications. See [additional product details][12]. The following resources are currently supported: @@ -399,7 +403,7 @@ Set the environment variable `DD_TRACE_ENABLED` to `false` on your Lambda functi If you are using the [Lambda extension][2] to collect traces and logs, Datadog automatically adds the AWS Lambda request id to the `aws.lambda` span under the `request_id` tag as well as the Lambda logs for the same request under the `lambda.request_id` attribute. The Datadog trace and log views are connected using the AWS Lambda request ID. -If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs. The Datadog trace and log views are connected using the Datadog trace ID. This should work when using the default or a popular logger. If you are using a custom logger that isn't supported: +If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs (enabled by the environment variable `DD_LOGS_INJECTION`). The Datadog trace and log views are connected using the Datadog trace ID. This feature is supported for most applications using a popular runtime and logger (see the [support by runtime][19]). If you are using a runtime or custom logger that isn't supported: - When logging in JSON, you need to obtain the Datadog trace ID using `dd-trace` and add it to your logs under the `dd.trace_id` field: ```javascript { @@ -414,11 +418,13 @@ If you are using the [Forwarder Lambda function][4] to collect traces and logs, 1. obtain the Datadog trace ID using `dd-trace` and add it to your log 2. clone the default Lambda log pipeline, which is read-only 3. enable the cloned pipeline while disable the default one - 4. update the cloned pipeline to [parse][19] the Datadog trace ID into the `dd.trace_id` attribute. For example, `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}` matches `[INFO] dd.trace_id=4887065908816661012`. + 4. update the cloned pipeline to [parse][20] the Datadog trace ID into the `dd.trace_id` attribute. For example, `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}` matches `[INFO] dd.trace_id=4887065908816661012`. ## Link errors to your source code -[Datadog source code integration][20] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. +
This feature is currently supported for Go, and Java.
+ +[Datadog source code integration][21] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. {{< tabs >}} {{% tab "Datadog CLI" %}} @@ -500,14 +506,14 @@ export class ExampleStack extends cdk.Stack { ## Create monitors -Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][21]. If you are using the Datadog serverless plugin, see [how to enable default and custom monitors in serverless.yml][22]. +Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][22]. If you are using the Datadog serverless plugin, see [how to enable default and custom monitors in serverless.yml][23]. ## Create synthetic tests -If your serverless application powers an API or webpage, consider setting up Datadog [synthetic tests][23]. +If your serverless application powers an API or webpage, consider setting up Datadog [synthetic tests][24]. ## Enable AWS Lambda code signing -[Code signing for AWS Lambda][24] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. +[Code signing for AWS Lambda][25] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. @@ -517,11 +523,11 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. For existing installations using the Forwarder, see [Deciding to migrate to the Datadog Lambda extension][25] for why you should [migrate][26]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. For existing installations using the Forwarder, see [Deciding to migrate to the Datadog Lambda extension][26] for why you should [migrate][27]. ## Troubleshoot -If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][27]. +If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][28]. ## Further Reading @@ -546,12 +552,13 @@ If you have trouble configuring your installations, set the environment variable [16]: /tracing/setup_overview/custom_instrumentation/ [17]: /tracing/guide/ignoring_apm_resources/ [18]: /tracing/setup_overview/configure_data_security/ -[19]: /logs/log_configuration/parsing/ -[20]: /integrations/guide/source-code-integration -[21]: https://app.datadoghq.com/functions -[22]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors -[23]: /synthetics/ -[24]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html -[25]: /serverless/guide/extension_motivation/ -[26]: /serverless/guide/forwarder_extension_migration -[27]: /serverless/guide/troubleshoot_serverless_monitoring/ +[19]: /tracing/connect_logs_and_traces/ +[20]: /logs/log_configuration/parsing/ +[21]: /integrations/guide/source-code-integration +[22]: https://app.datadoghq.com/functions +[23]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors +[24]: /synthetics/ +[25]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html +[26]: /serverless/guide/extension_motivation/ +[27]: /serverless/guide/forwarder_extension_migration +[28]: /serverless/guide/troubleshoot_serverless_monitoring/ From 7788e0499a1719468902dbb74ea4fc638d2c3a8f Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Wed, 13 Apr 2022 12:13:59 -0400 Subject: [PATCH 03/35] Document DD_FLUSH_TO_LOG and sync custom metric submission method --- content/en/serverless/configuration/_index.md | 2 +- content/en/serverless/custom_metrics/_index.md | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 62d4705e99361..52e044e9a1d94 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -418,7 +418,7 @@ If you are using the [Forwarder Lambda function][4] to collect traces and logs, 1. obtain the Datadog trace ID using `dd-trace` and add it to your log 2. clone the default Lambda log pipeline, which is read-only 3. enable the cloned pipeline while disable the default one - 4. update the cloned pipeline to [parse][20] the Datadog trace ID into the `dd.trace_id` attribute. For example, `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}` matches `[INFO] dd.trace_id=4887065908816661012`. + 4. update the [Grok parser][20] rules of the cloned pipeline to parse the Datadog trace ID into the `dd.trace_id` attribute. For example, use rule `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.*` for logs that look like `[INFO] dd.trace_id=4887065908816661012 My log message`. ## Link errors to your source code diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index 3d8b713225170..287472c390ff4 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -8,9 +8,10 @@ kind: documentation There are a few different ways to submit custom metrics to Datadog from a Lambda function. - **Creating custom metrics from logs or traces**: If your Lambda functions are already sending trace or log data to Datadog, and the data you want to query is captured in an existing log or trace, you can [generate custom metrics from logs and traces](#creating-custom-metrics-from-logs-or-traces) without re-deploying or making any changes to your application code. -- **Submitting custom metrics using the Datadog Lambda Extension**: If you want to submit custom metrics directly from your Lambda function, Datadog recommends using the [Datadog Lambda Extension](#with-the-datadog-lambda-extension). [Check whether the Datadog Lambda Extension is supported][1] in your Lambda function runtime. +- **Submitting custom metrics using the Datadog Lambda extension**: If you want to submit custom metrics directly from your Lambda function, Datadog recommends using the [Datadog Lambda extension](#with-the-datadog-lambda-extension). [Check whether the Datadog Lambda extension is supported][1] in your Lambda function runtime. - **Submitting custom metrics using the Datadog Forwarder Lambda**: If you want to submit custom metrics from a runtime that is not yet supported by the Datadog Lambda Extension, you can use the [Datadog Forwarder Lambda](#with-the-datadog-forwarder). -- **(Deprecated) Submitting custom metrics from CloudWatch logs**: The method to submit custom metrics by printing a log formatted as `MONITORING|||||#` has been [deprecated](#deprecated-cloudwatch-logs), and you should migrate to one of the solutions above. +- **(Deprecated) Submitting custom metrics using the Datadog Lambda library**: The Datadog Lambda library for Python, Node.js and Go support sending custom metrics synchronously from the runtime to Datadog by blocking the invocation when `DD_FLUSH_TO_LOG` is set to `false`. Datadog recommends using the [Datadog Lambda extension](#with-the-datadog-lambda-extension) instead. +- **(Deprecated) Submitting custom metrics from CloudWatch logs**: The method to submit custom metrics by printing a log formatted as `MONITORING|||||#` has been [deprecated](#deprecated-cloudwatch-logs). Datadog recommends using the [Datadog Lambda extension](#with-the-datadog-lambda-extension) instead. - **(Not recommended) Using a third-party library**: Most third-party libraries do not submit metrics as distributions and can lead to under-counted results. ### Understanding distribution metrics From 2e00e974f5a4cf48a2ee5ac9702bb334bdded951 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Wed, 13 Apr 2022 13:02:42 -0400 Subject: [PATCH 04/35] Update extension migration guide --- content/en/serverless/configuration/_index.md | 61 ++++++++++++++- content/en/serverless/guide/_index.md | 16 ++-- .../guide/forwarder_extension_migration.md | 77 ------------------- 3 files changed, 68 insertions(+), 86 deletions(-) delete mode 100644 content/en/serverless/guide/forwarder_extension_migration.md diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 52e044e9a1d94..c3997a4f884e4 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -11,6 +11,7 @@ further_reading: aliases: - /serverless/distributed_tracing/collect_lambda_payloads - /serverless/libraries_integrations/lambda_code_signing + - /serverless/guide/forwarder_extension_migration/ --- After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring. @@ -523,7 +524,62 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. For existing installations using the Forwarder, see [Deciding to migrate to the Datadog Lambda extension][26] for why you should [migrate][27]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][26]. + +To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][27]. For your convenience, the key differences are summarized below. + +**Note**: Datadog recommends migrating your dev and staging applications first and migrating production applications one by one. + +{{< tabs >}} +{{% tab "Datadog CLI" %}} + +1. Upgrade `@datadog/datadog-ci` to the latest version +2. Update the `--layer-version` argument and set it to the latest version for your runtime. +3. Set the `--extension-version` argument to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} +4. Set the required environment variable `DATADOG_SITE` and `DATADOG_API_KEY_SECRET_ARN`. +5. Remove the `--forwarder` argument. +6. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. + +{{% /tab %}} +{{% tab "Serverless Framework" %}} + +1. Upgrade `serverless-plugin-datadog` to the latest version, which installs the Datadog Lambda Extension by default, unless you set `addExtension` to `false`. +2. Set the required parameters `site` and `apiKeySecretArn`. +3. Set the `env`, `service`, and `version` parameters if you previously set them as Lambda resource tags. The plugin will automatically set them through the Datadog reserved environment variables instead, such as `DD_ENV`, when using the extension. +4. Remove the `forwarderArn` parameter, unless you want to keep the Forwarder for collecting logs from non-Lambda resources, that is, you have `subscribeToApiGatewayLogs`, `subscribeToHttpApiLogs`, or `subscribeToWebsocketLogs` set to `true`. +5. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. + +{{% /tab %}} +{{% tab "AWS SAM" %}} + +1. Update the `datadog-serverless-macro` CloudFormation stack to pick up the latest version. +2. Set the `extensionLayerVersion` parameter to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} +3. Set the required parameters `site` and `apiKeySecretArn`. +4. Remove the `forwarderArn` parameter. +5. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. + +{{% /tab %}} +{{% tab "AWS CDK" %}} + +1. Upgrade `datadog-cdk-constructs` or `datadog-cdk-constructs-v2` to the latest version. +2. Set the `extensionLayerVersion` parameter to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} +3. Set the required parameters `site` and `apiKeySecretArn`. +4. Set the `env`, `service`, and `version` parameters if you previously set them as Lambda resource tags. The construct will automatically set them through the Datadog reserved environment variables instead, such as `DD_ENV`, when using the extension. +5. Remove the `forwarderArn` parameter. +6. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. + +{{% /tab %}} +{{% tab "Others" %}} + +1. Upgrade the Datadog Lambda library layer for your runtime to the latest version. +2. Install the latest version of the Datadog Lambda extension. +3. Set the required environment variables `DD_SITE` and `DD_API_KEY_SECRET_ARN`. +3. Set the `DD_ENV`, `DD_SERVICE`, and `DD_VERSION` environment variables if you previously set them as Lambda resource tags. +4. Remove the subscription filter that streams logs from your Lambda function's log group to the Datadog Forwarder. +5. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. + +{{% /tab %}} +{{< /tabs >}} ## Troubleshoot @@ -534,6 +590,7 @@ If you have trouble configuring your installations, set the environment variable {{< partial name="whats-next/whats-next.html" >}} + [1]: /serverless/installation/ [2]: /serverless/libraries_integrations/extension/ [3]: /integrations/amazon_web_services/ @@ -560,5 +617,5 @@ If you have trouble configuring your installations, set the environment variable [24]: /synthetics/ [25]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html [26]: /serverless/guide/extension_motivation/ -[27]: /serverless/guide/forwarder_extension_migration +[27]: /serverless/guide#install-using-the-datadog-forwarder [28]: /serverless/guide/troubleshoot_serverless_monitoring/ diff --git a/content/en/serverless/guide/_index.md b/content/en/serverless/guide/_index.md index 44a6b8ae037ee..757365fbb5c0a 100644 --- a/content/en/serverless/guide/_index.md +++ b/content/en/serverless/guide/_index.md @@ -3,25 +3,27 @@ title: Serverless Monitoring Guides kind: guide --- -{{< whatsnext desc="Serverless monitoring:" >}} +## Monitor your serverless applications + +{{< whatsnext desc="Best practices for monitoring your serverless applications" >}} {{< nextlink href="/serverless/guide/connect_invoking_resources" >}}Deeper visibility into resources invoking Lambda functions{{< /nextlink >}} {{< nextlink href="/serverless/guide/insights" >}}Serverless Insights{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_tagging" >}}Serverless Tagging{{< /nextlink >}} {{< /whatsnext >}} -{{< whatsnext desc="Using the Datadog Forwarder:" >}} +## Install using the Datadog Forwarder + +{{< whatsnext desc="Installation instructions for applications previously set up to be monitored using the Datadog Forwarder" >}} {{< nextlink href="/serverless/guide/datadog_forwarder_node" >}}Installing Serverless with the Datadog Forwarder - Node.js{{< /nextlink >}} {{< nextlink href="/serverless/guide/datadog_forwarder_python" >}}Installing Serverless with the Datadog Forwarder - Python{{< /nextlink >}} {{< nextlink href="/serverless/guide/datadog_forwarder_java" >}}Installing Serverless with the Datadog Forwarder - Java{{< /nextlink >}} {{< nextlink href="/serverless/guide/datadog_forwarder_go" >}}Installing Serverless with the Datadog Forwarder - Go{{< /nextlink >}} -{{< /whatsnext >}} - -{{< whatsnext desc="Using the Datadog Lambda Extension:" >}} {{< nextlink href="/serverless/guide/extension_motivation" >}}Deciding to migrate to the Datadog Lambda Extension{{< /nextlink >}} - {{< nextlink href="/serverless/guide/forwarder_extension_migration" >}}Migrating from the Datadog Forwarder to the Datadog Lambda Extension{{< /nextlink >}} {{< /whatsnext >}} -{{< whatsnext desc="Troubleshooting:" >}} +## Troubleshoot your installation + +{{< whatsnext desc="Common installation issues and tips for troubleshooting" >}} {{< nextlink href="/serverless/troubleshooting" >}}Troubleshooting Serverless Monitoring{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_tracing_and_webpack" >}}Node.js Lambda Tracing and Webpack Compatibility{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_package_too_large" >}}Troubleshooting Serverless Package Too Large Errors{{< /nextlink >}} diff --git a/content/en/serverless/guide/forwarder_extension_migration.md b/content/en/serverless/guide/forwarder_extension_migration.md deleted file mode 100644 index b437fbc423457..0000000000000 --- a/content/en/serverless/guide/forwarder_extension_migration.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Migrating from the Datadog Forwarder to the Datadog Lambda Extension -kind: guide ---- -## Overview - - -This guide explains how to migrate from the [Datadog Forwarder][1] to the Datadog Lambda Extension. - -The [Datadog Lambda Extension][2] is a lightweight version of the Datadog Agent built to run alongside your code with minimal performance overhead. - -Datadog recommends that you set up the Extension **before** removing the Forwarder. This means that for the period during which both the Extension and Forwarder are active, all telemetry is sent twice. The alternative (removing the Forwarder before setting up the Extension) results in a period of zero visibility. Depending on your organization's particular needs, you may prefer one outcome over the other. - -## Setting up the Datadog Lambda Extension {#extension-setup} - -See the [Datadog Lambda Extension documentation][2]. - -## Removing the Datadog Forwarder - -### Prevent the Forwarder from attaching to new functions {#prevent-forwarder} - -When you deploy a new function, the Datadog Forwarder detects an unsubscribed function and automatically creates a new subscription. If you used the automatic configuration for the Forwarder, it will not automatically resubscribe to your function's log groups if the Extension is installed on that function. - -{{< tabs >}} -{{% tab "Serverless Framework" %}} - -Remove the resource name of the Forwarder from your `serverless.yml` file. - -{{% /tab %}} -{{% tab "AWS SAM" %}} - -Remove the resource name of the Forwarder from your `template.yml` file. - -{{% /tab %}} -{{% tab "AWS CDK" %}} - -Remove the resource name of the Forwarder from your CDK stack. - -{{% /tab %}} -{{% tab "Zappa" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Chalice" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Datadog CLI" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Container Image" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Custom" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{< /tabs >}} - -For more information, see the [Datadog Forwarder documentation][1]. - -## Hybrid approach - -You may also wish to keep using the Datadog Forwarder for existing functions while using the Datadog Lambda Extension for all new functions. - -1. Ensure that the Forwarder [does not attach automatically](#prevent-forwarder) to new functions. -2. For each new function you deploy, [set up the Extension](#extension-setup) - -[1]: /serverless/libraries_integrations/forwarder/ -[2]: /serverless/libraries_integrations/extension/ From 35d79f83bb23a5fffae519018a4aa534e8e134a7 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 14 Apr 2022 10:44:05 -0400 Subject: [PATCH 05/35] Embed extension and cdk readmes --- .gitignore | 2 + Makefile | 4 ++ config/_default/menus/menus.en.yaml | 4 +- content/en/serverless/configuration/_index.md | 29 ++++++++---- .../libraries_integrations/_index.md | 2 +- .../libraries_integrations/extension.md | 47 ------------------- .../libraries_integrations/extension.md | 2 +- .../libraries_integrations/macro.md | 2 +- .../libraries_integrations/plugin.md | 2 +- .../datadog_lambda_library/_index.md | 2 +- .../serverless/libraries_integrations/cli.md | 2 +- .../libraries_integrations/extension.md | 2 +- .../libraries_integrations/macro.md | 2 +- .../libraries_integrations/plugin.md | 2 +- .../serverless_integrations/plugin.md | 2 +- .../py/build/configurations/pull_config.yaml | 31 ++++++++++++ .../configurations/pull_config_preview.yaml | 33 ++++++++++++- 17 files changed, 102 insertions(+), 68 deletions(-) delete mode 100644 content/en/serverless/libraries_integrations/extension.md diff --git a/.gitignore b/.gitignore index 72fe4c77bdd00..4981f17d9df3f 100644 --- a/.gitignore +++ b/.gitignore @@ -105,6 +105,8 @@ content/en/serverless/libraries_integrations/forwarder.md content/en/serverless/libraries_integrations/plugin.md content/en/serverless/libraries_integrations/macro.md content/en/serverless/libraries_integrations/cli.md +content/en/serverless/libraries_integrations/cdk.md +content/en/serverless/libraries_integrations/extension.md # Runtime data pids diff --git a/Makefile b/Makefile index 696425d2e7167..eb38b40c3e0c0 100644 --- a/Makefile +++ b/Makefile @@ -115,6 +115,10 @@ clean-auto-doc: ##Remove all doc automatically created rm -f content/en/serverless/libraries_integrations/macro.md ;fi @if [ content/en/serverless/libraries_integrations/cli.md ]; then \ rm -f content/en/serverless/libraries_integrations/cli.md ;fi + @if [ content/en/serverless/libraries_integrations/extension.md ]; then \ + rm -f content/en/serverless/libraries_integrations/extension.md ;fi + @if [ content/en/serverless/libraries_integrations/cdk.md ]; then \ + rm -f content/en/serverless/libraries_integrations/cdk.md ;fi @if [ content/en/synthetics/cicd_integrations/circleci_orb.md ]; then \ rm -f content/en/synthetics/cicd_integrations/circleci_orb.md ;fi @if [ content/en/synthetics/cicd_integrations/github_actions.md ]; then \ diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index a5aaa284d7158..3e5b1ee15c19c 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -846,8 +846,8 @@ main: url: serverless/libraries_integrations/cli/ parent: libraries_integrations weight: 306 - - name: Lambda Code Signing - url: serverless/libraries_integrations/lambda_code_signing/ + - name: Datadog CDK Construct + url: serverless/libraries_integrations/cdk/ parent: libraries_integrations weight: 307 - name: Distributed Tracing diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index c3997a4f884e4..f7ef6b1232d8e 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -12,6 +12,7 @@ aliases: - /serverless/distributed_tracing/collect_lambda_payloads - /serverless/libraries_integrations/lambda_code_signing - /serverless/guide/forwarder_extension_migration/ + - /serverless/guide/extension_private_link/ --- After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring. @@ -29,6 +30,7 @@ After [installing][1] Datadog serverless monitoring, you should be collecting me - [Link errors to your source code](#link-errors-to-your-source-code) - [Create monitors](#create-monitors) - [Create synthetic tests](#create-synthetic-tests) +- [Send telemetry over PrivateLink or proxy](#send-telemetry-over-privatelink-or-proxy) - [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) - [Migrate to the Datadog Lambda extension](#migrate-to-the-datadog-lambda-extension) - [Troubleshoot](#troubleshoot) @@ -512,9 +514,16 @@ Datadog has some predefined monitors that you can quickly enable in the [Serverl ## Create synthetic tests If your serverless application powers an API or webpage, consider setting up Datadog [synthetic tests][24]. + +## Send telemetry over PrivateLink or proxy + +The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][25] to the US1 (`datadoghq.com`) [Datadog site][26], or [send data over a proxy][27] for all other sites. + +If you are using the Datadog Forwarder, follow these [instructions][28]. + ## Enable AWS Lambda code signing -[Code signing for AWS Lambda][25] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. +[Code signing for AWS Lambda][29] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. @@ -524,9 +533,9 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][26]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][30]. -To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][27]. For your convenience, the key differences are summarized below. +To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][31]. For your convenience, the key differences are summarized below. **Note**: Datadog recommends migrating your dev and staging applications first and migrating production applications one by one. @@ -583,7 +592,7 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte ## Troubleshoot -If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][28]. +If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][32]. ## Further Reading @@ -615,7 +624,11 @@ If you have trouble configuring your installations, set the environment variable [22]: https://app.datadoghq.com/functions [23]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors [24]: /synthetics/ -[25]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html -[26]: /serverless/guide/extension_motivation/ -[27]: /serverless/guide#install-using-the-datadog-forwarder -[28]: /serverless/guide/troubleshoot_serverless_monitoring/ +[25]: /agent/guide/private-link/ +[26]: /getting_started/site/ +[27]: /agent/proxy/ +[28]: https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#aws-privatelink-support +[29]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html +[30]: /serverless/guide/extension_motivation/ +[31]: /serverless/guide#install-using-the-datadog-forwarder +[32]: /serverless/guide/troubleshoot_serverless_monitoring/ diff --git a/content/en/serverless/libraries_integrations/_index.md b/content/en/serverless/libraries_integrations/_index.md index b8700bd21a920..e609147c02fd2 100644 --- a/content/en/serverless/libraries_integrations/_index.md +++ b/content/en/serverless/libraries_integrations/_index.md @@ -22,7 +22,7 @@ aliases: {{< nextlink href="/serverless/libraries_integrations/plugin/" >}}Datadog Lambda Plugin{{< /nextlink >}} {{< nextlink href="/serverless/libraries_integrations/macro/" >}}Datadog Lambda Macro{{< /nextlink >}} {{< nextlink href="/serverless/libraries_integrations/cli/" >}}Datadog Lambda CLI{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/lambda_code_signing/" >}}Lambda Code Signing{{< /nextlink >}} + {{< nextlink href="/serverless/libraries_integrations/cdk/" >}}Datadog CDK Construct{{< /nextlink >}} {{< /whatsnext >}} ## AWS Step Functions diff --git a/content/en/serverless/libraries_integrations/extension.md b/content/en/serverless/libraries_integrations/extension.md deleted file mode 100644 index bfa216ce1c514..0000000000000 --- a/content/en/serverless/libraries_integrations/extension.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Datadog Lambda Extension -kind: documentation -further_reading: - - link: 'serverless/custom_metrics' - tag: 'Documentation' - text: 'Submitting Custom Metrics from AWS Lambda' - - link: 'https://www.datadoghq.com/blog/aws-graviton2-lambda-monitoring/' - tag: 'Blog' - text: 'AWS Lambda Functions running on AWS Graviton2 processors' -aliases: - - /serverless/datadog_lambda_library/extension/ - - /serverless/guide/extension_private_link/ ---- - -## Overview - -AWS Lambda extensions are companion processes that augment your Lambda functions. They run within the Lambda execution environment, alongside your Lambda function code. The Datadog extension is a lightweight version of the Datadog Agent built to run alongside your code with minimal performance overhead. - -The Datadog extension submits [enhanced Lambda metrics][1], [custom metrics][2], [traces][3], and logs asynchronously. Submitting Lambda logs with the extension is supported in all Lambda runtimes. Submitting custom metrics, enhanced metrics and traces is supported in Node.js, Python, Go, and .NET Lambda runtimes. - -{{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} - -## Installation - -To install the Datadog Lambda Extension, see the [serverless installation instructions][4]. - -## Overhead - -The Datadog Lambda Extension introduces a small amount of overhead to your Lambda function's cold starts (that is, the higher init duration), as the Extension needs to initialize. Datadog is continuously optimizing the Lambda extension performance and recommend always using the latest release. - -You may notice an increase of your Lambda function's reported duration. This is because the Datadog Lambda Extension needs to flush data back to the Datadog API. Although the time spent by the extension flushing data is reported as part of the duration, it's done *after* AWS returns your function's response back to the client. In other words, the added duration does not slow down your Lambda function. See this [AWS blog post][5] for more technical information. To monitor your function's actual performance and exclude the duration added by the Datadog extension, use the metric `aws.lambda.enhanced.runtime_duration`. - -By default, the Extension sends data back to Datadog at the end of each invocation. This avoids delays of data arrival for sporadic invocations from low-traffic applications, cron jobs, and manual tests. Once the Extension detects a steady and frequent invocation pattern (more than once per minute), it batches data from multiple invocations and flushes periodically at the beginning of the invocation when it's due. This means that *the busier your function is, the lower the average duration overhead per invocation*. - -For Lambda functions deployed in a region that is far from the Datadog site, for example, a Lambda function deployed in eu-west-1 reporting data to the US1 Datadog site, can observe a higher duration overhead due to the network latency. - - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: /serverless/enhanced_lambda_metrics -[2]: /serverless/custom_metrics -[3]: /serverless/distributed_tracing -[4]: /serverless/installation -[5]: https://aws.amazon.com/blogs/compute/performance-and-functionality-improvements-for-aws-lambda-extensions/ diff --git a/content/fr/serverless/libraries_integrations/extension.md b/content/fr/serverless/libraries_integrations/extension.md index d0f15ad9ef416..938a258aef2f8 100644 --- a/content/fr/serverless/libraries_integrations/extension.md +++ b/content/fr/serverless/libraries_integrations/extension.md @@ -9,7 +9,7 @@ further_reading: tag: Blog text: Fonctions AWS Lambda exécutées sur des processeurs AWS Graviton2 aliases: - - /fr/serverless/datadog_lambda_library/extension/ + - /fr/serverless/libraries_integrations/extension/ --- ## Présentation diff --git a/content/fr/serverless/libraries_integrations/macro.md b/content/fr/serverless/libraries_integrations/macro.md index 7abc374ddacc7..86f94de1990e5 100644 --- a/content/fr/serverless/libraries_integrations/macro.md +++ b/content/fr/serverless/libraries_integrations/macro.md @@ -153,4 +153,4 @@ Si vous avez des commentaires ou des questions concernant les fonctionnalités, [5]: https://github.com/DataDog/datadog-lambda-python/releases [6]: https://github.com/DataDog/datadog-lambda-js/releases [7]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html -[8]: https://docs.datadoghq.com/fr/serverless/datadog_lambda_library/extension/ \ No newline at end of file +[8]: https://docs.datadoghq.com/fr/serverless/libraries_integrations/extension/ \ No newline at end of file diff --git a/content/fr/serverless/libraries_integrations/plugin.md b/content/fr/serverless/libraries_integrations/plugin.md index 17b3dda057113..f72a90cb5c070 100644 --- a/content/fr/serverless/libraries_integrations/plugin.md +++ b/content/fr/serverless/libraries_integrations/plugin.md @@ -268,4 +268,4 @@ Ce produit inclut un logiciel développé chez Datadog (https://www.datadoghq.co [5]: https://www.npmjs.com/package/datadog-lambda-js [6]: https://webpack.js.org/configuration/externals/ [7]: https://docs.datadoghq.com/fr/serverless/forwarder/ -[8]: https://docs.datadoghq.com/fr/serverless/datadog_lambda_library/extension/ +[8]: https://docs.datadoghq.com/fr/serverless/libraries_integrations/extension/ diff --git a/content/ja/serverless/datadog_lambda_library/_index.md b/content/ja/serverless/datadog_lambda_library/_index.md index 7ee951dc653b1..16e114588e5ec 100644 --- a/content/ja/serverless/datadog_lambda_library/_index.md +++ b/content/ja/serverless/datadog_lambda_library/_index.md @@ -2,7 +2,7 @@ title: Datadog Lambda ライブラリ kind: ドキュメント further_reading: - - link: /serverless/datadog_lambda_library/extension + - link: /serverless/libraries_integrations/extension tag: Documentation text: Datadog Lambda 拡張機能 (プレビュー) - link: /serverless/datadog_lambda_library/python diff --git a/content/ja/serverless/libraries_integrations/cli.md b/content/ja/serverless/libraries_integrations/cli.md index 49bf026bbf963..ed5a9faf5dfd0 100644 --- a/content/ja/serverless/libraries_integrations/cli.md +++ b/content/ja/serverless/libraries_integrations/cli.md @@ -102,5 +102,5 @@ datadog-ci lambda instrument -f functionname -r us-east-1 -v 10 --dry [2]: https://github.com/DataDog/datadog-ci [3]: https://github.com/DataDog/datadog-lambda-layer-js/releases [4]: https://github.com/DataDog/datadog-lambda-layer-python/releases -[5]: https://docs.datadoghq.com/ja/serverless/datadog_lambda_library/extension +[5]: https://docs.datadoghq.com/ja/serverless/libraries_integrations/extension [6]: https://docs.datadoghq.com/ja/account_management/api-app-keys/#api-keys \ No newline at end of file diff --git a/content/ja/serverless/libraries_integrations/extension.md b/content/ja/serverless/libraries_integrations/extension.md index aa0bd88fc99ac..6ea94bcd1d05f 100644 --- a/content/ja/serverless/libraries_integrations/extension.md +++ b/content/ja/serverless/libraries_integrations/extension.md @@ -6,7 +6,7 @@ further_reading: tag: ドキュメント text: AWS Lambda からのカスタムメトリクスの送信 aliases: - - /ja/serverless/datadog_lambda_library/extension/ + - /ja/serverless/libraries_integrations/extension/ --- ## 概要 diff --git a/content/ja/serverless/libraries_integrations/macro.md b/content/ja/serverless/libraries_integrations/macro.md index cb2ef5bb02d27..7c8d3c5544527 100644 --- a/content/ja/serverless/libraries_integrations/macro.md +++ b/content/ja/serverless/libraries_integrations/macro.md @@ -151,4 +151,4 @@ Resources: [5]: https://github.com/DataDog/datadog-lambda-python/releases [6]: https://github.com/DataDog/datadog-lambda-js/releases [7]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html -[8]: https://docs.datadoghq.com/ja/serverless/datadog_lambda_library/extension/ \ No newline at end of file +[8]: https://docs.datadoghq.com/ja/serverless/libraries_integrations/extension/ \ No newline at end of file diff --git a/content/ja/serverless/libraries_integrations/plugin.md b/content/ja/serverless/libraries_integrations/plugin.md index 2608c4ad417a7..c89ac4000406b 100644 --- a/content/ja/serverless/libraries_integrations/plugin.md +++ b/content/ja/serverless/libraries_integrations/plugin.md @@ -267,4 +267,4 @@ custom: [5]: https://www.npmjs.com/package/datadog-lambda-js [6]: https://webpack.js.org/configuration/externals/ [7]: https://docs.datadoghq.com/ja/serverless/forwarder/ -[8]: https://docs.datadoghq.com/ja/serverless/datadog_lambda_library/extension/ +[8]: https://docs.datadoghq.com/ja/serverless/libraries_integrations/extension/ diff --git a/content/ja/serverless/serverless_integrations/plugin.md b/content/ja/serverless/serverless_integrations/plugin.md index 121408652cc97..5276536c194b8 100644 --- a/content/ja/serverless/serverless_integrations/plugin.md +++ b/content/ja/serverless/serverless_integrations/plugin.md @@ -163,4 +163,4 @@ custom: [5]: https://www.npmjs.com/package/datadog-lambda-js [6]: https://webpack.js.org/configuration/externals/ [7]: https://docs.datadoghq.com/ja/serverless/forwarder/ -[8]: https://docs.datadoghq.com/ja/serverless/datadog_lambda_library/extension/ +[8]: https://docs.datadoghq.com/ja/serverless/libraries_integrations/extension/ diff --git a/local/bin/py/build/configurations/pull_config.yaml b/local/bin/py/build/configurations/pull_config.yaml index 7b12a52e84ac4..18b02f5695dd3 100644 --- a/local/bin/py/build/configurations/pull_config.yaml +++ b/local/bin/py/build/configurations/pull_config.yaml @@ -273,6 +273,37 @@ - /serverless/datadog_lambda_library/ - /serverless/serverless_integrations/cli/ + - repo_name: datadog-cdk-constructs + contents: + - action: pull-and-push-file + branch: main + globs: + - 'README.md' + options: + dest_path: '/serverless/libraries_integrations/' + file_name: 'cdk.md' + front_matters: + dependencies: ["https://github.com/DataDog/datadog-cdk-constructs/blob/main/README.md"] + title: Datadog CDK Construct + kind: documentation + + - repo_name: datadog-lambda-extension + contents: + - action: pull-and-push-file + branch: main + globs: + - 'README.md' + options: + dest_path: '/serverless/libraries_integrations/' + file_name: 'extension.md' + front_matters: + dependencies: ["https://github.com/DataDog/datadog-lambda-extension/blob/main/README.md"] + title: Datadog Lambda Extension + kind: documentation + aliases: + - /serverless/datadog_lambda_library/extension + - /serverless/libraries_integrations/extension + - repo_name: synthetics-ci-github-action contents: - action: pull-and-push-file diff --git a/local/bin/py/build/configurations/pull_config_preview.yaml b/local/bin/py/build/configurations/pull_config_preview.yaml index 8a12c8cfd0b07..dec51830cc0d5 100644 --- a/local/bin/py/build/configurations/pull_config_preview.yaml +++ b/local/bin/py/build/configurations/pull_config_preview.yaml @@ -268,12 +268,43 @@ file_name: 'cli.md' front_matters: dependencies: ["https://github.com/DataDog/datadog-ci/blob/master/src/commands/lambda/README.md"] - title: Datadog Serverless CLI + title: Datadog Lambda Extension kind: documentation aliases: - /serverless/datadog_lambda_library/ - /serverless/serverless_integrations/cli/ + - repo_name: datadog-cdk-constructs + contents: + - action: pull-and-push-file + branch: main + globs: + - 'README.md' + options: + dest_path: '/serverless/libraries_integrations/' + file_name: 'cdk.md' + front_matters: + dependencies: ["https://github.com/DataDog/datadog-cdk-constructs/blob/main/README.md"] + title: Datadog CDK Construct + kind: documentation + + - repo_name: datadog-lambda-extension + contents: + - action: pull-and-push-file + branch: main + globs: + - 'README.md' + options: + dest_path: '/serverless/libraries_integrations/' + file_name: 'extension.md' + front_matters: + dependencies: ["https://github.com/DataDog/datadog-lambda-extension/blob/main/README.md"] + title: Datadog Serverless CLI + kind: documentation + aliases: + - /serverless/datadog_lambda_library/extension + - /serverless/libraries_integrations/extension + - repo_name: synthetics-ci-github-action contents: - action: pull-and-push-file From 37afac8af4871b2ce6e4da7860eb09a5e6d62a5a Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 14 Apr 2022 12:26:47 -0400 Subject: [PATCH 06/35] Update the serverless integrations doc --- config/_default/menus/menus.en.yaml | 14 ++-- content/en/serverless/glossary/_index.md | 2 +- .../libraries_integrations/_index.md | 79 +++++++------------ .../libraries_integrations/library.md | 63 --------------- .../configurations/pull_config_preview.yaml | 4 +- 5 files changed, 36 insertions(+), 126 deletions(-) delete mode 100644 content/en/serverless/libraries_integrations/library.md diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index 3e5b1ee15c19c..b66893b3c4d98 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -826,30 +826,26 @@ main: url: serverless/libraries_integrations/extension/ parent: libraries_integrations weight: 301 - - name: Datadog Lambda Library - url: serverless/libraries_integrations/library/ - parent: libraries_integrations - weight: 302 - name: Datadog Forwarder url: serverless/libraries_integrations/forwarder/ parent: libraries_integrations - weight: 303 + weight: 302 - name: Datadog Serverless Plugin url: serverless/libraries_integrations/plugin/ parent: libraries_integrations - weight: 304 + weight: 303 - name: Datadog Serverless Macro url: serverless/libraries_integrations/macro/ parent: libraries_integrations - weight: 305 + weight: 304 - name: Datadog Serverless CLI url: serverless/libraries_integrations/cli/ parent: libraries_integrations - weight: 306 + weight: 305 - name: Datadog CDK Construct url: serverless/libraries_integrations/cdk/ parent: libraries_integrations - weight: 307 + weight: 306 - name: Distributed Tracing url: serverless/distributed_tracing identifier: serverless_distributed_tracing diff --git a/content/en/serverless/glossary/_index.md b/content/en/serverless/glossary/_index.md index 8235604df3948..081454e30d66d 100644 --- a/content/en/serverless/glossary/_index.md +++ b/content/en/serverless/glossary/_index.md @@ -65,7 +65,7 @@ AWS Lambda is the FaaS platform provided by Amazon Web Services. See the [AWS La [1]: https://docs.aws.amazon.com/lambda/index.html [2]: https://opencontainers.org/ [3]: /serverless/enhanced_lambda_metrics -[4]: /serverless/libraries_integrations/library/ +[4]: /serverless/libraries_integrations/ [5]: /serverless/libraries_integrations/forwarder/ [6]: /serverless/libraries_integrations/extension/ [7]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html diff --git a/content/en/serverless/libraries_integrations/_index.md b/content/en/serverless/libraries_integrations/_index.md index e609147c02fd2..82a168db58061 100644 --- a/content/en/serverless/libraries_integrations/_index.md +++ b/content/en/serverless/libraries_integrations/_index.md @@ -1,74 +1,51 @@ --- title: Serverless Libraries and Integrations kind: documentation -further_reading: -- link: "/serverless/serverless_integrations/plugin/" - tag: "Datadog Serverless Plugin" - text: "Documentation" -- link: "/serverless/serverless_integrations/macro/" - tag: "Documentation" - text: "Datadog Serverless Macro" -- link: "/serverless/serverless_integrations/cli/" - tag: "Documentation" - text: "Datadog Serverless CLI" aliases: -- /serverless/serverless_integrations + - /serverless/serverless_integrations + - /serverless/datadog_lambda_library/ + - /serverless/libraries_integrations/library/ --- -{{< whatsnext desc="Serverless Libraries & Integrations:" >}} - {{< nextlink href="/serverless/libraries_integrations/extension/" >}}Datadog Lambda Extension{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/library/" >}}Datadog Lambda Library{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/forwarder/" >}}Datadog Lambda Forwarder{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/plugin/" >}}Datadog Lambda Plugin{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/macro/" >}}Datadog Lambda Macro{{< /nextlink >}} +## Serverless Development Tool Integrations + +{{< whatsnext desc="Datadog integrates with popular serverless development tools to install the Datadog Lambda extension and library to your applications automatically." >}} + {{< nextlink href="/serverless/libraries_integrations/plugin/" >}}Datadog Plugin for Serverless Framework{{< /nextlink >}} {{< nextlink href="/serverless/libraries_integrations/cli/" >}}Datadog Lambda CLI{{< /nextlink >}} - {{< nextlink href="/serverless/libraries_integrations/cdk/" >}}Datadog CDK Construct{{< /nextlink >}} + {{< nextlink href="/serverless/libraries_integrations/cdk/" >}}Datadog Construct for AWS CDK{{< /nextlink >}} + {{< nextlink href="/serverless/libraries_integrations/macro/" >}}Datadog Serverless Macro for AWS SAM{{< /nextlink >}} {{< /whatsnext >}} -## AWS Step Functions - -Enable the [AWS Step Functions integration][1] to automatically get additional tags on your Lambda metrics to identify which state machines a particular function belongs to. Use these tags to get an aggregated view of your Lambda metrics and logs per Step Function on the [Serverless view][2]. +## Datadog Lambda Extension and Forwarder -1. Install the [AWS Step Functions integration][1]. -2. Add the following permissions to your [Datadog IAM policy][3] to add additional tags to your Lambda metrics. - - | AWS Permission | Description | - | ------------------ | -------------------------------------------- | - | `states:ListStateMachines` | List active Step Functions. | - | `states:DescribeStateMachine` | Get Step Function metadata, and tags. | -3. Configure [distributed tracing and logging][1] for AWS Step Functions. -4. Once done, go to the [Serverless Homepage][4] and filter your Lambda functions by `statemachinename`, `statemachinearn` or `stepname`. - -{{< img src="serverless/step-function-trace.jpeg" alt="AWS Step Function Tracing" >}} +{{< whatsnext desc="You need either the Lambda extension or the Forwarder to send telemetry from your Lambda functions. You may also need the Forwarder to collect logs for non-Lambda serverless resources, such as AWS API Gateway." >}} + {{< nextlink href="/serverless/libraries_integrations/extension/" >}}Datadog Lambda Extension{{< /nextlink >}} + {{< nextlink href="https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring" >}}Datadog Forwarder Lambda Function{{< /nextlink >}} +{{< /whatsnext >}} -## Amazon EFS for Lambda +## Datadog Lambda Libraries -Enable [Amazon EFS for Lambda][5] to automatically get additional tags on your Lambda metrics to identify which EFS a particular function belongs to. Use these tags to get an aggregated view of your Lambda metrics and logs per EFS on the [Serverless view][6]. +{{< whatsnext desc="Certain runtime requires the Datadog Lambda library in addition to the Datadog Lambda extension to collect the telemetry." >}} + {{< nextlink href="https://github.com/DataDog/datadog-lambda-python" >}}Datadog Lambda Library for Python{{< /nextlink >}} + {{< nextlink href="https://github.com/DataDog/datadog-lambda-js" >}}Datadog Lambda Library for Node.js{{< /nextlink >}} + {{< nextlink href="https://github.com/DataDog/datadog-lambda-go" >}}Datadog Lambda Library for Go{{< /nextlink >}} + {{< nextlink href="https://github.com/DataDog/datadog-lambda-rb" >}}Datadog Lambda Library for Ruby{{< /nextlink >}} +{{< /whatsnext >}} -1. Install the [Amazon EFS integration][7]. -2. Add the following permissions to your [Datadog IAM policy][3] to collect EFS metrics from Lambda. +## AWS Step Functions - | AWS Permission | Description | - | ------------------ | -------------------------------------------- | - | `elasticfilesystem:DescribeAccessPoints` | Lists active EFS connected to Lambda functions. | +Enable the [AWS Step Functions integration][1] for metrics, traces, and logs. -3. Once done, go to the [Serverless view][2] to use the new `filesystemid` tag on your Lambda functions. +Datadog automatically adds tags `statemachinename`, `statemachinearn`, and `stepname` on your Lambda telemetry to identify which state machines a particular function belongs to. You can use these tags to get an aggregated view of your Lambda functions on the [Serverless view][2]. -{{< img src="integrations/amazon_lambda/efs_for_lambda.mp4" alt="Amazon EFS for Lambda" video=true >}} +{{< img src="serverless/step-function-trace.jpeg" alt="AWS Step Function Tracing" >}} ## Lambda@Edge -Use the `at_edge`, `edge_master_name`, and `edge_master_arn` tags to get an aggregated view of your Lambda function metrics and logs as they run in Edge locations. - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} +Enable the [AWS Lambda integration][3] for metrics and logs. Datadog automatically adds tags `at_edge`, `edge_master_name`, and `edge_master_arn` tags on your Lambda metrics to get an aggregated view of your Lambda function metrics and logs as they run in Edge locations. +Distributed tracing is _not_ yet supported for Lambda@Edge functions. [1]: /integrations/amazon_step_functions/ [2]: https://app.datadoghq.com/functions -[3]: /integrations/amazon_web_services/#installation -[4]: /serverless/serverless_integrations/macro/ -[5]: /integrations/amazon_efs/#amazon-efs-for-lambda -[6]: /serverless/serverless_integrations/plugin/ -[7]: /integrations/amazon_efs/ +[3]: /integrations/amazon_lambda/ diff --git a/content/en/serverless/libraries_integrations/library.md b/content/en/serverless/libraries_integrations/library.md deleted file mode 100644 index a3ce05b21017b..0000000000000 --- a/content/en/serverless/libraries_integrations/library.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Datadog Lambda Library -kind: documentation -further_reading: -- link: "/serverless/libraries_integrations/extension/" - tag: "Documentation" - text: "Datadog Lambda Extension" -- link: "https://github.com/DataDog/datadog-lambda-python/blob/master/README.md" - tag: "Github" - text: "Datadog Lambda Library for Python" -- link: "https://github.com/DataDog/datadog-lambda-js/blob/master/README.md" - tag: "Github" - text: "Datadog Lambda Library for Node.js" -- link: "https://github.com/DataDog/datadog-lambda-rb/blob/master/README.md" - tag: "Github" - text: "Datadog Lambda Library for Ruby" -- link: "https://github.com/DataDog/datadog-lambda-go/blob/master/README.md" - tag: "Github" - text: "Datadog Lambda Library for Go" -- link: "https://github.com/DataDog/datadog-lambda-java/blob/master/README.md" - tag: "Github" - text: "Datadog Lambda Library for Java" -aliases: - - /serverless/datadog_lambda_library/ ---- - -{{< img src="serverless/datadog_lambda_library.png" alt="Datadog Lambda Library" style="width:100%;">}} - -The Datadog Lambda Library is responsible for: - -- Generating real-time [enhanced Lambda metrics][1] for invocations, errors, cold starts, estimated costs, etc. -- Submitting [custom metrics][2] (synchronously and asynchronously). -- Enabling [Datadog APM and Distributed Tracing][3] for Node.js, Python, and Ruby. - -If you are using the Datadog Lambda library for **Ruby**, you **must** also install and configure the Datadog Forwarder to ingest traces, enhanced Lambda metrics, or custom metrics (asynchronously) from your Lambda functions. -If you are using the Datadog Lambda library for **Python**, **Node**, **Go**, **Java**, or **.NET**, you may use the [Datadog Lambda Extension][4] to ingest traces, enhanced Lambda metrics, or custom metrics. Alternatively, you may continue to use the Datadog Forwarder. - -The Datadog Lambda Library is **NOT** responsible for collecting: - -- Lambda metrics from CloudWatch (see [AWS Lambda Integration][5]) -- Lambda traces from X-Ray (see [AWS X-Ray integration][6]) -- Lambda logs from CloudWatch (see [Datadog Forwarder][7]) - -Datadog distributes the Lambda library as a package for Python, Node.js, Ruby, Go, and Java. Packages are installed through the common package managers, such as pip, npm, gem, maven, etc. - -The Datadog Lambda library is also available as a [Lambda layer][8] for Python, Node.js, and Ruby. - -To install the Datadog Lambda library and instrument your serverless applications, see the [installation instructions][9]. - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} - - -[1]: /serverless/enhanced_lambda_metrics/ -[2]: /serverless/custom_metrics/ -[3]: /tracing/ -[4]: /serverless/libraries_integrations/extension/ -[5]: /integrations/amazon_lambda/ -[6]: /integrations/amazon_xray/ -[7]: /serverless/forwarder/ -[8]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[9]: /serverless/installation/ diff --git a/local/bin/py/build/configurations/pull_config_preview.yaml b/local/bin/py/build/configurations/pull_config_preview.yaml index dec51830cc0d5..e45f0564b6094 100644 --- a/local/bin/py/build/configurations/pull_config_preview.yaml +++ b/local/bin/py/build/configurations/pull_config_preview.yaml @@ -268,7 +268,7 @@ file_name: 'cli.md' front_matters: dependencies: ["https://github.com/DataDog/datadog-ci/blob/master/src/commands/lambda/README.md"] - title: Datadog Lambda Extension + title: Datadog Serverless CLI kind: documentation aliases: - /serverless/datadog_lambda_library/ @@ -299,7 +299,7 @@ file_name: 'extension.md' front_matters: dependencies: ["https://github.com/DataDog/datadog-lambda-extension/blob/main/README.md"] - title: Datadog Serverless CLI + title: Datadog Lambda Extension kind: documentation aliases: - /serverless/datadog_lambda_library/extension From 3bb0c4918a28fffbaa503fb4167130b8db99ed15 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 14 Apr 2022 17:37:13 -0400 Subject: [PATCH 07/35] Guide to wrap handler in code --- content/en/serverless/guide/_index.md | 1 + .../en/serverless/guide/handler_wrapper.md | 34 +++++++++++ .../en/serverless/troubleshooting/_index.md | 56 ++++++++++--------- 3 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 content/en/serverless/guide/handler_wrapper.md diff --git a/content/en/serverless/guide/_index.md b/content/en/serverless/guide/_index.md index 757365fbb5c0a..94e4402a4d807 100644 --- a/content/en/serverless/guide/_index.md +++ b/content/en/serverless/guide/_index.md @@ -27,4 +27,5 @@ kind: guide {{< nextlink href="/serverless/troubleshooting" >}}Troubleshooting Serverless Monitoring{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_tracing_and_webpack" >}}Node.js Lambda Tracing and Webpack Compatibility{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_package_too_large" >}}Troubleshooting Serverless Package Too Large Errors{{< /nextlink >}} + {{< nextlink href="/serverless/guide/serverless_package_too_large" >}}Wrap Your Lambda Handler in Code{{< /nextlink >}} {{< /whatsnext >}} \ No newline at end of file diff --git a/content/en/serverless/guide/handler_wrapper.md b/content/en/serverless/guide/handler_wrapper.md new file mode 100644 index 0000000000000..7501f79bbea09 --- /dev/null +++ b/content/en/serverless/guide/handler_wrapper.md @@ -0,0 +1,34 @@ +--- +title: Wrap Your Lambda Handler in Code +kind: documentation +--- + +For Python and Node.js Lambda functions, in order to instrument individual invocations, the Datadog Lambda library needs to wrap around your Lambda handler function. This is achieved by setting your function's handler to the Datadog handler function, such as `datadog_lambda.handler.handler`, and setting the environment variable `DD_LAMBDA_HANDLER` with your original handler function to be called by the Datadog handler. + +If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can apply the Datadog wrapper in your function code instead. + +1. Follow the "Custom" installation instructions for [Python][1] or [Node.js][2] to install the Datadog serverless monitoring +2. Skip the step to configure the handler function +3. Skip the step to set the environment variable `DD_LAMBDA_HANDLER` +4. Apply the Datadog wrapper in your function code like below: + ```python + # for python + from datadog_lambda.wrapper import datadog_lambda_wrapper + + @datadog_lambda_wrapper + def my_lambda_handle(event, context): + # your function code + ``` + + ```js + // for node.js + const { datadog } = require("datadog-lambda-js"); + const tracer = require("dd-trace").init({}); + + module.exports.myHandler = datadog(myHandler, { + // my function code + }); + ``` + +[1]: /serverless/installation/python?tab=custom +[2]: /serverless/installation/nodejs?tab=custom diff --git a/content/en/serverless/troubleshooting/_index.md b/content/en/serverless/troubleshooting/_index.md index ba65527ae077b..e2ba0341d13f7 100644 --- a/content/en/serverless/troubleshooting/_index.md +++ b/content/en/serverless/troubleshooting/_index.md @@ -5,40 +5,43 @@ further_reading: - link: '/serverless/installation/' tag: 'Documentation' text: 'Installing Serverless Monitoring' -- link: '/serverless/guide/' +- link: '/serverless/guide/#troubleshoot-your-installation' tag: 'Documentation' text: 'Troubleshoot Common Issues' aliases: - /serverless/guide/troubleshoot_serverless_monitoring --- -This guide helps you troubleshoot general data collection issues for serverless monitoring, such as missing metrics, traces, logs, or tags. Check out more [troubleshooting guides][1] for issues such as the function code size is too large or about webpack compatibility. + +This guide helps you troubleshoot general data collection issues for serverless monitoring, such as missing metrics, traces, logs, or tags. + + ## Understand the basics -To better understand the instructions from this guide, familiarize yourself with the [key concepts][2] first. A better understanding on how things work helps you identify the missing pieces and narrow down probable causes. +To better understand the instructions from this guide, familiarize yourself with the [key concepts][1] first. A better understanding on how things work helps you identify the missing pieces and narrow down probable causes. ## Use the Datadog Lambda Extension instead of the Forwarder -If you are still using the [Datadog Forwarder Lambda function][3] for data collection, consider adopting the [Datadog Lambda Extension][4] instead. Because the technical limitations of the Forwarder Lambda cause a number of known issues, migrating to the Lambda Extension can resolve them automatically. +If you are still using the [Datadog Forwarder Lambda function][2] for data collection, consider adopting the [Datadog Lambda Extension][3] instead. Because the technical limitations of the Forwarder Lambda cause a number of known issues, migrating to the Lambda Extension can resolve them automatically. -* If you are unsure whether your Lambda is using the Extension, check your Lambda function's [layer configurations][5] and see if any Lambda layer is named `Datadog-Extension`. +* If you are unsure whether your Lambda is using the Extension, check your Lambda function's [layer configurations][4] and see if any Lambda layer is named `Datadog-Extension`. -* If you are unsure whether your Lambda is using the Forwarder, check the [subscription filters][6] of your Lambda function's log group, and see if the log group is subscribed by a Lambda named `Datadog Forwarder` or something similar. +* If you are unsure whether your Lambda is using the Forwarder, check the [subscription filters][5] of your Lambda function's log group, and see if the log group is subscribed by a Lambda named `Datadog Forwarder` or something similar. -See this [comparison guide][7] to understand the benefits of using the Extension and this [migration guide][8] for the general migration steps. Test your changes in a dev or staging environment first! +See this [comparison guide][6] to understand the benefits of using the Extension and this [migration guide][7] for the general migration steps. Test your changes in a dev or staging environment first! -To continue using the Forwarder, see this [Forwarder troubleshooting guide][9] for more help. +To continue using the Forwarder, see this [Forwarder troubleshooting guide][8] for more help. ## Ensure the configurations are up-to-date and expected -Check out the [installation guides][10] with up-to-date instructions about applications you may have configured for Datadog monitoring in the past. +Check out the [installation guides][9] with up-to-date instructions about applications you may have configured for Datadog monitoring in the past. To ensure the actual changes made to your Lambda functions are expected, try setting up another testing function and configuring it following the instructions for _Datadog CLI_ or _Custom_. Compare the changes (such as handler, layers, environment variables, and tags) made on your real Lambda functions against the testing one. ## Collect debugging logs -Enable verbose debugging logs by setting the environment variable `DD_LOG_LEVEL` to `debug` on your Lambda functions. If you are using the [Datadog Forwarder Lambda function][3] for data forwarding from logs, also set `DD_LOG_LEVEL` to `debug` on the Forwarder Lambda function. +Enable verbose debugging logs by setting the environment variable `DD_LOG_LEVEL` to `debug` on your Lambda functions. If you are using the [Datadog Forwarder Lambda function][2] for data forwarding from logs, also set `DD_LOG_LEVEL` to `debug` on the Forwarder Lambda function. If you have issues with tracing, set the environment variable `DD_TRACE_DEBUG` to `true` for extra debugging logs from the Datadog Tracer. @@ -46,19 +49,19 @@ To avoid unnecessary costs, disable the debugging logs after you collect enough ## Check the AWS integration -Datadog can collect metrics and resource tags from AWS through an [integration with AWS][11] (optional). If you are missing certain metrics from CloudWatch and Lambda resource tags, ensure that the AWS integration is properly configured. +Datadog can collect metrics and resource tags from AWS through an [integration with AWS][10] (optional). If you are missing certain metrics from CloudWatch and Lambda resource tags, ensure that the AWS integration is properly configured. ## Ensure the tags are configured If you have trouble applying the Datadog standard `service`, `env`, and `version` tags to the collected data, make sure the environment variables `DD_SERVICE`, `DD_ENV`, and `DD_VERSION` are configured on your Lambda functions. For custom tags, ensure `DD_TAGS` is configured. -If you want to enrich the data collected with your AWS Lambda resource tags, make sure the [Datadog integration for AWS][11] is properly configured. +If you want to enrich the data collected with your AWS Lambda resource tags, make sure the [Datadog integration for AWS][10] is properly configured. ## Get help -For quick questions, post in the _#serverless_ channel of the [Datadog Slack community][12]. +For quick questions, post in the _#serverless_ channel of the [Datadog Slack community][11]. -If you have followed all the troubleshooting steps above and want help from [Datadog Support][13], include the following information in your ticket: +If you have followed all the troubleshooting steps above and want help from [Datadog Support][12], include the following information in your ticket: 1. Basic information about your Lambda function:ARN, runtime, handler, layers, environment variables, and tags. Focus on one function first if you have the same issue with many. 1. If the Lambda function is configured to send data through logs using the Datadog Forwarder Lambda function, include basic information about the Forwarder Lambda function, as well as the subscription filters configured on your Lambda function's log group. @@ -72,16 +75,15 @@ If you have followed all the troubleshooting steps above and want help from [Dat {{< partial name="whats-next/whats-next.html" >}} -[1]: /serverless/guide/ -[2]: /serverless/glossary/#datadog-serverless-for-aws-lambda-concepts -[3]: /serverless/libraries_integrations/forwarder/ -[4]: /serverless/libraries_integrations/extension/ -[5]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html -[6]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html -[7]: /serverless/guide/extension_motivation/ -[8]: /serverless/guide/forwarder_extension_migration/ -[9]: /logs/guide/lambda-logs-collection-troubleshooting-guide/ -[10]: /serverless/installation/ -[11]: /integrations/amazon_web_services/ -[12]: https://chat.datadoghq.com/ -[13]: https://www.datadoghq.com/support/ +[1]: /serverless/glossary/#datadog-serverless-for-aws-lambda-concepts +[2]: /serverless/libraries_integrations/forwarder/ +[3]: /serverless/libraries_integrations/extension/ +[4]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html +[5]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html +[6]: /serverless/guide/extension_motivation/ +[7]: /serverless/guide/forwarder_extension_migration/ +[8]: /logs/guide/lambda-logs-collection-troubleshooting-guide/ +[9]: /serverless/installation/ +[10]: /integrations/amazon_web_services/ +[11]: https://chat.datadoghq.com/ +[12]: https://www.datadoghq.com/support/ From f86abfdc367028c8e2e4bc29c6dadd9af4491f7c Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 15 Apr 2022 10:57:44 -0400 Subject: [PATCH 08/35] misc --- config/_default/menus/menus.en.yaml | 16 ++++++++-------- content/en/serverless/_index.md | 2 +- content/en/serverless/configuration/_index.md | 2 +- content/en/serverless/guide/_index.md | 2 +- content/en/serverless/installation/_index.md | 2 +- content/en/serverless/troubleshooting/_index.md | 5 +---- 6 files changed, 13 insertions(+), 16 deletions(-) diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index b66893b3c4d98..3728f26289653 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -846,31 +846,31 @@ main: url: serverless/libraries_integrations/cdk/ parent: libraries_integrations weight: 306 + - name: Enhanced Lambda Metrics + url: serverless/enhanced_lambda_metrics + parent: serverless + weight: 4 - name: Distributed Tracing url: serverless/distributed_tracing identifier: serverless_distributed_tracing parent: serverless - weight: 4 + weight: 5 - name: Collect Lambda Payloads url: serverless/distributed_tracing/collect_lambda_payloads parent: serverless_distributed_tracing - weight: 401 + weight: 501 - name: Trace Merging (Advanced) url: serverless/distributed_tracing/serverless_trace_merging parent: serverless_distributed_tracing - weight: 402 + weight: 502 - name: Trace Propagation (Advanced) url: serverless/distributed_tracing/serverless_trace_propagation parent: serverless_distributed_tracing - weight: 403 + weight: 503 - name: Custom Metrics url: serverless/custom_metrics parent: serverless identifier: custom_metrics - weight: 5 - - name: Enhanced Lambda Metrics - url: serverless/enhanced_lambda_metrics - parent: serverless weight: 6 - name: Deployment Tracking url: serverless/deployment_tracking diff --git a/content/en/serverless/_index.md b/content/en/serverless/_index.md index 2887453e69de6..d05b761a8e6b5 100644 --- a/content/en/serverless/_index.md +++ b/content/en/serverless/_index.md @@ -83,7 +83,7 @@ Easily correlate serverless code, configuration, and deployment changes with met ## Getting Started -Getting started to monitor your serverless application is quick and easy. See the [installation instructions][4]. +Getting started to monitor your serverless application is quick and easy. Follow the [installation instructions][4] to collect metrics, traces, and logs from your serverless applications. ## Other serverless clouds diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index f7ef6b1232d8e..1c0935a207a13 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -15,7 +15,7 @@ aliases: - /serverless/guide/extension_private_link/ --- -After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring. +After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring experience. ## Table of contents diff --git a/content/en/serverless/guide/_index.md b/content/en/serverless/guide/_index.md index 94e4402a4d807..ae271e3046895 100644 --- a/content/en/serverless/guide/_index.md +++ b/content/en/serverless/guide/_index.md @@ -27,5 +27,5 @@ kind: guide {{< nextlink href="/serverless/troubleshooting" >}}Troubleshooting Serverless Monitoring{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_tracing_and_webpack" >}}Node.js Lambda Tracing and Webpack Compatibility{{< /nextlink >}} {{< nextlink href="/serverless/guide/serverless_package_too_large" >}}Troubleshooting Serverless Package Too Large Errors{{< /nextlink >}} - {{< nextlink href="/serverless/guide/serverless_package_too_large" >}}Wrap Your Lambda Handler in Code{{< /nextlink >}} + {{< nextlink href="/serverless/guide/handler_wrapper" >}}Wrap Your Lambda Handler in Code{{< /nextlink >}} {{< /whatsnext >}} \ No newline at end of file diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index 81d83c4cfb7ee..d67c686c8323f 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -14,7 +14,7 @@ further_reading: ## Quick start -If you are new to Datadog, [sign up for a Datadog account][1], then follow the installation instructions for [AWS Lambda][2]. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. +If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2]. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. ## Installation instructions diff --git a/content/en/serverless/troubleshooting/_index.md b/content/en/serverless/troubleshooting/_index.md index e2ba0341d13f7..3d6d681584390 100644 --- a/content/en/serverless/troubleshooting/_index.md +++ b/content/en/serverless/troubleshooting/_index.md @@ -12,10 +12,7 @@ aliases: - /serverless/guide/troubleshoot_serverless_monitoring --- - -This guide helps you troubleshoot general data collection issues for serverless monitoring, such as missing metrics, traces, logs, or tags. - -
Check out the additional troubleshooting guides for common issues such as the function code size is too large or webpack compatibility.
+
Check out the additional troubleshooting guides for common issues such as the function code size is too large or webpack compatibility. This guide helps you troubleshoot general telemetry collection issues.
## Understand the basics From 3d1f9749c76f2be0c6cf2a951464c8b5771e485f Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 15 Apr 2022 11:46:51 -0400 Subject: [PATCH 09/35] misc --- config/_default/menus/menus.en.yaml | 4 --- content/en/serverless/configuration/_index.md | 6 ++++- .../enhanced_lambda_metrics/_index.md | 25 +++++++---------- .../serverless/guide/extension_motivation.md | 6 ++--- .../libraries_integrations/_index.md | 27 +++++++------------ .../en/serverless/troubleshooting/_index.md | 2 +- 6 files changed, 28 insertions(+), 42 deletions(-) diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index 3728f26289653..219e1df183e22 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -855,10 +855,6 @@ main: identifier: serverless_distributed_tracing parent: serverless weight: 5 - - name: Collect Lambda Payloads - url: serverless/distributed_tracing/collect_lambda_payloads - parent: serverless_distributed_tracing - weight: 501 - name: Trace Merging (Advanced) url: serverless/distributed_tracing/serverless_trace_merging parent: serverless_distributed_tracing diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 1c0935a207a13..8461da8f302bf 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -296,7 +296,11 @@ To scrub or filter other logs before sending them to Datadog, see [Advanced Log ### Disable logs collection -Logs collection through the Datadog Lambda extension is enabled by default. If you want to stop collecting logs using the Datadog Forwarder Lambda function, simply remove the subscription filter from your own Lambda function's CloudWatch log group. If you want to stop collecting logs using the Datadog Lambda extension, follow the instructions below for the installation method you use.: +Logs collection through the Datadog Lambda extension is enabled by default. + +If you want to stop collecting logs using the Datadog Forwarder Lambda function, simply remove the subscription filter from your own Lambda function's CloudWatch log group. + +If you want to stop collecting logs using the Datadog Lambda extension, follow the instructions below for the installation method you use: {{< tabs >}} {{% tab "Serverless Framework" %}} diff --git a/content/en/serverless/enhanced_lambda_metrics/_index.md b/content/en/serverless/enhanced_lambda_metrics/_index.md index 2c7097fa9837e..b4ebebc698c13 100644 --- a/content/en/serverless/enhanced_lambda_metrics/_index.md +++ b/content/en/serverless/enhanced_lambda_metrics/_index.md @@ -10,13 +10,13 @@ kind: documentation ## Overview -[Datadog Lambda library][1] and the [Datadog Lambda Extension][2] or the [Datadog Forwarder][3] together generate enhanced Lambda metrics out-of-the-box with low latency, several second granularity, and detailed metadata for cold starts and custom tags. +Datadog generates enhanced Lambda metrics from your Lambda runtime out-of-the-box with low latency, several second granularity, and detailed metadata for cold starts and custom tags. -Enhanced Lambda metrics give you a view above and beyond the default [Lambda metrics][4] enabled with the AWS Lambda integration. These metrics are distinguished by being in the `aws.lambda.enhanced.*` namespace, and are Datadog’s best practice for setting real-time monitors on your serverless application health. +Enhanced Lambda metrics give you a view above and beyond the default [Lambda metrics][1] enabled with the AWS Lambda integration. These metrics are distinguished by being in the `aws.lambda.enhanced.*` namespace, and are Datadog’s best practice for setting real-time monitors on your serverless application health. ### Real-time enhanced Lambda metrics -The following real-time enhanced Lambda metrics are available, and they are tagged with the `aws_account`, `region`, `functionname`, `cold_start`, `memorysize`, `executedversion`, `resource` and `runtime`. These metrics are [distributions][5], and you can query them using the `count`, `min`, `max`, `sum`, and `avg` aggregations. +The following real-time enhanced Lambda metrics are available, and they are tagged with the `aws_account`, `region`, `functionname`, `cold_start`, `memorysize`, `executedversion`, `resource` and `runtime`. These metrics are [distributions][2], and you can query them using the `count`, `min`, `max`, `sum`, and `avg` aggregations. `aws.lambda.enhanced.invocations` @@ -49,24 +49,17 @@ The following real-time enhanced Lambda metrics are available, and they are tagg `aws.lambda.enhanced.out_of_memory` : Measures the number of times a function runs out of memory. -**Note**: When you aren't using the [Datadog Lambda Extension][2], enhanced metrics are sent to the Datadog Forwarder via CloudWatch Logs, meaning you’ll see an increased volume of logs in CloudWatch. This may affect your AWS bill. To opt-out, set the `DD_ENHANCED_METRICS` environment variable to `false` on your AWS Lambda functions. - ## Enable enhanced Lambda metrics {{< img src="serverless/serverless_custom_metrics.png" alt="Collecting Enhanced Metrics from AWS Lambda" >}} -Follow the [installation instructions][6] to set up instrumentation of your serverless applications, and the enhanced Lambda metrics are enabled by default. - -**Note**: To enable enhanced Lambda metrics via the Datadog Forwarder without sending the logs for your functions to Datadog, set the `DD_FORWARD_LOG` environment variable to `false` on the [Datadog Forwarder][3]. +Follow the [installation instructions][3] to set up instrumentation of your serverless applications, and the enhanced Lambda metrics are enabled by default. ## Viewing your dashboard -Once you've enabled Enhanced Lambda Metrics, view your [default dashboard in the Datadog app][7]. +Once you've enabled Enhanced Lambda Metrics, view your [default dashboard in the Datadog app][4]. -[1]: /serverless/datadog_lambda_library -[2]: /serverless/libraries_integrations/extension -[3]: /serverless/forwarder/ -[4]: /integrations/amazon_lambda/#metric-collection -[5]: /metrics/distributions/ -[6]: /serverless/installation/ -[7]: https://app.datadoghq.com/screen/integration/30306 +[1]: /integrations/amazon_lambda/#metric-collection +[2]: /metrics/distributions/ +[3]: /serverless/installation/ +[4]: https://app.datadoghq.com/screen/integration/30306 diff --git a/content/en/serverless/guide/extension_motivation.md b/content/en/serverless/guide/extension_motivation.md index b3144d4f6ae18..87b467e02b3ec 100644 --- a/content/en/serverless/guide/extension_motivation.md +++ b/content/en/serverless/guide/extension_motivation.md @@ -2,9 +2,9 @@ title: Deciding to migrate to the Datadog Lambda extension kind: guide further_reading: - - link: '/serverless/guide/forwarder_extension_migration' + - link: '/serverless/configuration/#migrate-to-the-datadog-lambda-extension' tag: 'Documentation' - text: 'Migrating from the Datadog Forwarder to the Datadog Lambda Extension' + text: 'Migrating to the Datadog Lambda Extension' --- ## Should I migrate to the Datadog Lambda extension? @@ -43,4 +43,4 @@ To migrate from the the Datadog Forwarder to the Datadog Lambda Extension, follo [2]: /serverless [3]: /serverless/libraries_integrations/forwarder/ [4]: /serverless/libraries_integrations/extension/#overhead -[5]: /serverless/guide/forwarder_extension_migration +[5]: /serverless/configuration/#migrate-to-the-datadog-lambda-extension diff --git a/content/en/serverless/libraries_integrations/_index.md b/content/en/serverless/libraries_integrations/_index.md index 82a168db58061..1d316e4a29347 100644 --- a/content/en/serverless/libraries_integrations/_index.md +++ b/content/en/serverless/libraries_integrations/_index.md @@ -32,20 +32,13 @@ aliases: {{< nextlink href="https://github.com/DataDog/datadog-lambda-rb" >}}Datadog Lambda Library for Ruby{{< /nextlink >}} {{< /whatsnext >}} -## AWS Step Functions - -Enable the [AWS Step Functions integration][1] for metrics, traces, and logs. - -Datadog automatically adds tags `statemachinename`, `statemachinearn`, and `stepname` on your Lambda telemetry to identify which state machines a particular function belongs to. You can use these tags to get an aggregated view of your Lambda functions on the [Serverless view][2]. - -{{< img src="serverless/step-function-trace.jpeg" alt="AWS Step Function Tracing" >}} - -## Lambda@Edge - -Enable the [AWS Lambda integration][3] for metrics and logs. Datadog automatically adds tags `at_edge`, `edge_master_name`, and `edge_master_arn` tags on your Lambda metrics to get an aggregated view of your Lambda function metrics and logs as they run in Edge locations. - -Distributed tracing is _not_ yet supported for Lambda@Edge functions. - -[1]: /integrations/amazon_step_functions/ -[2]: https://app.datadoghq.com/functions -[3]: /integrations/amazon_lambda/ +## Datadog AWS Integration + +{{< whatsnext desc="In addition to collecting telemetry directly from your Lambda functions, Datadog can also collect telemetry through the Datadog AWS integration for resources utilized by your serverless application." >}} + {{< nextlink href="/integrations/amazon_lambda/" >}}AWS Lambda Integration{{< /nextlink >}} + {{< nextlink href="/integrations/amazon_step_functions/" >}}AWS Step Functions Integration{{< /nextlink >}} + {{< nextlink href="/integrations/amazon_appsync/" >}}AWS AppSync Integration{{< /nextlink >}} + {{< nextlink href="/integrations/amazon_api_gateway/" >}}AWS API Gateway Integration{{< /nextlink >}} + {{< nextlink href="/integrations/amazon_sqs/" >}}AWS SQS Integration{{< /nextlink >}} + {{< nextlink href="/integrations/amazon_sns/" >}}AWS SNS Integration{{< /nextlink >}} +{{< /whatsnext >}} \ No newline at end of file diff --git a/content/en/serverless/troubleshooting/_index.md b/content/en/serverless/troubleshooting/_index.md index 3d6d681584390..0228ce4100670 100644 --- a/content/en/serverless/troubleshooting/_index.md +++ b/content/en/serverless/troubleshooting/_index.md @@ -78,7 +78,7 @@ If you have followed all the troubleshooting steps above and want help from [Dat [4]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html [5]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html [6]: /serverless/guide/extension_motivation/ -[7]: /serverless/guide/forwarder_extension_migration/ +[7]: /serverless/configuration/#migrate-to-the-datadog-lambda-extension [8]: /logs/guide/lambda-logs-collection-troubleshooting-guide/ [9]: /serverless/installation/ [10]: /integrations/amazon_web_services/ From 436aabd508f51273b122aa0ef0f38999259f777b Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 15 Apr 2022 14:49:03 -0400 Subject: [PATCH 10/35] Refresh sls tracing page --- .../serverless/distributed_tracing/_index.md | 84 +++++++++---------- .../enhanced_lambda_metrics/_index.md | 2 +- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/content/en/serverless/distributed_tracing/_index.md b/content/en/serverless/distributed_tracing/_index.md index 8a2a7e8ad63eb..89ccaf07d50cb 100644 --- a/content/en/serverless/distributed_tracing/_index.md +++ b/content/en/serverless/distributed_tracing/_index.md @@ -30,17 +30,17 @@ further_reading: By connecting your serverless traces to metrics, Datadog provides a context-rich picture of your application’s performance, allowing you to better troubleshoot performance issues given the distributed nature of serverless applications. -The Datadog Python, Node.js, Ruby, Go, Java, and .NET tracing libraries support distributed tracing for AWS Lambda. For most Lambda runtimes, the easiest way to add tracing to your application is with the [Datadog Lambda Library][1], which includes the Datadog tracing library as a dependency. +The Datadog Python, Node.js, Ruby, Go, Java, and .NET tracing libraries support distributed tracing for AWS Lambda. -## Choose your tracing library +## Choose your tracing solution {{< img src="serverless/serverless_tracing_installation_instructions.png" alt="Architecture diagram for tracing AWS Lambda with Datadog" >}}
New to serverless monitoring? Follow the installation steps here to get started.
-To start using Datadog APM with your serverless application, you can choose between installing Datadog's tracing libraries (`dd-trace`) or AWS X-Ray tracing libraries based on your Lambda runtime and individual requirements. To see all of your traces in Datadog in real-time in the Live Search view, you need to use Datadog's tracing libraries. +To start using Datadog APM with your serverless application, you can choose between generating traces using the Datadog's tracing client (`dd-trace`) or pulling X-Ray traces from AWS. -| [Datadog APM with dd-trace][2] | [Datadog APM with AWS X-Ray][3] | +| [Datadog APM with dd-trace][1] | [Datadog APM with AWS X-Ray][2] | |---------------------------------|-------------------------------------------------------------------------| | Uses Datadog APM's integration libraries for end-to-end tracing. | Pulls traces from AWS X-Ray. | | Visualize your traces in Datadog in real-time. | Trace data available in Datadog after a few minutes. | @@ -65,92 +65,88 @@ The Datadog Lambda Library and tracing libraries for Python and Node.js support: - SNS and SQS direct integration - Kinesis - EventBridge -- Tracing dozens of additional out-of-the-box [Python][4] and [Node.js][5] libraries. +- Tracing dozens of additional out-of-the-box [Python][3] and [Node.js][4] libraries. -For Python and Node.js serverless applications, Datadog recommends you [install Datadog's tracing libraries][7]. If your application requires AWS X-Ray active tracing in AWS managed services such as AppSync or Step Functions, Datadog recommends you augment AWS X-Ray traces with Datadog APM by configuring _both_ AWS X-Ray and Datadog APM tracing libraries as described in [Serverless Trace Merging][8]. +For Python and Node.js serverless applications, Datadog recommends you [install Datadog's tracing libraries][5]. If your application requires AWS X-Ray active tracing in AWS managed services such as AppSync or Step Functions, Datadog recommends you augment AWS X-Ray traces with Datadog APM by configuring _both_ AWS X-Ray and Datadog APM tracing libraries as described in [Serverless Trace Merging][6]. -If you are already tracing your serverless functions with X-Ray and want to continue using X-Ray, you can [install the AWS X-Ray integration][3]. +If you are already tracing your serverless functions with X-Ray and want to continue using X-Ray, you can [install the AWS X-Ray integration][2]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][9].* +*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* #### Ruby The Datadog Lambda Library and tracing libraries for Ruby support: - Automatic correlation of Lambda logs and traces with trace ID and tag injection. - Tracing HTTP requests invoking downstream Lambda functions or containers. -- Tracing dozens of additional out-of-the-box [Ruby][10] libraries. +- Tracing dozens of additional out-of-the-box [Ruby][8] libraries. -You can trace your serverless functions in Datadog with [Datadog's tracing libraries][7] or by [installing the AWS X-Ray integration][3]. If you are using [Datadog's tracing libraries][7], and need to connect Lambda function traces across AWS managed services, Datadog recommends you augment your traces by configuring _both_ AWS X-Ray and Datadog APM tracing libraries as described [here][8]. +You can trace your serverless functions in Datadog with [Datadog's tracing libraries][5] or by [installing the AWS X-Ray integration][2]. If you are using [Datadog's tracing libraries][5], and need to connect Lambda function traces across AWS managed services, Datadog recommends you augment your traces by configuring _both_ AWS X-Ray and Datadog APM tracing libraries as described [here][6]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][9].* +*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* #### Go The Datadog Lambda Library and tracing libraries for Go support: - Manual correlation of Lambda logs and traces with trace ID and tag injection. - Tracing HTTP requests invoking downstream Lambda functions or containers. -- Tracing dozens of additional out-of-the-box [Go][11] libraries. +- Tracing dozens of additional out-of-the-box [Go][9] libraries. -For Go serverless applications, Datadog recommends installing [Datadog's tracing libraries][7]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][3]. +For Go serverless applications, Datadog recommends installing [Datadog's tracing libraries][5]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][2]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][9].* +*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* #### Java The Datadog Lambda Library and tracing libraries for Java support: -- Correlation of Lambda logs and traces with trace ID and tag injection. See [Connecting Java logs and traces][12] for more details. +- Correlation of Lambda logs and traces with trace ID and tag injection. See [Connecting Java logs and traces][10] for more details. - Tracing HTTP requests invoking downstream Lambda functions or containers. -- Tracing dozens of additional out-of-the-box [Java][13] libraries. +- Tracing dozens of additional out-of-the-box [Java][11] libraries. -For Java serverless applications, Datadog recommends [installing Datadog's tracing libraries][7]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][3]. +For Java serverless applications, Datadog recommends [installing Datadog's tracing libraries][5]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][2]. -*Have feedback on the Datadog's tracing libraries for Java Lambda functions? Make sure to check out discussions going on in the [#serverless][14] channel in the [Datadog Slack community][15].* +*Have feedback on the Datadog's tracing libraries for Java Lambda functions? Make sure to check out discussions going on in the [#serverless][12] channel in the [Datadog Slack community][13].* #### .NET The tracing library for .NET supports: - Tracing HTTP requests invoking downstream Lambda functions or containers. -- Tracing dozens of additional out-of-the-box [.NET][18] libraries. +- Tracing dozens of additional out-of-the-box [.NET][14] libraries. -For .NET serverless applications, Datadog recommends [installing Datadog's tracing libraries][7]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][3]. +For .NET serverless applications, Datadog recommends [installing Datadog's tracing libraries][5]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][2]. -Learn more about [tracing through .NET Azure serverless applications][16]. +Learn more about [tracing through .NET Azure serverless applications][15]. ### Hybrid environments If you have installed Datadog's tracing libraries (`dd-trace`) on both your Lambda functions and hosts, your traces automatically show you the complete picture of requests that cross infrastructure boundaries, whether it be AWS Lambda, containers, on-prem hosts, or managed services. -If `dd-trace` is installed on your hosts with the Datadog Agent, and your serverless functions are traced with AWS X-Ray, trace merging is required to see a single, connected trace across your infrastructure. Learn more about merging traces from `dd-trace` and AWS X-Ray [here][8]. +If `dd-trace` is installed on your hosts with the Datadog Agent, and your serverless functions are traced with AWS X-Ray, trace merging is required to see a single, connected trace across your infrastructure. Learn more about merging traces from `dd-trace` and AWS X-Ray [here][6]. -Datadog's [AWS X-Ray integration][3] only provides traces for Lambda functions. Learn more about tracing in container or host-based environments [here][17]. +Datadog's [AWS X-Ray integration][2] only provides traces for Lambda functions. Learn more about tracing in container or host-based environments [here][16]. ## Enable Datadog APM {{< img src="tracing/live_search/livesearchmain.mp4" alt="Live Search" video=true >}} -The Datadog Python, Node.js, Ruby, Go, Java, and .NET tracing libraries support distributed tracing for AWS Lambda. To enable tracing on your functions, follow [the installation instructions][7]. - -If you are using the Datadog Forwarder Lambda Function and you want to enable Datadog APM without enabling logging for your functions, ensure the `DdForwarderLog` environment variable is set to `false` on your Datadog Forwarder. +The Datadog Python, Node.js, Ruby, Go, Java, and .NET tracing libraries support distributed tracing for AWS Lambda. To enable tracing on your functions, follow [the installation instructions][5]. ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: /serverless/datadog_lambda_library/ -[2]: /serverless/distributed_tracing#distributed-tracing-with-datadog-apm -[3]: /integrations/amazon_xray/#overview -[4]: /tracing/setup_overview/compatibility_requirements/python -[5]: /tracing/setup_overview/compatibility_requirements/nodejs -[6]: /serverless/distributed_tracing/serverless_trace_propagation -[7]: /serverless/installation/ -[8]: /serverless/distributed_tracing/serverless_trace_merging -[9]: https://docs.datadoghq.com/help/ -[10]: /tracing/setup_overview/compatibility_requirements/ruby -[11]: /tracing/setup_overview/compatibility_requirements/go -[12]: /tracing/connect_logs_and_traces/java/ -[13]: /tracing/setup_overview/compatibility_requirements/java -[14]: https://datadoghq.slack.com/archives/CFDPB83M4 -[15]: https://chat.datadoghq.com/ -[16]: /serverless/azure_app_services -[17]: /tracing/setup_overview/ -[18]: /tracing/setup_overview/compatibility_requirements/dotnet-core +[1]: /serverless/distributed_tracing#distributed-tracing-with-datadog-apm +[2]: /integrations/amazon_xray/#overview +[3]: /tracing/setup_overview/compatibility_requirements/python +[4]: /tracing/setup_overview/compatibility_requirements/nodejs +[5]: /serverless/installation/ +[6]: /serverless/distributed_tracing/serverless_trace_merging +[7]: https://docs.datadoghq.com/help/ +[8]: /tracing/setup_overview/compatibility_requirements/ruby +[9]: /tracing/setup_overview/compatibility_requirements/go +[10]: /tracing/connect_logs_and_traces/java/ +[11]: /tracing/setup_overview/compatibility_requirements/java +[12]: https://datadoghq.slack.com/archives/CFDPB83M4 +[13]: https://chat.datadoghq.com/ +[14]: /tracing/setup_overview/compatibility_requirements/dotnet-core +[15]: /serverless/azure_app_services +[16]: /tracing/setup_overview/ diff --git a/content/en/serverless/enhanced_lambda_metrics/_index.md b/content/en/serverless/enhanced_lambda_metrics/_index.md index b4ebebc698c13..158f6dc57e9e7 100644 --- a/content/en/serverless/enhanced_lambda_metrics/_index.md +++ b/content/en/serverless/enhanced_lambda_metrics/_index.md @@ -62,4 +62,4 @@ Once you've enabled Enhanced Lambda Metrics, view your [default dashboard in the [1]: /integrations/amazon_lambda/#metric-collection [2]: /metrics/distributions/ [3]: /serverless/installation/ -[4]: https://app.datadoghq.com/screen/integration/30306 +[4]: https://app.datadoghq.com/screen/integration/aws_lambda_enhanced_metrics From 9659120b0691e0bc5494c6635d45925f20fbe82c Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 15 Apr 2022 15:45:50 -0400 Subject: [PATCH 11/35] Node.js installation guide refresh --- content/en/serverless/installation/nodejs.md | 513 +++++++------------ content/en/serverless/installation/python.md | 51 +- content/en/serverless/installation/ruby.md | 142 ++--- 3 files changed, 262 insertions(+), 444 deletions(-) diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 56e1a6c4cf829..0c1097b688f59 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -2,21 +2,15 @@ title: Instrumenting Node.js Serverless Applications kind: documentation further_reading: - - link: '/serverless/serverless_integrations/plugin/' + - link: '/serverless/configuration' tag: 'Documentation' - text: 'Datadog Serverless Plugin' - - link: '/serverless/serverless_integrations/macro/' + text: 'Configure Serverless Monitoring' + - link: '/serverless/guide/serverless_tracing_and_webpack/' tag: 'Documentation' - text: 'Datadog Serverless Macro' - - link: '/serverless/serverless_integrations/cli/' + text: 'Node.js Lambda Tracing and Webpack Compatibility' + - link: '/serverless/guide/troubleshoot_serverless_monitoring' tag: 'Documentation' - text: 'Datadog Serverless CLI' - - link: 'serverless/serverless_tagging/' - tag: 'Documentation' - text: 'Tagging Serverless Applications' - - link: 'serverless/distributed_tracing/' - tag: 'Documentation' - text: 'Tracing Serverless Applications' + text: 'Troubleshoot Serverless Monitoring' - link: 'serverless/custom_metrics/' tag: 'Documentation' text: 'Submitting Custom Metrics from Serverless Applications' @@ -25,428 +19,312 @@ aliases: - /serverless/guide/nodejs/ --- -
If you previously set up Datadog Serverless using the Datadog Forwarder, see the Datadog Forwarder - Node guide.
+
If you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Node.js guide.
-## Configuration +
The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can send data over AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or send data over a proxy for all other sites.
-Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI, which does not require redeploying your whole application. The CLI can also be added to your CI/CD pipelines to enable instrumentation for applications across your entire organization. +## Installation + +Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI. {{< tabs >}} {{% tab "Datadog CLI" %}} The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. -You can also add the command to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command _after_ your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. +1. Install the Datadog CLI client -### Install + ```sh + npm install -g @datadog/datadog-ci + ``` -Install the Datadog CLI with NPM: +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. -```sh -npm install -g @datadog/datadog-ci -``` + ```sh + datadog-ci lambda instrument -i + ``` -### Configure credentials +3. Configure the AWS credentials -For a quick start, configure Datadog and [AWS credentials][1] using the [instrumentation command](#instrument). For production applications, provide credentials in a more secure manner by using environment variables. For example: + Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` +4. Configure the Datadog site -### Instrument + Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. -**Note**: Instrument your Lambda functions in a dev or staging environment first. Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. + ```sh + export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com + ``` -To instrument the function, run the following command: +5. Configure the Datadog API key -```sh -datadog-ci lambda instrument -f -f -r -v -e -``` + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. + + ```sh + export DATADOG_API_KEY_SECRET_ARN="" + ``` -To fill in the placeholders: + For quick testing purposes, you can also set the Datadog API key in plaintext: -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Library. The latest version is `{{< latest-lambda-layer-version layer="node" >}}`. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. + ```sh + export DATADOG_API_KEY="" + ``` -For example: +6. Instrument your Lambda functions -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -v {{< latest-lambda-layer-version layer="node" >}} -e {{< latest-lambda-layer-version layer="extension" >}} -``` + **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. -More information and additional parameters can be found in the [CLI documentation][2]. + To instrument your Lambda functions, run the following command. + + ```sh + datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="node" >}} -e {{< latest-lambda-layer-version layer="extension" >}} + ``` + + To fill in the placeholders: + - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. + - Replace `` with the AWS region name. + + Additional parameters can be found in the [CLI documentation][3]. [1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli {{% /tab %}} {{% tab "Serverless Framework" %}} -The [Datadog Serverless Plugin][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+ +The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. To install and configure the Datadog Serverless Plugin, follow these steps: 1. Install the Datadog Serverless Plugin: - ``` - npm install serverless-plugin-datadog --save-dev - ``` -2. In your `serverless.yml`, add the following: - ``` - plugins: - - serverless-plugin-datadog - ``` -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a Javascript file (for example, by using a serverless.ts file), follow the custom installation instructions.
-3. In your `serverless.yml`, also add the following section: + ```sh + serverless plugin install --name serverless-plugin-datadog ``` + +2. Update your `serverless.yml`: + + ```yaml custom: datadog: - apiKey: # Your Datadog API Key goes here. + site: + apiKeySecretArn: ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. -If you encounter the "Code uncompressed size is greater than max allowed size of 272629760" error after adding `serverless-plugin-datadog`, see this [troubleshooting guide][4]. + To fill in the placeholders: + - Replace `` with your [Datadog site][3] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin -[2]: /serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys -[4]: /serverless/guide/serverless_package_too_large +[2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "AWS SAM" %}} -The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to add the Datadog Lambda library to your functions using layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog to your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. -### Install +1. Install the Datadog CloudFormation macro -Run the following command with your [AWS credentials][3] to deploy a CloudFormation stack that installs the macro AWS resource. You only need to install the macro once for a given region in your account. Replace `create-stack` with `update-stack` to update the macro to the latest version. + Run the following command with your [AWS credentials][3] to deploy a CloudFormation stack that installs the macro AWS resource. You only need to install the macro **once** for a given region in your account. Replace `create-stack` with `update-stack` to update the macro to the latest version. -```sh -aws cloudformation create-stack \ - --stack-name datadog-serverless-macro \ - --template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \ - --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM -``` - -The macro is now deployed and ready to use. + ```sh + aws cloudformation create-stack \ + --stack-name datadog-serverless-macro \ + --template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \ + --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM + ``` -### Instrument + The macro is now deployed and ready to use. -In your `template.yml`, add the following under the `Transform` section, **after** the `AWS::Serverless` transform for SAM. +2. Instrument your Lambda functions -```yaml -Transform: - - AWS::Serverless-2016-10-31 - - Name: DatadogServerless - Parameters: - stackName: !Ref 'AWS::StackName' - apiKey: - nodeLayerVersion: { { < latest-lambda-layer-version layer="node" > } } - extensionLayerVersion: { { < latest-lambda-layer-version layer="extension" > } } - service: '' # Optional - env: '' # Optional -``` + Add the `DatadogServerless` transform **after** the `AWS::Serverless` transform under the `Transform` section in your for SAM `template.yml`. -To fill in the placeholders: + ```yaml + Transform: + - AWS::Serverless-2016-10-31 + - Name: DatadogServerless + Parameters: + stackName: !Ref "AWS::StackName" + nodeLayerVersion: {{< latest-lambda-layer-version layer="node" >}} + extensionLayerVersion: {{< latest-lambda-layer-version layer="extension" >}} + site: "" + apiKeySecretArn: "" + ``` -- Replace `` with your Datadog API key from the [API Management page][4]. -- Replace `` and `` with appropriate values. + To fill in the placeholders: + - Replace `` with your [Datadog site][4] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. -More information and additional parameters can be found in the [macro documentation][1]. + More information and additional parameters can be found in the [macro documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/macro -[2]: /serverless/libraries_integrations/extension +[2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension [3]: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html -[4]: https://app.datadoghq.com/organization-settings/api-keys +[4]: https://docs.datadoghq.com/getting_started/site/ +[5]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "AWS CDK" %}} -The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +The [Datadog CDK Construct][1] automatically installs Datadog to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. -### Install the Datadog CDK constructs library +1. Install the Datadog CDK constructs library -Run the following NPM command in your CDK project to install the Datadog CDK constructs library: + ```sh + # For AWS CDK v1 + npm install datadog-cdk-constructs --save-dev -```sh -npm install datadog-cdk-constructs --save-dev -``` - -### Instrument the function + # For AWS CDK v2 + npm install datadog-cdk-constructs-v2 --save-dev + ``` -Import the `datadog-cdk-construct` module in your AWS CDK app and add the following configurations: +2. Instrument your Lambda functions -```typescript -import * as cdk from "@aws-cdk/core"; -import { Datadog } from "datadog-cdk-constructs"; + ```javascript + // For AWS CDK v1 + import { Datadog } from "datadog-cdk-constructs"; -class CdkStack extends cdk.Stack { - constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); + // For AWS CDK v2 + import { Datadog } from "datadog-cdk-constructs-v2"; const datadog = new Datadog(this, "Datadog", { - nodeLayerVersion: {{< latest-lambda-layer-version layer="node" >}}, + nodeLayerVersion: {{< latest-lambda-layer-version layer="python" >}}, extensionLayerVersion: {{< latest-lambda-layer-version layer="extension" >}}, - apiKey: + site: "", + apiKeySecretArn: "" }); - datadog.addLambdaFunctions([]); - } -} -``` - -Replace `` with your Datadog API key from the [API Management page][3]. + datadog.addLambdaFunctions([]) + ``` -More information and additional parameters can be found in the [Datadog CDK NPM page][1]. + To fill in the placeholders: + - Replace `` with your [Datadog site][2] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. + More information and additional parameters can be found on the [Datadog CDK documentation][1]. -[1]: https://www.npmjs.com/package/datadog-cdk-constructs -[2]: https://github.com/DataDog/datadog-lambda-js/releases +[1]: https://github.com/DataDog/datadog-cdk-constructs +[2]: https://docs.datadoghq.com/getting_started/site/ [3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Container Image" %}} -### Install - -If you are deploying your Lambda function as a container image, you cannot use the Datadog Lambda Library as a layer. Instead, you must install the Datadog Lambda Library as a dependency of your function within the image. If you are using Datadog tracing, you must also install `dd-trace`. +1. Install the Datadog Lambda Library -**NPM**: + If you are deploying your Lambda function as a container image, you cannot use the Datadog Lambda library as a Lambda Layer. Instead, you must package the Datadog Lambda and tracing libraries within the image. -```sh -npm install datadog-lambda-js dd-trace -``` - -**Note**: The minor version of the `datadog-lambda-js` package always matches the layer version. For example, `datadog-lambda-js v0.5.0` matches the content of layer version 5. - -### Configure - -### Install the Datadog Lambda Extension + ```sh + npm install datadog-lambda-js dd-trace + ``` -Add the Datadog Lambda Extension to your container image by adding the following to your Dockerfile: + Note that the minor version of the `datadog-lambda-js` package always matches the layer version. For example, `datadog-lambda-js v0.5.0` matches the content of layer version 5. -``` -COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions -``` +2. Install the Datadog Lambda Extension -Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. + Add the Datadog Lambda Extension to your container image by adding the following to your Dockerfile: -### Configure the function + ```dockerfile + COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions + ``` -1. Set your image's `CMD` value to `node_modules/datadog-lambda-js/dist/handler.handler`. You can set this in AWS or directly in your Dockerfile. **Note**: The value set in AWS overrides the value in the Dockerfile if you set both. -2. Set the following environment variables in AWS: + Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -- Set `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. -- Set `DD_TRACE_ENABLED` to `true`. -- Set `DD_API_KEY` with your Datadog API key from the [API Management page][2]. +3. Configure your Lambda functions -3. Optionally add `service` and `env` tags with appropriate values to your function. + - Set your image's `CMD` value to `node_modules/datadog-lambda-js/dist/handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. + - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. + - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension -[2]: https://app.datadoghq.com/organization-settings/api-keys -{{% /tab %}} -{{% tab "Terraform" %}} - -### Update configurations - -1. Add the following configurations to the `aws_lambda_function` resources in your .tf files: - -{{< site-region region="us,us3,us5,eu" >}} - -```hcl -variable "dd_api_key" { - type = string - description = "Datadog API key" -} -resource "aws_lambda_function" "my_func" { - function_name = "my_func" - handler = "/opt/nodejs/node_modules/datadog-lambda-js/handler.handler" - layers = [ - "arn:aws:lambda::464622532012:layer:Datadog-:", - "arn:aws:lambda::464622532012:layer:Datadog-Extension:", - ] - environment { - variables = { - DD_LAMBDA_HANDLER = "my_func.handler" - DD_TRACE_ENABLED = true - DD_API_KEY = var.dd_api_key - } - } -} -``` - -{{< /site-region >}} -{{< site-region region="gov" >}} - -```hcl -variable "dd_api_key" { - type = string - description = "Datadog API key" -} -resource "aws_lambda_function" "my_func" { - function_name = "my_func" - handler = "/opt/nodejs/node_modules/datadog-lambda-js/handler.handler" - layers = [ - "arn:aws-us-gov:lambda::002406178527:layer:Datadog-:", - "arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:", - ] - environment { - variables = { - DD_LAMBDA_HANDLER = "my_func.handler" - DD_TRACE_ENABLED = true - DD_API_KEY = var.dd_api_key - } - } -} -``` - -{{< /site-region >}} - -2. Replace the following placeholders with appropriate values: - - - Replace `` with the AWS region to which your Lambda functions are deployed. - - Replace `` with the appropriate Node.js runtime. The available `RUNTIME` options are `Node10-x`, `Node12-x`, and `Node14-x`. - - Replace `` with the desired version of the Datadog Lambda Library. The latest version is `{{< latest-lambda-layer-version layer="node" >}}`. - - Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. - -3. Apply the Terraform configuration with your Datadog API key that can be found on the [API Management page][1]: - - ```bash - terraform apply -var "dd_api_key=" - ``` - - -[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} -
If you are not using a serverless development tool that Datadog supports, such as the Serverless Framework or AWS CDK, Datadog strongly encourages you instrument your serverless applications with the Datadog CLI.
- -### Install the Datadog Lambda library - -The Datadog Lambda Library can be imported either as a layer (recommended) _OR_ as a JavaScript package. - -The minor version of the `datadog-lambda-js` package always matches the layer version. For example, datadog-lambda-js v0.5.0 matches the content of layer version 5. - -#### Using the layer - -[Configure the layers][1] for your Lambda function using the ARN in the following format: - -{{< site-region region="us,us3,us5,eu" >}} - -``` -arn:aws:lambda::464622532012:layer:Datadog-: -``` - -{{< /site-region >}} -{{< site-region region="gov" >}} - -``` -arn:aws-us-gov:lambda::002406178527:layer:Datadog-: -``` - -{{< /site-region >}} - -The available `RUNTIME` options are `Node10-x`, `Node12-x`, and `Node14-x`. The latest `VERSION` is `{{< latest-lambda-layer-version layer="node" >}}`. For example: - -{{< site-region region="us,us3,us5,eu" >}} +
If you are not using a serverless development tool that Datadog supports, such as the Serverless Framework or AWS CDK, Datadog strongly encourages you instrument your serverless applications with the Datadog CLI.
-``` -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Node14-x:{{< latest-lambda-layer-version layer="node" >}} -``` +1. Install the Datadog Lambda library -{{< /site-region >}} -{{< site-region region="gov" >}} + The Datadog Lambda Library can be imported either as a layer (recommended) _OR_ as a JavaScript package. -``` -arn:aws-us-gov:lambda:us-gov-east-1:002406178527::layer:Datadog-Node14-x:{{< latest-lambda-layer-version layer="node" >}} -``` + The minor version of the `datadog-lambda-js` package always matches the layer version. For example, datadog-lambda-js v0.5.0 matches the content of layer version 5. -{{< /site-region >}} + - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format: -#### Using the package + ```sh + # AWS commercial regions (x86 and arm64, respectively) + arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} + arn:aws:lambda::464622532012:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="node" >}} -If you cannot use the prebuilt Datadog Lambda layer, alternatively you can install the packages `datadog-lambda-js` and `dd-trace` using your favorite package manager. + # AWS GovCloud regions (x86 and arm64, respectively) + arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} + arn:aws-us-gov:lambda::002406178527:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="node" >}} + ``` -**NPM**: - -``` -npm install datadog-lambda-js dd-trace -``` + Replace `` with a valid AWS region, such as `us-east-1`. The available `RUNTIME` options are `Node12-x`, and `Node14-x`. -See the [latest release][2]. + - Option B: If you cannot use the prebuilt Datadog Lambda layer, alternatively you can install the packages `datadog-lambda-js` and `dd-trace` using your favorite package manager. -### Install the Datadog Lambda Extension - -[Configure the layers][1] for your Lambda function using the ARN in the following format: - -{{< site-region region="us,us3,us5,eu" >}} - -``` -// For x86 lambdas -arn:aws:lambda::464622532012:layer:Datadog-Extension: -// For arm64 lambdas -arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM: - -``` - -{{< /site-region >}} -{{< site-region region="gov" >}} + ``` + npm install datadog-lambda-js dd-trace + ``` -``` -// For x86 lambdas -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension: -// For arm64 lambdas -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM: -``` +2. Install the Datadog Lambda Extension -{{< /site-region >}} + [Configure the layers][1] for your Lambda function using the ARN in the following format: -The latest `EXTENSION_VERSION` is `{{< latest-lambda-layer-version layer="extension" >}}`. + ```sh + # AWS commercial regions (x86 and arm64, respectively) + arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} -### Configure + # AWS GovCloud regions (x86 and arm64, respectively) + arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} + ``` -Follow these steps to configure the function: + Replace `` with a valid AWS region, such as `us-east-1`. -1. Set your function's handler to `/opt/nodejs/node_modules/datadog-lambda-js/handler.handler` if using the layer, or `node_modules/datadog-lambda-js/dist/handler.handler` if using the package. -2. Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. -3. Set the environment variable `DD_TRACE_ENABLED` to `true`. -4. Set the environment variable `DD_API_KEY` to your Datadog API key from the [API Management page][3]. -5. Optionally add a `service` and `env` tag with appropriate values to your function. +3. Configure your Lambda functions + - Set your function's handler to `/opt/nodejs/node_modules/datadog-lambda-js/handler.handler` if using the layer, or `node_modules/datadog-lambda-js/dist/handler.handler` if using the package. + - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. + - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[2]: https://www.npmjs.com/package/datadog-lambda-js +[2]: https://docs.datadoghq.com/getting_started/site/ [3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{< /tabs >}} -## Explore Datadog serverless monitoring +### PrivateLink and Proxy -After you have configured your function following the steps above, you can view metrics, logs and traces on the [Serverless Homepage][1]. +The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][1] to the US1 (`datadoghq.com`) [Datadog site][2], or [send data over a proxy][3] for all other sites. -### Unified service tagging +## What's next? -Datadog recommends tagging your serverless applications with `DD_ENV`, `DD_SERVICE`, `DD_VERSION`, and `DD_TAGS`. See the [Lambda extension documentation][2] for more details. - -### Collect logs from AWS serverless resources - -Serverless logs generated by managed resources besides AWS Lambda functions can be hugely valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you forward logs from the following managed resources in your environment: - -- API's: API Gateway, AppSync, ALB -- Queues & Streams: SQS, SNS, Kinesis -- Data Stores: DynamoDB, S3, RDS, etc. - -To collect logs from non-Lambda AWS resources, install and configure the [Datadog Forwarder][3] to subscribe to each of your managed resource CloudWatch log groups. +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- See the sample code to [monitor custom business logic](#monitor-custom-business-logic) +- See the [troubleshooting guide][2] if you have trouble collecting the telemetry +- See the [advanced configurations][3] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces ### Monitor custom business logic -If you would like to submit a custom metric or span, see the sample code below: +To monitor your custom business logic, submit a custom metric or span using the sample code below. For additional options, see [custom metric submission for serverless applications][4] and the APM guide for [custom instrumentation][5]. ```javascript const { sendDistributionMetric, sendDistributionMetricWithDate } = require('datadog-lambda-js'); @@ -486,17 +364,12 @@ exports.handler = async (event) => { }; ``` -For more information on custom metric submission, see [here][4]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][5]. - -If your Lambda function is running in a VPC, follow the [Datadog Lambda Extension AWS PrivateLink Setup][6] guide to ensure that the extension can reach Datadog API endpoints. - ## Further Reading {{< partial name="whats-next/whats-next.html" >}} [1]: https://app.datadoghq.com/functions -[2]: /serverless/libraries_integrations/extension/#tagging -[3]: /serverless/libraries_integrations/forwarder +[2]: /serverless/guide/troubleshoot_serverless_monitoring/ +[3]: /serverless/configuration/ [4]: /serverless/custom_metrics?tab=nodejs [5]: /tracing/custom_instrumentation/nodejs/ -[6]: /serverless/guide/extension_private_link/ diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 1efc2089f0f08..01374af962077 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -2,15 +2,15 @@ title: Instrumenting Python Serverless Applications kind: documentation further_reading: - - link: 'serverless/distributed_tracing/' + - link: '/serverless/configuration' tag: 'Documentation' - text: 'Tracing Serverless Applications' - - link: 'serverless/custom_metrics/' - tag: 'Documentation' - text: 'Submitting Custom Metrics from Serverless Applications' + text: 'Configure Serverless Monitoring' - link: '/serverless/guide/troubleshoot_serverless_monitoring' tag: 'Documentation' text: 'Troubleshoot Serverless Monitoring' + - link: 'serverless/custom_metrics/' + tag: 'Documentation' + text: 'Submitting Custom Metrics from Serverless Applications' aliases: - /serverless/datadog_lambda_library/python/ - /serverless/guide/python/ @@ -18,6 +18,8 @@ aliases:
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Python guide.
+
The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can send data over AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or send data over a proxy for all other sites.
+ ## Installation Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI. @@ -88,7 +90,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins {{% /tab %}} {{% tab "Serverless Framework" %}} -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. @@ -122,7 +124,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: {{% /tab %}} {{% tab "AWS SAM" %}} -The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to add the Datadog Lambda library to your functions using layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog to your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. 1. Install the Datadog CloudFormation macro @@ -168,7 +170,7 @@ The [Datadog CloudFormation macro][1] automatically transforms your SAM applicat {{% /tab %}} {{% tab "AWS CDK" %}} -The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. +The [Datadog CDK Construct][1] automatically installs Datadog to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. 1. Install the Datadog CDK constructs library @@ -210,7 +212,7 @@ The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to {{% /tab %}} {{% tab "Container Image" %}} -1. Install the Datadog Lambda Library for Python +1. Install the Datadog Lambda Library If you are deploying your Lambda function as a container image, you cannot use the Datadog Lambda library as a Lambda Layer. Instead, you must install the Datadog Lambda library as a dependency of your function within the image. @@ -331,27 +333,21 @@ The [Datadog CDK Construct][1] automatically adds the Datadog Lambda Library to {{% /tab %}} {{< /tabs >}} -### PrivateLink and Proxy - -The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][1] to the US1 (`datadoghq.com`) [Datadog site][2], or [send data over a proxy][3] for all other sites. - -## Explore Datadog serverless monitoring - -Congratulations! Once you complete all the installation steps above, you can now view metrics, logs, and traces on the [Serverless Homepage][4]. +## What's next? -What's next? +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. - See the sample code to [monitor custom business logic](#monitor-custom-business-logic) -- See the [troubleshooting guide][5] if you have trouble collecting the telemetry -- See the [advanced configurations][6] to +- See the [troubleshooting guide][2] if you have trouble collecting the telemetry +- See the [advanced configurations][3] to - connect your telemetry using tags - collect telemetry for AWS API Gateway, SQS, etc. - capture the Lambda request and response payloads - link errors of your Lambda functions to your source code - filter or scrub sensitive information from logs or traces -## Monitor custom business logic +### Monitor custom business logic -To monitor your custom business logic, submit a custom metric or span using the sample code below. For additional options, see [custom metric submission for serverless applications][7] and the APM guide for [custom instrumentation][8]. +To monitor your custom business logic, submit a custom metric or span using the sample code below. For additional options, see [custom metric submission for serverless applications][4] and the APM guide for [custom instrumentation][5]. ```python import time @@ -391,11 +387,8 @@ def get_message(): {{< partial name="whats-next/whats-next.html" >}} -[1]: /agent/guide/private-link/ -[2]: /getting_started/site/ -[3]: /agent/proxy/ -[4]: https://app.datadoghq.com/functions -[5]: /serverless/guide/troubleshoot_serverless_monitoring/ -[6]: /serverless/configuration/ -[7]: /serverless/custom_metrics?tab=python -[8]: /tracing/custom_instrumentation/python/ +[1]: https://app.datadoghq.com/functions +[2]: /serverless/guide/troubleshoot_serverless_monitoring/ +[3]: /serverless/configuration/ +[4]: /serverless/custom_metrics?tab=python +[5]: /tracing/custom_instrumentation/python/ diff --git a/content/en/serverless/installation/ruby.md b/content/en/serverless/installation/ruby.md index 3d855e9f8f7dd..74b2a9e33e017 100644 --- a/content/en/serverless/installation/ruby.md +++ b/content/en/serverless/installation/ruby.md @@ -2,18 +2,15 @@ title: Instrumenting Ruby Serverless Applications kind: documentation further_reading: -- link: 'serverless/datadog_lambda_library/ruby' - tag: 'Documentation' - text: 'Datadog Lambda Library for Ruby' -- link: 'serverless/distributed_tracing/' - tag: 'Documentation' - text: 'Tracing Serverless Applications' -- link: 'serverless/custom_metrics/' - tag: 'Documentation' - text: 'Submitting Custom Metrics from Serverless Applications' -- link: '/serverless/guide/troubleshoot_serverless_monitoring' - tag: 'Documentation' - text: 'Troubleshoot Serverless Monitoring' + - link: '/serverless/configuration' + tag: 'Documentation' + text: 'Configure Serverless Monitoring' + - link: '/serverless/guide/troubleshoot_serverless_monitoring' + tag: 'Documentation' + text: 'Troubleshoot Serverless Monitoring' + - link: 'serverless/custom_metrics/' + tag: 'Documentation' + text: 'Submitting Custom Metrics from Serverless Applications' aliases: - /serverless/datadog_lambda_library/ruby/ --- @@ -22,116 +19,71 @@ aliases: The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda traces, enhanced metrics, custom metrics, and logs. -## Configuration +## Installation {{< tabs >}} {{% tab "Datadog CLI" %}} The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. -You can also add the [instrumentation command](#instrument) to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command _after_ your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. +1. Install the Datadog CLI client -### Install - -Install the Datadog CLI with NPM: - -```sh -npm install -g @datadog/datadog-ci -``` - -### Configure credentials - -For a quick start, configure Datadog and [AWS credentials][1] using the [instrumentation command](#instrument). For production applications, provide credentials in a more secure manner by using environment variables. For example: - -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` - -### Instrument - -**Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation needs to be reverted, run `uninstrument` with the same arguments that was used for instrumentation. - -To instrument your Lambda functions, run the following command: - -```sh -datadog-ci lambda instrument -f -f -r -e -``` - -To fill in the placeholders: - -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. - -For example: - -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -e {{< latest-lambda-layer-version layer="extension" >}} -``` - -More information and additional parameters can be found in the [CLI documentation][2]. + ```sh + npm install -g @datadog/datadog-ci + ``` -### Install the Lambda Library +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. -The Datadog Lambda Library can be installed as a layer or a gem. For most functions, Datadog recommends installing the library as a layer. If your Lambda function is deployed as a container image, you must install the library as a gem. + ```sh + datadog-ci lambda instrument -i + ``` -The minor version of the `datadog-lambda` gem always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. +3. Configure the AWS credentials -#### Using the layer + Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. -[Configure the layers][3] for your Lambda function using the ARN in the following format. +4. Configure the Datadog site -``` -# For commercial regions -arn:aws:lambda::464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} + Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. -# For us-gov regions -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -``` + ```sh + export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com + ``` -For example: +5. Configure the Datadog API key -``` -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -``` + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. -If your Lambda function is configured to use code signing, you must add Datadog's Signing Profile ARN (`arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc`) to your function's [Code Signing Configuration][4] before you can add the Datadog Lambda library as a layer. -#### Using the gem + ```sh + export DATADOG_API_KEY_SECRET_ARN="" + ``` -Add the following to your Gemfile: + For quick testing purposes, you can also set the Datadog API key in plaintext: -```Gemfile -gem 'datadog-lambda' -``` + ```sh + export DATADOG_API_KEY="" + ``` -To use Datadog APM, you must also add `ddtrace` as a second dependency in your Gemfile. +6. Instrument your Lambda functions -```Gemfile -gem 'datadog-lambda' -gem 'ddtrace' -``` + **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. -`ddtrace` contains native extensions that must be compiled for Amazon Linux to work with AWS Lambda. Datadog therefore recommends that you build and deploy your Lambda as a container image. If your function cannot be deployed as a container image and you would like to use Datadog APM, Datadog recommends installing the Lambda Library as a layer instead of as a gem. + To instrument your Lambda functions, run the following command. -Install `gcc`, `gmp-devel`, and `make` prior to running `bundle install` in your function’s Dockerfile to ensure that the native extensions can be successfully compiled. + ```sh + datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="node" >}} -e {{< latest-lambda-layer-version layer="extension" >}} + ``` -```dockerfile -FROM + To fill in the placeholders: + - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. + - Replace `` with the AWS region name. -# assemble your container image + Additional parameters can be found in the [CLI documentation][3]. -RUN yum -y install gcc gmp-devel make -RUN bundle config set path 'vendor/bundle' -RUN bundle install -``` -[1]: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli -[3]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[4]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-config-update +[1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli {{% /tab %}} {{% tab "Serverless Framework" %}} From 61e568c85d0faf2bf3603a512e4c84e108c7c2b8 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Mon, 18 Apr 2022 14:39:01 -0400 Subject: [PATCH 12/35] Update ruby doc --- content/en/serverless/installation/nodejs.md | 18 +- content/en/serverless/installation/ruby.md | 301 +++++-------------- 2 files changed, 78 insertions(+), 241 deletions(-) diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 0c1097b688f59..3b89eff278877 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -19,7 +19,7 @@ aliases: - /serverless/guide/nodejs/ --- -
If you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Node.js guide.
+
If you previously set up Datadog Serverless using the Datadog Forwarder, see Using the Datadog Forwarder - Node.js.
The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can send data over AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or send data over a proxy for all other sites.
@@ -260,22 +260,20 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh - # AWS commercial regions (x86 and arm64, respectively) + # AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} - arn:aws:lambda::464622532012:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="node" >}} - # AWS GovCloud regions (x86 and arm64, respectively) + # AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} - arn:aws-us-gov:lambda::002406178527:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="node" >}} ``` Replace `` with a valid AWS region, such as `us-east-1`. The available `RUNTIME` options are `Node12-x`, and `Node14-x`. - Option B: If you cannot use the prebuilt Datadog Lambda layer, alternatively you can install the packages `datadog-lambda-js` and `dd-trace` using your favorite package manager. - ``` - npm install datadog-lambda-js dd-trace - ``` + ``` + npm install datadog-lambda-js dd-trace + ``` 2. Install the Datadog Lambda Extension @@ -306,10 +304,6 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions {{% /tab %}} {{< /tabs >}} -### PrivateLink and Proxy - -The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][1] to the US1 (`datadoghq.com`) [Datadog site][2], or [send data over a proxy][3] for all other sites. - ## What's next? - Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. diff --git a/content/en/serverless/installation/ruby.md b/content/en/serverless/installation/ruby.md index 74b2a9e33e017..035950d2bba8c 100644 --- a/content/en/serverless/installation/ruby.md +++ b/content/en/serverless/installation/ruby.md @@ -2,15 +2,18 @@ title: Instrumenting Ruby Serverless Applications kind: documentation further_reading: - - link: '/serverless/configuration' - tag: 'Documentation' - text: 'Configure Serverless Monitoring' - - link: '/serverless/guide/troubleshoot_serverless_monitoring' - tag: 'Documentation' - text: 'Troubleshoot Serverless Monitoring' - - link: 'serverless/custom_metrics/' - tag: 'Documentation' - text: 'Submitting Custom Metrics from Serverless Applications' +- link: 'serverless/datadog_lambda_library/ruby' + tag: 'Documentation' + text: 'Datadog Lambda Library for Ruby' +- link: 'serverless/distributed_tracing/' + tag: 'Documentation' + text: 'Tracing Serverless Applications' +- link: 'serverless/custom_metrics/' + tag: 'Documentation' + text: 'Submitting Custom Metrics from Serverless Applications' +- link: '/serverless/guide/troubleshoot_serverless_monitoring' + tag: 'Documentation' + text: 'Troubleshoot Serverless Monitoring' aliases: - /serverless/datadog_lambda_library/ruby/ --- @@ -21,241 +24,84 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda trac ## Installation -{{< tabs >}} -{{% tab "Datadog CLI" %}} +1. Install the Datadog Lambda Library -The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. + The Datadog Lambda Library can be installed as a layer or a gem. For most functions, Datadog recommends installing the library as a layer. If your Lambda function is deployed as a container image, you must install the library as a gem. -1. Install the Datadog CLI client + The minor version of the `datadog-lambda` gem always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. - ```sh - npm install -g @datadog/datadog-ci - ``` - -2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. - - ```sh - datadog-ci lambda instrument -i - ``` - -3. Configure the AWS credentials - - Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. - -4. Configure the Datadog site - - Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. - - ```sh - export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com - ``` - -5. Configure the Datadog API key - - Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. - - ```sh - export DATADOG_API_KEY_SECRET_ARN="" - ``` - - For quick testing purposes, you can also set the Datadog API key in plaintext: - - ```sh - export DATADOG_API_KEY="" - ``` - -6. Instrument your Lambda functions - - **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. - - To instrument your Lambda functions, run the following command. - - ```sh - datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="node" >}} -e {{< latest-lambda-layer-version layer="extension" >}} - ``` - - To fill in the placeholders: - - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. - - Replace `` with the AWS region name. - - Additional parameters can be found in the [CLI documentation][3]. - - -[1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html -[2]: https://docs.datadoghq.com/getting_started/site/ -[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli -{{% /tab %}} -{{% tab "Serverless Framework" %}} - -The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. - -To install and configure the Datadog Serverless Plugin, follow these steps: - -1. Install the Datadog Serverless Plugin: - ```sh - npm install serverless-plugin-datadog --save-dev - ``` -2. In your `serverless.yml`, add the following: - ```yaml - plugins: - - serverless-plugin-datadog - ``` - -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
- -3. In your `serverless.yml`, also add the following section: - ```yaml - custom: - datadog: - apiKey: # Your Datadog API Key goes here. - ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. - -#### Using the layer - -[Configure the layers][4] for your Lambda function using the ARN in the following format. - -``` -# For commercial regions -arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="ruby" >}} - -# For us-gov regions -arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="ruby" >}} -``` - -The available `RUNTIME` is `Ruby2-7`. For example: - -``` -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -``` - -If your Lambda function is configured to use code signing, you must add Datadog's Signing Profile ARN (`arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc`) to your function's [Code Signing Configuration][5] before you can add the Datadog Lambda library as a layer.`` - -In your `serverless.yml`, add your layer for each function: - ```yaml - my-function: - layers: - - # Your lambda layer goes here. - ``` - -[1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin -[2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys -[4]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[5]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-config-update -{{% /tab %}} -{{% tab "Custom" %}} -### Install the Datadog Lambda Extension - -Add the Datadog Lambda Extension layer for your Lambda function using the ARN in the following format: - -{{< site-region region="us,us3,eu" >}} -``` -// For x86 lambdas -arn:aws:lambda::464622532012:layer:Datadog-Extension: -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -// For x86 lambdas -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension: -``` -{{< /site-region >}} - -The latest `EXTENSION_VERSION` is {{< latest-lambda-layer-version layer="extension" >}}. + - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format. -### Install the Lambda Library + ``` + # For regular regions + arn:aws:lambda::464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -The Datadog Lambda Library can be installed as a layer or a gem. For most functions, Datadog recommends installing the library as a layer. If your Lambda function is deployed as a container image, you must install the library as a gem. + # For us-gov regions + arn:aws-us-gov:lambda::002406178527:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} + ``` -The minor version of the `datadog-lambda` gem always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. + Replace `` with a valid AWS region, such as `us-east-1`. -#### Using the layer + - Option B: If you cannot use the prebuilt Datadog Lambda layer, alternatively you can add the following to your Gemfile: -[Configure the layers][1] for your Lambda function using the ARN in the following format. + ```Gemfile + gem 'datadog-lambda' + gem 'ddtrace' + ``` -``` -# For commercial regions -arn:aws:lambda::464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} - -# For us-gov regions -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -``` + `ddtrace` contains native extensions that must be compiled for Amazon Linux to work with AWS Lambda. Datadog therefore recommends that you build and deploy your Lambda as a container image. If your function cannot be deployed as a container image and you would like to use Datadog APM, Datadog recommends installing the Lambda Library as a layer instead of as a gem. -For example: - -``` -arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Ruby2-7:{{< latest-lambda-layer-version layer="ruby" >}} -``` + Install `gcc`, `gmp-devel`, and `make` prior to running `bundle install` in your function’s Dockerfile to ensure that the native extensions can be successfully compiled. -If your Lambda function is configured to use code signing, you must add Datadog's Signing Profile ARN (`arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc`) to your function's [Code Signing Configuration][2] before you can add the Datadog Lambda library as a layer. -#### Using the gem + ```dockerfile + FROM -Add the following to your Gemfile: - -```Gemfile -gem 'datadog-lambda' -``` - -To use Datadog APM, you must also add `ddtrace` as a second dependency in your Gemfile. - -```Gemfile -gem 'datadog-lambda' -gem 'ddtrace' -``` + # assemble your container image -`ddtrace` contains native extensions that must be compiled for Amazon Linux to work with AWS Lambda. Datadog therefore recommends that you build and deploy your Lambda as a container image. If your function cannot be deployed as a container image and you would like to use Datadog APM, Datadog recommends installing the Lambda Library as a layer instead of as a gem. + RUN yum -y install gcc gmp-devel make + RUN bundle config set path 'vendor/bundle' + RUN bundle install + ``` -Install `gcc`, `gmp-devel`, and `make` prior to running `bundle install` in your function’s Dockerfile to ensure that the native extensions can be successfully compiled. +2. Configure your Lambda functions -```dockerfile -FROM + Enable Datadog APM and wrap your Lambda handler function using the wrapper provided by the Datadog Lambda library. -# assemble your container image + ```ruby + require 'datadog/lambda' -RUN yum -y install gcc gmp-devel make -RUN bundle config set path 'vendor/bundle' -RUN bundle install -``` -[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[2]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-config-update -{{% /tab %}} -{{< /tabs >}} - -### Configure the function - -Enable Datadog APM and wrap your Lambda handler function using the wrapper provided by the Datadog Lambda library. - -```ruby -require 'datadog/lambda' - -Datadog::Lambda.configure_apm do |c| -# Enable the instrumentation -end - -def handler(event:, context:) - Datadog::Lambda.wrap(event, context) do - return { statusCode: 200, body: 'Hello World' } + Datadog::Lambda.configure_apm do |c| + # Enable the instrumentation end -end -``` -### Subscribe + def handler(event:, context:) + Datadog::Lambda.wrap(event, context) do + return { statusCode: 200, body: 'Hello World' } + end + end + ``` -Subscribe the Datadog Forwarder Lambda function to each of your function’s log groups to send metrics, traces and logs to Datadog. +3. Subscribe the Datadog Forwarder to log groups -1. [Install the Datadog Forwarder if you haven't][1]. -2. [Subscribe the Datadog Forwarder to your function's log groups][2]. + Subscribe the Datadog Forwarder Lambda function to each of your function’s log groups to send metrics, traces and logs to Datadog. -### Tag + 1. [Install the Datadog Forwarder if you haven't][2]. + 2. [Subscribe the Datadog Forwarder to your function's log groups][3]. -Although it's optional, Datadog recommends tagging you serverless applications with the `env`, `service`, and `version` tags following the [unified service tagging documentation][3]. -## Explore +## What's next? -After configuring your function following the steps above, view your metrics, logs, and traces on the [Serverless homepage][4]. +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][4]. +- See the sample code to [monitor custom business logic](#monitor-custom-business-logic) +- See the [troubleshooting guide][5] if you have trouble collecting the telemetry +- See the [advanced configurations][6] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces -## Monitor custom business logic +### Monitor custom business logic If you would like to submit a custom metric or span, see the sample code below: @@ -300,20 +146,17 @@ def some_operation() end ``` -For more information on custom metric submission, see [here][5]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][6]. - -## Troubleshooting - -If you have trouble collecting monitoring data after following the instructions above, see the [serverless monitoring troubleshooting guide][7]. +For more information on custom metric submission, see [here][7]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][8]. ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: /serverless/forwarder/ -[2]: /logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/#collecting-logs-from-cloudwatch-log-group -[3]: /getting_started/tagging/unified_service_tagging/#aws-lambda-functions +[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html +[2]: /serverless/forwarder/ +[3]: /logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/#collecting-logs-from-cloudwatch-log-group [4]: https://app.datadoghq.com/functions -[5]: /serverless/custom_metrics?tab=ruby -[6]: /tracing/custom_instrumentation/ruby/ -[7]: /serverless/guide/troubleshoot_serverless_monitoring/ +[5]: /serverless/guide/troubleshoot_serverless_monitoring/ +[6]: /serverless/configuration +[7]: /serverless/custom_metrics?tab=ruby +[8]: /tracing/custom_instrumentation/ruby/ From 30c57da4f3aad94fa2f5d76d67c28970411c2092 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Mon, 18 Apr 2022 14:51:42 -0400 Subject: [PATCH 13/35] webpack & esbuild --- content/en/serverless/installation/nodejs.md | 6 ++++-- content/en/serverless/installation/python.md | 4 ++-- content/en/serverless/installation/ruby.md | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 3b89eff278877..f6541a28d0367 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -19,9 +19,11 @@ aliases: - /serverless/guide/nodejs/ --- -
If you previously set up Datadog Serverless using the Datadog Forwarder, see Using the Datadog Forwarder - Node.js.
+
If you previously set up Datadog Serverless using the Datadog Forwarder, see Using the Datadog Forwarder - Node.js.
-
The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can send data over AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or send data over a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+ +
If you are bundling using webpack or esbuild, mark the Datadog libraries as external.
## Installation diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 01374af962077..356fd16df5c7d 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -16,9 +16,9 @@ aliases: - /serverless/guide/python/ --- -
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Python guide.
+
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Python guide.
-
The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can send data over AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or send data over a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
## Installation diff --git a/content/en/serverless/installation/ruby.md b/content/en/serverless/installation/ruby.md index 035950d2bba8c..a721a17a8a570 100644 --- a/content/en/serverless/installation/ruby.md +++ b/content/en/serverless/installation/ruby.md @@ -30,7 +30,7 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda trac The minor version of the `datadog-lambda` gem always matches the layer version. For example, datadog-lambda v0.5.0 matches the content of layer version 5. - - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format. + - Option A: [Configure the layers][2] for your Lambda function using the ARN in the following format. ``` # For regular regions @@ -85,7 +85,7 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda trac Subscribe the Datadog Forwarder Lambda function to each of your function’s log groups to send metrics, traces and logs to Datadog. - 1. [Install the Datadog Forwarder if you haven't][2]. + 1. [Install the Datadog Forwarder if you haven't][1]. 2. [Subscribe the Datadog Forwarder to your function's log groups][3]. @@ -152,8 +152,8 @@ For more information on custom metric submission, see [here][7]. For additional {{< partial name="whats-next/whats-next.html" >}} -[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[2]: /serverless/forwarder/ +[1]: /serverless/forwarder/ +[2]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [3]: /logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/#collecting-logs-from-cloudwatch-log-group [4]: https://app.datadoghq.com/functions [5]: /serverless/guide/troubleshoot_serverless_monitoring/ From 529b2439e474c0f6b76bb3b70e74640d30f4bbee Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Mon, 18 Apr 2022 16:46:29 -0400 Subject: [PATCH 14/35] .NET updates --- content/en/serverless/guide/_index.md | 9 +- .../guide/datadog_forwarder_dotnet.md | 53 ++++ .../serverless/guide/datadog_forwarder_go.md | 2 +- .../guide/datadog_forwarder_java.md | 2 +- .../guide/datadog_forwarder_node.md | 2 +- .../guide/datadog_forwarder_python.md | 2 +- content/en/serverless/installation/dotnet.md | 285 ++++++------------ content/en/serverless/installation/nodejs.md | 2 +- content/en/serverless/installation/python.md | 2 - 9 files changed, 161 insertions(+), 198 deletions(-) create mode 100644 content/en/serverless/guide/datadog_forwarder_dotnet.md diff --git a/content/en/serverless/guide/_index.md b/content/en/serverless/guide/_index.md index ae271e3046895..0a9d25b547d5a 100644 --- a/content/en/serverless/guide/_index.md +++ b/content/en/serverless/guide/_index.md @@ -14,10 +14,11 @@ kind: guide ## Install using the Datadog Forwarder {{< whatsnext desc="Installation instructions for applications previously set up to be monitored using the Datadog Forwarder" >}} - {{< nextlink href="/serverless/guide/datadog_forwarder_node" >}}Installing Serverless with the Datadog Forwarder - Node.js{{< /nextlink >}} - {{< nextlink href="/serverless/guide/datadog_forwarder_python" >}}Installing Serverless with the Datadog Forwarder - Python{{< /nextlink >}} - {{< nextlink href="/serverless/guide/datadog_forwarder_java" >}}Installing Serverless with the Datadog Forwarder - Java{{< /nextlink >}} - {{< nextlink href="/serverless/guide/datadog_forwarder_go" >}}Installing Serverless with the Datadog Forwarder - Go{{< /nextlink >}} + {{< nextlink href="/serverless/guide/datadog_forwarder_node" >}}Instrumenting Node.js Serverless Applications Using the Datadog Forwarder{{< /nextlink >}} + {{< nextlink href="/serverless/guide/datadog_forwarder_python" >}}Instrumenting Python Serverless Applications Using the Datadog Forwarder{{< /nextlink >}} + {{< nextlink href="/serverless/guide/datadog_forwarder_java" >}}Instrumenting Java Serverless Applications Using the Datadog Forwarder{{< /nextlink >}} + {{< nextlink href="/serverless/guide/datadog_forwarder_go" >}}Instrumenting Go Serverless Applications Using the Datadog Forwarder{{< /nextlink >}} + {{< nextlink href="/serverless/guide/datadog_forwarder_dotnet" >}}Instrumenting .NET Serverless Applications Using the Datadog Forwarder{{< /nextlink >}} {{< nextlink href="/serverless/guide/extension_motivation" >}}Deciding to migrate to the Datadog Lambda Extension{{< /nextlink >}} {{< /whatsnext >}} diff --git a/content/en/serverless/guide/datadog_forwarder_dotnet.md b/content/en/serverless/guide/datadog_forwarder_dotnet.md new file mode 100644 index 0000000000000..1a6f2bb6a4268 --- /dev/null +++ b/content/en/serverless/guide/datadog_forwarder_dotnet.md @@ -0,0 +1,53 @@ +--- +title: Instrumenting .NET Serverless Applications Using the Datadog Forwarder +kind: guide +--- +## Overview + +
+If you are a new user of Datadog Serverless, follow the instructions to instrument your Lambda functions using the Datadog Lambda Extension instead. If you have setup Datadog Serverless with the Datadog Forwarder before Lambda offered out-of-the-box functionality, use this guide to maintain your instance. +
+ +## Prerequisites + +The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda enhanced metrics, custom metrics, and logs. + +## Enable X-Ray tracing + +1. Enable [AWS X-Ray active tracing][2] for your Lambda function. +2. Install the [AWS X-Ray SDK for .NET][3]. + +## Subscribe the Datadog Forwarder to log groups + +[Subscribe][4] the Datadog Forwarder Lambda function to each of your function's log groups to send metrics, traces, and logs to Datadog. + +## What's next? + +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][5]. +- See the sample code to [monitor custom business logic](#monitor-custom-business-logic) +- See the [troubleshooting guide][6] if you have trouble collecting the telemetry + +## Monitor custom business logic + +If you would like to submit a [custom metric][7] using the Datadog Forwarder, see the sample code below: + +```csharp +var myMetric = new Dictionary(); +myMetric.Add("m", "coffee_house.order_value"); +myMetric.Add("v", 12.45); +myMetric.Add("e", (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds); +myMetric.Add("t", new string[] {"product:latte", "order:online"}); +LambdaLogger.Log(JsonConvert.SerializeObject(myMetric)); +``` + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: /serverless/forwarder +[2]: https://docs.aws.amazon.com/xray/latest/devguide/xray-services-lambda.html +[3]: https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-dotnet.html +[4]: https://docs.datadoghq.com/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/ +[5]: https://app.datadoghq.com/functions +[6]: /serverless/guide/troubleshoot_serverless_monitoring/ +[7]: /serverless/custom_metrics diff --git a/content/en/serverless/guide/datadog_forwarder_go.md b/content/en/serverless/guide/datadog_forwarder_go.md index 42e2563669d8b..da0ae11b560cb 100644 --- a/content/en/serverless/guide/datadog_forwarder_go.md +++ b/content/en/serverless/guide/datadog_forwarder_go.md @@ -1,5 +1,5 @@ --- -title: Using the Datadog Forwarder - Go +title: Instrumenting Go Serverless Applications Using the Datadog Forwarder kind: guide --- ## Overview diff --git a/content/en/serverless/guide/datadog_forwarder_java.md b/content/en/serverless/guide/datadog_forwarder_java.md index 918b5d22108ac..30cebdaf94b29 100644 --- a/content/en/serverless/guide/datadog_forwarder_java.md +++ b/content/en/serverless/guide/datadog_forwarder_java.md @@ -1,5 +1,5 @@ --- -title: Using the Datadog Forwarder - Java +title: Instrumenting Java Serverless Applications Using the Datadog Forwarder kind: guide --- ## Overview diff --git a/content/en/serverless/guide/datadog_forwarder_node.md b/content/en/serverless/guide/datadog_forwarder_node.md index fcdec39c2e01f..2274ade719b9c 100644 --- a/content/en/serverless/guide/datadog_forwarder_node.md +++ b/content/en/serverless/guide/datadog_forwarder_node.md @@ -1,5 +1,5 @@ --- -title: Using the Datadog Forwarder - Node +title: Instrumenting Node.js Serverless Applications Using the Datadog Forwarder kind: guide --- diff --git a/content/en/serverless/guide/datadog_forwarder_python.md b/content/en/serverless/guide/datadog_forwarder_python.md index b800293dad001..ff6938117dbbf 100644 --- a/content/en/serverless/guide/datadog_forwarder_python.md +++ b/content/en/serverless/guide/datadog_forwarder_python.md @@ -1,5 +1,5 @@ --- -title: Using the Datadog Forwarder - Python +title: Instrumenting Python Serverless Applications Using the Datadog Forwarder kind: guide --- ## Overview diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 7f4ac70e7aef1..4c7a66f4203cc 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -2,85 +2,86 @@ title: Instrumenting .NET Serverless Applications kind: documentation further_reading: - - link: '/serverless/troubleshooting/serverless_tagging/' +further_reading: + - link: '/serverless/configuration' tag: 'Documentation' - text: 'Tagging Serverless Applications' - - link: 'serverless/distributed_tracing/' + text: 'Configure Serverless Monitoring' + - link: '/serverless/guide/troubleshoot_serverless_monitoring' tag: 'Documentation' - text: 'Tracing Serverless Applications' + text: 'Troubleshoot Serverless Monitoring' - link: 'serverless/custom_metrics/' tag: 'Documentation' text: 'Submitting Custom Metrics from Serverless Applications' - - link: '/serverless/guide/troubleshoot_serverless_monitoring' - tag: 'Documentation' - text: 'Troubleshoot Serverless Monitoring' --- -To instrument your .NET serverless application, you must use **either** the [Datadog Lambda Extension][1] or the [Datadog Forwarder Lambda function][2]. - -If you use the Datadog Lambda Extension, you can use Datadog's native .NET APM tracer to instrument your function. If you use the Datadog Forwarder Lambda function, you can use Datadog's integration with AWS X-Ray tracing. - -**Note**: The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must use the Datadog Forwarder for instrumentation. +
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must using the Datadog Forwarder instead.
-## Instrumentation +## Installation -### Using the Datadog Lambda Extension - -Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. +Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI. {{< tabs >}} {{% tab "Datadog CLI" %}} The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. -You can also add the [instrumentation command](#instrument) to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command _after_ your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. +1. Install the Datadog CLI client + + ```sh + npm install -g @datadog/datadog-ci + ``` + +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. + + ```sh + datadog-ci lambda instrument -i + ``` -### Install +3. Configure the AWS credentials -Install the Datadog CLI with NPM: + Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. -```sh -npm install -g @datadog/datadog-ci -``` +4. Configure the Datadog site -### Configure credentials + Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. -For a quick start, configure Datadog and [AWS credentials][1] using the [instrumentation command](#instrument). For production applications, provide credentials in a more secure manner by using environment variables. For example: + ```sh + export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com + ``` -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` +5. Configure the Datadog API key -### Instrument + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. -**Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation needs to be reverted, run `uninstrument` with the same arguments that was used for instrumentation. + ```sh + export DATADOG_API_KEY_SECRET_ARN="" + ``` -To instrument your Lambda functions, run the following command: + For quick testing purposes, you can also set the Datadog API key in plaintext: -```sh -datadog-ci lambda instrument -f -f -r -e -``` + ```sh + export DATADOG_API_KEY="" + ``` -To fill in the placeholders: +6. Instrument your Lambda functions -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. + **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. -For example: + To instrument your Lambda functions, run the following command. -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -e {{< latest-lambda-layer-version layer="extension" >}} -``` + ```sh + datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="dd-trace-dotnet" >}} -e {{< latest-lambda-layer-version layer="extension" >}} + ``` -More information and additional parameters can be found in [Datadog Serverless CLI][2]. + To fill in the placeholders: + - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. + - Replace `` with the AWS region name. + Additional parameters can be found in the [CLI documentation][3]. -[1]: https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli +[1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli {{% /tab %}} {{% tab "Serverless Framework" %}} @@ -89,90 +90,34 @@ The [Datadog Serverless Plugin][1] automatically configures your functions to se To install and configure the Datadog Serverless Plugin, follow these steps: 1. Install the Datadog Serverless Plugin: + ```sh - npm install serverless-plugin-datadog --save-dev - ``` -2. In your `serverless.yml`, add the following: - ```yaml - plugins: - - serverless-plugin-datadog + serverless plugin install --name serverless-plugin-datadog ``` -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+2. Update your `serverless.yml`: -3. In your `serverless.yml`, also add the following section: ```yaml custom: - datadog: - apiKey: # Your Datadog API Key goes here. + datadog: + site: + apiKeySecretArn: ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. + To fill in the placeholders: + - Replace `` with your [Datadog site][3] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + + For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys -{{% /tab %}} -{{% tab "AWS SAM" %}} - -1. Add the following layers and environment variables to each .NET Lambda function you wish to instrument: - - ```yml - Type: AWS::Serverless::Function - Properties: - Environment: - Variables: - DD_TRACE_ENABLED: true - DD_API_KEY: '' - CORECLR_ENABLE_PROFILING: 1 - CORECLR_PROFILER: '{846F5F1C-F9AE-4B07-969E-05C26BC060D8}' - CORECLR_PROFILER_PATH: '/opt/datadog/Datadog.Trace.ClrProfiler.Native.so' - DD_DOTNET_TRACER_HOME: '/opt/datadog' - Layers: - - arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} - - arn:aws:lambda::464622532012:layer:dd-trace-dotnet:{{< latest-lambda-layer-version layer="dd-trace-dotnet" >}} - ``` - - Replace `` with your Datadog API key, found on the [API Management page][1]. - -2. Optionally add `service` and `env` tags with appropriate values to your function. - - -[1]: https://app.datadoghq.com/organization-settings/api-keys -{{% /tab %}} -{{% tab "AWS CDK" %}} - -1. Add the following layers and environment variables to each .NET Lambda function you wish to instrument: - - ```typescript - const fn = new lambda.Function(this, 'MyFunc', { - // ... - environment: { - DD_TRACE_ENABLED: true - DD_API_KEY: '' - CORECLR_ENABLE_PROFILING: 1 - CORECLR_PROFILER: '{846F5F1C-F9AE-4B07-969E-05C26BC060D8}' - CORECLR_PROFILER_PATH: '/opt/datadog/Datadog.Trace.ClrProfiler.Native.so' - DD_DOTNET_TRACER_HOME: '/opt/datadog' - } - }); - - fn.addLayers( - lambda.LayerVersion.fromLayerVersionArn(this, 'extension', 'arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}}'), - lambda.LayerVersion.fromLayerVersionArn(this, 'dd-trace-dotnet', 'arn:aws:lambda::464622532012:layer:dd-trace-dotnet:{{< latest-lambda-layer-version layer="dd-trace-dotnet" >}}'), - ) - ``` - - Replace `` with your Datadog API key, found on the [API Management page][1]. - -2. Optionally add `service` and `env` tags with appropriate values to your function. - - -[1]: https://app.datadoghq.com/organization-settings/api-keys +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Container image" %}} -1. Add the Datadog Lambda Extension to your container image by adding the following to your Dockerfile: +1. Install the Datadog Lambda Extension ```dockerfile COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions @@ -180,7 +125,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -2. Add the Datadog .NET APM tracer to your container image and configure it with the required environment variables by adding the following to your Dockerfile: +2. Install the Datadog .NET APM client ```dockerfile RUN yum -y install tar wget gzip @@ -195,104 +140,70 @@ To install and configure the Datadog Serverless Plugin, follow these steps: Replace `` with the version number of `dd-trace-dotnet` you would like to use (for example, `2.3.0`). The minimum supported version is `2.3.0`. You can see the latest versions of `dd-trace-dotnet` in [GitHub][2]. -3. Set the following environment variables in AWS: - - Set `DD_TRACE_ENABLED` to `true`. - - Set `DD_API_KEY` with your Datadog API key, found on the [API Management page][3]. -4. Optionally add `service` and `env` tags with appropriate values to your function. +3. Set the required environment variables + - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension [2]: https://github.com/DataDog/dd-trace-dotnet/releases -[3]: https://app.datadoghq.com/organization-settings/api-keys +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} -1. Add the [Datadog Lambda Extension][1] layer to your Lambda function: +1. Install the Datadog Lambda Extension + + [Configure the layers][1] for your Lambda function using the ARN in the following format: `arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}}` - Note that only the `x86_64` version of the Datadog Lambda Extension is supported for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must use the Datadog Forwarder for instrumentation. +2. Install the Datadog .NET APM client -2. Add the dd-trace-dotnet layer to your Lambda function: + [Configure the layers][1] for your Lambda function using the ARN in the following format: `arn:aws:lambda::464622532012:layer:dd-trace-dotnet:{{< latest-lambda-layer-version layer="dd-trace-dotnet" >}}` -3. Add your [Datadog API Key][2] to the Lambda function using the environment variable `DD_API_KEY`. - -4. Configure your Lambda function with the following additional environment variables: +3. Configure your Lambda function with the following environment variables: ``` - DD_TRACE_ENABLED = true CORECLR_ENABLE_PROFILING = 1 CORECLR_PROFILER = {846F5F1C-F9AE-4B07-969E-05C26BC060D8} CORECLR_PROFILER_PATH = /opt/datadog/Datadog.Trace.ClrProfiler.Native.so DD_DOTNET_TRACER_HOME = /opt/datadog + DD_SITE = + DD_API_KEY_SECRET_ARN = ``` + - Replace `` with your [Datadog site][2] to send the telemetry to. + - Set the environment variable `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. -[1]: /serverless/libraries_integrations/extension/ -[2]: https://app.datadoghq.com/organization-settings/api-keys + +[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{< /tabs >}} -### Using the Datadog Forwarder - -As an alternative to the [Datadog Lambda Extension][1], you can use the [Datadog Forwarder Lambda function][2]. - -#### Install +## What's next? -1. Enable [AWS X-Ray active tracing][3] for your Lambda function. -2. Install the [AWS X-Ray SDK for .NET][4]. - -#### Subscribe - -Subscribe the Datadog Forwarder Lambda function to each of your function's log groups to send metrics, traces, and logs to Datadog. - -1. [Install the Datadog Forwarder if you haven't][2]. -2. [Subscribe the Datadog Forwarder to your function's log groups][5]. - -#### Monitor custom business logic - -If you would like to submit a custom metric using the Datadog Forwarder, see the sample code below: - -```csharp -var myMetric = new Dictionary(); -myMetric.Add("m", "coffee_house.order_value"); -myMetric.Add("v", 12.45); -myMetric.Add("e", (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds); -myMetric.Add("t", new string[] {"product:latte", "order:online"}); -LambdaLogger.Log(JsonConvert.SerializeObject(myMetric)); -``` - -For more information on custom metric submission, see the [Serverless Custom Metrics documentation][6]. - -#### Tagging - -Although it's optional, Datadog recommends tagging your serverless applications with the `env`, `service`, and `version` tags following the [unified service tagging documentation][7]. - -## Collect logs from AWS serverless resources - -Serverless logs generated by managed resources besides AWS Lambda functions can be valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you forward logs from the following managed resources in your environment: - -- APIs: API Gateway, AppSync, Application Load Balancer (ALB) -- Queues and streams: SQS, SNS, Kinesis -- Data stores: DynamoDB, S3, RDS, etc. - -To collect logs from non-Lambda AWS resources, install and configure the [Datadog Forwarder][2] to subscribe to each of your managed resource CloudWatch log groups. - -## Troubleshooting - -If you have trouble collecting monitoring data after following the instructions above, see the [serverless monitoring troubleshooting guide][8]. +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- Submit a [custom metric][2] or [APM span][3] to monitor your business logic. +- See the [troubleshooting guide][4] if you have trouble collecting the telemetry +- See the [advanced configurations][5] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: /serverless/libraries_integrations/extension/ -[2]: /serverless/forwarder/ -[3]: https://docs.aws.amazon.com/xray/latest/devguide/xray-services-lambda.html -[4]: https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-dotnet.html -[5]: https://docs.datadoghq.com/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/ -[6]: /serverless/custom_metrics?tab=otherruntimes -[7]: /serverless/troubleshooting/serverless_tagging/ -[8]: /serverless/guide/troubleshoot_serverless_monitoring/ + +[1]: https://app.datadoghq.com/functions +[2]: https://docs.datadoghq.com/metrics/dogstatsd_metrics_submission/ +[3]: /tracing/custom_instrumentation/dotnet/ +[4]: /serverless/guide/troubleshoot_serverless_monitoring/ +[5]: /serverless/configuration/ diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index f6541a28d0367..49357d6482e97 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -23,7 +23,7 @@ aliases:
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
-
If you are bundling using webpack or esbuild, mark the Datadog libraries as external.
+
If you are bundling using webpack or esbuild, you may need to mark the Datadog libraries as external.
## Installation diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 356fd16df5c7d..e3868e6e7c304 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -90,8 +90,6 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins {{% /tab %}} {{% tab "Serverless Framework" %}} -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
- The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. To install and configure the Datadog Serverless Plugin, follow these steps: From 7bfe3b6df2b5d404227383aecf300141d6966772 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Mon, 18 Apr 2022 17:16:31 -0400 Subject: [PATCH 15/35] go --- content/en/serverless/installation/dotnet.md | 5 +- content/en/serverless/installation/go.md | 358 ++++--------------- 2 files changed, 68 insertions(+), 295 deletions(-) diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 4c7a66f4203cc..f7746c94102e3 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -1,7 +1,6 @@ --- title: Instrumenting .NET Serverless Applications kind: documentation -further_reading: further_reading: - link: '/serverless/configuration' tag: 'Documentation' @@ -14,7 +13,7 @@ further_reading: text: 'Submitting Custom Metrics from Serverless Applications' --- -
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must using the Datadog Forwarder instead.
+
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
## Installation @@ -176,7 +175,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: ``` - Replace `` with your [Datadog site][2] to send the telemetry to. - - Set the environment variable `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index ee761dec6eab5..25fc68fce337a 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -2,260 +2,91 @@ title: Instrumenting Go Serverless Applications kind: documentation further_reading: -- link: 'serverless/datadog_lambda_library/go' - tag: 'Documentation' - text: 'Datadog Lambda Library for Go' -- link: 'serverless/distributed_tracing/' - tag: 'Documentation' - text: 'Tracing Serverless Applications' -- link: 'serverless/custom_metrics/' - tag: 'Documentation' - text: 'Submitting Custom Metrics from Serverless Applications' -- link: '/serverless/guide/troubleshoot_serverless_monitoring' - tag: 'Documentation' - text: 'Troubleshoot Serverless Monitoring' + - link: '/serverless/configuration' + tag: 'Documentation' + text: 'Configure Serverless Monitoring' + - link: '/serverless/guide/troubleshoot_serverless_monitoring' + tag: 'Documentation' + text: 'Troubleshoot Serverless Monitoring' + - link: 'serverless/custom_metrics/' + tag: 'Documentation' + text: 'Submitting Custom Metrics from Serverless Applications' aliases: - /serverless/datadog_lambda_library/go/ --- -{{< img src="serverless/go-lambda-tracing.png" alt="Monitor Go Lambda Functions with Datadog" style="width:100%;">}} +
If your Go Lambda functions are still using runtime `go1.x` and you cannot migrate to the `provided.al2` runtime, you must instrument using the Datadog Forwarder instead.
-## Configuration - -If your Go Lambda functions are still using runtime `go1.x`, you must either [migrate][1] to `provided.al2` or use the [Datadog Forwarder][2] instead of the Datadog Lambda Extension. +## Installation {{< tabs >}} -{{% tab "Datadog CLI" %}} - -The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. - -You can also add the [instrumentation command](#instrument) to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command _after_ your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. - -### Install - -Install the Datadog CLI with NPM: - -```sh -npm install -g @datadog/datadog-ci -``` - -### Configure credentials - -For a quick start, configure Datadog and [AWS credentials][1] using the [instrumentation command](#instrument). For production applications, provide credentials in a more secure manner by using environment variables. For example: - -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` - -### Instrument - -**Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation needs to be reverted, run `uninstrument` with the same arguments that was used for instrumentation. - -To instrument your Lambda functions, run the following command: - -```sh -datadog-ci lambda instrument -f -f -r -e -``` - -To fill in the placeholders: - -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. - -For example: - -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -e {{< latest-lambda-layer-version layer="extension" >}} -``` - -More information and additional parameters can be found in the [Datadog Serverless CLI][2]. - -### Install the Datadog Lambda library - -Install the [Datadog Lambda library][3] locally by running the following command: - -``` -go get github.com/DataDog/datadog-lambda-go -``` - -### Set up tracing -1. Set the environment variable `DD_TRACE_ENABLED` to `true`. -2. Import the required packages in the file declaring your Lambda function handler. - - ```go - package main - - import ( - "github.com/aws/aws-lambda-go/lambda" - "github.com/DataDog/datadog-lambda-go" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - ) - ``` -3. Wrap your Lambda function handler using the wrapper provided by the Datadog Lambda library. - - ```go - func main() { - // Wrap your lambda handler like this - lambda.Start(ddlambda.WrapFunction(myHandler, nil)) - /* OR with manual configuration options - lambda.Start(ddlambda.WrapFunction(myHandler, &ddlambda.Config{ - BatchInterval: time.Second * 15 - APIKey: "my-api-key", - })) - */ - } - ``` -4. Use the included libraries to create additional spans, connect logs and traces, and pass trace context to other services. - ```go - func myHandler(ctx context.Context, event MyEvent) (string, error) { - // Trace an HTTP request - req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil) - client := http.Client{} - client = *httptrace.WrapClient(&client) - client.Do(req) - - // Connect your Lambda logs and traces - currentSpan, _ := tracer.SpanFromContext(ctx) - log.Printf("my log message %v", currentSpan) - - // Create a custom span - s, _ := tracer.StartSpanFromContext(ctx, "child.span") - time.Sleep(100 * time.Millisecond) - s.Finish() - } - ``` - -[1]: https://aws.github.io/aws-sdk-go-v2/docs/getting-started/#get-your-aws-access-keys -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli -[3]: https://github.com/DataDog/datadog-lambda-go -{{% /tab %}} {{% tab "Serverless Framework" %}} The [Datadog Serverless Plugin][1] automatically configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. To install and configure the Datadog Serverless Plugin, follow these steps: -1. Install the Datadog Serverless Plugin: - ```sh - npm install serverless-plugin-datadog --save-dev - ``` -2. In your `serverless.yml`, add the following: - ```yaml - plugins: - - serverless-plugin-datadog +### Install the Datadog Serverless Plugin: + + ```sh + serverless plugin install --name serverless-plugin-datadog ``` -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+### Update your `serverless.yml`: -3. In your `serverless.yml`, also add the following section: ```yaml custom: datadog: - apiKey: # Your Datadog API Key goes here. + site: + apiKeySecretArn: ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. -### Install the Datadog Lambda library + To fill in the placeholders: + - Replace `` with your [Datadog site][3] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. -Install the [Datadog Lambda library][4] locally by running the following command: - -``` -go get github.com/DataDog/datadog-lambda-go -``` - -### Set up tracing -1. Import the required packages in the file declaring your Lambda function handler. - - ```go - package main - - import ( - "github.com/aws/aws-lambda-go/lambda" - "github.com/DataDog/datadog-lambda-go" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - ) - ``` -2. Wrap your Lambda function handler using the wrapper provided by the Datadog Lambda library. - - ```go - func main() { - // Wrap your lambda handler like this - lambda.Start(ddlambda.WrapFunction(myHandler, nil)) - /* OR with manual configuration options - lambda.Start(ddlambda.WrapFunction(myHandler, &ddlambda.Config{ - BatchInterval: time.Second * 15 - APIKey: "my-api-key", - })) - */ - } - ``` -3. Use the included libraries to create additional spans, connect logs and traces, and pass trace context to other services. - ```go - func myHandler(ctx context.Context, event MyEvent) (string, error) { - // Trace an HTTP request - req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil) - client := http.Client{} - client = *httptrace.WrapClient(&client) - client.Do(req) - - // Connect your Lambda logs and traces - currentSpan, _ := tracer.SpanFromContext(ctx) - log.Printf("my log message %v", currentSpan) - - // Create a custom span - s, _ := tracer.StartSpanFromContext(ctx, "child.span") - time.Sleep(100 * time.Millisecond) - s.Finish() - } - ``` + For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys -[4]: https://github.com/DataDog/datadog-lambda-go +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} ### Install the Datadog Lambda Extension -Add the Datadog Lambda Extension layer for your Lambda function using the ARN in the following format: +[Configure the layers][1] for your Lambda function using the ARN in the following format: -{{< site-region region="us,us3,eu" >}} -``` -// For x86 lambdas -arn:aws:lambda::464622532012:layer:Datadog-Extension: -// For arm64 lambdas -arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM: -``` -{{< /site-region >}} -{{< site-region region="gov" >}} -``` -// For x86 lambdas -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension: -// For arm64 lambdas -arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM: +```sh +# AWS commercial regions (x86 and arm64, respectively) +arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} +arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} + +# AWS GovCloud regions (x86 and arm64, respectively) +arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} +arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} ``` -{{< /site-region >}} -The latest `EXTENSION_VERSION` is {{< latest-lambda-layer-version layer="extension" >}}. +Replace `` with a valid AWS region, such as `us-east-1`. -### Install the Datadog Lambda library +### Configure the required environment variables + +- Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. +- Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + +[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys +{{% /tab %}} +{{< /tabs >}} -Install the [Datadog Lambda library][1] locally by running the following command: +### Install the Datadog Lambda library ``` go get github.com/DataDog/datadog-lambda-go ``` -### Set up tracing -1. Set the environment variable `DD_API_KEY` to your Datadog API key from [API Management][2]. -2. Set the environment variable `DD_TRACE_ENABLED` to `true`. -3. Import the required packages in the file declaring your Lambda function handler. +### Update your Lambda function code ```go package main @@ -266,23 +97,12 @@ go get github.com/DataDog/datadog-lambda-go "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" ) - ``` -4. Wrap your Lambda function handler using the wrapper provided by the Datadog Lambda library. - ```go func main() { - // Wrap your lambda handler like this + // Wrap your lambda handler lambda.Start(ddlambda.WrapFunction(myHandler, nil)) - /* OR with manual configuration options - lambda.Start(ddlambda.WrapFunction(myHandler, &ddlambda.Config{ - BatchInterval: time.Second * 15 - APIKey: "my-api-key", - })) - */ } - ``` -5. Use the included libraries to create additional spans, connect logs and traces, and pass trace context to other services. - ```go + func myHandler(ctx context.Context, event MyEvent) (string, error) { // Trace an HTTP request req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil) @@ -290,9 +110,12 @@ go get github.com/DataDog/datadog-lambda-go client = *httptrace.WrapClient(&client) client.Do(req) - // Connect your Lambda logs and traces - currentSpan, _ := tracer.SpanFromContext(ctx) - log.Printf("my log message %v", currentSpan) + // Submit a custom metric + ddlambda.Metric( + "coffee_house.order_value", // Metric name + 12.45, // Metric value + "product:latte", "order:online" // Associated tags + ) // Create a custom span s, _ := tracer.StartSpanFromContext(ctx, "child.span") @@ -300,71 +123,22 @@ go get github.com/DataDog/datadog-lambda-go s.Finish() } ``` -[1]: https://github.com/DataDog/datadog-lambda-go -[2]: https://app.datadoghq.com/organization-settings/api-keys -{{% /tab %}} -{{< /tabs >}} - -### Unified service tagging - -Datadog recommends tagging your serverless applications with `DD_ENV`, `DD_SERVICE`, `DD_VERSION`, and `DD_TAGS`. See the [Lambda extension documentation][3] for more details. - -## Explore - -After configuring your function following the steps above, view your metrics, logs, and traces on the [Serverless homepage][4]. - -## Monitor custom business logic - -If you would like to submit a custom metric, see the sample code below: - -```go -package main - -import ( - "github.com/aws/aws-lambda-go/lambda" - "github.com/DataDog/datadog-lambda-go" -) - -func main() { - // Wrap your handler function - lambda.Start(ddlambda.WrapFunction(myHandler, nil)) -} - -func myHandler(ctx context.Context, event MyEvent) (string, error) { - // Submit a custom metric - ddlambda.Metric( - "coffee_house.order_value", // Metric name - 12.45, // Metric value - "product:latte", "order:online" // Associated tags - ) - - req, err := http.NewRequest("GET", "http://example.com/status") - - // Add the datadog distributed tracing headers - ddlambda.AddTraceHeaders(ctx, req) - - client := http.Client{} - client.Do(req) -} -``` - -For more information, see the [Custom Metrics documentation][5]. - -If your Lambda function is running in a VPC, follow these [instructions][6] to ensure that the extension can reach Datadog API endpoints. - -## Troubleshooting +## What's next? -If you have trouble collecting monitoring data after following the instructions above, see the [serverless monitoring troubleshooting guide][7]. +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- See the [troubleshooting guide][2] if you have trouble collecting the telemetry +- See the [advanced configurations][3] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-to-al2/ -[2]: /serverless/guide/datadog_forwarder_go -[3]: /serverless/libraries_integrations/extension/#tagging -[4]: https://app.datadoghq.com/functions -[5]: /serverless/custom_metrics?tab=go -[6]: /serverless/libraries_integrations/extension/#vpc -[7]: /serverless/guide/troubleshoot_serverless_monitoring/ +[1]: https://app.datadoghq.com/functions +[2]: /serverless/guide/troubleshoot_serverless_monitoring/ +[3]: /serverless/configuration/ From c77d5dec49bc49196785fedfa63b4ff25de4ada8 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Tue, 19 Apr 2022 10:05:16 -0400 Subject: [PATCH 16/35] Remove hardcoded dotnet env vars --- content/en/serverless/installation/dotnet.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index f7746c94102e3..8156cb2d3f40a 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -131,10 +131,6 @@ To install and configure the Datadog Serverless Plugin, follow these steps: RUN wget https://github.com/DataDog/dd-trace-dotnet/releases/download/v/datadog-dotnet-apm-.tar.gz RUN mkdir /opt/datadog RUN tar -C /opt/datadog -xzf datadog-dotnet-apm-.tar.gz - ENV CORECLR_ENABLE_PROFILING=1 - ENV CORECLR_PROFILER={846F5F1C-F9AE-4B07-969E-05C26BC060D8} - ENV CORECLR_PROFILER_PATH=/opt/datadog/Datadog.Trace.ClrProfiler.Native.so - ENV DD_DOTNET_TRACER_HOME=/opt/datadog ``` Replace `` with the version number of `dd-trace-dotnet` you would like to use (for example, `2.3.0`). The minimum supported version is `2.3.0`. You can see the latest versions of `dd-trace-dotnet` in [GitHub][2]. @@ -166,10 +162,6 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Configure your Lambda function with the following environment variables: ``` - CORECLR_ENABLE_PROFILING = 1 - CORECLR_PROFILER = {846F5F1C-F9AE-4B07-969E-05C26BC060D8} - CORECLR_PROFILER_PATH = /opt/datadog/Datadog.Trace.ClrProfiler.Native.so - DD_DOTNET_TRACER_HOME = /opt/datadog DD_SITE = DD_API_KEY_SECRET_ARN = ``` From 57196afd776a2365eced0712874d8ba7ea304cc5 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Tue, 19 Apr 2022 17:16:17 -0400 Subject: [PATCH 17/35] Update go installation --- content/en/serverless/installation/go.md | 104 ++++++++++++----------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index 25fc68fce337a..45d45b49c2704 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -28,24 +28,24 @@ To install and configure the Datadog Serverless Plugin, follow these steps: ### Install the Datadog Serverless Plugin: - ```sh - serverless plugin install --name serverless-plugin-datadog - ``` +```sh +serverless plugin install --name serverless-plugin-datadog +``` ### Update your `serverless.yml`: - ```yaml - custom: - datadog: - site: - apiKeySecretArn: - ``` +```yaml +custom: + datadog: + site: + apiKeySecretArn: +``` - To fill in the placeholders: - - Replace `` with your [Datadog site][3] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. +To fill in the placeholders: +- Replace `` with your [Datadog site][3] to send the telemetry to. +- Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. - For more information and additional settings, see the [plugin documentation][1]. +For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension @@ -58,12 +58,16 @@ To install and configure the Datadog Serverless Plugin, follow these steps: [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh -# AWS commercial regions (x86 and arm64, respectively) +# Use this format for x86-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + +# Use this format for arm64-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} -# AWS GovCloud regions (x86 and arm64, respectively) +# Use this format for x86-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + +# Use this format for arm64-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} ``` @@ -88,41 +92,41 @@ go get github.com/DataDog/datadog-lambda-go ### Update your Lambda function code - ```go - package main - - import ( - "github.com/aws/aws-lambda-go/lambda" - "github.com/DataDog/datadog-lambda-go" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - ) - - func main() { - // Wrap your lambda handler - lambda.Start(ddlambda.WrapFunction(myHandler, nil)) - } - - func myHandler(ctx context.Context, event MyEvent) (string, error) { - // Trace an HTTP request - req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil) - client := http.Client{} - client = *httptrace.WrapClient(&client) - client.Do(req) - - // Submit a custom metric - ddlambda.Metric( - "coffee_house.order_value", // Metric name - 12.45, // Metric value - "product:latte", "order:online" // Associated tags - ) - - // Create a custom span - s, _ := tracer.StartSpanFromContext(ctx, "child.span") - time.Sleep(100 * time.Millisecond) - s.Finish() - } - ``` +```go +package main + +import ( + "github.com/aws/aws-lambda-go/lambda" + "github.com/DataDog/datadog-lambda-go" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" +) + +func main() { + // Wrap your lambda handler + lambda.Start(ddlambda.WrapFunction(myHandler, nil)) +} + +func myHandler(ctx context.Context, event MyEvent) (string, error) { + // Trace an HTTP request + req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil) + client := http.Client{} + client = *httptrace.WrapClient(&client) + client.Do(req) + + // Submit a custom metric + ddlambda.Metric( + "coffee_house.order_value", // Metric name + 12.45, // Metric value + "product:latte", "order:online" // Associated tags + ) + + // Create a custom span + s, _ := tracer.StartSpanFromContext(ctx, "child.span") + time.Sleep(100 * time.Millisecond) + s.Finish() +} +``` ## What's next? From 3f26e5594365d05d8b4ad9acf10ef065a62cfad3 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Tue, 19 Apr 2022 17:37:02 -0400 Subject: [PATCH 18/35] More explicit on lambda layer format --- content/en/serverless/installation/go.md | 2 +- content/en/serverless/installation/nodejs.md | 12 ++++++++---- content/en/serverless/installation/python.md | 16 ++++++++++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index 45d45b49c2704..971e3457a0d98 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -55,7 +55,7 @@ For more information and additional settings, see the [plugin documentation][1]. {{% tab "Custom" %}} ### Install the Datadog Lambda Extension -[Configure the layers][1] for your Lambda function using the ARN in the following format: +[Add the Lambda layer][1] of Datadog Lambda Extension to your Lambda functions, using the ARN format based on your AWS region and architecture: ```sh # Use this format for x86-based Lambda deployed in AWS commercial regions diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 49357d6482e97..041fee113aa0b 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -262,10 +262,10 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh - # AWS commercial regions + # Use this format for AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} - # AWS GovCloud regions + # Use this format for AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="node" >}} ``` @@ -282,12 +282,16 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh - # AWS commercial regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + + # Use this format for arm64-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} - # AWS GovCloud regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + + # Use this format for arm64-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} ``` diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index e3868e6e7c304..871272f254402 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -256,12 +256,16 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Option A: [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh - # AWS commercial regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-:{{< latest-lambda-layer-version layer="python" >}} + + # Use this format for arm64-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="python" >}} - # AWS GovCloud regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-:{{< latest-lambda-layer-version layer="python" >}} + + # Use this format for arm64-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog--ARM:{{< latest-lambda-layer-version layer="python" >}} ``` @@ -282,12 +286,16 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions [Configure the layers][1] for your Lambda function using the ARN in the following format: ```sh - # AWS commercial regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + + # Use this format for arm64-based Lambda deployed in AWS commercial regions arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} - # AWS GovCloud regions (x86 and arm64, respectively) + # Use this format for x86-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}} + + # Use this format for arm64-based Lambda deployed in AWS GovCloud regions arn:aws-us-gov:lambda::002406178527:layer:Datadog-Extension-ARM:{{< latest-lambda-layer-version layer="extension" >}} ``` From fd0b37ffd8279ee615066f30bd6686887667d2d8 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Tue, 19 Apr 2022 18:03:32 -0400 Subject: [PATCH 19/35] refresh sls java installation --- content/en/serverless/installation/java.md | 371 ++++++--------------- 1 file changed, 107 insertions(+), 264 deletions(-) diff --git a/content/en/serverless/installation/java.md b/content/en/serverless/installation/java.md index 2cf67c51a99a4..a0fab532709ae 100644 --- a/content/en/serverless/installation/java.md +++ b/content/en/serverless/installation/java.md @@ -2,110 +2,89 @@ title: Instrumenting Java Serverless Applications kind: documentation further_reading: - - link: 'serverless/datadog_lambda_library/java' + - link: '/serverless/configuration' tag: 'Documentation' - text: 'Datadog Lambda Library for Java' - - link: 'serverless/distributed_tracing/' + text: 'Configure Serverless Monitoring' + - link: '/serverless/guide/troubleshoot_serverless_monitoring' tag: 'Documentation' - text: 'Tracing Serverless Applications' + text: 'Troubleshoot Serverless Monitoring' - link: 'serverless/custom_metrics/' tag: 'Documentation' text: 'Submitting Custom Metrics from Serverless Applications' - - link: '/serverless/guide/troubleshoot_serverless_monitoring' - tag: 'Documentation' - text: 'Troubleshoot Serverless Monitoring' aliases: - /serverless/datadog_lambda_library/java/ --- -{{< img src="serverless/java-lambda-tracing.png" alt="Monitor Java Lambda Functions with Datadog" style="width:100%;">}} - -
-There are versions of datadog-lambda-java that import log4j <=2.14.0 as a transitive dependency. Upgrade instructions are below. -
+
To fully instrument your serverless application with distributed tracing, your Java Lambda functions must be using the Java 8 Corretto (`java8.al2`) or Java 11 (`java11`) runtimes.
-## Prerequisites +
If your Java Lambda functions were previously set up using the Datadog Forwarder, see the installation instructions.
-To fully instrument your serverless application with distributed tracing, your Java Lambda functions must be using the Java 8 Corretto (`java8.al2`) or Java 11 (`java11`) runtimes. +## Installation -If your Java Lambda functions were previously set up using the Datadog Forwarder, see the [installation instructions][1]. - -## Configuration +Datadog offers many different ways to enable instrumentation for your serverless applications. Choose a method below that best suits your needs. Datadog generally recommends using the Datadog CLI. {{< tabs >}} {{% tab "Datadog CLI" %}} -The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. - -You can also add the [instrumentation command](#instrument) to your CI/CD pipelines to enable instrumentation for all your serverless applications. Run the command _after_ your normal serverless application deployment, so that changes made by the Datadog CLI command are not overridden. -### Install - -Install the Datadog CLI with NPM: +The Datadog CLI modifies existing Lambda functions' configurations to enable instrumentation without requiring a new deployment. It is the quickest way to get started with Datadog's serverless monitoring. -```sh -npm install -g @datadog/datadog-ci -``` +1. Install the Datadog CLI client -### Configure credentials + ```sh + npm install -g @datadog/datadog-ci + ``` -For a quick start, configure Datadog and [AWS credentials][1] using the following command. For production applications, consider supplying the environment variables or credentials in a more secure manner. +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. -```bash -export DATADOG_API_KEY="" -export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu, us3.datadoghq.com or ddog-gov.com -export AWS_ACCESS_KEY_ID="" -export AWS_SECRET_ACCESS_KEY="" -``` + ```sh + datadog-ci lambda instrument -i + ``` -### Instrument +3. Configure the AWS credentials -**Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation needs to be reverted, run `uninstrument` with the same arguments that was used for instrumentation. + Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. -To instrument your Lambda functions, run the following command: +4. Configure the Datadog site -```sh -datadog-ci lambda instrument -f -f -r -e -``` + Specify the [Datadog site][2] where the telemetry should be sent to. The default is `datadoghq.com`. -To fill in the placeholders: + ```sh + export DATADOG_SITE="" # such as datadoghq.com, datadoghq.eu or ddog-gov.com + ``` -- Replace `` and `` with your Lambda function names. -- Replace `` with the AWS region name. -- Replace `` with the desired version of the Datadog Lambda Extension. The latest version is `{{< latest-lambda-layer-version layer="extension" >}}`. +5. Configure the Datadog API key -For example: + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. -```sh -datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -e {{< latest-lambda-layer-version layer="extension" >}} -``` + ```sh + export DATADOG_API_KEY_SECRET_ARN="" + ``` -More information and additional parameters can be found in the [Datadog Serverless CLI][2]. + For quick testing purposes, you can also set the Datadog API key in plaintext: -### Install the Datadog tracing library + ```sh + export DATADOG_API_KEY="" + ``` -[Configure the layers][3] for your Lambda function using the ARN in the following format: +6. Instrument your Lambda functions -``` -arn:aws:lambda::464622532012:layer:dd-trace-java: -``` + **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. -The latest `VERSION` is {{< latest-lambda-layer-version layer="dd-trace-java" >}}. + To instrument your Lambda functions, run the following command. -### Configure environment variables + ```sh + datadog-ci lambda instrument -f -f -r -v {{< latest-lambda-layer-version layer="dd-trace-dotnet" >}} -e {{< latest-lambda-layer-version layer="extension" >}} + ``` -Configure the following environment variables on your function: + To fill in the placeholders: + - Replace `` and `` with your Lambda function names. Alternatively, you can use `--functions-regex` to automatically instrument multiple functions whose names match the given regular expression. + - Replace `` with the AWS region name. -```yaml -DD_API_KEY: # Replace with your Datadog API key -JAVA_TOOL_OPTIONS: -javaagent:"/opt/java/lib/dd-java-agent.jar" -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -DD_LOGS_INJECTION: true -DD_JMXFETCH_ENABLED: false -DD_TRACE_ENABLED: true -``` + Additional parameters can be found in the [CLI documentation][3]. -[1]: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html -[2]: https://docs.datadoghq.com/serverless/serverless_integrations/cli -[3]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html +[1]: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://docs.datadoghq.com/serverless/serverless_integrations/cli {{% /tab %}} {{% tab "Serverless Framework" %}} @@ -114,238 +93,102 @@ The [Datadog Serverless Plugin][1] automatically configures your functions to se To install and configure the Datadog Serverless Plugin, follow these steps: 1. Install the Datadog Serverless Plugin: + ```sh - npm install serverless-plugin-datadog --save-dev - ``` -2. In your `serverless.yml`, add the following: - ```yaml - plugins: - - serverless-plugin-datadog + serverless plugin install --name serverless-plugin-datadog ``` -
If you are instead deploying your Serverless Framework app by natively exporting a JSON object from a JavaScript file (for example, by using a serverless.ts file), follow the custom installation instructions.
+2. Update your `serverless.yml`: -3. In your `serverless.yml`, also add the following section: ```yaml custom: - datadog: - apiKey: # Your Datadog API Key goes here. + datadog: + site: + apiKeySecretArn: ``` - Find your Datadog API key on the [API Management page][3]. For additional settings, see the [plugin documentation][1]. + To fill in the placeholders: + - Replace `` with your [Datadog site][3] to send the telemetry to. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + + For more information and additional settings, see the [plugin documentation][1]. [1]: https://docs.datadoghq.com/serverless/serverless_integrations/plugin [2]: https://docs.datadoghq.com/serverless/libraries_integrations/extension -[3]: https://app.datadoghq.com/organization-settings/api-keys +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} -{{% tab "Custom" %}} - -### Install the Datadog Lambda Extension - -[Configure the layers][1] for your Lambda function using the ARN in the following format: - -``` -// For x86 architecture -arn:aws:lambda::464622532012:layer:Datadog-Extension: -// For arm64 architecture -arn:aws:lambda::464622532012:layer:Datadog-Extension-ARM: -``` +{{% tab "Container image" %}} -The latest `EXTENSION_VERSION` is {{< latest-lambda-layer-version layer="extension" >}}. - -### Install the Datadog tracing library - -[Configure the layers][2] for your Lambda function using the ARN in the following format: - -``` -arn:aws:lambda::464622532012:layer:dd-trace-java: -``` - -The latest `VERSION` is {{< latest-lambda-layer-version layer="dd-trace-java" >}}. - -### Configure environment variables - -Configure the following environment variables on your function: - -```yaml -DD_API_KEY: # Replace with your Datadog API key -JAVA_TOOL_OPTIONS: -javaagent:"/opt/java/lib/dd-java-agent.jar" -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -DD_LOGS_INJECTION: true -DD_JMXFETCH_ENABLED: false -DD_TRACE_ENABLED: true -``` - -[1]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html -[2]: https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html -{{% /tab %}} -{{< /tabs >}} +1. Install the Datadog Lambda Extension -### Install the Datadog Lambda library - -Install the Datadog Lambda Library locally by adding one of the following code blocks into your `pom.xml` or `build.gradle` as appropriate based on your project’s configuration. Replace `VERSION` below with the latest release (omitting the preceeding `v`): ![Maven Cental][4] -{{< tabs >}} -{{% tab "Maven" %}} + ```dockerfile + COPY --from=public.ecr.aws/datadog/lambda-extension: /opt/extensions/ /opt/extensions + ``` -Include the following dependency in your `pom.xml`: + Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -```xml - - com.datadoghq - datadog-lambda-java - VERSION - -``` +2. Install the Datadog Java APM client -{{% /tab %}} -{{% tab "Gradle" %}} + ```dockerfile + RUN yum -y install tar wget gzip + RUN wget -O /opt/dd-java-agent.jar https://dtdg.co/latest-java-tracer + ``` -Include the following in your `build.gradle`: +3. Set the required environment variables -```groovy -dependencies { - implementation 'com.datadoghq:datadog-lambda-java:VERSION' -} -``` + - Set `JAVA_TOOL_OPTIONS` to `-javaagent:“/opt/dd-java-agent.jar” -XX:+TieredCompilation -XX:TieredStopAtLevel=1` + - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. +[1]: https://gallery.ecr.aws/datadog/lambda-extension +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} -{{< /tabs >}} - -### Wrap your Lambda handler - -Wrap your Lambda handler function using the wrapper provided by the Datadog Lambda Library: - -```java -public class Handler implements RequestHandler { - public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){ - DDLambda ddl = new DDLambda(request, context); //Required to initialize the trace - - do_some_stuff(); - make_some_http_requests(); - - ddl.finish(); //Required to finish the active span. - return new ApiGatewayResponse(); - } -} -``` - -### Unified service tagging - -Datadog recommends tagging your serverless applications with `DD_ENV`, `DD_SERVICE`, `DD_VERSION`, and `DD_TAGS`. See the [Lambda extension documentation][2] for more details. - -## Explore - -After configuring your function following the steps above, view your metrics, logs, and traces on the [Serverless homepage][9]. - -### Monitor custom business logic - -If you would like to submit a custom metric, see the sample code below: - -```java -public class Handler implements RequestHandler { - public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){ - DDLambda ddl = new DDLambda(request, context); - - Map myTags = new HashMap(); - myTags.put("product", "latte"); - myTags.put("order","online"); - - // Submit a custom metric - ddl.metric( - "coffee_house.order_value", // Metric name - 12.45, // Metric value - myTags); // Associated tags - - URL url = new URL("https://example.com"); - HttpURLConnection hc = (HttpURLConnection)url.openConnection(); - hc.connect(); - - ddl.finish(); - } -} -``` - -See the [custom metrics documentation][10] for more information on custom metric submission. - -### Connect logs and traces - -To automatically connect Java Lambda function logs and traces, see [Connecting Java Logs and Traces][11] for instructions. - -
Failing to use the correct Java runtime can result in errors like, "Error opening zip file or JAR manifest missing : /opt/java/lib/dd-java-agent.jar" Make sure to use java8.al2 or java11 as runtime as described above.
- -## Upgrading - -Apache Foundation has announced that log4j, a popular Java logging library, is [vulnerable to remote code execution][12]. -Some versions of `datadog-lambda-java` include a transitive dependency on log4j that may be vulnerable. The vulnerable versions are: - -- `<=0.3.3` -- `1.4.0` - -The latest version of datadog-lambda java is ![Maven Cental][4]. Use this version (omitting the preceeding `v`) when following the upgrading instructions below. - -If you do not wish to upgrade to `1.4.x`, `0.3.x` is updated with the latest log4j security patches as well. -You may find the latest version of `0.3.x` in the [datadog-lambda-java repository][13]. - -The version of the `datadog-lambda-java` dependency in your Lambda function is set in `pom.xml` or `build.gradle` depending on whether you are using Maven or Gradle, respectively. - -{{< tabs >}} -{{% tab "Maven" %}} +{{% tab "Custom" %}} -Your `pom.xml` file contains a section similar to the following: +1. Install the Datadog Lambda Extension -```xml - - com.datadoghq - datadog-lambda-java - VERSION - -``` + [Configure the layers][1] for your Lambda function using the ARN in the following format: -Replace `VERSION` with the latest version of `datadog-lambda-java` (available above). -Then redeploy your lambda function. + `arn:aws:lambda::464622532012:layer:Datadog-Extension:{{< latest-lambda-layer-version layer="extension" >}}` -{{% /tab %}} +2. Install the Datadog Java APM client -{{% tab "Gradle" %}} + [Configure the layers][1] for your Lambda function using the ARN in the following format: -Your `build.gradle` file contains a section similar to the following: + `arn:aws:lambda::464622532012:layer:dd-trace-java:{{< latest-lambda-layer-version layer="dd-trace-java" >}}` -```groovy -dependencies { - implementation 'com.datadoghq:datadog-lambda-java:VERSION' -} -``` +3. Set the required environment variables -Replace `VERSION` with the latest version of `datadog-lambda-java` (available above). -Then redeploy your lambda function. + - Set `JAVA_TOOL_OPTIONS` to `-javaagent:“/opt/dd-java-agent.jar” -XX:+TieredCompilation -XX:TieredStopAtLevel=1` + - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. +[1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html +[2]: https://docs.datadoghq.com/getting_started/site/ +[3]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} -{{< /tabs>}} - -If you are upgrading from 0.3.x to 1.4.x and you wish to use the `dd-trace-java` tracer, find the reference to the `dd-trace-java` lambda layer and change it to: - -``` -arn:aws:lambda::464622532012:layer:dd-trace-java:4 -``` +{{< /tabs >}} -## Troubleshooting +## What's next? -If you have trouble collecting monitoring data after following the instructions above, see the [serverless monitoring troubleshooting guide][14]. +- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- Submit a [custom metric][2] or [APM span][3] to monitor your business logic. +- See the [troubleshooting guide][4] if you have trouble collecting the telemetry +- See the [advanced configurations][5] to + - connect your telemetry using tags + - collect telemetry for AWS API Gateway, SQS, etc. + - capture the Lambda request and response payloads + - link errors of your Lambda functions to your source code + - filter or scrub sensitive information from logs or traces ## Further Reading {{< partial name="whats-next/whats-next.html" >}} -[1]: /serverless/guide/datadog_forwarder_java -[2]: /serverless/libraries_integrations/extension/ -[3]: /serverless/enhanced_lambda_metrics -[4]: https://img.shields.io/maven-central/v/com.datadoghq/datadog-lambda-java -[5]: /logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/#collecting-logs-from-cloudwatch-log-group -[6]: /serverless/insights#cold-starts -[7]: /monitors/create/types/metric/?tab=threshold#overview -[8]: /getting_started/tagging/unified_service_tagging/#aws-lambda-functions -[9]: https://app.datadoghq.com/functions -[10]: /serverless/custom_metrics?tab=java -[11]: /tracing/connect_logs_and_traces/java/ -[12]: https://www.datadoghq.com/log4j-vulnerability/ -[13]: https://github.com/DataDog/datadog-lambda-java/releases -[14]: /serverless/guide/troubleshoot_serverless_monitoring/ +[1]: https://app.datadoghq.com/functions +[2]: https://docs.datadoghq.com/metrics/dogstatsd_metrics_submission/ +[3]: /tracing/custom_instrumentation/java/ +[4]: /serverless/guide/troubleshoot_serverless_monitoring/ +[5]: /serverless/configuration/ From fbef31ff7b5805612dafc25ad2d7d69173752629 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Wed, 20 Apr 2022 11:19:10 -0400 Subject: [PATCH 20/35] misc --- content/en/serverless/configuration/_index.md | 78 +++++++++++-------- .../serverless_trace_propagation.md | 36 ++++++++- content/en/serverless/installation/dotnet.md | 4 +- content/en/serverless/installation/go.md | 4 +- content/en/serverless/installation/java.md | 6 +- content/en/serverless/installation/nodejs.md | 36 ++++++--- content/en/serverless/installation/python.md | 44 +++++++---- 7 files changed, 142 insertions(+), 66 deletions(-) diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 8461da8f302bf..202e736053c31 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -28,9 +28,12 @@ After [installing][1] Datadog serverless monitoring, you should be collecting me - [Configure trace collection](#configure-trace-collection) - [Connect logs and traces](#connect-logs-and-traces) - [Link errors to your source code](#link-errors-to-your-source-code) -- [Create monitors](#create-monitors) -- [Create synthetic tests](#create-synthetic-tests) +- [Submit custom metrics](#submit-custom-metrics) +- [Monitor your applications](#monitor-your-applications) - [Send telemetry over PrivateLink or proxy](#send-telemetry-over-privatelink-or-proxy) +- [Propagate trace context over AWS resources +](#propagate-trace-context-over-AWS-resources) +- [Merge X-Ray and Datadog traces](#merge-xray-and-datadog-traces) - [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) - [Migrate to the Datadog Lambda extension](#migrate-to-the-datadog-lambda-extension) - [Troubleshoot](#troubleshoot) @@ -272,8 +275,6 @@ The following resources are currently supported: - S3 - DynamoDB -For unsupported resources, you can [propagate the trace context with a small piece of code][13]. - To disable this feature, set `DD_TRACE_MANAGED_SERVICES` to `false`. ## Configure logs collection @@ -292,7 +293,7 @@ logs_config: Datadog recommends keeping the `REPORT` logs, as they are used to populate the invocations list in the serverless function views. -To scrub or filter other logs before sending them to Datadog, see [Advanced Log Collection][14]. +To scrub or filter other logs before sending them to Datadog, see [Advanced Log Collection][13]. ### Disable logs collection @@ -345,13 +346,13 @@ Set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false` on your Lam ## Configure trace collection -To see what libraries and frameworks are automatically instrumented by Datadog APM client, see [Compatibility Requirements for APM][15]. To instrument custom applications, see Datadog APM guide for [custom instrumentation][16]. +To see what libraries and frameworks are automatically instrumented by Datadog APM client, see [Compatibility Requirements for APM][14]. To instrument custom applications, see Datadog APM guide for [custom instrumentation][15]. ### Filter or scrub sensitive information from traces -To filter traces before sending them to Datadog, see [Ignoring Unwanted Resources in APM][17]. +To filter traces before sending them to Datadog, see [Ignoring Unwanted Resources in APM][16]. -To scrub trace attributes for data security, see [Configure the Datadog Agent or Tracer for Data Security][18]. +To scrub trace attributes for data security, see [Configure the Datadog Agent or Tracer for Data Security][17]. ### Disable trace collection @@ -410,7 +411,7 @@ Set the environment variable `DD_TRACE_ENABLED` to `false` on your Lambda functi If you are using the [Lambda extension][2] to collect traces and logs, Datadog automatically adds the AWS Lambda request id to the `aws.lambda` span under the `request_id` tag as well as the Lambda logs for the same request under the `lambda.request_id` attribute. The Datadog trace and log views are connected using the AWS Lambda request ID. -If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs (enabled by the environment variable `DD_LOGS_INJECTION`). The Datadog trace and log views are connected using the Datadog trace ID. This feature is supported for most applications using a popular runtime and logger (see the [support by runtime][19]). If you are using a runtime or custom logger that isn't supported: +If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs (enabled by the environment variable `DD_LOGS_INJECTION`). The Datadog trace and log views are connected using the Datadog trace ID. This feature is supported for most applications using a popular runtime and logger (see the [support by runtime][18]). If you are using a runtime or custom logger that isn't supported: - When logging in JSON, you need to obtain the Datadog trace ID using `dd-trace` and add it to your logs under the `dd.trace_id` field: ```javascript { @@ -425,13 +426,13 @@ If you are using the [Forwarder Lambda function][4] to collect traces and logs, 1. obtain the Datadog trace ID using `dd-trace` and add it to your log 2. clone the default Lambda log pipeline, which is read-only 3. enable the cloned pipeline while disable the default one - 4. update the [Grok parser][20] rules of the cloned pipeline to parse the Datadog trace ID into the `dd.trace_id` attribute. For example, use rule `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.*` for logs that look like `[INFO] dd.trace_id=4887065908816661012 My log message`. + 4. update the [Grok parser][19] rules of the cloned pipeline to parse the Datadog trace ID into the `dd.trace_id` attribute. For example, use rule `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.*` for logs that look like `[INFO] dd.trace_id=4887065908816661012 My log message`. ## Link errors to your source code
This feature is currently supported for Go, and Java.
-[Datadog source code integration][21] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. +[Datadog source code integration][20] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. {{< tabs >}} {{% tab "Datadog CLI" %}} @@ -511,13 +512,15 @@ export class ExampleStack extends cdk.Stack { {{% /tab %}} {{< /tabs >}} -## Create monitors +## Submit custom metrics + +You can monitor your custom business logic by [submitting custom metrics][21]. -Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][22]. If you are using the Datadog serverless plugin, see [how to enable default and custom monitors in serverless.yml][23]. +## Monitor your applications -## Create synthetic tests +Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][22]. If you are using the Datadog serverless plugin, you can also [enable default and custom monitors in serverless.yml][23]. -If your serverless application powers an API or webpage, consider setting up Datadog [synthetic tests][24]. +If your serverless application powers an API or webpage, you can also set up [synthetic tests][24]. ## Send telemetry over PrivateLink or proxy @@ -525,9 +528,17 @@ The Datadog Lambda Extension needs access to public internet to send data to Dat If you are using the Datadog Forwarder, follow these [instructions][28]. +## Propagate trace context over AWS resources + +Datadog automatically injects the trace context into outgoing AWS SDK requests and extract the trace context from the Lambda event, in order to trace a request or transaction over distributed services. See [additional information][29]. + +## Merge X-Ray and Datadog traces + +AWS X-Ray supports tracing through certain AWS managed services such as AppSync and Step Functions, which isn't yet supported by Datadog APM natively. You can enable the [Datadog X-Ray integration][30], and merge the X-Ray traces with the Datadog native traces. See [additional details][31]. + ## Enable AWS Lambda code signing -[Code signing for AWS Lambda][29] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. +[Code signing for AWS Lambda][32] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. @@ -537,9 +548,9 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][30]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][33]. -To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][31]. For your convenience, the key differences are summarized below. +To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][34]. For your convenience, the key differences are summarized below. **Note**: Datadog recommends migrating your dev and staging applications first and migrating production applications one by one. @@ -596,7 +607,7 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte ## Troubleshoot -If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][32]. +If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][35]. ## Further Reading @@ -616,15 +627,15 @@ If you have trouble configuring your installations, set the environment variable [10]: /integrations/amazon_sqs/#data-collected [11]: /integrations/amazon_web_services/#log-collection [12]: https://www.datadoghq.com/blog/monitor-aws-fully-managed-services-datadog-serverless-monitoring/ -[13]: /serverless/distributed_tracing/serverless_trace_propagation/ -[14]: /agent/logs/advanced_log_collection/ -[15]: /tracing/setup_overview/compatibility_requirements/ -[16]: /tracing/setup_overview/custom_instrumentation/ -[17]: /tracing/guide/ignoring_apm_resources/ -[18]: /tracing/setup_overview/configure_data_security/ -[19]: /tracing/connect_logs_and_traces/ -[20]: /logs/log_configuration/parsing/ -[21]: /integrations/guide/source-code-integration +[13]: /agent/logs/advanced_log_collection/ +[14]: /tracing/setup_overview/compatibility_requirements/ +[15]: /tracing/setup_overview/custom_instrumentation/ +[16]: /tracing/guide/ignoring_apm_resources/ +[17]: /tracing/setup_overview/configure_data_security/ +[18]: /tracing/connect_logs_and_traces/ +[19]: /logs/log_configuration/parsing/ +[20]: /integrations/guide/source-code-integration +[21]: /serverless/custom_metrics [22]: https://app.datadoghq.com/functions [23]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors [24]: /synthetics/ @@ -632,7 +643,10 @@ If you have trouble configuring your installations, set the environment variable [26]: /getting_started/site/ [27]: /agent/proxy/ [28]: https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#aws-privatelink-support -[29]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html -[30]: /serverless/guide/extension_motivation/ -[31]: /serverless/guide#install-using-the-datadog-forwarder -[32]: /serverless/guide/troubleshoot_serverless_monitoring/ +[29]: /serverless/distributed_tracing/serverless_trace_propagation/ +[30]: /integrations/amazon_xray/ +[31]: /serverless/distributed_tracing/serverless_trace_merging +[32]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html +[33]: /serverless/guide/extension_motivation/ +[34]: /serverless/guide#install-using-the-datadog-forwarder +[35]: /serverless/guide/troubleshoot_serverless_monitoring/ diff --git a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md index 7ce3cc907cee4..8dcf689fba8a4 100644 --- a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md +++ b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md @@ -126,7 +126,41 @@ exports.json = (payload) => { }; }; ``` - +{{% /tab %}} +{{% tab "Go" %}} +```go +var exampleSQSExtractor = func(ctx context.Context, ev json.RawMessage) map[string]string { + eh := events.SQSEvent{} + + headers := map[string]string{} + + if err := json.Unmarshal(ev, &eh); err != nil { + return headers + } + + // Using SQS as a trigger with a batchSize=1 so it's important we check + // for this as a single SQS message will drive the execution of the handler. + if len(eh.Records) != 1 { + return headers + } + + record := eh.Records[0] + + lowercaseHeaders := map[string]string{} + for k, v := range record.MessageAttributes { + if v.StringValue != nil { + lowercaseHeaders[strings.ToLower(k)] = *v.StringValue + } + } + + return lowercaseHeaders +} + +cfg := &ddlambda.Config{ + TraceContextExtractor: exampleSQSExtractor, +} +ddlambda.WrapFunction(handler, cfg) +``` {{% /tab %}} {{< /tabs >}} diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 8156cb2d3f40a..2e7b5203b2ab0 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -13,7 +13,9 @@ further_reading: text: 'Submitting Custom Metrics from Serverless Applications' --- -
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
+
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
+ +
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
## Installation diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index 971e3457a0d98..c8ab4b2a479cd 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -15,7 +15,9 @@ aliases: - /serverless/datadog_lambda_library/go/ --- -
If your Go Lambda functions are still using runtime `go1.x` and you cannot migrate to the `provided.al2` runtime, you must instrument using the Datadog Forwarder instead.
+
If your Go Lambda functions are still using runtime `go1.x` and you cannot migrate to the `provided.al2` runtime, you must instrument using the Datadog Forwarder instead.
+ +
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
## Installation diff --git a/content/en/serverless/installation/java.md b/content/en/serverless/installation/java.md index a0fab532709ae..cf3a8d0dda7c4 100644 --- a/content/en/serverless/installation/java.md +++ b/content/en/serverless/installation/java.md @@ -17,7 +17,9 @@ aliases:
To fully instrument your serverless application with distributed tracing, your Java Lambda functions must be using the Java 8 Corretto (`java8.al2`) or Java 11 (`java11`) runtimes.
-
If your Java Lambda functions were previously set up using the Datadog Forwarder, see the installation instructions.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+ +
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
## Installation @@ -137,7 +139,6 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Set the required environment variables - - Set `JAVA_TOOL_OPTIONS` to `-javaagent:“/opt/dd-java-agent.jar” -XX:+TieredCompilation -XX:TieredStopAtLevel=1` - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. @@ -161,7 +162,6 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Set the required environment variables - - Set `JAVA_TOOL_OPTIONS` to `-javaagent:“/opt/dd-java-agent.jar” -XX:+TieredCompilation -XX:TieredStopAtLevel=1` - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 041fee113aa0b..7d4c7e066b2b1 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -19,9 +19,9 @@ aliases: - /serverless/guide/nodejs/ --- -
If you previously set up Datadog Serverless using the Datadog Forwarder, see Using the Datadog Forwarder - Node.js.
+
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
If you are bundling using webpack or esbuild, you may need to mark the Datadog libraries as external.
@@ -237,17 +237,23 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -3. Configure your Lambda functions +3. Redirect the handler function - Set your image's `CMD` value to `node_modules/datadog-lambda-js/dist/handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + + **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + +4. Configure the Datadog site and API key + + - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension -[2]: https://docs.datadoghq.com/getting_started/site/ -[3]: https://app.datadoghq.com/organization-settings/api-keys +[2]: https://docs.datadoghq.com/serverless/guide/handler_wrapper +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} @@ -297,16 +303,22 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions Replace `` with a valid AWS region, such as `us-east-1`. -3. Configure your Lambda functions +3. Redirect the handler function - Set your function's handler to `/opt/nodejs/node_modules/datadog-lambda-js/handler.handler` if using the layer, or `node_modules/datadog-lambda-js/dist/handler.handler` if using the package. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + + **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + +4. Configure Datadog site and API key + + - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html -[2]: https://docs.datadoghq.com/getting_started/site/ -[3]: https://app.datadoghq.com/organization-settings/api-keys +[2]: https://docs.datadoghq.com/serverless/guide/handler_wrapper +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{< /tabs >}} diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 871272f254402..3a18392173d80 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -16,9 +16,9 @@ aliases: - /serverless/guide/python/ --- -
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up Datadog Serverless using the Datadog Forwarder, see the Using the Datadog Forwarder - Python guide.
+
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink to the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
## Installation @@ -230,18 +230,24 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions Replace `` with either a specific version number (for example, `{{< latest-lambda-layer-version layer="extension" >}}`) or with `latest`. You can see a complete list of possible tags in the [Amazon ECR repository][1]. -3. Configure your Lambda functions +3. Redirect the handler function - Set your image's `CMD` value to `datadog_lambda.handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - - Set the environment variable `DD_SITE` with your [Datadog site][2] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + + **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + +4. Configure the Datadog site, API key, and tracing + + - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. - Set the environment variable `DD_TRACE_ENABLED` to `true`. [1]: https://gallery.ecr.aws/datadog/lambda-extension -[2]: https://docs.datadoghq.com/getting_started/site/ -[3]: https://app.datadoghq.com/organization-settings/api-keys +[2]: https://docs.datadoghq.com/serverless/guide/handler_wrapper +[3]: https://docs.datadoghq.com/getting_started/site/ +[4]: https://app.datadoghq.com/organization-settings/api-keys {{% /tab %}} {{% tab "Custom" %}} @@ -301,17 +307,22 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions Replace `` with a valid AWS region, such as `us-east-1`. -3. Configure your Lambda functions +3. Redirect the handler function - Set your function's handler to `datadog_lambda.handler.handler`. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - - Set the environment variable `DD_SITE` with your [Datadog site][6] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][7] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + + **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][6] instead. + +4. Configure the Datadog site, API key, and tracing + + - Set the environment variable `DD_SITE` with your [Datadog site][7] to send the telemetry to. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][8] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. - Set the environment variable `DD_TRACE_ENABLED` to `true`. -4. (AWS Chalice only) Register the middleware +5. (AWS Chalice only) Register the middleware - If you are using [AWS Chalice][8], you must install `datadog-lambda` using `pip`, and register `datadog_lambda_wrapper` as a [middleware][9] in your `app.py`: + If you are using [AWS Chalice][9], you must install `datadog-lambda` using `pip`, and register `datadog_lambda_wrapper` as a [middleware][10] in your `app.py`: ```python from chalice import Chalice, ConvertToMiddleware @@ -332,10 +343,11 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions [3]: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html [4]: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies [5]: https://pypi.org/project/datadog-lambda/ -[6]: https://docs.datadoghq.com/getting_started/site/ -[7]: https://app.datadoghq.com/organization-settings/api-keys -[8]: https://aws.github.io/chalice/ -[9]: https://aws.github.io/chalice/topics/middleware.html +[6]: https://docs.datadoghq.com/serverless/guide/handler_wrapper +[7]: https://docs.datadoghq.com/getting_started/site/ +[8]: https://app.datadoghq.com/organization-settings/api-keys +[9]: https://aws.github.io/chalice/ +[10]: https://aws.github.io/chalice/topics/middleware.html {{% /tab %}} {{< /tabs >}} From d8583a6c56c9779930ebc1a10a72feb22be64790 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 21 Apr 2022 11:55:44 -0400 Subject: [PATCH 21/35] Custom metrics refresh --- .../en/serverless/custom_metrics/_index.md | 130 ++++++++++++------ 1 file changed, 89 insertions(+), 41 deletions(-) diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index 287472c390ff4..3d3b789626b1c 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -58,28 +58,94 @@ Datadog recommends using the [Datadog Lambda Extension][1] to submit custom metr 1. Follow the general [serverless installation instructions][8] appropriate for your Lambda runtime. 1. If you are not interested in collecting traces from your Lambda function, set the environment variable `DD_TRACE_ENABLED` to `false`. 1. If you are not interested in collecting logs from your Lambda function, set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false`. -1. Import and use the helper function from the Datadog Lambda Library, such as `lambda_metric` or `sendDistributionMetric`, to submit your custom metrics following the [sample code](#custom-metrics-sample-code). +1. Follow the sample code or instructions belows to submit your custom metric. -If your Lambda function is running in a VPC, ensure that your function can reach Datadog API endpoints either through the public internet, [PrivateLink][9] or a [proxy][10]. +{{< programming-lang-wrapper langs="python,nodeJS,go,ruby,other" >}} +{{< programming-lang lang="python" >}} -## With the Datadog Forwarder +```python +from datadog_lambda.metric import lambda_metric -Datadog recommends using the [Datadog Forwarder Lambda][11] to submit custom metrics from Lambda runtimes that are not yet supported by the Datadog Lambda Extension. +def lambda_handler(event, context): + lambda_metric( + "coffee_house.order_value", # Metric name + 12.45, # Metric value + tags=['product:latte', 'order:online'] # Associated tags + ) +``` +{{< /programming-lang >}} +{{< programming-lang lang="nodeJS" >}} -1. Follow the general [serverless installation instructions][8] to configure your Lambda function, install the Datadog Lambda Library and the Datadog Forwarder Lambda function, and subscribe the Forwarder to your function's log group. -1. If you are not interested in collecting traces from your Lambda function, set the environment variable `DD_TRACE_ENABLED` to `false` on your own Lambda function. -1. If you are not interested in collecting logs from your Lambda function, set the Forwarder's CloudFormation stack parameter `DdForwardLog` to `false`. -1. Import and use the helper function from the Datadog Lambda Library, such as `lambda_metric` or `sendDistributionMetric`, to submit your custom metrics following the [sample code](#custom-metrics-sample-code). +```javascript +const { sendDistributionMetric } = require('datadog-lambda-js'); -If the Datadog Lambda Library is not available for your runtime, you can print metrics to CloudWatch logs in the expected JSON format on your own. Select the "Other" tab from the [sample code](#custom-metrics-sample-code) section. +async function myHandler(event, context) { + sendDistributionMetric( + 'coffee_house.order_value', // Metric name + 12.45, // Metric value + 'product:latte', // First tag + 'order:online' // Second tag + ); +} +``` +{{< /programming-lang >}} +{{< programming-lang lang="go" >}} -## Custom metrics sample code +```go +package main -**Note:** The arguments to the custom metrics reporting methods have the following requirements: +import ( + "github.com/aws/aws-lambda-go/lambda" + "github.com/DataDog/datadog-lambda-go" +) -- `` uniquely identifies your metric and follows the [metric naming policy][12]. -- `` MUST be a number (that is, integer or float). -- `` is optional and formatted, for example: `['owner:Datadog', 'env:demo', 'cooltag']`. +func main() { + lambda.Start(ddlambda.WrapFunction(myHandler, nil)) +} + +func myHandler(ctx context.Context, event MyEvent) (string, error) { + ddlambda.Distribution( + "coffee_house.order_value", // Metric name + 12.45, // Metric value + "product:latte", "order:online" // Associated tags + ) +} +``` + +{{< /programming-lang >}} +{{< programming-lang lang="ruby" >}} + +```ruby +require 'datadog/lambda' + +def handler(event:, context:) + # You only need to wrap your function handler (Not helper functions). + Datadog::Lambda.wrap(event, context) do + Datadog::Lambda.metric( + 'coffee_house.order_value', # Metric name + 12.45, # Metric value + "product":"latte", "order":"online" # Associated tags + ) + end +end +``` + +{{< /programming-lang >}} +{{< programming-lang lang="other" >}} + +[Install][14] the DogStatsD client for your runtime and follow the [sample code][15] to submit your custom metrics. Note: For accurate results, you must use [**distribution**](#understanding-distribution-metrics). + +{{< /programming-lang >}} +{{< /programming-lang-wrapper >}} + +## With the Datadog Forwarder + +Datadog recommends using the [Datadog Forwarder Lambda][9] to submit custom metrics from Lambda runtimes that are not yet supported by the Datadog Lambda Extension. + +1. Follow the general [serverless installation instructions][8] to instrument your Lambda function using the Datadog Forwarder Lambda function. +1. If you are not interested in collecting traces from your Lambda function, set the environment variable `DD_TRACE_ENABLED` to `false` on your own Lambda function. +1. If you are not interested in collecting logs from your Lambda function, set the Forwarder's CloudFormation stack parameter `DdForwardLog` to `false`. +1. Import and use the helper function from the Datadog Lambda Library, such as `lambda_metric` or `sendDistributionMetric`, to submit your custom metrics following the sample code below. {{< programming-lang-wrapper langs="python,nodeJS,go,ruby,java,other" >}} {{< programming-lang lang="python" >}} @@ -94,8 +160,7 @@ def lambda_handler(event, context): tags=['product:latte', 'order:online'] # Associated tags ) - # Submit a metric with a timestamp that is within the last 20 minutes, - # only supported when using the Forwarder Lambda + # Submit a metric with a timestamp that is within the last 20 minutes lambda_metric( "coffee_house.order_value", # Metric name 12.45, # Metric value @@ -117,8 +182,7 @@ async function myHandler(event, context) { 'order:online' // Second tag ); - // Submit a metric with a timestamp that is within the last 20 minutes, - // only supported when using the Forwarder Lambda + // Submit a metric with a timestamp that is within the last 20 minutes sendDistributionMetricWithDate( 'coffee_house.order_value', // Metric name 12.45, // Metric value @@ -126,10 +190,6 @@ async function myHandler(event, context) { 'order:online' // Second tag new Date(Date.now()), // date ); - return { - statusCode: 200, - body: 'hello, dog!' - }; } ``` {{< /programming-lang >}} @@ -144,14 +204,7 @@ import ( ) func main() { - // You only need to wrap your function handler (Not helper functions). lambda.Start(ddlambda.WrapFunction(myHandler, nil)) - /* OR with manual configuration options - lambda.Start(ddlambda.WrapFunction(myHandler, &ddlambda.Config{ - BatchInterval: time.Second * 15 - APIKey: "my-api-key", - })) - */ } func myHandler(ctx context.Context, event MyEvent) (string, error) { @@ -161,8 +214,7 @@ func myHandler(ctx context.Context, event MyEvent) (string, error) { "product:latte", "order:online" // Associated tags ) - // Submit a metric with a timestamp that is within the last 20 minutes, - // only supported when using the Forwarder Lambda + // Submit a metric with a timestamp that is within the last 20 minutes ddlambda.MetricWithTimestamp( "coffee_house.order_value", // Metric name 12.45, // Metric value @@ -187,15 +239,13 @@ def handler(event:, context:) "product":"latte", "order":"online" # Associated tags ) - # Submit a metric with a timestamp that is within the last 20 minutes, - # only supported when using the Forwarder Lambda + # Submit a metric with a timestamp that is within the last 20 minutes Datadog::Lambda.metric( 'coffee_house.order_value', # Metric name 12.45, # Metric value time: Time.now.utc, # Timestamp "product":"latte", "order":"online" # Associated tags ) - return { statusCode: 200, body: 'Hello World' } end end ``` @@ -254,7 +304,7 @@ For example: **Note**: If you are migrating to one of the recommended solutions, you'll need to start instrumenting your custom metrics under **new metric names** when submitting them to Datadog. The same metric name cannot simultaneously exist as both distribution and non-distribution metric types. -This requires the following AWS permissions in your [Datadog IAM policy][13]. +This requires the following AWS permissions in your [Datadog IAM policy][10]. | AWS Permission | Description | | ------------------------- | ----------------------------------------------------------- | @@ -274,7 +324,7 @@ Where: - `` is in seconds, not milliseconds. - `` MUST be a number (that is, integer or float). - `` is `count`, `gauge`, `histogram`, or `check`. -- `` uniquely identifies your metric and follows the [metric naming policy][12]. +- `` uniquely identifies your metric and follows the [metric naming policy][11]. - `` is optional, comma separated, and must be preceded by `#`. The tag `function_name:` is automatically applied to custom metrics. **Note**: The sum for each timestamp is used for counts and the last value for a given timestamp is used for gauges. It is not recommended to print a log statement every time you increment a metric, as this increases the time it takes to parse your logs. Continually update the value of the metric in your code, and print one log statement for that metric before the function finishes. @@ -287,8 +337,6 @@ Where: [6]: /logs/logs_to_metrics/ [7]: /tracing/generate_metrics/ [8]: /serverless/installation/ -[9]: /agent/guide/private-link/ -[10]: /agent/proxy/ -[11]: /serverless/forwarder/ -[12]: /metrics/ -[13]: /integrations/amazon_web_services/?tab=roledelegation#datadog-aws-iam-policy +[9]: /serverless/forwarder/ +[10]: /integrations/amazon_web_services/?tab=roledelegation#datadog-aws-iam-policy +[11]: /metrics/ From b07724c98c80ca806faecca5f9fc945c0bf9ea63 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 21 Apr 2022 12:01:20 -0400 Subject: [PATCH 22/35] misc --- content/en/serverless/custom_metrics/_index.md | 2 +- content/en/serverless/installation/dotnet.md | 14 +++++--------- content/en/serverless/installation/java.md | 2 ++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index 3d3b789626b1c..edaafad186584 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -133,7 +133,7 @@ end {{< /programming-lang >}} {{< programming-lang lang="other" >}} -[Install][14] the DogStatsD client for your runtime and follow the [sample code][15] to submit your custom metrics. Note: For accurate results, you must use [**distribution**](#understanding-distribution-metrics). +[Install][12] the DogStatsD client for your runtime and follow the [sample code][13] to submit your custom metrics. Note: For accurate results, you must use [**distribution**](#understanding-distribution-metrics). {{< /programming-lang >}} {{< /programming-lang-wrapper >}} diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 2e7b5203b2ab0..6af866b75a165 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -139,6 +139,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Set the required environment variables + - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. @@ -161,16 +162,11 @@ To install and configure the Datadog Serverless Plugin, follow these steps: `arn:aws:lambda::464622532012:layer:dd-trace-dotnet:{{< latest-lambda-layer-version layer="dd-trace-dotnet" >}}` -3. Configure your Lambda function with the following environment variables: - - ``` - DD_SITE = - DD_API_KEY_SECRET_ARN = - ``` - - - Replace `` with your [Datadog site][2] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. +3. Set the required environment variables + - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. + - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [2]: https://docs.datadoghq.com/getting_started/site/ diff --git a/content/en/serverless/installation/java.md b/content/en/serverless/installation/java.md index cf3a8d0dda7c4..fee4699979013 100644 --- a/content/en/serverless/installation/java.md +++ b/content/en/serverless/installation/java.md @@ -139,6 +139,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Set the required environment variables + - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. @@ -162,6 +163,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: 3. Set the required environment variables + - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. From e4c7b019876edb03b93fc3aab17f65ffc6f28a96 Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Thu, 21 Apr 2022 16:29:37 -0400 Subject: [PATCH 23/35] Grouping --- config/_default/menus/menus.en.yaml | 2 +- content/en/serverless/configuration/_index.md | 74 +++++++++--------- .../guide/forwarder_extension_migration.md | 77 ------------------- 3 files changed, 36 insertions(+), 117 deletions(-) delete mode 100644 content/en/serverless/guide/forwarder_extension_migration.md diff --git a/config/_default/menus/menus.en.yaml b/config/_default/menus/menus.en.yaml index ae5c33ad37790..a0b11866bf2fd 100644 --- a/config/_default/menus/menus.en.yaml +++ b/config/_default/menus/menus.en.yaml @@ -832,7 +832,7 @@ main: parent: serverless_installation identifier: serverless_installation_dotnet weight: 106 - - name: Configuration + - name: Advanced Configurations url: serverless/configuration parent: serverless identifier: serverless_configuration diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 202e736053c31..7e024a21fdacc 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -19,23 +19,28 @@ After [installing][1] Datadog serverless monitoring, you should be collecting me ## Table of contents -- [Connect telemetry using tags](#connect-telemetry-using-tags) -- [Collect the request and response payloads](#collect-the-request-and-response-payloads) +### Metrics - [Collect metrics from non-Lambda resources](#collect-metrics-from-non-lambda-resources) -- [Collect logs from non-Lambda resources](#collect-logs-from-non-lambda-resources) -- [Collect traces from non-Lambda resources](#collect-traces-from-non-lambda-resources) +- [Submit custom metrics](#submit-custom-metrics) + +### Logs - [Configure logs collection](#configure-logs-collection) -- [Configure trace collection](#configure-trace-collection) +- [Collect logs from non-Lambda resources](#collect-logs-from-non-lambda-resources) - [Connect logs and traces](#connect-logs-and-traces) + +### APM +- [Configure trace collection](#configure-trace-collection) +- [Collect the request and response payloads](#collect-the-request-and-response-payloads) +- [Collect traces from non-Lambda resources](#collect-traces-from-non-lambda-resources) +- [Propagate trace context over AWS resources](#propagate-trace-context-over-aws-resources) +- [Merge X-Ray and Datadog traces](#merge-x-ray-and-datadog-traces) - [Link errors to your source code](#link-errors-to-your-source-code) -- [Submit custom metrics](#submit-custom-metrics) -- [Monitor your applications](#monitor-your-applications) + +### Others +- [Connect telemetry using tags](#connect-telemetry-using-tags) - [Send telemetry over PrivateLink or proxy](#send-telemetry-over-privatelink-or-proxy) -- [Propagate trace context over AWS resources -](#propagate-trace-context-over-AWS-resources) -- [Merge X-Ray and Datadog traces](#merge-xray-and-datadog-traces) -- [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) - [Migrate to the Datadog Lambda extension](#migrate-to-the-datadog-lambda-extension) +- [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) - [Troubleshoot](#troubleshoot) ## Connect telemetry using tags @@ -516,29 +521,23 @@ export class ExampleStack extends cdk.Stack { You can monitor your custom business logic by [submitting custom metrics][21]. -## Monitor your applications - -Datadog has some predefined monitors that you can quickly enable in the [Serverless Homepage][22]. If you are using the Datadog serverless plugin, you can also [enable default and custom monitors in serverless.yml][23]. - -If your serverless application powers an API or webpage, you can also set up [synthetic tests][24]. - ## Send telemetry over PrivateLink or proxy -The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][25] to the US1 (`datadoghq.com`) [Datadog site][26], or [send data over a proxy][27] for all other sites. +The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][22] to the US1 (`datadoghq.com`) [Datadog site][23], or [send data over a proxy][24] for all other sites. -If you are using the Datadog Forwarder, follow these [instructions][28]. +If you are using the Datadog Forwarder, follow these [instructions][25]. ## Propagate trace context over AWS resources -Datadog automatically injects the trace context into outgoing AWS SDK requests and extract the trace context from the Lambda event, in order to trace a request or transaction over distributed services. See [additional information][29]. +Datadog automatically injects the trace context into outgoing AWS SDK requests and extract the trace context from the Lambda event, in order to trace a request or transaction over distributed services. See [additional information][26]. ## Merge X-Ray and Datadog traces -AWS X-Ray supports tracing through certain AWS managed services such as AppSync and Step Functions, which isn't yet supported by Datadog APM natively. You can enable the [Datadog X-Ray integration][30], and merge the X-Ray traces with the Datadog native traces. See [additional details][31]. +AWS X-Ray supports tracing through certain AWS managed services such as AppSync and Step Functions, which isn't yet supported by Datadog APM natively. You can enable the [Datadog X-Ray integration][27], and merge the X-Ray traces with the Datadog native traces. See [additional details][28]. ## Enable AWS Lambda code signing -[Code signing for AWS Lambda][32] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. +[Code signing for AWS Lambda][29] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. @@ -548,9 +547,9 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][33]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][30]. -To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][34]. For your convenience, the key differences are summarized below. +To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][31]. For your convenience, the key differences are summarized below. **Note**: Datadog recommends migrating your dev and staging applications first and migrating production applications one by one. @@ -607,7 +606,7 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte ## Troubleshoot -If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][35]. +If you have trouble configuring your installations, set the environment variable `DD_LOG_LEVEL` to `debug` for debugging logs. For additional troubleshooting tips, see the [serverless monitoring troubleshooting guide][32]. ## Further Reading @@ -636,17 +635,14 @@ If you have trouble configuring your installations, set the environment variable [19]: /logs/log_configuration/parsing/ [20]: /integrations/guide/source-code-integration [21]: /serverless/custom_metrics -[22]: https://app.datadoghq.com/functions -[23]: https://github.com/DataDog/serverless-plugin-datadog#serverless-monitors -[24]: /synthetics/ -[25]: /agent/guide/private-link/ -[26]: /getting_started/site/ -[27]: /agent/proxy/ -[28]: https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#aws-privatelink-support -[29]: /serverless/distributed_tracing/serverless_trace_propagation/ -[30]: /integrations/amazon_xray/ -[31]: /serverless/distributed_tracing/serverless_trace_merging -[32]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html -[33]: /serverless/guide/extension_motivation/ -[34]: /serverless/guide#install-using-the-datadog-forwarder -[35]: /serverless/guide/troubleshoot_serverless_monitoring/ +[22]: /agent/guide/private-link/ +[23]: /getting_started/site/ +[24]: /agent/proxy/ +[25]: https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#aws-privatelink-support +[26]: /serverless/distributed_tracing/serverless_trace_propagation/ +[27]: /integrations/amazon_xray/ +[28]: /serverless/distributed_tracing/serverless_trace_merging +[29]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html +[30]: /serverless/guide/extension_motivation/ +[31]: /serverless/guide#install-using-the-datadog-forwarder +[32]: /serverless/guide/troubleshoot_serverless_monitoring/ diff --git a/content/en/serverless/guide/forwarder_extension_migration.md b/content/en/serverless/guide/forwarder_extension_migration.md deleted file mode 100644 index 32ee63bc780b1..0000000000000 --- a/content/en/serverless/guide/forwarder_extension_migration.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Migrating from the Datadog Forwarder to the Datadog Lambda Extension -kind: guide ---- -## Overview - - -This guide explains how to migrate from the [Datadog Forwarder][1] to the Datadog Lambda Extension. - -The [Datadog Lambda Extension][2] is a lightweight version of the Datadog Agent built to run alongside your code with minimal performance overhead. - -Datadog recommends that you set up the Extension **before** removing the Forwarder. This means that for the period during which both the Extension and Forwarder are active, all telemetry is sent twice. The alternative (removing the Forwarder before setting up the Extension) results in a period of zero visibility. Depending on your organization's particular needs, you may prefer one outcome over the other. - -## Setting up the Datadog Lambda Extension {#extension-setup} - -See the [Datadog Lambda Extension documentation][2]. - -## Removing the Datadog Forwarder - -### Prevent the Forwarder from attaching to new functions {#prevent-forwarder} - -When you deploy a new function, the Datadog Forwarder detects an unsubscribed function and automatically creates a new subscription. If you used the automatic configuration for the Forwarder, it will not automatically resubscribe to your function's log groups if the Extension is installed on that function. - -{{< tabs >}} -{{% tab "Serverless Framework" %}} - -Remove the resource name of the Forwarder from your `serverless.yml` file. - -{{% /tab %}} -{{% tab "AWS SAM" %}} - -Remove the resource name of the Forwarder from your `template.yml` file. - -{{% /tab %}} -{{% tab "AWS CDK" %}} - -Remove the resource name of the Forwarder from your CDK stack. - -{{% /tab %}} -{{% tab "Zappa" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Chalice" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Datadog CLI" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Container Image" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{% tab "Custom" %}} - -Manually remove the subscription from the AWS console. - -{{% /tab %}} -{{< /tabs >}} - -For more information, see the [Datadog Forwarder documentation][1]. - -## Hybrid approach - -You may also wish to keep using the Datadog Forwarder for existing functions while using the Datadog Lambda Extension for all new functions. - -1. Ensure that the Forwarder [does not attach automatically](#prevent-forwarder) to new functions. -2. For each new function you deploy, [set up the Extension](#extension-setup) - -[1]: /logs/guide/forwarder/ -[2]: /serverless/libraries_integrations/extension/ From c533aee2872ff227aadf2c07bd6d742afa0e4c4b Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 22 Apr 2022 16:18:42 -0400 Subject: [PATCH 24/35] misc --- .../distributed_tracing/serverless_trace_propagation.md | 7 ++++++- content/en/serverless/guide/handler_wrapper.md | 9 +++++++-- content/en/serverless/installation/_index.md | 8 ++++---- content/en/serverless/installation/nodejs.md | 4 ++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md index 8dcf689fba8a4..11f891b1cfefc 100644 --- a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md +++ b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md @@ -91,7 +91,11 @@ exports.handler = async event => { ## Extracting trace context -To extract the above trace context from the consumer Lambda function, you need to define an extractor function that runs captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function (format is `.`, for example, `extractors.json` if the `json` extract method is in the `extractors.js` file). Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. +To extract the above trace context from the consumer Lambda function, you need to define an extractor function that runs captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function (format is `.`, for example, `extractors.json` if the `json` extractor is in the `extractors.js` file). Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. + +**Notes**: +- If you are using typescript or a bundler like webpack, you must `import` or `require` your node.js module where the extractors are defined, to ensure the module gets compiled and bundled into your Lambda deployment package. +- If your Node.js Lambda function runs on `arm64`, you must [define the extractor in your function code][6] instead of using the `DD_TRACE_EXTRACTOR` environment variable. ### Sample extractors @@ -173,3 +177,4 @@ ddlambda.WrapFunction(handler, cfg) [3]: /serverless/datadog_lambda_library [4]: /serverless/distributed_tracing#runtime-recommendations [5]: /tracing/setup_overview/custom_instrumentation/ +[6]: /serverless/guide/handler_wrapper/ diff --git a/content/en/serverless/guide/handler_wrapper.md b/content/en/serverless/guide/handler_wrapper.md index 7501f79bbea09..250f15ebf4c56 100644 --- a/content/en/serverless/guide/handler_wrapper.md +++ b/content/en/serverless/guide/handler_wrapper.md @@ -5,7 +5,7 @@ kind: documentation For Python and Node.js Lambda functions, in order to instrument individual invocations, the Datadog Lambda library needs to wrap around your Lambda handler function. This is achieved by setting your function's handler to the Datadog handler function, such as `datadog_lambda.handler.handler`, and setting the environment variable `DD_LAMBDA_HANDLER` with your original handler function to be called by the Datadog handler. -If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can apply the Datadog wrapper in your function code instead. +If your Lambda function configuration is incompatible with the Datadog handler redirection, you can apply the Datadog wrapper in your function code instead. 1. Follow the "Custom" installation instructions for [Python][1] or [Node.js][2] to install the Datadog serverless monitoring 2. Skip the step to configure the handler function @@ -23,10 +23,15 @@ If you are using a 3rd-party security or monitoring tool that is incompatible wi ```js // for node.js const { datadog } = require("datadog-lambda-js"); - const tracer = require("dd-trace").init({}); + const tracer = require("dd-trace").init({ + // optional tracer options + }); module.exports.myHandler = datadog(myHandler, { // my function code + }, { + // optional datadog config, e.g., custom trace context extractor + traceExtractor: () => {}, }); ``` diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index d67c686c8323f..60d45702681ab 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -14,11 +14,11 @@ further_reading: ## Quick start -If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2]. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. +If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2] to temporarily instrument your Lambda function for a quick start with Datadog. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. To instrument Lambda functions permanently, see the detailed installation instructions in the next section. ## Installation instructions -For more detailed installation instructions, select the Lambda runtime below: +For the detailed installation instructions, select the Lambda runtime below: {{< partial name="serverless/getting-started-languages.html" >}} @@ -27,8 +27,8 @@ For more detailed installation instructions, select the Lambda runtime below: After the installation and collecting the telemetry, follow the [advanced configurations][3] to: - connect your metrics, traces, and logs using tags -- collect metrics, traces, and logs from AWS API Gateway, SQS, etc. -- collect the request and response payloads for individual Lambda invocations +- collect telemetry from AWS resources such as API Gateway, AppSync, and Step Functions +- capture the request and response payloads for individual Lambda invocations - link errors of your Lambda functions to your source code - filter or scrub sensitive information from logs or traces diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 7d4c7e066b2b1..61ec791813994 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -242,7 +242,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your image's `CMD` value to `node_modules/datadog-lambda-js/dist/handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + **Note**: If your Lambda function runs on `arm64`, you must either build your container image in an arm64-based Amazon Linux environment or [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection. 4. Configure the Datadog site and API key @@ -308,7 +308,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your function's handler to `/opt/nodejs/node_modules/datadog-lambda-js/handler.handler` if using the layer, or `node_modules/datadog-lambda-js/dist/handler.handler` if using the package. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + **Note**: If your Lambda function runs on `arm64` and the `datadog-lambda-js` library is installed as a NPM package (option B of step 1), you must [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection. 4. Configure Datadog site and API key From 2b8a782c441bd8d6695473281c141a54077e20ce Mon Sep 17 00:00:00 2001 From: Tian Chu Date: Fri, 22 Apr 2022 16:40:09 -0400 Subject: [PATCH 25/35] misc --- content/en/serverless/installation/_index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index 60d45702681ab..8fc859d9ae004 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -14,7 +14,9 @@ further_reading: ## Quick start -If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2] to temporarily instrument your Lambda function for a quick start with Datadog. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. To instrument Lambda functions permanently, see the detailed installation instructions in the next section. +If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2] to instrument your Lambda function for a quick start with Datadog. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. + +The quick start process configures your Lambda functions on the fly. To instrument Lambda functions permanently, see the detailed installation instructions in the next section. ## Installation instructions From 439276a8ff0f8f36c19caa18833ee82cf798c56f Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 11:25:59 -0700 Subject: [PATCH 26/35] rearranging --- content/en/serverless/_index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/content/en/serverless/_index.md b/content/en/serverless/_index.md index d05b761a8e6b5..0293aee712120 100644 --- a/content/en/serverless/_index.md +++ b/content/en/serverless/_index.md @@ -51,7 +51,9 @@ further_reading: The following section outlines Datadog's solution for monitoring AWS serverless applications and Lambda functions. You can also learn more about support for monitoring [Azure serverless][2] and [Google serverless][3] applications. -## Explore Datadog Serverless Monitoring +## Explore Datadog Serverless Monitoring for AWS Lambda + +To get started, follow the [installation instructions][4] to collect metrics, traces, and logs from your serverless applications. ### Monitor your entire serverless stack in the Serverless view @@ -81,11 +83,7 @@ Easily correlate serverless code, configuration, and deployment changes with met {{< img src="serverless/serverless_deployment_tracking.jpeg" alt="Datadog Serverless Monitoring" style="width:100%;" >}} -## Getting Started - -Getting started to monitor your serverless application is quick and easy. Follow the [installation instructions][4] to collect metrics, traces, and logs from your serverless applications. - -## Other serverless clouds +## Datadog Serverless Monitoring for other serverless clouds ### Azure App Service From 36ea6989c51aac2ea42fd0679a519e0b38f3b915 Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 14:26:16 -0700 Subject: [PATCH 27/35] grammar edits --- content/en/serverless/configuration/_index.md | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index 7e024a21fdacc..c305f41b3095e 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -15,9 +15,7 @@ aliases: - /serverless/guide/extension_private_link/ --- -After [installing][1] Datadog serverless monitoring, you should be collecting metrics, traces and logs. Follow the instructions below to configure your installation for the optimal monitoring experience. - -## Table of contents +First, [install][1] Datadog serverless monitoring to begin collecting metrics, traces, and logs. After installation is complete, refer to the following topics to configure your installation to suit your monitoring needs. ### Metrics - [Collect metrics from non-Lambda resources](#collect-metrics-from-non-lambda-resources) @@ -38,19 +36,19 @@ After [installing][1] Datadog serverless monitoring, you should be collecting me ### Others - [Connect telemetry using tags](#connect-telemetry-using-tags) -- [Send telemetry over PrivateLink or proxy](#send-telemetry-over-privatelink-or-proxy) +- [Send telemetry over AWS PrivateLink or a proxy](#send-telemetry-over-privatelink-or-proxy) - [Migrate to the Datadog Lambda extension](#migrate-to-the-datadog-lambda-extension) - [Enable AWS Lambda code signing](#enable-aws-lambda-code-signing) - [Troubleshoot](#troubleshoot) ## Connect telemetry using tags -Connect Datadog telemetry together through the use of reserved (`env`, `service`, and `version`) and custom tags. With these tags you can navigate seamlessly across metrics, traces, and logs. Add the extra parameters below for the installation method you use. +Connect Datadog telemetry together through the use of reserved (`env`, `service`, and `version`) and custom tags. You can use these tags to navigate seamlessly across metrics, traces, and logs. Add the extra parameters below for the installation method you use. {{< tabs >}} {{% tab "Datadog CLI" %}} -Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with the extra arguments. For example: +Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with appropriate extra arguments. For example: ```sh datadog-ci lambda instrument \ @@ -118,13 +116,13 @@ datadog.addLambdaFunctions([]); {{% /tab %}} {{% tab "Others" %}} -If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][1], set the following environment variables to your Lambda functions. For example: +If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][1], set the following environment variables on your Lambda functions. For example: - DD_ENV: dev - DD_SERVICE: web - DD_VERSION: v1.2.3 - DD_TAGS: team:avengers,project:marvel -If you are collecting telemetry from your Lambda functions using the [Datadog Forwarder Lambda function][2], set the `env`, `service`, `version` and additional tags as AWS resource tags on your Lambda functions and ensure the `DdFetchLambdaTags` option is set to `true` on the CloudFormation stack for your Datadog Forwarder. This option defaults to true since version 3.19.0. +If you are collecting telemetry from your Lambda functions using the [Datadog Forwarder Lambda function][2], set the `env`, `service`, `version`, and additional tags as AWS resource tags on your Lambda functions. Ensure the `DdFetchLambdaTags` option is set to `true` on the CloudFormation stack for your Datadog Forwarder. This option defaults to true since version 3.19.0. [1]: /serverless/libraries_integrations/extension/ [2]: /serverless/libraries_integrations/forwarder/ @@ -133,7 +131,7 @@ If you are collecting telemetry from your Lambda functions using the [Datadog Fo Datadog can also enrich the collected telemetry with existing AWS resource tags defined on your Lambda functions. -- If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][2], you just need to enable the [Datadog AWS integration][3]. +- If you are collecting telemetry from your Lambda functions using the [Datadog Lambda extension][2], enable the [Datadog AWS integration][3]. - If you are collecting telemetry from your Lambda functions using the [Datadog Forwarder Lambda function][4], set the `DdFetchLambdaTags` option to `true` on the CloudFormation stack for your Datadog Forwarder. This option defaults to true since version 3.19.0. @@ -143,7 +141,7 @@ Datadog can also enrich the collected telemetry with existing AWS resource tags Datadog can [collect and visualize the JSON request and response payloads of AWS Lambda functions][5], giving you deeper insight into your serverless applications and helping troubleshoot Lambda function failures. -This feature is disabled by default, follow the instructions below for the installation method you use. +This feature is disabled by default. Follow the instructions below for the installation method you use. {{< tabs >}} {{% tab "Datadog CLI" %}} @@ -207,7 +205,7 @@ Set the environment variable `DD_CAPTURE_LAMBDA_PAYLOAD` to `true` on your Lambd {{% /tab %}} {{< /tabs >}} -To prevent any sensitive data within request or response JSON objects from being sent to Datadog, you can to scrub specific parameters from being sent to Datadog. +To prevent any sensitive data within request or response JSON objects from being sent to Datadog, you can to scrub specific parameters. To do this, add a new file `datadog.yaml` in the same folder as your Lambda function code. Obfuscation of fields in the Lambda payload is then available through [the replace_tags block][6] within `apm_config` settings in `datadog.yaml`: @@ -252,14 +250,14 @@ DD_APM_REPLACE_TAGS=[ ## Collect metrics from non-Lambda resources -In addition to the real-time [Datadog Lambda enhanced metrics][7], Datadog can also help you collect metrics for AWS managed resources, such as [API Gateway][8], [AppSync][9] and [SQS][10], to help you monitor your entire serverless application. The metrics also get enriched with the corresponding AWS resource tags. +In addition to collecting real-time [Datadog Lambda enhanced metrics][7], Datadog can also help you collect metrics for AWS managed resources—such as [API Gateway][8], [AppSync][9], and [SQS][10]—to help you monitor your entire serverless application. The metrics are also enriched with the corresponding AWS resource tags. -It only takes a few clicks to set up the [Datadog AWS integration][3]. +To collect these metrics, set up the [Datadog AWS integration][3]. ## Collect logs from non-Lambda resources Logs generated by managed resources besides AWS Lambda functions can be hugely valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you [collect logs][11] from the following AWS managed resources in your environment: -- API's: API Gateway, AppSync, ALB +- APIs: API Gateway, AppSync, ALB - Queues & Streams: SQS, SNS, Kinesis - Data Stores: DynamoDB, S3, RDS, etc. @@ -267,14 +265,14 @@ Logs generated by managed resources besides AWS Lambda functions can be hugely v
This feature is currently supported for Python, Node.js, Java, and .NET.
-Datadog can infer APM spans based on the incoming Lambda events for the AWS managed resources that trigger the Lambda function. This can be hugely valuable in helping visualize the relationship between the AWS managed resources and identify performance issues in your serverless applications. See [additional product details][12]. +Datadog can infer APM spans based on the incoming Lambda events for the AWS managed resources that trigger the Lambda function. This can be help visualize the relationship between AWS managed resources and identify performance issues in your serverless applications. See [additional product details][12]. The following resources are currently supported: -- API Gateway (REST API, HTTP API and WebSocket) +- API Gateway (REST API, HTTP API, and WebSocket) - Function URLs - SQS -- SNS (SNS messaged delivered via SQS are also supported) +- SNS (SNS messages delivered through SQS are also supported) - Kinesis Streams (if data is a JSON string or base64 encoded JSON string) - EventBridge (custom events, where `Details` is a JSON string) - S3 @@ -304,7 +302,7 @@ To scrub or filter other logs before sending them to Datadog, see [Advanced Log Logs collection through the Datadog Lambda extension is enabled by default. -If you want to stop collecting logs using the Datadog Forwarder Lambda function, simply remove the subscription filter from your own Lambda function's CloudWatch log group. +If you want to stop collecting logs using the Datadog Forwarder Lambda function, remove the subscription filter from your own Lambda function's CloudWatch log group. If you want to stop collecting logs using the Datadog Lambda extension, follow the instructions below for the installation method you use: @@ -351,7 +349,7 @@ Set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false` on your Lam ## Configure trace collection -To see what libraries and frameworks are automatically instrumented by Datadog APM client, see [Compatibility Requirements for APM][14]. To instrument custom applications, see Datadog APM guide for [custom instrumentation][15]. +To see what libraries and frameworks are automatically instrumented by the Datadog APM client, see [Compatibility Requirements for APM][14]. To instrument custom applications, see Datadog's APM guide for [custom instrumentation][15]. ### Filter or scrub sensitive information from traces @@ -361,7 +359,7 @@ To scrub trace attributes for data security, see [Configure the Datadog Agent or ### Disable trace collection -Trace collection through the Datadog Lambda extension is enabled by default, if you want to stop collecting traces from your Lambda functions follow the instructions below: +Trace collection through the Datadog Lambda extension is enabled by default. If you want to stop collecting traces from your Lambda functions, follow the instructions below: {{< tabs >}} {{% tab "Datadog CLI" %}} @@ -414,9 +412,11 @@ Set the environment variable `DD_TRACE_ENABLED` to `false` on your Lambda functi ## Connect logs and traces -If you are using the [Lambda extension][2] to collect traces and logs, Datadog automatically adds the AWS Lambda request id to the `aws.lambda` span under the `request_id` tag as well as the Lambda logs for the same request under the `lambda.request_id` attribute. The Datadog trace and log views are connected using the AWS Lambda request ID. +If you are using the [Lambda extension][2] to collect traces and logs, Datadog automatically adds the AWS Lambda request ID to the `aws.lambda` span under the `request_id` tag. Additionally, Lambda logs for the same request are added under the `lambda.request_id` attribute. The Datadog trace and log views are connected using the AWS Lambda request ID. + +If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` is automatically injected into logs (enabled by the environment variable `DD_LOGS_INJECTION`). The Datadog trace and log views are connected using the Datadog trace ID. This feature is supported for most applications using a popular runtime and logger (see the [support by runtime][18]). -If you are using the [Forwarder Lambda function][4] to collect traces and logs, `dd.trace_id` gets automatically injected into logs (enabled by the environment variable `DD_LOGS_INJECTION`). The Datadog trace and log views are connected using the Datadog trace ID. This feature is supported for most applications using a popular runtime and logger (see the [support by runtime][18]). If you are using a runtime or custom logger that isn't supported: +If you are using a runtime or custom logger that isn't supported, follow these steps: - When logging in JSON, you need to obtain the Datadog trace ID using `dd-trace` and add it to your logs under the `dd.trace_id` field: ```javascript { @@ -428,23 +428,23 @@ If you are using the [Forwarder Lambda function][4] to collect traces and logs, } ``` - When logging in plaintext, you need to: - 1. obtain the Datadog trace ID using `dd-trace` and add it to your log - 2. clone the default Lambda log pipeline, which is read-only - 3. enable the cloned pipeline while disable the default one - 4. update the [Grok parser][19] rules of the cloned pipeline to parse the Datadog trace ID into the `dd.trace_id` attribute. For example, use rule `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.*` for logs that look like `[INFO] dd.trace_id=4887065908816661012 My log message`. + 1. Obtain the Datadog trace ID using `dd-trace` and add it to your log. + 2. Clone the default Lambda log pipeline, which is read-only. + 3. Enable the cloned pipeline and disable the default one. + 4. Update the [Grok parser][19] rules of the cloned pipeline to parse the Datadog trace ID into the `dd.trace_id` attribute. For example, use rule `my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.*` for logs that look like `[INFO] dd.trace_id=4887065908816661012 My log message`. ## Link errors to your source code -
This feature is currently supported for Go, and Java.
+
This feature is supported for Go and Java.
-[Datadog source code integration][20] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in Github. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that must not be dirty or ahead of remote. +[Datadog source code integration][20] allows you to link your telemetry (such as stack traces) to the source code of your Lambda functions in GitHub. Follow the instructions below to enable the feature. **Note**: You must deploy from a local Git repository that is neither dirty nor ahead of remote. {{< tabs >}} {{% tab "Datadog CLI" %}} -Run `datadog-ci lambda instrument` with `--source-code-integration true` will automatically send Git metadata in the current local directory and add the required tags to your Lambda functions. +Run `datadog-ci lambda instrument` with `--source-code-integration true` to automatically send Git metadata in the current local directory and add the required tags to your Lambda functions. -**Note**: You must set environment variable `DATADOG_API_KEY` for `datadog-ci` to upload Git metadata. `DATADOG_API_KEY` will also be set on your Lambda functions to send telemetry unless you also have `DATADOG_API_KEY_SECRET_ARN` defined, which takes precedence over `DATADOG_API_KEY`. +**Note**: You must set environment variable `DATADOG_API_KEY` for `datadog-ci` to upload Git metadata. `DATADOG_API_KEY` is also set on your Lambda functions to send telemetry unless you also have `DATADOG_API_KEY_SECRET_ARN` defined, which takes precedence over `DATADOG_API_KEY`. ```sh @@ -453,7 +453,7 @@ Run `datadog-ci lambda instrument` with `--source-code-integration true` will au # required, to upload git metadata export DATADOG_API_KEY= -# optional, DATADOG_API_KEY will be used if undefined +# optional, DATADOG_API_KEY is used if undefined export DATADOG_API_KEY_SECRET_ARN= datadog-ci lambda instrument \ @@ -463,9 +463,9 @@ datadog-ci lambda instrument \ {{% /tab %}} {{% tab "Serverless Framework" %}} -With `enableSourceCodeIntegration` set to `true`, the Datadog serverless plugin will automatically send Git metadata in the current local directory and add the required tags to your Lambda functions. +With `enableSourceCodeIntegration` set to `true`, the Datadog serverless plugin automatically sends Git metadata in the current local directory and adds the required tags to your Lambda functions. -**Note**: You must set the `apiKey` parameter for the plugin to upload Git metadata. `apiKey` will also be set on your Lambda functions to send telemetry unless you also have `apiKeySecretArn` defined, which takes precedence over `apiKey`. +**Note**: You must set the `apiKey` parameter for the plugin to upload Git metadata. `apiKey` is also set on your Lambda functions to send telemetry unless you also have `apiKeySecretArn` defined, which takes precedence over `apiKey`. ```yaml custom: @@ -523,17 +523,17 @@ You can monitor your custom business logic by [submitting custom metrics][21]. ## Send telemetry over PrivateLink or proxy -The Datadog Lambda Extension needs access to public internet to send data to Datadog. If your Lambda functions are deployed in VPC without access to public internet, you can [send data over AWS PrivateLink][22] to the US1 (`datadoghq.com`) [Datadog site][23], or [send data over a proxy][24] for all other sites. +The Datadog Lambda Extension needs access to the public internet to send data to Datadog. If your Lambda functions are deployed in a VPC without access to public internet, you can [send data over AWS PrivateLink][22] to the `datadoghq.com` [Datadog site][23], or [send data over a proxy][24] for all other sites. If you are using the Datadog Forwarder, follow these [instructions][25]. ## Propagate trace context over AWS resources -Datadog automatically injects the trace context into outgoing AWS SDK requests and extract the trace context from the Lambda event, in order to trace a request or transaction over distributed services. See [additional information][26]. +Datadog automatically injects the trace context into outgoing AWS SDK requests and extracts the trace context from the Lambda event. This enables Datadog to trace a request or transaction over distributed services. See [additional information][26]. ## Merge X-Ray and Datadog traces -AWS X-Ray supports tracing through certain AWS managed services such as AppSync and Step Functions, which isn't yet supported by Datadog APM natively. You can enable the [Datadog X-Ray integration][27], and merge the X-Ray traces with the Datadog native traces. See [additional details][28]. +AWS X-Ray supports tracing through certain AWS managed services such as AppSync and Step Functions, which is not supported by Datadog APM natively. You can enable the [Datadog X-Ray integration][27] and merge the X-Ray traces with the Datadog native traces. See [additional details][28]. ## Enable AWS Lambda code signing From 0dbbd00a4bf4e2b15b48474034f2939f3648effc Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 14:27:02 -0700 Subject: [PATCH 28/35] grammar fix --- content/en/serverless/custom_metrics/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index edaafad186584..4d4a9ddc1abb5 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -58,7 +58,7 @@ Datadog recommends using the [Datadog Lambda Extension][1] to submit custom metr 1. Follow the general [serverless installation instructions][8] appropriate for your Lambda runtime. 1. If you are not interested in collecting traces from your Lambda function, set the environment variable `DD_TRACE_ENABLED` to `false`. 1. If you are not interested in collecting logs from your Lambda function, set the environment variable `DD_SERVERLESS_LOGS_ENABLED` to `false`. -1. Follow the sample code or instructions belows to submit your custom metric. +1. Follow the sample code or instructions below to submit your custom metric. {{< programming-lang-wrapper langs="python,nodeJS,go,ruby,other" >}} {{< programming-lang lang="python" >}} From 82c44ac56a2faa08aa9223c62775ef9f4a79b663 Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 14:27:50 -0700 Subject: [PATCH 29/35] style --- content/en/serverless/custom_metrics/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index 4d4a9ddc1abb5..89695eda7c469 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -140,7 +140,7 @@ end ## With the Datadog Forwarder -Datadog recommends using the [Datadog Forwarder Lambda][9] to submit custom metrics from Lambda runtimes that are not yet supported by the Datadog Lambda Extension. +Datadog recommends using the [Datadog Forwarder Lambda][9] to submit custom metrics from Lambda runtimes that are not supported by the Datadog Lambda Extension. 1. Follow the general [serverless installation instructions][8] to instrument your Lambda function using the Datadog Forwarder Lambda function. 1. If you are not interested in collecting traces from your Lambda function, set the environment variable `DD_TRACE_ENABLED` to `false` on your own Lambda function. From 562a1432f0f24c10174f8ff7fbe2527fcb1763be Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 15:35:30 -0700 Subject: [PATCH 30/35] Apply suggestions from code review --- content/en/serverless/distributed_tracing/_index.md | 2 +- .../distributed_tracing/serverless_trace_propagation.md | 4 ++-- content/en/serverless/enhanced_lambda_metrics/_index.md | 2 +- content/en/serverless/guide/datadog_forwarder_dotnet.md | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/en/serverless/distributed_tracing/_index.md b/content/en/serverless/distributed_tracing/_index.md index aa5a79a7346eb..250482cd1960c 100644 --- a/content/en/serverless/distributed_tracing/_index.md +++ b/content/en/serverless/distributed_tracing/_index.md @@ -38,7 +38,7 @@ The Datadog Python, Node.js, Ruby, Go, Java, and .NET tracing libraries support
New to serverless monitoring? Follow the installation steps here to get started.
-To start using Datadog APM with your serverless application, you can choose between generating traces using the Datadog's tracing client (`dd-trace`) or pulling X-Ray traces from AWS. +To start using Datadog APM with your serverless application, you can choose between generating traces using Datadog's tracing client (`dd-trace`) or pulling X-Ray traces from AWS. | [Datadog APM with dd-trace][1] | [Datadog APM with AWS X-Ray][2] | |---------------------------------|-------------------------------------------------------------------------| diff --git a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md index 11f891b1cfefc..e3858ba0b3988 100644 --- a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md +++ b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md @@ -91,10 +91,10 @@ exports.handler = async event => { ## Extracting trace context -To extract the above trace context from the consumer Lambda function, you need to define an extractor function that runs captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function (format is `.`, for example, `extractors.json` if the `json` extractor is in the `extractors.js` file). Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. +To extract the above trace context from the consumer Lambda function, you need to define an extractor function that runs captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function. The format for this is `.`. For example, `extractors.json` if the `json` extractor is in the `extractors.js` file. Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. **Notes**: -- If you are using typescript or a bundler like webpack, you must `import` or `require` your node.js module where the extractors are defined, to ensure the module gets compiled and bundled into your Lambda deployment package. +- If you are using TypeScript or a bundler like webpack, you must `import` or `require` your Node.js module where the extractors are defined. This ensures the module gets compiled and bundled into your Lambda deployment package. - If your Node.js Lambda function runs on `arm64`, you must [define the extractor in your function code][6] instead of using the `DD_TRACE_EXTRACTOR` environment variable. ### Sample extractors diff --git a/content/en/serverless/enhanced_lambda_metrics/_index.md b/content/en/serverless/enhanced_lambda_metrics/_index.md index 158f6dc57e9e7..9b2a13c0911a3 100644 --- a/content/en/serverless/enhanced_lambda_metrics/_index.md +++ b/content/en/serverless/enhanced_lambda_metrics/_index.md @@ -53,7 +53,7 @@ The following real-time enhanced Lambda metrics are available, and they are tagg {{< img src="serverless/serverless_custom_metrics.png" alt="Collecting Enhanced Metrics from AWS Lambda" >}} -Follow the [installation instructions][3] to set up instrumentation of your serverless applications, and the enhanced Lambda metrics are enabled by default. +Follow the [installation instructions][3] to set up instrumentation of your serverless applications. Enhanced Lambda metrics are enabled by default. ## Viewing your dashboard diff --git a/content/en/serverless/guide/datadog_forwarder_dotnet.md b/content/en/serverless/guide/datadog_forwarder_dotnet.md index 1a6f2bb6a4268..c96a2685e88ef 100644 --- a/content/en/serverless/guide/datadog_forwarder_dotnet.md +++ b/content/en/serverless/guide/datadog_forwarder_dotnet.md @@ -5,7 +5,7 @@ kind: guide ## Overview
-If you are a new user of Datadog Serverless, follow the instructions to instrument your Lambda functions using the Datadog Lambda Extension instead. If you have setup Datadog Serverless with the Datadog Forwarder before Lambda offered out-of-the-box functionality, use this guide to maintain your instance. +If you are a new user of Datadog Serverless, follow the instructions to instrument your Lambda functions using the Datadog Lambda Extension instead. If you have already set up Datadog Serverless with the Datadog Forwarder before Lambda offered out-of-the-box functionality, use this guide to maintain your instance.
## Prerequisites @@ -23,9 +23,9 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda enha ## What's next? -- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][5]. -- See the sample code to [monitor custom business logic](#monitor-custom-business-logic) -- See the [troubleshooting guide][6] if you have trouble collecting the telemetry +- You can now view metrics, logs, and traces on the [Serverless Homepage][5]. +- See the sample code to [monitor custom business logic](#monitor-custom-business-logic). +- See the [troubleshooting guide][6] if you have trouble collecting the telemetry. ## Monitor custom business logic From 2dd3e5e2a9c0217918593d0dae367f5b5c257431 Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 15:37:10 -0700 Subject: [PATCH 31/35] Apply suggestions from code review --- .../en/serverless/guide/extension_motivation.md | 2 +- content/en/serverless/guide/handler_wrapper.md | 6 +++--- content/en/serverless/installation/_index.md | 2 +- content/en/serverless/installation/dotnet.md | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/content/en/serverless/guide/extension_motivation.md b/content/en/serverless/guide/extension_motivation.md index 6eec547f1505c..07be47ce407ec 100644 --- a/content/en/serverless/guide/extension_motivation.md +++ b/content/en/serverless/guide/extension_motivation.md @@ -19,7 +19,7 @@ There are some key differences between the Lambda extension and the Forwarder, a {{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} -Although Lambda extension replaces the Forwarder as the recommended way to collect telemetry from Lambda functions. The Forwarder is required to collect and add metadata to other AWS service logs, including those from API Gateway, AppSync, and Lambda@Edge. +Although the Lambda Extension replaces the Forwarder as the recommended way to collect telemetry from Lambda functions, the Forwarder is required to collect and add metadata to other AWS service logs—including those from API Gateway, AppSync, and Lambda@Edge. ### Advantages diff --git a/content/en/serverless/guide/handler_wrapper.md b/content/en/serverless/guide/handler_wrapper.md index 250f15ebf4c56..82f9102bf05a1 100644 --- a/content/en/serverless/guide/handler_wrapper.md +++ b/content/en/serverless/guide/handler_wrapper.md @@ -7,9 +7,9 @@ For Python and Node.js Lambda functions, in order to instrument individual invoc If your Lambda function configuration is incompatible with the Datadog handler redirection, you can apply the Datadog wrapper in your function code instead. -1. Follow the "Custom" installation instructions for [Python][1] or [Node.js][2] to install the Datadog serverless monitoring -2. Skip the step to configure the handler function -3. Skip the step to set the environment variable `DD_LAMBDA_HANDLER` +1. Follow the **Custom** installation instructions for [Python][1] or [Node.js][2] to install the Datadog serverless monitoring. +2. Skip the step to configure the handler function. +3. Skip the step to set the environment variable `DD_LAMBDA_HANDLER`. 4. Apply the Datadog wrapper in your function code like below: ```python # for python diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index 8fc859d9ae004..f7d65504b2d4d 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -14,7 +14,7 @@ further_reading: ## Quick start -If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2] to instrument your Lambda function for a quick start with Datadog. Completing the steps will configure your Lambda functions to send real-time metrics, logs, and traces to Datadog. +If you are new to Datadog, [sign up for a Datadog account][1], then follow the Datadog Agent installation instructions for [AWS Lambda][2] to instrument your Lambda function for a quick start with Datadog. Completing the steps configures your Lambda functions to send real-time metrics, logs, and traces to Datadog. The quick start process configures your Lambda functions on the fly. To instrument Lambda functions permanently, see the detailed installation instructions in the next section. diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 6af866b75a165..3fb1537902f38 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -15,7 +15,7 @@ further_reading:
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
## Installation @@ -32,7 +32,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins npm install -g @datadog/datadog-ci ``` -2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in the interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. +2. If you are new to Datadog serverless monitoring, launch the Datadog CLI in interactive mode to guide your first installation for a quick start, and you can ignore the remaining steps. To permanently install Datadog for your production applications, skip this step and follow the remaining ones to run the Datadog CLI command in your CI/CD pipelines _after_ your normal deployment. ```sh datadog-ci lambda instrument -i @@ -40,7 +40,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 3. Configure the AWS credentials - Datadog CLI requires access to the AWS Lambda service, and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. + The Datadog CLI requires access to the AWS Lambda service and depends on the AWS JavaScript SDK to [resolve the credentials][1]. Ensure your AWS credentials are configured using the same method you would use when invoking the AWS CLI. 4. Configure the Datadog site @@ -52,7 +52,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 5. Configure the Datadog API key - Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string (not a JSON blob). Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. ```sh export DATADOG_API_KEY_SECRET_ARN="" @@ -107,7 +107,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: To fill in the placeholders: - Replace `` with your [Datadog site][3] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can instead use `apiKey` and set the Datadog API key in plaintext. For more information and additional settings, see the [plugin documentation][1]. @@ -141,7 +141,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension [2]: https://github.com/DataDog/dd-trace-dotnet/releases @@ -166,7 +166,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [2]: https://docs.datadoghq.com/getting_started/site/ @@ -176,7 +176,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: ## What's next? -- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- You can now view metrics, logs, and traces on the [Serverless Homepage][1]. - Submit a [custom metric][2] or [APM span][3] to monitor your business logic. - See the [troubleshooting guide][4] if you have trouble collecting the telemetry - See the [advanced configurations][5] to From 5acf67d69fc7bccab8fb776569e374282194fa44 Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 15:39:08 -0700 Subject: [PATCH 32/35] Apply suggestions from code review --- content/en/serverless/installation/go.md | 8 +++---- content/en/serverless/installation/java.md | 16 +++++++------- content/en/serverless/installation/nodejs.md | 22 ++++++++++---------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index c8ab4b2a479cd..d0a75a34e58f4 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -15,9 +15,9 @@ aliases: - /serverless/datadog_lambda_library/go/ --- -
If your Go Lambda functions are still using runtime `go1.x` and you cannot migrate to the `provided.al2` runtime, you must instrument using the Datadog Forwarder instead.
+
If your Go Lambda functions are still using runtime go1.x and you cannot migrate to the provided.al2 runtime, you must instrument using the Datadog Forwarder instead.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in a VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
## Installation @@ -45,7 +45,7 @@ custom: To fill in the placeholders: - Replace `` with your [Datadog site][3] to send the telemetry to. -- Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. +- Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can instead use `apiKey` and set the Datadog API key in plaintext. For more information and additional settings, see the [plugin documentation][1]. @@ -78,7 +78,7 @@ Replace `` with a valid AWS region, such as `us-east-1`. ### Configure the required environment variables - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. -- Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. +- Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [2]: https://docs.datadoghq.com/getting_started/site/ diff --git a/content/en/serverless/installation/java.md b/content/en/serverless/installation/java.md index fee4699979013..b79758adbf847 100644 --- a/content/en/serverless/installation/java.md +++ b/content/en/serverless/installation/java.md @@ -15,9 +15,9 @@ aliases: - /serverless/datadog_lambda_library/java/ --- -
To fully instrument your serverless application with distributed tracing, your Java Lambda functions must be using the Java 8 Corretto (`java8.al2`) or Java 11 (`java11`) runtimes.
+
To fully instrument your serverless application with distributed tracing, your Java Lambda functions must be using the Java 8 Corretto (java8.al2) or Java 11 (java11) runtimes.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in a VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
@@ -56,7 +56,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 5. Configure the Datadog API key - Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string (not a JSON blob). Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. ```sh export DATADOG_API_KEY_SECRET_ARN="" @@ -70,7 +70,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 6. Instrument your Lambda functions - **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. + **Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation result is unsatisfactory, run `uninstrument` with the same arguments to revert the changes. To instrument your Lambda functions, run the following command. @@ -111,7 +111,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: To fill in the placeholders: - Replace `` with your [Datadog site][3] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can instead use `apiKey` and set the Datadog API key in plaintext. For more information and additional settings, see the [plugin documentation][1]. @@ -141,7 +141,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension [2]: https://docs.datadoghq.com/getting_started/site/ @@ -165,7 +165,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: - Set `AWS_LAMBDA_EXEC_WRAPPER` to `/opt/datadog_wrapper`. - Set `DD_SITE` to your [Datadog site][2] to send the telemetry to. - - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set `DD_API_KEY_SECRET_ARN` to the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [2]: https://docs.datadoghq.com/getting_started/site/ @@ -175,7 +175,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: ## What's next? -- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- You can now view metrics, logs, and traces on the [Serverless Homepage][1]. - Submit a [custom metric][2] or [APM span][3] to monitor your business logic. - See the [troubleshooting guide][4] if you have trouble collecting the telemetry - See the [advanced configurations][5] to diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 61ec791813994..597760fe9773c 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -21,7 +21,7 @@ aliases:
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
If you are bundling using webpack or esbuild, you may need to mark the Datadog libraries as external.
@@ -60,7 +60,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 5. Configure the Datadog API key - Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string (not a JSON blob). Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. ```sh export DATADOG_API_KEY_SECRET_ARN="" @@ -118,7 +118,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: To fill in the placeholders: - Replace `` with your [Datadog site][3] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can instead use `apiKey` and set the Datadog API key in plaintext. For more information and additional settings, see the [plugin documentation][1]. @@ -129,7 +129,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: {{% /tab %}} {{% tab "AWS SAM" %}} -The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog to your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog on your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. 1. Install the Datadog CloudFormation macro @@ -162,7 +162,7 @@ The [Datadog CloudFormation macro][1] automatically transforms your SAM applicat To fill in the placeholders: - Replace `` with your [Datadog site][4] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `apiKey` instead and set the Datadog API key in plaintext. More information and additional parameters can be found in the [macro documentation][1]. @@ -175,7 +175,7 @@ The [Datadog CloudFormation macro][1] automatically transforms your SAM applicat {{% /tab %}} {{% tab "AWS CDK" %}} -The [Datadog CDK Construct][1] automatically installs Datadog to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. +The [Datadog CDK Construct][1] automatically installs Datadog on your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. 1. Install the Datadog CDK constructs library @@ -207,7 +207,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions To fill in the placeholders: - Replace `` with your [Datadog site][2] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob).The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `apiKey` instead and set the Datadog API key in plaintext. More information and additional parameters can be found on the [Datadog CDK documentation][1]. @@ -242,12 +242,12 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your image's `CMD` value to `node_modules/datadog-lambda-js/dist/handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If your Lambda function runs on `arm64`, you must either build your container image in an arm64-based Amazon Linux environment or [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection. + **Note**: If your Lambda function runs on `arm64`, you must either build your container image in an arm64-based Amazon Linux environment or [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a third-party security or monitoring tool that is incompatible with the Datadog handler redirection. 4. Configure the Datadog site and API key - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://gallery.ecr.aws/datadog/lambda-extension @@ -308,12 +308,12 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your function's handler to `/opt/nodejs/node_modules/datadog-lambda-js/handler.handler` if using the layer, or `node_modules/datadog-lambda-js/dist/handler.handler` if using the package. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If your Lambda function runs on `arm64` and the `datadog-lambda-js` library is installed as a NPM package (option B of step 1), you must [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection. + **Note**: If your Lambda function runs on `arm64` and the `datadog-lambda-js` library is installed as a NPM package (option B of step 1), you must [apply the Datadog wrapper in your function code][2] instead. You may also need to do that if you are using a third-party security or monitoring tool that is incompatible with the Datadog handler redirection. 4. Configure Datadog site and API key - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. [1]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html [2]: https://docs.datadoghq.com/serverless/guide/handler_wrapper From 94f66df34c20a1e7f2fa8e86e4af71fe232c577e Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 15:40:08 -0700 Subject: [PATCH 33/35] Apply suggestions from code review --- content/en/serverless/installation/python.md | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/content/en/serverless/installation/python.md b/content/en/serverless/installation/python.md index 3a18392173d80..bc33dab2ab982 100644 --- a/content/en/serverless/installation/python.md +++ b/content/en/serverless/installation/python.md @@ -18,7 +18,7 @@ aliases:
If your Python Lambda functions are written in Python 3.6 or less, or you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
-
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the US1 (`datadoghq.com`) Datadog site, or using a proxy for all other sites.
+
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
## Installation @@ -55,7 +55,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 5. Configure the Datadog API key - Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string, instead of being inside a json blob. Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. + Datadog recommends saving the Datadog API key in AWS Secrets Manager for security and easy rotation. The key needs to be stored as a plaintext string (not a JSON blob). Ensure your Lambda functions have the required `secretsmanager:GetSecretValue` IAM permission. ```sh export DATADOG_API_KEY_SECRET_ARN="" @@ -69,7 +69,7 @@ The Datadog CLI modifies existing Lambda functions' configurations to enable ins 6. Instrument your Lambda functions - **Note**: Instrument your Lambda functions in a dev or staging environment first! Should the instrumentation result be unsatisfactory, run `uninstrument` with the same arguments to revert the changes. + **Note**: Instrument your Lambda functions in a dev or staging environment first. If the instrumentation result is unsatisfactory, run `uninstrument` with the same arguments to revert the changes. To instrument your Lambda functions, run the following command. @@ -111,7 +111,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: To fill in the placeholders: - Replace `` with your [Datadog site][3] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can instead use `apiKey` and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can instead use `apiKey` and set the Datadog API key in plaintext. For more information and additional settings, see the [plugin documentation][1]. @@ -122,7 +122,7 @@ To install and configure the Datadog Serverless Plugin, follow these steps: {{% /tab %}} {{% tab "AWS SAM" %}} -The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog to your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. +The [Datadog CloudFormation macro][1] automatically transforms your SAM application template to install Datadog on your functions using Lambda layers, and configures your functions to send metrics, traces, and logs to Datadog through the [Datadog Lambda Extension][2]. 1. Install the Datadog CloudFormation macro @@ -155,7 +155,7 @@ The [Datadog CloudFormation macro][1] automatically transforms your SAM applicat To fill in the placeholders: - Replace `` with your [Datadog site][4] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][5] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `apiKey` instead and set the Datadog API key in plaintext. More information and additional parameters can be found in the [macro documentation][1]. @@ -168,7 +168,7 @@ The [Datadog CloudFormation macro][1] automatically transforms your SAM applicat {{% /tab %}} {{% tab "AWS CDK" %}} -The [Datadog CDK Construct][1] automatically installs Datadog to your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. +The [Datadog CDK Construct][1] automatically installs Datadog on your functions using Lambda Layers, and configures your functions to send metrics, traces, and logs to Datadog through the Datadog Lambda Extension. 1. Install the Datadog CDK constructs library @@ -200,7 +200,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions To fill in the placeholders: - Replace `` with your [Datadog site][2] to send the telemetry to. - - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `apiKey` instead and set the Datadog API key in plaintext. + - Replace `` with the ARN of the AWS secret where your [Datadog API key][3] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `apiKey` instead and set the Datadog API key in plaintext. More information and additional parameters can be found on the [Datadog CDK documentation][1]. @@ -235,12 +235,12 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your image's `CMD` value to `datadog_lambda.handler.handler`. You can set this in AWS or directly in your Dockerfile. Note that the value set in AWS overrides the value in the Dockerfile if you set both. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. + **Note**: If you are using a third-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][2] instead. 4. Configure the Datadog site, API key, and tracing - Set the environment variable `DD_SITE` with your [Datadog site][3] to send the telemetry to. - - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string, instead of being inside a json blob. The `secretsmanager:GetSecretValue` permission is required. For quick testings, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. + - Set the environment variable `DD_API_KEY_SECRET_ARN` with the ARN of the AWS secret where your [Datadog API key][4] is securely stored. The key needs to be stored as a plaintext string (not a JSON blob). The `secretsmanager:GetSecretValue` permission is required. For quick testing, you can use `DD_API_KEY` instead and set the Datadog API key in plaintext. - Set the environment variable `DD_TRACE_ENABLED` to `true`. @@ -277,13 +277,13 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions Replace `` with a valid AWS region, such as `us-east-1`. The available `RUNTIME` options are `Python37`, `Python38` and `Python39`. - - Option B: If you cannot use the prebuilt Datadog Lambda layer for some reason, alternatively install the `datadog-lambda` package and its dependencies locally to your function project folder using your favorite Python package manager, such as `pip`. + - Option B: If you cannot use the prebuilt Datadog Lambda layer, alternatively install the `datadog-lambda` package and its dependencies locally to your function project folder using your favorite Python package manager, such as `pip`. ```sh pip install datadog-lambda -t ./ ``` - **Note**: `datadog-lambda` depends on `ddtrace`, which uses native extensions; therefore they must be installed and compiled in a Linux environment on the right architecture (`x86_64` or `arm64`). For example, you can use [dockerizePip][2] for the Serverless Framework and [--use-container][3] for AWS SAM. For more details, see [how to add dependencies to your function deployment package][4]. + **Note**: `datadog-lambda` depends on `ddtrace`, which uses native extensions; therefore it must be installed and compiled in a Linux environment on the right architecture (`x86_64` or `arm64`). For example, you can use [dockerizePip][2] for the Serverless Framework and [--use-container][3] for AWS SAM. For more details, see [how to add dependencies to your function deployment package][4]. See the [latest release][5]. @@ -312,7 +312,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions - Set your function's handler to `datadog_lambda.handler.handler`. - Set the environment variable `DD_LAMBDA_HANDLER` to your original handler, for example, `myfunc.handler`. - **Note**: If you are using a 3rd-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][6] instead. + **Note**: If you are using a third-party security or monitoring tool that is incompatible with the Datadog handler redirection, you can [apply the Datadog wrapper in your function code][6] instead. 4. Configure the Datadog site, API key, and tracing @@ -353,7 +353,7 @@ The [Datadog CDK Construct][1] automatically installs Datadog to your functions ## What's next? -- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][1]. +- You can now view metrics, logs, and traces on the [Serverless Homepage][1]. - See the sample code to [monitor custom business logic](#monitor-custom-business-logic) - See the [troubleshooting guide][2] if you have trouble collecting the telemetry - See the [advanced configurations][3] to From b3056fa13bfef46af5d1d21fb384b16c15069cca Mon Sep 17 00:00:00 2001 From: cswatt Date: Wed, 27 Apr 2022 15:40:57 -0700 Subject: [PATCH 34/35] Apply suggestions from code review --- content/en/serverless/installation/ruby.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/serverless/installation/ruby.md b/content/en/serverless/installation/ruby.md index a721a17a8a570..1f0156bb9319f 100644 --- a/content/en/serverless/installation/ruby.md +++ b/content/en/serverless/installation/ruby.md @@ -42,7 +42,7 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda trac Replace `` with a valid AWS region, such as `us-east-1`. - - Option B: If you cannot use the prebuilt Datadog Lambda layer, alternatively you can add the following to your Gemfile: + - Option B: If you cannot use the prebuilt Datadog Lambda layer, you can add the following to your Gemfile as an alternative: ```Gemfile gem 'datadog-lambda' @@ -91,7 +91,7 @@ The [Datadog Forwarder Lambda function][1] is required to ingest AWS Lambda trac ## What's next? -- Congratulations! You can now view metrics, logs, and traces on the [Serverless Homepage][4]. +- You can now view metrics, logs, and traces on the [Serverless Homepage][4]. - See the sample code to [monitor custom business logic](#monitor-custom-business-logic) - See the [troubleshooting guide][5] if you have trouble collecting the telemetry - See the [advanced configurations][6] to @@ -146,7 +146,7 @@ def some_operation() end ``` -For more information on custom metric submission, see [here][7]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][8]. +For more information on custom metric submission, see [Serverless Custom Metrics][7]. For additional details on custom instrumentation, see the Datadog APM documentation for [custom instrumentation][8]. ## Further Reading From 8fadccd6cdfb2c23aa68760d08722bdabcec758c Mon Sep 17 00:00:00 2001 From: Heston Hoffman Date: Thu, 28 Apr 2022 16:10:43 -0700 Subject: [PATCH 35/35] Apply suggestions from code review --- .../en/security/guide/tls_deprecation_1_2.md | 2 +- content/en/serverless/configuration/_index.md | 28 ++++++++++--------- .../en/serverless/custom_metrics/_index.md | 2 ++ .../serverless/distributed_tracing/_index.md | 12 ++++---- .../serverless_trace_propagation.md | 2 +- .../guide/datadog_forwarder_dotnet.md | 3 -- .../serverless/guide/extension_motivation.md | 4 +-- .../en/serverless/guide/handler_wrapper.md | 2 +- content/en/serverless/installation/_index.md | 2 +- content/en/serverless/installation/dotnet.md | 2 +- content/en/serverless/installation/go.md | 2 +- content/en/serverless/installation/java.md | 2 +- content/en/serverless/installation/nodejs.md | 2 +- content/en/tracing/visualization/service.md | 4 +-- 14 files changed, 35 insertions(+), 34 deletions(-) diff --git a/content/en/security/guide/tls_deprecation_1_2.md b/content/en/security/guide/tls_deprecation_1_2.md index 79b633f11e047..088f0a919e37e 100644 --- a/content/en/security/guide/tls_deprecation_1_2.md +++ b/content/en/security/guide/tls_deprecation_1_2.md @@ -117,7 +117,7 @@ On a 64 bit .Net Framework (version 4 and above): [3]: https://caniuse.com/tls1-2 [4]: https://github.com/DataDog/dd-agent/blob/5.32.8/packaging/datadog-agent/source/setup_agent.sh [5]: https://www.openssl.org/news/changelog.html#openssl-101. -[6]: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#%23configuring-security-via-appcontext-switches-for-net-framework-46-or-later-versions +[6]: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-security-via-appcontext-switches-for-net-framework-46-or-later-versions [7]: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls [8]: https://github.com/markekraus/BetterTls [9]: https://docs.microsoft.com/en-us/officeonlineserver/enable-tls-1-1-and-tls-1-2-support-in-office-online-server diff --git a/content/en/serverless/configuration/_index.md b/content/en/serverless/configuration/_index.md index c305f41b3095e..fec599a7f829a 100644 --- a/content/en/serverless/configuration/_index.md +++ b/content/en/serverless/configuration/_index.md @@ -48,7 +48,7 @@ Connect Datadog telemetry together through the use of reserved (`env`, `service` {{< tabs >}} {{% tab "Datadog CLI" %}} -Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with appropriate extra arguments. For example: +Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument` command with appropriate extra arguments. For example: ```sh datadog-ci lambda instrument \ @@ -146,7 +146,7 @@ This feature is disabled by default. Follow the instructions below for the insta {{< tabs >}} {{% tab "Datadog CLI" %}} -Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument command` with the extra `--capture-lambda-payload` argument. For example: +Ensure you are using the latest version of the [Datadog CLI][1] and run the `datadog-ci lambda instrument` command with the extra `--capture-lambda-payload` argument. For example: ```sh datadog-ci lambda instrument \ @@ -205,7 +205,7 @@ Set the environment variable `DD_CAPTURE_LAMBDA_PAYLOAD` to `true` on your Lambd {{% /tab %}} {{< /tabs >}} -To prevent any sensitive data within request or response JSON objects from being sent to Datadog, you can to scrub specific parameters. +To prevent any sensitive data within request or response JSON objects from being sent to Datadog, you can scrub specific parameters. To do this, add a new file `datadog.yaml` in the same folder as your Lambda function code. Obfuscation of fields in the Lambda payload is then available through [the replace_tags block][6] within `apm_config` settings in `datadog.yaml`: @@ -256,10 +256,10 @@ To collect these metrics, set up the [Datadog AWS integration][3]. ## Collect logs from non-Lambda resources -Logs generated by managed resources besides AWS Lambda functions can be hugely valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you [collect logs][11] from the following AWS managed resources in your environment: +Logs generated by managed resources besides AWS Lambda functions can be valuable in helping identify the root cause of issues in your serverless applications. Datadog recommends you [collect logs][11] from the following AWS managed resources in your environment: - APIs: API Gateway, AppSync, ALB - Queues & Streams: SQS, SNS, Kinesis -- Data Stores: DynamoDB, S3, RDS, etc. +- Data Stores: DynamoDB, S3, RDS ## Collect traces from non-Lambda resources @@ -529,7 +529,7 @@ If you are using the Datadog Forwarder, follow these [instructions][25]. ## Propagate trace context over AWS resources -Datadog automatically injects the trace context into outgoing AWS SDK requests and extracts the trace context from the Lambda event. This enables Datadog to trace a request or transaction over distributed services. See [additional information][26]. +Datadog automatically injects the trace context into outgoing AWS SDK requests and extracts the trace context from the Lambda event. This enables Datadog to trace a request or transaction over distributed services. See [Serverless Trace Propagation][26]. ## Merge X-Ray and Datadog traces @@ -539,7 +539,9 @@ AWS X-Ray supports tracing through certain AWS managed services such as AppSync [Code signing for AWS Lambda][29] helps to ensure that only trusted code is deployed from your Lambda functions to AWS. When you enable code signing on your functions, AWS validates that all of the code in your deployments is signed by a trusted source, which you define from your code signing configuration. -If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN below to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. +If your Lambda functions are configured to use code signing, you must add Datadog's Signing Profile ARN to your function's code signing configuration before you can deploy Lambda functions using Lambda Layers published by Datadog. + +Datadog's Signing Profile ARN: ``` arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc @@ -547,7 +549,7 @@ arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProf ## Migrate to the Datadog Lambda extension -Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [why should you migrate][30]. +Datadog can collect the monitoring data from your Lambda functions either using the [Forwarder Lambda function][4] or the [Lambda extension][2]. Datadog recommends the Lambda extension for new installations. If you are unsure, see [Deciding to migrate to the Datadog Lambda extension][30]. To migrate, compare the [installation instructions using the Datadog Lambda Extension][1] against the [instructions using the Datadog Forwarder][31]. For your convenience, the key differences are summarized below. @@ -558,8 +560,8 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte 1. Upgrade `@datadog/datadog-ci` to the latest version 2. Update the `--layer-version` argument and set it to the latest version for your runtime. -3. Set the `--extension-version` argument to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} -4. Set the required environment variable `DATADOG_SITE` and `DATADOG_API_KEY_SECRET_ARN`. +3. Set the `--extension-version` argument to the latest extension version. The latest extension version is `{{< latest-lambda-layer-version layer="extension" >}}`. +4. Set the required environment variables `DATADOG_SITE` and `DATADOG_API_KEY_SECRET_ARN`. 5. Remove the `--forwarder` argument. 6. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. @@ -569,14 +571,14 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte 1. Upgrade `serverless-plugin-datadog` to the latest version, which installs the Datadog Lambda Extension by default, unless you set `addExtension` to `false`. 2. Set the required parameters `site` and `apiKeySecretArn`. 3. Set the `env`, `service`, and `version` parameters if you previously set them as Lambda resource tags. The plugin will automatically set them through the Datadog reserved environment variables instead, such as `DD_ENV`, when using the extension. -4. Remove the `forwarderArn` parameter, unless you want to keep the Forwarder for collecting logs from non-Lambda resources, that is, you have `subscribeToApiGatewayLogs`, `subscribeToHttpApiLogs`, or `subscribeToWebsocketLogs` set to `true`. +4. Remove the `forwarderArn` parameter, unless you want to keep the Forwarder for collecting logs from non-Lambda resources and you have `subscribeToApiGatewayLogs`, `subscribeToHttpApiLogs`, or `subscribeToWebsocketLogs` set to `true`. 5. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. {{% /tab %}} {{% tab "AWS SAM" %}} 1. Update the `datadog-serverless-macro` CloudFormation stack to pick up the latest version. -2. Set the `extensionLayerVersion` parameter to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} +2. Set the `extensionLayerVersion` parameter to the latest extension version. The latest extension version is `{{< latest-lambda-layer-version layer="extension" >}}`. 3. Set the required parameters `site` and `apiKeySecretArn`. 4. Remove the `forwarderArn` parameter. 5. If you configured the Datadog AWS integration to automatically subscribe the Forwarder to Lambda log groups, disable that after you migrate _all_ the Lambda functions in that region. @@ -585,7 +587,7 @@ To migrate, compare the [installation instructions using the Datadog Lambda Exte {{% tab "AWS CDK" %}} 1. Upgrade `datadog-cdk-constructs` or `datadog-cdk-constructs-v2` to the latest version. -2. Set the `extensionLayerVersion` parameter to the latest extension version {{< latest-lambda-layer-version layer="extension" >}} +2. Set the `extensionLayerVersion` parameter to the latest extension version. The latest extension version is `{{< latest-lambda-layer-version layer="extension" >}}`. 3. Set the required parameters `site` and `apiKeySecretArn`. 4. Set the `env`, `service`, and `version` parameters if you previously set them as Lambda resource tags. The construct will automatically set them through the Datadog reserved environment variables instead, such as `DD_ENV`, when using the extension. 5. Remove the `forwarderArn` parameter. diff --git a/content/en/serverless/custom_metrics/_index.md b/content/en/serverless/custom_metrics/_index.md index 89695eda7c469..643edddb13d91 100644 --- a/content/en/serverless/custom_metrics/_index.md +++ b/content/en/serverless/custom_metrics/_index.md @@ -340,3 +340,5 @@ Where: [9]: /serverless/forwarder/ [10]: /integrations/amazon_web_services/?tab=roledelegation#datadog-aws-iam-policy [11]: /metrics/ +[12]: /developers/dogstatsd/?tab=hostagent#install-the-dogstatsd-client +[13]: /developers/dogstatsd/?tab=hostagent#instantiate-the-dogstatsd-client diff --git a/content/en/serverless/distributed_tracing/_index.md b/content/en/serverless/distributed_tracing/_index.md index 250482cd1960c..845138be9604a 100644 --- a/content/en/serverless/distributed_tracing/_index.md +++ b/content/en/serverless/distributed_tracing/_index.md @@ -71,7 +71,7 @@ For Python and Node.js serverless applications, Datadog recommends you [install If you are already tracing your serverless functions with X-Ray and want to continue using X-Ray, you can [install the AWS X-Ray integration][2]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* +*Looking to trace through serverless resources not listed above? [Open a feature request][7].* #### Ruby @@ -80,9 +80,9 @@ The Datadog Lambda Library and tracing libraries for Ruby support: - Tracing HTTP requests invoking downstream Lambda functions or containers. - Tracing dozens of additional out-of-the-box [Ruby][8] libraries. -You can trace your serverless functions in Datadog with [Datadog's tracing libraries][5] or by [installing the AWS X-Ray integration][2]. If you are using [Datadog's tracing libraries][5], and need to connect Lambda function traces across AWS managed services, Datadog recommends you augment your traces by configuring _both_ AWS X-Ray and Datadog APM tracing libraries as described [here][6]. +You can trace your serverless functions in Datadog with [Datadog's tracing libraries][5] or by [installing the AWS X-Ray integration][2]. If you are using [Datadog's tracing libraries][5], and need to connect Lambda function traces across AWS managed services, Datadog recommends you augment your traces by configuring _both_ [AWS X-Ray and Datadog APM tracing libraries][6]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* +*Looking to trace through serverless resources not listed above? [Open a feature request][7].* #### Go @@ -93,7 +93,7 @@ The Datadog Lambda Library and tracing libraries for Go support: For Go serverless applications, Datadog recommends installing [Datadog's tracing libraries][5]. If your application requires AWS X-Ray active tracing in AWS managed services such as API Gateway or Step Functions, you may want to consider instead using [Datadog APM with AWS X-Ray tracing][2]. -*Looking to trace through serverless resources not listed above? Open a feature request [here][7].* +*Looking to trace through serverless resources not listed above? [Open a feature request][7].* #### Java @@ -120,9 +120,9 @@ Learn more about [tracing through .NET Azure serverless applications][15]. If you have installed Datadog's tracing libraries (`dd-trace`) on both your Lambda functions and hosts, your traces automatically show you the complete picture of requests that cross infrastructure boundaries, whether it be AWS Lambda, containers, on-prem hosts, or managed services. -If `dd-trace` is installed on your hosts with the Datadog Agent, and your serverless functions are traced with AWS X-Ray, trace merging is required to see a single, connected trace across your infrastructure. Learn more about merging traces from `dd-trace` and AWS X-Ray [here][6]. +If `dd-trace` is installed on your hosts with the Datadog Agent, and your serverless functions are traced with AWS X-Ray, trace merging is required to see a single, connected trace across your infrastructure. See the [Serverless Trace Merging][6] documentation to learn more about merging traces from `dd-trace` and AWS X-Ray. -Datadog's [AWS X-Ray integration][2] only provides traces for Lambda functions. Learn more about tracing in container or host-based environments [here][16]. +Datadog's [AWS X-Ray integration][2] only provides traces for Lambda functions. See the [Datadog APM documentation][16] to learn more about tracing in container or host-based environments. ## Enable Datadog APM diff --git a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md index e3858ba0b3988..12175a81622e8 100644 --- a/content/en/serverless/distributed_tracing/serverless_trace_propagation.md +++ b/content/en/serverless/distributed_tracing/serverless_trace_propagation.md @@ -91,7 +91,7 @@ exports.handler = async event => { ## Extracting trace context -To extract the above trace context from the consumer Lambda function, you need to define an extractor function that runs captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function. The format for this is `.`. For example, `extractors.json` if the `json` extractor is in the `extractors.js` file. Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. +To extract the above trace context from the consumer Lambda function, you need to define an extractor function that captures trace context before the execution of your Lambda function handler. To do this, configure the `DD_TRACE_EXTRACTOR` environment variable to point to the location of your extractor function. The format for this is `.`. For example, `extractors.json` if the `json` extractor is in the `extractors.js` file. Datadog recommends you place your extractor methods all in one file, as extractors can be re-used across multiple Lambda functions. These extractors are completely customizable to fit any use case. **Notes**: - If you are using TypeScript or a bundler like webpack, you must `import` or `require` your Node.js module where the extractors are defined. This ensures the module gets compiled and bundled into your Lambda deployment package. diff --git a/content/en/serverless/guide/datadog_forwarder_dotnet.md b/content/en/serverless/guide/datadog_forwarder_dotnet.md index c96a2685e88ef..7056a9ef04aad 100644 --- a/content/en/serverless/guide/datadog_forwarder_dotnet.md +++ b/content/en/serverless/guide/datadog_forwarder_dotnet.md @@ -40,9 +40,6 @@ myMetric.Add("t", new string[] {"product:latte", "order:online"}); LambdaLogger.Log(JsonConvert.SerializeObject(myMetric)); ``` -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} [1]: /serverless/forwarder [2]: https://docs.aws.amazon.com/xray/latest/devguide/xray-services-lambda.html diff --git a/content/en/serverless/guide/extension_motivation.md b/content/en/serverless/guide/extension_motivation.md index 07be47ce407ec..3ee4bb0f5993f 100644 --- a/content/en/serverless/guide/extension_motivation.md +++ b/content/en/serverless/guide/extension_motivation.md @@ -19,7 +19,7 @@ There are some key differences between the Lambda extension and the Forwarder, a {{< img src="serverless/serverless_monitoring_installation_instructions.png" alt="Instrument AWS Serverless Applications" style="width:100%;">}} -Although the Lambda Extension replaces the Forwarder as the recommended way to collect telemetry from Lambda functions, the Forwarder is required to collect and add metadata to other AWS service logs—including those from API Gateway, AppSync, and Lambda@Edge. +Although the Lambda Extension replaces the Forwarder as the recommended way to collect telemetry from Lambda functions, the Forwarder is required to collect and add metadata to other AWS service logs — including those from API Gateway, AppSync, and Lambda@Edge. ### Advantages @@ -34,7 +34,7 @@ The extension [adds overhead to your Lambda functions][4], compared to functions ## Migrate to the Datadog Lambda Extension -To migrate from the the Datadog Forwarder to the Datadog Lambda Extension, follow these [instructions][5]. +To migrate from the the Datadog Forwarder to the Datadog Lambda Extension, see the [Serverless configuration documentation][5]. ## Further Reading {{< partial name="whats-next/whats-next.html" >}} diff --git a/content/en/serverless/guide/handler_wrapper.md b/content/en/serverless/guide/handler_wrapper.md index 82f9102bf05a1..2a6861a5b9540 100644 --- a/content/en/serverless/guide/handler_wrapper.md +++ b/content/en/serverless/guide/handler_wrapper.md @@ -10,7 +10,7 @@ If your Lambda function configuration is incompatible with the Datadog handler r 1. Follow the **Custom** installation instructions for [Python][1] or [Node.js][2] to install the Datadog serverless monitoring. 2. Skip the step to configure the handler function. 3. Skip the step to set the environment variable `DD_LAMBDA_HANDLER`. -4. Apply the Datadog wrapper in your function code like below: +4. Apply the Datadog wrapper in your function code: ```python # for python from datadog_lambda.wrapper import datadog_lambda_wrapper diff --git a/content/en/serverless/installation/_index.md b/content/en/serverless/installation/_index.md index f7d65504b2d4d..f09acad0e3f3e 100644 --- a/content/en/serverless/installation/_index.md +++ b/content/en/serverless/installation/_index.md @@ -26,7 +26,7 @@ For the detailed installation instructions, select the Lambda runtime below: ## Advanced Configurations -After the installation and collecting the telemetry, follow the [advanced configurations][3] to: +After you're done with installation and you've set up telemetry collection, you can use [advanced configurations][3] to: - connect your metrics, traces, and logs using tags - collect telemetry from AWS resources such as API Gateway, AppSync, and Step Functions diff --git a/content/en/serverless/installation/dotnet.md b/content/en/serverless/installation/dotnet.md index 3fb1537902f38..a9846db9ec6ab 100644 --- a/content/en/serverless/installation/dotnet.md +++ b/content/en/serverless/installation/dotnet.md @@ -13,7 +13,7 @@ further_reading: text: 'Submitting Custom Metrics from Serverless Applications' --- -
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
+
The Datadog Lambda Extension only supports the `x86_64` architecture for .NET Lambda functions. If your .NET Lambda function uses the `arm64` architecture, you must instrument using the Datadog Forwarder instead.
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
diff --git a/content/en/serverless/installation/go.md b/content/en/serverless/installation/go.md index d0a75a34e58f4..c96d88a205e42 100644 --- a/content/en/serverless/installation/go.md +++ b/content/en/serverless/installation/go.md @@ -15,7 +15,7 @@ aliases: - /serverless/datadog_lambda_library/go/ --- -
If your Go Lambda functions are still using runtime go1.x and you cannot migrate to the provided.al2 runtime, you must instrument using the Datadog Forwarder instead.
+
If your Go Lambda functions are still using runtime go1.x and you cannot migrate to the provided.al2 runtime, you must instrument using the Datadog Forwarder instead.
If your Lambda functions are deployed in a VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
diff --git a/content/en/serverless/installation/java.md b/content/en/serverless/installation/java.md index b79758adbf847..0ee647290eec7 100644 --- a/content/en/serverless/installation/java.md +++ b/content/en/serverless/installation/java.md @@ -19,7 +19,7 @@ aliases:
If your Lambda functions are deployed in a VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
-
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
+
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
## Installation diff --git a/content/en/serverless/installation/nodejs.md b/content/en/serverless/installation/nodejs.md index 597760fe9773c..19dfffa44a66b 100644 --- a/content/en/serverless/installation/nodejs.md +++ b/content/en/serverless/installation/nodejs.md @@ -19,7 +19,7 @@ aliases: - /serverless/guide/nodejs/ --- -
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
+
If you previously set up your Lambda functions using the Datadog Forwarder, see instrumenting using the Datadog Forwarder.
If your Lambda functions are deployed in VPC without access to the public internet, you can send data either using AWS PrivateLink for the datadoghq.com Datadog site, or using a proxy for all other sites.
diff --git a/content/en/tracing/visualization/service.md b/content/en/tracing/visualization/service.md index dc849a4e0f0b1..74ba101e98de5 100644 --- a/content/en/tracing/visualization/service.md +++ b/content/en/tracing/visualization/service.md @@ -136,7 +136,7 @@ You can add columns to or remove columns from this overview table and your selec {{< img src="tracing/visualization/service/deployments.png" alt="Deployments" style="width:90%;">}} -Read more about Deployments on the service page [here][11]. +Read more about Deployments [on the service page][11]. ### Error Tracking View issues on your service, which are similar errors aggregated together to turn a noisy stream of errors into manageable issues and help you assess the impact of your service’s errors. Read more about issues in [Error Tracking][4]) @@ -160,7 +160,7 @@ If runtime metrics are enabled in the tracing client, you’ll see a Runtime met {{< img src="tracing/visualization/service/runtime_metrics.png" alt="Runtime Metrics" style="width:90%;">}} ### Profiling -You'll see a Profiling tab if the [Continuous Profiler][13] is set up for your service. Summary details like versions available and runtime language are at the top. Below are out-of-the-box profiling metrics by version, endpoint, and method to help you identify and debug resource-intensive methods. Click on any graph to view related traces, logs, and other data, or open a flame graph to inspect the code profile. Learn more about APM and the Continuous Profiler [here][14]. +You'll see a Profiling tab if the [Continuous Profiler][13] is set up for your service. Summary details like versions available and runtime language are at the top. Below are out-of-the-box profiling metrics by version, endpoint, and method to help you identify and debug resource-intensive methods. Click on any graph to view related traces, logs, and other data, or open a flame graph to inspect the code profile. [Learn more about APM and the Continuous Profiler][14]. {{< img src="tracing/visualization/service/profiler.jpg" alt="Profiling" style="width:90%;">}}
Check out the additional troubleshooting guides for common issues such as the function code size is too large or webpack compatibility.