APM Server binary
editAPM Server binary
editThis guide will explain how to set up and configure the APM Server binary.
Prerequisites
editFirst, see the Elastic Support Matrix for information about supported operating systems and product compatibility.
You’ll need:
- Elasticsearch for storing and indexing data.
- Kibana for visualizing with the Applications UI.
We recommend you use the same version of Elasticsearch, Kibana, and APM Server. See Installing the Elastic Stack for more information about installing these products.
Step 1: Install
editBefore you begin: If you haven’t installed the Elastic Stack, do that now. See Learn how to install the Elastic Stack on your own hardware.
To download and install APM Server, use the commands below that work with your system.
If you use apt
or yum
, you can install APM Server from our repositories
to update to the newest version more easily.
See our download page for other installation options, such as 32-bit images.
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-8.16.2-amd64.deb sudo dpkg -i apm-server-8.16.2-amd64.deb
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-8.16.2-x86_64.rpm sudo rpm -vi apm-server-8.16.2-x86_64.rpm
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-8.16.2-linux-x86_64.tar.gz tar xzvf apm-server-8.16.2-linux-x86_64.tar.gz
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-8.16.2-darwin-x86_64.tar.gz tar xzvf apm-server-8.16.2-darwin-x86_64.tar.gz
- Download the APM Server Windows zip file from the downloads page.
-
Extract the contents of the zip file into
C:\Program Files
. -
Rename the
apm-server-<version>-windows
directory toAPM-Server
. - Open a PowerShell prompt as an Administrator (right-click the PowerShell icon and select Run As Administrator). If you are running Windows XP, you may need to download and install PowerShell.
-
From the PowerShell prompt, run the following commands to install APM Server as a Windows service:
PS > cd 'C:\Program Files\APM-Server' PS C:\Program Files\APM-Server> .\install-service.ps1
If script execution is disabled on your system,
you need to set the execution policy for the current session to allow the script to run.
For example: PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service.ps1
.
See Running on Docker for deploying Docker containers.
Step 2: Set up and configure
editConfigure APM by editing the apm-server.yml
configuration file.
The location of this file varies by platform—see the Installation layout for help locating it.
A minimal configuration file might look like this:
apm-server: host: "localhost:8200" output.elasticsearch: hosts: ["localhost:9200"] username: "elastic" password: "changeme"
The |
|
The Elasticsearch |
|
This example uses basic authentication. The user provided here needs the privileges required to publish events to Elasticsearch. To create a dedicated user for this role, see Create a writer role. |
All available configuration options are outlined in configuring APM Server.
Step 3: Start
editIn a production environment, you would put APM Server on its own machines, similar to how you run Elasticsearch. You can run it on the same machines as Elasticsearch, but this is not recommended, as the processes will be competing for resources.
To start APM Server, run:
./apm-server -e
The -e
global flag enables logging to stderr and disables syslog/file output.
Remove this flag if you’ve enabled logging in the configuration file.
For Linux systems, see APM Server status and logs.
You should see APM Server start up.
It will try to connect to Elasticsearch on localhost port 9200
and expose an API to agents on port 8200
.
You can change the defaults in apm-server.yml
or by supplying a different address on the command line:
./apm-server -e -E output.elasticsearch.hosts=ElasticsearchAddress:9200 -E apm-server.host=localhost:8200
For Debian package and RPM installations, we recommend the apm-server
process runs as a non-root user.
Therefore, these installation methods create an apm-server
user which you can use to start the process.
In addition, APM Server will only start if the configuration file is
owned by the user running the process.
To start the APM Server in this case, run:
sudo -u apm-server apm-server [<argument...>]
By default, APM Server loads its configuration file from /etc/apm-server/apm-server.yml
.
See the deb & rpm default paths for a full directory layout.
Step 4: Install APM agents
edit1. Add the agent to your project
First, add the Elastic APM agent plugin to your application’s build.gradle
file as shown below:
// Android app's build.gradle file plugins { id "com.android.application" id "co.elastic.apm.android" version "[latest_version]" }
The Elastic plugin declaration must be added below the Android app plugin declaration ( |
2. Configure the agent
After adding the agent plugin, configure it. A minimal configuration sets the Elastic APM integration endpoint as shown below:
// Android app's build.gradle file plugins { //... id "co.elastic.apm.android" version "[latest_version]" } elasticApm { // Minimal configuration serverUrl = "https://your.elastic.server" // Optional serviceName = "your app name" serviceVersion = "0.0.0" apiKey = "your server api key" secretToken = "your server auth token" }
You can find the latest version in the Gradle plugin portal. |
|
Defaults to your |
|
Defaults to your |
|
Defaults to null. More info on API Keys here. |
|
Defaults to null. |
When both secretToken
and apiKey
are provided, apiKey has priority and secretToken is ignored.
3. Initialize the agent
After syncing your project with the Gradle changes above, the Elastic APM agent needs to be initialized within your Application class. This example shows the simplest way to configure the agent:
// Your Application class class MyApp extends android.app.Application { @Override public void onCreate() { super.onCreate(); ElasticApmAgent.initialize(this); } }
All that’s left is to compile and run your application. That’s it!
Learn more in the agent reference
Read more in the APM Android Agent Reference.
1. Install the agent
Install the Elastic APM Go agent package using go get
:
go get -u go.elastic.co/apm/v2
2. Configure the agent
To simplify development and testing,
the agent defaults to sending data to the Elastic APM integration at http://localhost:8200
.
To send data to an alternative location, you must configure ELASTIC_APM_SERVER_URL
.
# The APM integration host and port export ELASTIC_APM_SERVER_URL= # If you do not specify `ELASTIC_APM_SERVICE_NAME`, the Go agent will use the # executable name. For example, if your executable is called "my-app.exe", then your # service will be identified as "my-app". export ELASTIC_APM_SERVICE_NAME= # Secret tokens are used to authorize requests to the APM integration export ELASTIC_APM_SECRET_TOKEN=
3. Instrument your application
Instrumentation is the process of extending your application’s code to report trace data to Elastic APM. Go applications must be instrumented manually at the source code level. To instrument your applications, use one of the following approaches:
- Built-in instrumentation modules.
- Custom instrumentation and context propagation with the Go Agent API.
Learn more in the agent reference
1. Add the agent dependency to your project
Add the Elastic APM iOS Agent to your Xcode project or your Package.swift
.
Here are instructions for adding a package dependency to a standard Xcode project.
Refer to Add a Dependency on Another Swift Package for details about adding dependencies to your Package.swift
.
Here is a helpful code-snippet:
Package( dependencies:[ .package(name: "apm-agent-ios", url: "https://github.com/elastic/apm-agent-ios.git", from: "1.0.0"), ], targets:[ .target( name: "MyApp", dependencies: [ .product(name: "ElasticApm", package: "apm-agent-ios") ] ), ])
2. Initialize the agent
If you’re using SwiftUI
to build your app, add the following to your App.swift
:
import SwiftUI import ElasticApm class AppDelegate : NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { var config = AgentConfigBuilder() .withServerUrl(URL(string:"http://127.0.0.1:8200")) .withSecretToken("<SecretToken>") .build() ElasticApmAgent.start(with: config) return true } } @main struct MyApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate init() { } var body: some Scene { WindowGroup { ContentView() } } }
If you’re not using SwiftUI
, you can alternatively add the same thing to your AppDelegate.swift
file:
import UIKit import ElasticApm @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { var config = AgentConfigBuilder() .withServerUrl(URL(string:"http://127.0.0.1:8200")) .withSecretToken("<SecretToken>") .build() ElasticApmAgent.start(with: config) return true } }
Learn more in the agent reference
Read more in the APM iOS Agent Reference.
Manually set up and configure the agent with the -javaagent
JVM option. No application code change is required, but this requires an
application restart. See below for more information on this setup method.
1. Download the APM agent
The first step in getting started with the Elastic APM Java agent is to retrieve a copy of the agent JAR. Java agent releases are published to Maven central. In order to get a copy you can either:
- download the latest agent or previous releases from Maven central.
-
download with
curl
:curl -o 'elastic-apm-agent.jar' -L 'https://oss.sonatype.org/service/local/artifact/maven/redirect?r=releases&g=co.elastic.apm&a=elastic-apm-agent&v=LATEST'
2. Add -javaagent
flag
When starting your application, add the JVM flag -javaagent:/path/to/elastic-apm-agent-<version>.jar
3. Configure
Different application servers have different ways of setting the -javaagent
flag and system properties.
Start your application (for example a Spring Boot application or other embedded servers) and add the -javaagent
JVM flag.
Use the -D
prefix to configure the agent using system properties:
java -javaagent:/path/to/elastic-apm-agent-<version>.jar -Delastic.apm.service_name=my-cool-service -Delastic.apm.application_packages=org.example,org.another.example -Delastic.apm.server_url=http://127.0.0.1:8200 -jar my-application.jar
Refer to Manual setup with -javaagent
flag to learn more.
Alternate setup methods
-
Automatic setup with
apm-agent-attach-cli.jar
Automatically set up the agent without needing to alter the configuration of your JVM or application server. This method requires no changes to application code or JVM options, and allows attaching to a running JVM. Refer to the Java agent documentation for more information on this setup method. -
Programmatic API setup to self-attach
Set up the agent with a one-line code change and an extraapm-agent-attach
dependency. This method requires no changes to JVM options, and the agent artifact is embedded within the packaged application binary. Refer to the Java agent documentation for more information on this setup method.
Set up the APM agent
The .NET agent can be added to an application in a few different ways:
- Profiler runtime instrumentation: The agent supports auto instrumentation without any code change and without any recompilation of your projects. See Profiler auto instrumentation.
- NuGet packages: The agent ships as a set of NuGet packages available on nuget.org. You can add the Agent and specific instrumentations to a .NET application by referencing one or more of these packages and following the package documentation.
- Host startup hook: On .NET Core 3.0+ or .NET 5+, the agent supports auto instrumentation without any code change and without any recompilation of your projects. See Zero code change setup on .NET Core for more details.
Learn more in the agent reference
1. Install the APM agent
Install the APM agent for Node.js as a dependency to your application.
npm install elastic-apm-node --save
2. Initialization
It’s important that the agent is started before you require any other modules in your Node.js application - i.e. before http
and before your router etc.
This means that you should probably require and start the agent in your application’s main file (usually index.js
, server.js
or app.js
).
Here’s a simple example of how Elastic APM is normally required and started:
// Add this to the VERY top of the first file loaded in your app var apm = require('elastic-apm-node').start({ // Override service name from package.json // Allowed characters: a-z, A-Z, 0-9, -, _, and space serviceName: '', // Use if APM integration requires a token secretToken: '', // Use if APM integration uses API keys for authentication apiKey: '', // Set custom APM integration host and port (default: http://127.0.0.1:8200) serverUrl: '', })
The agent will now monitor the performance of your application and record any uncaught exceptions.
Learn more in the agent reference
1. Install the agent
Install the agent using one of the packages for supported platforms.
To use the RPM Package (RHEL/CentOS and Fedora):
rpm -ivh <package-file>.rpm
To use the DEB package (Debian and Ubuntu):
dpkg -i <package-file>.deb
To use the APK package (Alpine):
apk add --allow-untrusted <package-file>.apk
If you can’t find your distribution, you can install the agent by building it from the source. The following instructions will build the APM agent using the same docker environment that Elastic uses to build our official packages.
The agent is currently only available for Linux operating system.
- Download the agent source from https://github.com/elastic/apm-agent-php/.
- Execute the following commands to build the agent and install it:
cd apm-agent-php # for linux glibc - libc distributions (Ubuntu, Redhat, etc) export BUILD_ARCHITECTURE=linux-x86-64 # for linux with musl - libc distributions (Alpine) export BUILD_ARCHITECTURE=linuxmusl-x86-64 # provide a path to php-config tool export PHP_CONFIG=php-config # build extensions make -f .ci/Makefile build # run extension tests PHP_VERSION=`$PHP_CONFIG --version | cut -d'.' -f 1,2` make -f .ci/Makefile run-phpt-tests # install agent extensions sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/ext/elastic_apm-*.so `$PHP_CONFIG --extension-dir` # install automatic loader sudo cp agent/native/_build/${BUILD_ARCHITECTURE}-release/loader/code/elastic_apm_loader.so `$PHP_CONFIG --extension-dir`
2. Enable and configure the APM agent
Enable and configure your agent inside of the php.ini
file:
extension=elastic_apm_loader.so elastic_apm.bootstrap_php_part_file=<repo root>/agent/php/bootstrap_php_part.php
Learn more in the agent reference
- Django
-
1. Install the APM agent
Install the APM agent for Python as a dependency.
$ pip install elastic-apm
2. Configure the agent
Agents are libraries that run inside of your application process. APM services are created programmatically based on the
SERVICE_NAME
.# Add the agent to the installed apps INSTALLED_APPS = ( 'elasticapm.contrib.django', # ... ) ELASTIC_APM = { # Set required service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space 'SERVICE_NAME': '', # Use if APM integration requires a token 'SECRET_TOKEN': '', # Set custom APM integration host and port (default: http://localhost:8200) 'SERVER_URL': '', } # To send performance metrics, add our tracing middleware: MIDDLEWARE = ( 'elasticapm.contrib.django.middleware.TracingMiddleware', #... )
- Flask
-
1. Install the APM agent
Install the APM agent for Python as a dependency.
$ pip install elastic-apm[flask]
2. Configure the agent
Agents are libraries that run inside of your application process. APM services are created programmatically based on the
SERVICE_NAME
.# initialize using environment variables from elasticapm.contrib.flask import ElasticAPM app = Flask(__name__) apm = ElasticAPM(app) # or configure to use ELASTIC_APM in your application settings from elasticapm.contrib.flask import ElasticAPM app.config['ELASTIC_APM'] = { # Set required service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space 'SERVICE_NAME': '', # Use if APM integration requires a token 'SECRET_TOKEN': '', # Set custom APM integration host and port (default: http://localhost:8200) 'SERVER_URL': '', } apm = ElasticAPM(app)
Learn more in the agent reference
1. Install the APM agent
Add the agent to your Gemfile.
gem 'elastic-apm'
2. Configure the agent
- Ruby on Rails
-
APM is automatically started when your app boots. Configure the agent by creating the config file
config/elastic_apm.yml
:# config/elastic_apm.yml: # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space # Defaults to the name of your Rails app service_name: 'my-service' # Use if APM integration requires a token secret_token: '' # Set custom APM integration host and port (default: http://localhost:8200) server_url: 'http://localhost:8200'
- Rack
-
For Rack or a compatible framework, like Sinatra, include the middleware in your app and start the agent.
# config.ru app = lambda do |env| [200, {'Content-Type' => 'text/plain'}, ['ok']] end # Wraps all requests in transactions and reports exceptions use ElasticAPM::Middleware # Start an instance of the Agent ElasticAPM.start(service_name: 'NothingButRack') run app # Gracefully stop the agent when process exits. # Makes sure any pending transactions are sent. at_exit { ElasticAPM.stop }
Create a config file
Create a config file config/elastic_apm.yml:
# config/elastic_apm.yml: # Set service name - allowed characters: a-z, A-Z, 0-9, -, _ and space # Defaults to the name of your Rack app's class. service_name: 'my-service' # Use if APM integration requires a token secret_token: '' # Set custom APM integration host and port (default: http://localhost:8200) server_url: 'http://localhost:8200'
Learn more in the agent reference
1. Enable Real User Monitoring (RUM)
RUM is disabled by default. Enable it by setting Enable RUM
to true
.
2. Set up the agent
Set up the agent with <script>
tags or by using a bundler.
Synchronous / Blocking Pattern
Add a <script> tag to load the bundle and use the elasticApm
global
object to initialize the agent:
<script src="https://<your-cdn-host>.com/path/to/elastic-apm-rum.umd.min-<version>.js" crossorigin></script> <script> elasticApm.init({ serviceName: '<instrumented-app>', serverUrl: '<apm-server-url>', }) </script>
Asynchronous / Non-Blocking Pattern
Loading the script asynchronously ensures the agent script will not block other
resources on the page, however, it will still block browsers onload
event.
<script> ;(function(d, s, c) { var j = d.createElement(s), t = d.getElementsByTagName(s)[0] j.src = 'https://<your-cdn-host>.com/path/to/elastic-apm-rum.umd.min-<version>.js' j.onload = function() {elasticApm.init(c)} t.parentNode.insertBefore(j, t) })(document, 'script', {serviceName: '<instrumented-app>', serverUrl: '<apm-server-url>'}) </script>
Using Bundlers
Install the Real User Monitoring APM agent as a dependency to your application:
npm install @elastic/apm-rum --save
Configure the agent:
import { init as initApm } from '@elastic/apm-rum' const apm = initApm({ // Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space) serviceName: '', // Set custom APM integration host and port (default: http://localhost:8200) serverUrl: 'http://localhost:8200', // Set service version (required for sourcemap feature) serviceVersion: '' })
Learn more in the agent reference
Elastic integrates with OpenTelemetry, allowing you to reuse your existing instrumentation to easily send observability data to the Elastic Stack.
For more information on how to combine Elastic and OpenTelemetry, see OpenTelemetry integration.
Step 5: View your data
editOnce you have at least one APM agent sending data to APM Server, you can start visualizing your data in the Kibana Applications UI.
Repositories for APT and YUM
editWe have repositories available for APT and YUM-based distributions. Note that we provide binary packages, but no source packages.
We use the PGP key D88E42B4, Elasticsearch Signing Key, with fingerprint
4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4
to sign all our packages. It is available from https://pgp.mit.edu.
To add the apm-server repository for APT:
-
Download and install the Public Signing Key:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
-
You may need to install the
apt-transport-https
package on Debian before proceeding:sudo apt-get install apt-transport-https
-
Save the repository definition to
/etc/apt/sources.list.d/elastic-8.x.list
:echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
To add the Elastic repository, make sure that you use the
echo
method shown in the example. Do not useadd-apt-repository
because it will add adeb-src
entry, but we do not provide a source package.If you have added the
deb-src
entry by mistake, you will see an error like the following:Unable to find expected entry 'main/source/Sources' in Release file (Wrong sources.list entry or malformed file)
Simply delete the
deb-src
entry from the/etc/apt/sources.list
file, and the installation should work as expected. -
Run
apt-get update
, and the repository is ready for use. For example, you can install APM Server by running:sudo apt-get update && sudo apt-get install apm-server
-
To configure APM Server to start automatically during boot, run:
sudo systemctl enable apm-server
To add the apm-server repository for YUM:
-
Download and install the public signing key:
sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
-
Create a file with a
.repo
extension (for example,elastic.repo
) in your/etc/yum.repos.d/
directory and add the following lines:[elastic-8.x] name=Elastic repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
Your repository is ready to use. For example, you can install APM Server by running:
sudo yum install apm-server
-
To configure APM Server to start automatically during boot, run:
sudo systemctl enable apm-server
Run APM Server on Docker
editDocker images for APM Server are available from the Elastic Docker registry. The base image is ubuntu:22.04.
A list of all published Docker images and tags is available at www.docker.elastic.co.
These images are free to use under the Elastic license. They contain open source and free commercial features and access to paid commercial features. Start a 30-day trial to try out all of the paid commercial features. See the Subscriptions page for information about Elastic license levels.
Obtaining APM Server for Docker is as simple as issuing a docker pull
command
against the Elastic Docker registry and then, optionally, verifying the image.
-
Pull the Docker image:
docker pull docker.elastic.co/apm/apm-server:8.16.2
Alternately, you can use the hardened Wolfi image.
docker pull docker.elastic.co/apm/apm-server-wolfi:8.16.2
-
Verify the Docker image:
wget https://artifacts.elastic.co/cosign.pub cosign verify --key cosign.pub docker.elastic.co/apm/apm-server:8.16.2
The
cosign
command prints the check results and the signature payload in JSON format:Verification for docker.elastic.co/apm/apm-server:8.16.2 -- The following checks were performed on each of these signatures: - The cosign claims were validated - Existence of the claims in the transparency log was verified offline - The signatures were verified against the specified public key
The Docker image provides several methods for configuring APM Server. The conventional approach is to provide a configuration file via a volume mount, but it’s also possible to create a custom image with your configuration included.
Download this example configuration file as a starting point:
curl -L -O https://raw.githubusercontent.com/elastic/apm-server/8.16/apm-server.docker.yml
One way to configure APM Server on Docker is to provide apm-server.docker.yml
via a volume mount.
With docker run
, the volume mount can be specified like this.
docker run -d \ -p 8200:8200 \ --name=apm-server \ --user=apm-server \ --volume="$(pwd)/apm-server.docker.yml:/usr/share/apm-server/apm-server.yml:ro" \ docker.elastic.co/apm/apm-server:8.16.2 \ --strict.perms=false -e \ -E output.elasticsearch.hosts=["elasticsearch:9200"]
Substitute your Elasticsearch hosts and ports. |
|
If you are using the hosted Elasticsearch Service in Elastic Cloud, replace
the |
The apm-server.docker.yml
downloaded earlier should be customized for your environment. See Configure APM Server for more details. Edit the configuration file and customize it to match your environment then re-deploy your APM Server container.
It’s possible to embed your APM Server configuration in a custom image. Here is an example Dockerfile to achieve this:
FROM docker.elastic.co/apm/apm-server:8.16.2 COPY --chmod=0644 --chown=1000:1000 apm-server.yml /usr/share/apm-server/apm-server.yml