APM Server binary

This guide will explain how to set up and configure the APM Server binary.

Prerequisites ¶

First, 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.

Install Elastic APM yourself

Step 1: Install ¶

Note

Before 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.


deb:

Version 9.0.0 of APM Server has not yet been released.


RPM:

Version 9.0.0 of APM Server has not yet been released.


Other Linux:

Version 9.0.0 of APM Server has not yet been released.


Mac:

Version 9.0.0 of APM Server has not yet been released.


Windows:

Version 9.0.0 of APM Server has not yet been released.


Docker:

See Running on Docker for deploying Docker containers.

Step 2: Set up and configure ¶

Configure 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" 1
output.elasticsearch:
  hosts: ["localhost:9200"] 2
  username: "elastic" 3
  password: "changeme"

		
  1. The host:port APM Server listens on.
  2. The Elasticsearch host:port to connect to.
  3. 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 ¶

In 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

		

Note

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

		

Debian Package / RPM ¶

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 ¶

1. 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]" 1
}

		
  1. The Elastic plugin declaration must be added below the Android app plugin declaration (com.android.application) and below the Kotlin plugin declaration (if used).

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]" 1
}

elasticApm {
    // Minimal configuration
    serverUrl = "https://your.elastic.server"

    // Optional
    serviceName = "your app name" 2
    serviceVersion = "0.0.0" 3
    apiKey = "your server api key" 4
    secretToken = "your server auth token" 5
}

		
  1. You can find the latest version in the Gradle plugin portal.
  2. Defaults to your android.defaultConfig.applicationId value.
  3. Defaults to your android.defaultConfig.versionName value.
  4. Defaults to null. More info on API Keys here.
  5. Defaults to null.

Note

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); 1
    }
}

		
  1. Initialize the Elastic APM agent once.

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:

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:1
            .withSecretToken("<SecretToken>") 2
            .build()

        ElasticApmAgent.start(with: config)
        return true
    }
}

@main
struct MyApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    init() {
    }
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

		
  1. The APM integration host and port
  2. Secret token for APM integration connection

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:1
                       .withSecretToken("<SecretToken>") 2
                       .build()
        ElasticApmAgent.start(with: config)
        return true
    }
}

		
  1. The APM integration host and port
  2. Secret token for APM integration connection

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 extra apm-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.

Note

The agent is currently only available for Linux operating system.

  1. Download the agent source from https://github.com/elastic/apm-agent-php/.
  2. 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 ¶

Once you have at least one APM agent sending data to APM Server, you can start visualizing your data in the Kibana Applications UI.

Applications UI with data

Repositories for APT and YUM ¶

We 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.

APT ¶

Version 9.0.0-beta1 of apm-server has not yet been released.

YUM ¶

Version 9.0.0-beta1 of apm-server has not yet been released.

Run APM Server on Docker ¶

Docker 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.

Pull the image ¶

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.

However, version 9.0.0-beta1 of APM Server has not yet been released, so no Docker image is currently available for this version.

Configure APM Server on Docker ¶

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.

Example configuration file ¶

Download this example configuration file as a starting point:

			curl -L -O https://raw.githubusercontent.com/elastic/apm-server/master/apm-server.docker.yml

		

Volume-mounted configuration ¶

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:9.0.0-beta1 \
  --strict.perms=false -e \
  -E output.elasticsearch.hosts=["elasticsearch:9200"] <1> 12

		
  1. Substitute your Elasticsearch hosts and ports.
  2. If you are using the hosted Elasticsearch Service in Elastic Cloud, replace the -E output.elasticsearch.hosts line with the Cloud ID and elastic password using the syntax shown earlier.

Customize your configuration ¶

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.

Custom image configuration ¶

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:9.0.0-beta1
COPY --chmod=0644 --chown=1000:1000 apm-server.yml /usr/share/apm-server/apm-server.yml