DEV Community

Roy Ra for AWS Community Builders

Posted on • Edited on

Setting up Datadog APM on EKS + Fargate

In this post, I will go through the steps required to integrate Datadog APM with EKS using Fargate as computing option.

The process is very similar to Setting up Datadog APM on ECS, Fargate(Spring Boot).

The datadog agent container must run as a sidecar of each of your application's container.

Installing datadog agent

We will use helm to install datadog agent into Kubernetes cluster.

First, run the command below to add datadog's repository to helm.

helm repo add datadog https://helm.datadoghq.com helm repo update 
Enter fullscreen mode Exit fullscreen mode

After that, we have to edit values.yaml file, which will be used as a configuration file used by datadog agent running in the cluster. The fields I overrided(edited) are as below.

  • registry: Apply the value of AWS in the comment.
  • datadog.apiKey: Value of the API key that you created in Datadog.
  • datadog.apm.portEnabled: Set to true.

Finally, let's run the command below to finish installation.

helm install datadog-agent -f values.yaml datadog/datadog 
Enter fullscreen mode Exit fullscreen mode

Configuring APM

To integrate Datadog APM with your application, you must make sure that your application uses datadog agent when running itself. For instance, I have a Spring boot application (JVM), and corresponding dockerfile looks as below.

There is 1 datadog agent installed on your EKS cluster, and another datadog agent running as a process of your application to collect metrics.

FROM openjdk:11-jdk AS builder WORKDIR application ARG JAR_FILE=build/libs/MY_APP.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM openjdk:11-jdk WORKDIR application RUN apt-get update \  && apt-get install -y wget \  && rm -rf /var/lib/apt/lists/* RUN wget -O dd-java-agent.jar 'https://dtdg.co/latest-java-tracer' COPY --from=builder application/application.jar ./application.jar RUN true COPY --from=builder application/dependencies/ ./ RUN true COPY --from=builder application/spring-boot-loader/ ./ RUN true COPY --from=builder application/snapshot-dependencies/ ./ RUN true COPY --from=builder application/application/ ./ RUN true ENV TZ Asia/Seoul ENTRYPOINT ["java", "-javaagent:dd-java-agent.jar", "-Ddd.profiling.enabled=true", "-XX:FlightRecorderOptions=stackdepth=256", "org.springframework.boot.loader.JarLauncher"] 
Enter fullscreen mode Exit fullscreen mode

In the example above, dd-java-agent.jar uses port 8126 of container running datadog agent to send metrics to datadog.

Now all we have to do is to add another container spec to Kubernetes deployment file.

apiVersion: apps/v1 kind: Deployment metadata: name: planit-deployment namespace: planit labels: app: planit spec: replicas: 3 revisionHistoryLimit: 2 selector: matchLabels: app: planit template: metadata: labels: app: planit spec: containers: - name: "CONTAINER_NAME" image: "YOUR_IMAGE_NAME" imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP - name: datadog-agent image: datadog/agent:latest ports: - containerPort: 8126 name: traceport protocol: TCP env: - name: DD_KUBERNETES_KUBELET_NODENAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: DD_API_KEY valueFrom: secretKeyRef: name: datadog-secret key: DD_API_KEY - name: DD_SITE valueFrom: secretKeyRef: name: datadog-secret key: DD_SITE - name: DD_EKS_FARGATE valueFrom: secretKeyRef: name: datadog-secret key: DD_EKS_FARGATE - name: DD_APM_ENABLED valueFrom: secretKeyRef: name: datadog-secret key: DD_APM_ENABLED - name: DD_ENV valueFrom: secretKeyRef: name: datadog-secret key: DD_ENV - name: DD_SERVICE valueFrom: secretKeyRef: name: datadog-secret key: DD_SERVICE - name: DD_VERSION valueFrom: secretKeyRef: name: datadog-secret key: DD_VERSION - name: DD_PROFILING_ENABLED valueFrom: secretKeyRef: name: datadog-secret key: DD_PROFILING_ENABLED - name: DD_APM_IGNORE_RESOURCES valueFrom: secretKeyRef: name: datadog-secret key: DD_APM_IGNORE_RESOURCES - name: DD_LOGS_INJECTION valueFrom: secretKeyRef: name: datadog-secret key: DD_LOGS_INJECTION 
Enter fullscreen mode Exit fullscreen mode

datadog-secret is a Kubernetes secret object I created to store configuration values related to Datadog.

After deploying new Kubernetes deployment, you should be able to see APM working well as below.

DD APM UI

Top comments (0)