DEV Community

DEV-AI
DEV-AI

Posted on

Integrating Elastic APM with Kubernetes: Best Practices and Technical Guide for Java , React Apps

Integrating Elastic APM with Kubernetes: Best Practices and Technical Guide for Java , React Apps

Introduction

In today's microservices and containerized application landscape, monitoring and observability are crucial for maintaining system health and performance. Elastic APM (Application Performance Monitoring) provides deep insights into application performance, while Kubernetes offers a powerful container orchestration platform. Integrating Elastic APM into a Kubernetes cluster enables comprehensive monitoring of all services, facilitating proactive issue detection and resolution.

This guide outlines the best practices and technical steps to integrate Elastic APM with a Kubernetes cluster, leveraging verified product capabilities.


Prerequisites

  • Kubernetes Cluster: A running Kubernetes cluster.
  • Elastic Stack: Access to an existing Elastic Stack (Elasticsearch, Kibana, and APM Server) or readiness to deploy it.
  • Kubectl: Installed and configured to interact with your Kubernetes cluster.
  • Helm: Installed for deploying applications.
  • Security Credentials: Necessary credentials for Elastic Stack components.

Step 1: Deploy the Elastic Stack on Kubernetes

Deploying the Elastic Stack within your Kubernetes cluster ensures low-latency communication between services.

1.1 Add Elastic Helm Repository

helm repo add elastic https://helm.elastic.co
helm repo update
Enter fullscreen mode Exit fullscreen mode

1.2 Create a Namespace for Elastic Stack

kubectl create namespace elastic-system
Enter fullscreen mode Exit fullscreen mode

1.3 Deploy Elasticsearch

Deploy a highly available Elasticsearch cluster using the Helm chart.

helm install elasticsearch elastic/elasticsearch \
  --namespace elastic-system \
  --set replicas=3 \
  --set persistence.enabled=true \
  --set volumeClaimTemplate.resources.requests.storage=50Gi
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Persistence: Enable persistent storage to retain data across pod restarts.
  • Resource Allocation: Allocate sufficient CPU and memory according to your workload.

1.4 Deploy Kibana

helm install kibana elastic/kibana \
  --namespace elastic-system \
  --set service.type=ClusterIP \
  --set elasticsearchHosts=http://elasticsearch-master.elastic-system.svc.cluster.local:9200
Enter fullscreen mode Exit fullscreen mode

1.5 Deploy APM Server

helm install apm-server elastic/apm-server \
  --namespace elastic-system \
  --set service.type=ClusterIP \
  --set apmConfig.secret_token="your-secret-token" \
  --set output.elasticsearch.hosts="{http://elasticsearch-master.elastic-system.svc.cluster.local:9200}"
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Security: Use secure communication (HTTPS) and set a strong secret_token.
  • Scaling: Adjust replicas based on load.

Step 2: Configure Network Access and Security

(Refer to the original article for network access and security configuration.)


Step 3: Instrument Applications with Elastic APM Agents

3.1 Select the Appropriate APM Agent

Elastic APM supports several languages:

  • Java
  • Node.js
  • Python
  • Ruby
  • Go
  • .NET
  • PHP
  • JavaScript (Front-end)

3.2 Java Application (Spring Boot) Configuration

Elastic APM provides a powerful Java agent for monitoring Java applications, including Spring Boot.

Step 1: Download the Java Agent

Download the latest Elastic APM Java agent JAR file from the Elastic APM Java Agent Releases.

Step 2: Add the Java Agent to Your Spring Boot Application

Configure the Java agent by passing it as a -javaagent argument when starting your Spring Boot application.

Example Kubernetes Deployment for Spring Boot:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-boot-app
  template:
    metadata:
      labels:
        app: spring-boot-app
    spec:
      containers:
      - name: spring-boot-app
        image: spring-boot-app:latest
        env:
        - name: ELASTIC_APM_SERVICE_NAME
          value: "spring-boot-app"
        - name: ELASTIC_APM_SERVER_URL
          value: "http://apm-server.elastic-system.svc.cluster.local:8200"
        - name: ELASTIC_APM_SECRET_TOKEN
          valueFrom:
            secretKeyRef:
              name: apm-secret
              key: secret-token
        volumeMounts:
        - name: apm-agent
          mountPath: /elastic-apm
        command: ["java", "-javaagent:/elastic-apm/elastic-apm-agent.jar", "-jar", "app.jar"]
      volumes:
      - name: apm-agent
        configMap:
          name: elastic-apm-agent-config
Enter fullscreen mode Exit fullscreen mode

Step 3: Configure Spring Boot Application Properties

Add APM settings to your application.properties or application.yml file:

# Elastic APM Configuration
elastic.apm.service_name=spring-boot-app
elastic.apm.server_urls=http://apm-server.elastic-system.svc.cluster.local:8200
elastic.apm.secret_token=your-secret-token
elastic.apm.environment=production
elastic.apm.application_packages=com.example
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Use Kubernetes Secrets to store sensitive data like secret_token.
  • Environment Variables: Configure APM settings through environment variables for easier management.

3.3 React Application Configuration

Elastic APM can also monitor front-end applications such as React, using the Elastic APM RUM (Real User Monitoring) agent.

Step 1: Install the APM RUM Agent

Install the Elastic APM RUM agent via npm:

npm install @elastic/apm-rum
Enter fullscreen mode Exit fullscreen mode

Step 2: Initialize the APM Agent

Create a new file (e.g., apm.js) to initialize the APM agent.

import { init as initApm } from '@elastic/apm-rum';

const apm = initApm({
  serviceName: 'react-app',
  serverUrl: 'http://apm-server.elastic-system.svc.cluster.local:8200',
  secretToken: 'your-secret-token',
  environment: 'production',
  serviceVersion: '1.0.0' // Set your app version
});

export default apm;
Enter fullscreen mode Exit fullscreen mode

Step 3: Use the APM Agent in Your React App

Import the apm.js file in your main entry point (e.g., index.js or App.js) to start monitoring.

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';
import './apm'; // Import APM initialization file

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
Enter fullscreen mode Exit fullscreen mode

Step 4: Monitor User Interactions (Optional)

You can monitor custom transactions or user interactions in your React app.

Example: Monitoring a Custom Transaction

import React, { useEffect } from 'react';
import apm from './apm';

function App() {
  useEffect(() => {
    const transaction = apm.startTransaction('Page Load', 'page-load');

    setTimeout(() => {
      transaction.end(); // End transaction after some operation
    }, 2000);
  }, []);

  return <div>Hello, Elastic APM!</div>;
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Use APM's distributed tracing to correlate front-end and back-end performance.
  • Monitor interactions such as page loads, clicks, or custom events.


Step 4: Automate APM Agent Injection (Advanced)

For large clusters, manually instrumenting each application may not be feasible.

4.1 Use APM Agent Auto-Instrumentation

Some agents support auto-instrumentation via Java agents or environment variables.

For Java Applications:

Add the Java agent to your application without code changes.

containers:
- name: java-app
  image: your-java-app-image
  env:
    - name: ELASTIC_APM_AGENT_JAR_PATH
      value: "/elastic-apm/elastic-apm-agent.jar"
  volumeMounts:
    - name: elastic-apm-agent
      mountPath: /elastic-apm
  command: ["java", "-javaagent:/elastic-apm/elastic-apm-agent.jar", "-jar", "app.jar"]
volumes:
  - name: elastic-apm-agent
    configMap:
      name: elastic-apm-agent-config
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Agent Versions: Keep APM agents updated to the latest versions for optimal performance and features.
  • Sidecar Containers: Consider using sidecar containers for agents that support it.

4.2 Implement Mutating Admission Webhooks

Automate the injection of APM agents using Kubernetes admission controllers.

Tools:

  • kube-mutate: A custom webhook for mutating deployments.

Best Practices:

  • Testing: Thoroughly test webhook configurations to prevent unintended side effects.
  • Auditing: Maintain audit logs of mutations for compliance and debugging.

Step 5: Enhance Observability with Beats

Elastic Beats are lightweight data shippers for logs and metrics.

5.1 Deploy Filebeat for Log Monitoring

Filebeat collects and forwards logs to Elasticsearch.

Deployment:

helm install filebeat elastic/filebeat \
  --namespace elastic-system \
  --set daemonset.enabled=true \
  --set output.elasticsearch.hosts="{http://elasticsearch-master.elastic-system.svc.cluster.local:9200}"
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Kubernetes Module: Enable the Kubernetes module in Filebeat for metadata enrichment.
  • Processing: Use ingest pipelines for parsing and processing logs.

5.2 Deploy Metricbeat for Metrics Collection

Metricbeat collects system and Kubernetes metrics.

Deployment:

helm install metricbeat elastic/metricbeat \
  --namespace elastic-system \
  --set daemonset.enabled=true \
  --set deployment.enabled=true \
  --set output.elasticsearch.hosts="{http://elasticsearch-master.elastic-system.svc.cluster.local:9200}"
Enter fullscreen mode Exit fullscreen mode

Best Practices:

  • Node Metrics: Collect metrics from Kubernetes nodes and system components.
  • Module Configuration: Enable relevant Metricbeat modules for comprehensive data.

Step 6: Visualize and Analyze Data in Kibana

With data flowing into Elasticsearch, Kibana becomes the central platform for visualization.

6.1 Access the APM Dashboard

Navigate to the APM section in Kibana to view application performance metrics.

Features:

  • Service Overview: View high-level metrics for each service.
  • Transactions: Analyze request paths and their performance.
  • Errors: Investigate exceptions and errors across services.

6.2 Create Custom Dashboards

Utilize Kibana's dashboard capabilities to create custom visualizations.

Best Practices:

  • Templates: Use existing templates as a starting point.
  • Team Collaboration: Share dashboards with team members.

6.3 Set Up Alerts and Notifications

Configure alerts based on thresholds or anomalies.

Alert Types:

  • Latency Threshold: Alert when response times exceed a certain limit.
  • Error Rate: Notify when error rates spike.

Best Practices:

  • Actionable Alerts: Ensure alerts are meaningful and actionable to avoid alert fatigue.
  • Integrations: Integrate with communication tools like Slack or email for notifications.


Resources:


Conclusion

Integrating Elastic APM with a Kubernetes cluster provides detailed insights into both back-end and front-end performance. With specific configurations for Java Spring Boot and React, you can achieve full-stack observability and traceability. By following these best practices, you can enhance system reliability, optimize performance, and improve the overall user experience.


Resources:


Top comments (0)