How to monitor Spring Boot apps with Elastic APM Java Agent
Note
The Basic, Standard, and Enterprise plans will be deprecated starting from mid-March, 2025, with a 3 year retirement period. We recommend transitioning to Azure Container Apps. For more information, see the Azure Spring Apps retirement announcement.
The Standard consumption and dedicated plan will be deprecated starting September 30, 2024, with a complete shutdown after six months. We recommend transitioning to Azure Container Apps. For more information, see Migrate Azure Spring Apps Standard consumption and dedicated plan to Azure Container Apps.
This article applies to: ✔️ Basic/Standard ❌ Enterprise
This article explains how to use Elastic APM Agent to monitor Spring Boot applications running in Azure Spring Apps.
With the Elastic Observability Solution, you can achieve unified observability to:
- Monitor apps using the Elastic APM Java Agent and using persistent storage with Azure Spring Apps.
- Use diagnostic settings to ship Azure Spring Apps logs to Elastic. For more information, see Analyze logs with Elastic (ELK) using diagnostics settings.
The following video introduces unified observability for Spring Boot applications using Elastic.
Prerequisites
Deploy the Spring Petclinic application
This article uses the Spring Petclinic sample to walk through the required steps. Use the following steps to deploy the sample application:
Follow the steps in Deploy Spring Boot apps using Azure Spring Apps and MySQL until you reach the Deploy Spring Boot applications and set environment variables section.
Use the Azure Spring Apps extension for Azure CLI with the following command to create an application to run in Azure Spring Apps:
az spring app create \ --resource-group <your-resource-group-name> \ --service <your-Azure-Spring-Apps-instance-name> \ --name <your-app-name> \ --is-public true
Enable custom persistent storage for Azure Spring Apps
Use the following steps to enable custom persistent storage:
Follow the steps in How to enable your own persistent storage in Azure Spring Apps.
Use the following Azure CLI command to add persistent storage for your Azure Spring Apps apps.
az spring app append-persistent-storage \ --resource-group <your-resource-group-name> \ --service <your-Azure-Spring-Apps-instance-name> \ --name <your-app-name> \ --persistent-storage-type AzureFileVolume \ --share-name <your-Azure-file-share-name> \ --mount-path <unique-mount-path> \ --storage-name <your-mounted-storage-name>
Activate Elastic APM Java Agent
Before proceeding, you need your Elastic APM server connectivity information handy, which assumes you've deployed Elastic on Azure. For more information, see How to deploy and manage Elastic on Microsoft Azure. To get this information, use the following steps:
In the Azure portal, go to the Overview page of your Elastic deployment, then select Manage Elastic Cloud Deployment.
Under your deployment on Elastic Cloud Console, select the APM & Fleet section to get Elastic APM Server endpoint and secret token.
Download Elastic APM Java Agent from Maven Central.
Upload Elastic APM Agent to the custom persistent storage you enabled earlier. Go to Azure Fileshare and select Upload to add the agent JAR file.
After you have the Elastic APM endpoint and secret token, use the following command to activate Elastic APM Java agent when deploying applications. The placeholder
<agent-location>
refers to the mounted storage location of the Elastic APM Java Agent.az spring app deploy \ --name <your-app-name> \ --artifact-path <unique-path-to-your-app-jar-on-custom-storage> \ --jvm-options='-javaagent:<elastic-agent-location>' \ --env ELASTIC_APM_SERVICE_NAME=<your-app-name> \ ELASTIC_APM_APPLICATION_PACKAGES='<your-app-package-name>' \ ELASTIC_APM_SERVER_URL='<your-Elastic-APM-server-URL>' \ ELASTIC_APM_SECRET_TOKEN='<your-Elastic-APM-secret-token>'
Automate provisioning
You can also run a provisioning automation pipeline using Terraform, Bicep, or an Azure Resource Manager template (ARM template). This pipeline can provide a complete hands-off experience to instrument and monitor any new applications that you create and deploy.
Automate provisioning using Terraform
To configure the environment variables in a Terraform template, add the following code to the template, replacing the <...> placeholders with your own values. For more information, see Manages an Active Azure Spring Apps Deployment.
resource "azurerm_spring_cloud_java_deployment" "example" {
...
jvm_options = "-javaagent:<elastic-agent-location>"
...
environment_variables = {
"ELASTIC_APM_SERVICE_NAME"="<your-app-name>",
"ELASTIC_APM_APPLICATION_PACKAGES"="<your-app-package>",
"ELASTIC_APM_SERVER_URL"="<your-Elastic-APM-server-URL>",
"ELASTIC_APM_SECRET_TOKEN"="<your-Elastic-APM-secret-token>"
}
}
Automate provisioning using a Bicep file
To configure the environment variables in a Bicep file, add the following code to the file, replacing the <...> placeholders with your own values. For more information, see Microsoft.AppPlatform Spring/apps/deployments.
deploymentSettings: {
environmentVariables: {
ELASTIC_APM_SERVICE_NAME='<your-app-name>',
ELASTIC_APM_APPLICATION_PACKAGES='<your-app-package>',
ELASTIC_APM_SERVER_URL='<your-Elastic-APM-server-URL>',
ELASTIC_APM_SECRET_TOKEN='<your-Elastic-APM-secret-token>'
},
jvmOptions: '-javaagent:<elastic-agent-location>',
...
}
Automate provisioning using an ARM template
To configure the environment variables in an ARM template, add the following code to the template, replacing the <...> placeholders with your own values. For more information, see Microsoft.AppPlatform Spring/apps/deployments.
"deploymentSettings": {
"environmentVariables": {
"ELASTIC_APM_SERVICE_NAME"="<your-app-name>",
"ELASTIC_APM_APPLICATION_PACKAGES"="<your-app-package>",
"ELASTIC_APM_SERVER_URL"="<your-Elastic-APM-server-URL>",
"ELASTIC_APM_SECRET_TOKEN"="<your-Elastic-APM-secret-token>"
},
"jvmOptions": "-javaagent:<elastic-agent-location>",
...
}
Upgrade Elastic APM Java Agent
To plan your upgrade, see Upgrade versions for Elastic Cloud on Azure, and Breaking Changes for APM. After you've upgraded APM Server, upload the Elastic APM Java agent JAR file in the custom persistent storage. Then, restart your apps with the updated JVM options pointing to the upgraded Elastic APM Java agent JAR.
Monitor applications and metrics with Elastic APM
Use the following steps to monitor applications and metrics:
In the Azure portal, go to the Overview page of your Elastic deployment, then select the Kibana link.
After Kibana is open, search for APM in the search bar, then select APM.
Kibana APM is the curated application to support Application Monitoring workflows. Here you can view high-level details such as request/response times, throughput, and the transactions in a service with the most impact on the duration.
You can drill down in a specific transaction to understand the transaction-specific details such as the distributed tracing.
Elastic APM Java agent also captures the JVM metrics from the Azure Spring Apps apps that are available with Kibana App for users for troubleshooting.
Using the inbuilt AI engine in the Elastic solution, you can also enable Anomaly Detection on the Azure Spring Apps Services and choose an appropriate action - such as Teams notification, creation of a JIRA issue, a webhook-based API call, and others.