mastering obs

Mastering Observability: Revolutionize APM with Elasticsearch Synthetic Monitoring

Written by Ramanna Hanamanthrao

| Jun 20, 2023

6 MIN READ

In the ever-evolving field of Application Performance Monitoring (APM), enhancing observability is an ongoing mission for most top organisations. As our digital ecosystem keeps growing in complexity, we require more robust, adaptive tools to ensure an optimal performance. In the quest to meet this need, Synthetic Monitoring emerges as a top choice and dynamic feature helping to revolutionize the APM landscape within Elasticsearch.

Understanding Synthetic Monitoring: A Closer Look

Traditional APM methodologies heavily rely on Real User Monitoring (RUM), a technique that captures data from genuine user interactions under real-world conditions. While RUM provides invaluable insights, it falls short in terms of pre-emptive problem identification, a critical aspect of modern APM strategies.

Filling this gap is Synthetic Monitoring. At its core, Synthetic Monitoring utilizes automated scripts that mimic user behaviour and interactions with an application. By emulating typical user journeys or transactions, Synthetic Monitoring aids in discovering potential issues and performance bottlenecks before they affect users. Let’s consider an example.

For example, you run an e-commerce website: A typical user journey might involve searching for a product, adding it to the cart, and proceeding to checkout. Synthetic Monitoring would emulate this user journey through scripts, allowing you to catch any issues like slow page loads, broken links, or faulty checkout processes before they impact your users. Thus in turn promotes better customer experience and digital perceptiveness. 

The Elasticsearch Approach to Synthetic Monitoring

Elasticsearch’s Synthetic Monitoring is integrated seamlessly into the Elastic Stack architecture. Heartbeat, a crucial component of the Elastic Stack, is now enhanced with synthetic monitoring capabilities. You can use Heartbeat to define scripted journeys in JavaScript. These scripts are then executed using a real browser (Playwright) in a headless mode, allowing you to emulate and monitor real user journeys.

Here’s a quick look at how you can enable synthetic monitoring in Heartbeat. Let’s assume we want to monitor a sign-in process:

“`yaml

heartbeat.monitors:

– type: browser

  id: my-monitor

  name: My Monitor

  schedule: ‘@every 1m’

  script: |-

    step(‘load homepage’, async page => {

      await page.goto(‘https://example.com’);

    });

    step(‘sign in’, async page => {

      await page.click(‘#sign-in’);

      await page.fill(‘#username’, ‘elastic’);

      await page.fill(‘#password’, ‘changeme’);

      await page.click(‘#submit’);

    });

“`

In the script above, two steps are defined: ‘load homepage‘ and ‘sign in.’ These steps navigate to a webpage and perform sign-in operations. Heartbeat executes these steps and monitors their performance, helping you identify any potential issues in the process.

Synthetic monitoring can be crucial in a banking context, where user experience, speed, and functionality can directly impact customer satisfaction and retention.

Consider a typical user journey in a banking application. A user might log in, view their account balance, make a transaction, and then log out. Let’s see how we can monitor this journey using synthetic monitoring in Elasticsearch’s Heartbeat.

“`yaml

heartbeat.monitors:

– type: browser

  id: banking-app-monitor

  name: Banking App Monitor

  schedule: ‘@every 1m’

  script: |-

    step(‘load homepage’, async page => {

      await page.goto(‘https://banking.example.com’);

    });

    step(‘sign in’, async page => {

      await page.fill(‘#username’, ‘testuser’);

      await page.fill(‘#password’, ‘testpass’);

      await page.click(‘#sign-in-button’);

    });

    step(‘view account balance’, async page => {

      await page.click(‘#account-overview’);

      await page.waitForSelector(‘#balance’);

    });

    step(‘make transaction’, async page => {

      await page.click(‘#make-transaction’);

      await page.fill(‘#transaction-amount’, ‘100’);

      await page.click(‘#submit-transaction’);

    });

    step(‘sign out’, async page => {

      await page.click(‘#sign-out-button’);

    });

“`

In the script above, Heartbeat is configured to perform several steps that a typical user would go through when using a banking application. This includes signing into the application, viewing the account balance, making a transaction, and finally, signing out. 

Each step is performed using real browser interactions and the performance of each is monitored. This allows you to identify any potential issues or slowdowns at each stage of the user journey. For instance, if the ‘#account-overview’ page takes too long to load the account balance, or if the transaction process experiences any delays, the synthetic monitoring will alert you to these issues before they become a problem for your users.

This approach is just one of many ways synthetic monitoring can be used to proactively identify issues and ensure optimal performance in a banking application. It exemplifies the power and versatility of synthetic monitoring within the Elastic Stack.

Let’s discuss the activation process for Synthetic Monitoring in Elasticsearch and the infrastructure requirements.

Enabling Synthetic Monitoring in Elasticsearch

Enabling Synthetic Monitoring in Elasticsearch involves the use of Heartbeat, a component of the Elastic Stack, which is now equipped to handle browser-based Synthetic Monitoring along with its regular uptime checks. Heartbeat needs to be installed and properly configured to start using Synthetic Monitoring.

Here’s a simple example of how to activate Synthetic Monitoring using Heartbeat’s configuration file, `heartbeat.yml`:

“`yaml

heartbeat.monitors:

– type: browser

  id: my-monitor

  name: My Monitor

  schedule: ‘@every 1m’

  script: |-

    step(‘load homepage’, async page => {

      await page.goto(‘https://example.com’);

    });

    step(‘sign in’, async page => {

      await page.click(‘#sign-in’);

    });

“`

In this example, Heartbeat is configured to run synthetic tests every minute (`@every 1m`). These tests include loading a homepage and attempting to sign in.

Infrastructure Requirements

To run Synthetic Monitoring with Heartbeat, you need a server where Heartbeat can be installed and run. This server should have sufficient resources to execute the synthetic tests using headless browsers. 

Heartbeat is compatible with most modern Linux distributions, Windows, and macOS, which means it can be run on virtually any modern server or cloud platform. It can also be run inside a Docker container for easy deployment and scaling.

The exact infrastructure requirements will depend on the complexity and number of your synthetic tests. Each test requires a separate browser instance, so more complex testing scenarios with multiple concurrent tests will require more resources. 

Furthermore, Heartbeat should have network access to the services you want to monitor, as well as to your Elasticsearch cluster, where it will send the monitoring data.

In addition to Heartbeat, you will need an Elasticsearch cluster to store the monitoring data and Kibana to visualize and analyze this data. The size and configuration of your Elasticsearch cluster will depend on the volume of monitoring data you expect to generate.

Finally, Synthetic Monitoring with Heartbeat utilizes the Elastic APM Server to process and store the Synthetic Monitoring data. This APM Server should be properly installed and configured to receive data from Heartbeat.

By meeting these infrastructure requirements and following the activation process, you can effectively leverage Synthetic Monitoring within your Elasticsearch environment.

Key Features and Benefits of Synthetic Monitoring:

  • Proactive Monitoring:
    Proactive Monitoring in Synthetic Monitoring allows developers to identify and rectify potential issues before they impact users. This ability for early detection and resolution is a significant step up from traditional monitoring methods that often identify issues after they’ve occurred. The synthetic tests can be scheduled to run at regular intervals, thereby providing continuous coverage and minimizing the risk of disruptions.For instance, if a critical API endpoint starts responding slowly due to increased load or a bottleneck, Synthetic Monitoring can highlight this degradation before it significantly impacts the user experience, enabling swift remedial action.
  • Performance Benchmarking:
    Synthetic Monitoring offers repeatable and consistent tests that serve as an effective benchmarking tool. This allows for accurate tracking of performance metrics over time, which can assist in quantifying the impact of changes made to the application or infrastructure.For example, before and after deploying a significant code change, synthetic tests can be run to measure any impact on the application’s response time. This gives developers concrete data on how changes affect application performance.
  • Availability Checks:
    Synthetic Monitoring can simulate user interactions round the clock, ensuring that your application’s availability is checked at regular intervals. These checks provide an additional layer of assurance that all aspects of the application are functional and responsive, thereby enhancing user experience.This feature can be especially valuable for applications with global user bases across different time zones. With Synthetic Monitoring, it’s possible to simulate user interactions from various geographical locations, helping you identify any region-specific availability issues.
  • SLA Monitoring:
    Service Level Agreements (SLAs) are often critical in ensuring your business meets its contractual obligations. Synthetic Monitoring can be employed to validate and measure SLAs, adding a level of transparency and assurance to your business operations.For instance, if you have an SLA that guarantees a response time under 200ms for a particular service, Synthetic Monitoring can continuously test this service to ensure that the SLA is being met.
  • In-Depth Performance Insights:
    Synthetic Monitoring transcends basic uptime checks, providing granular insights into performance bottlenecks. With this deeper understanding, businesses can make precise optimizations for a superior customer experience.For example, by using Synthetic Monitoring, you may discover that a specific API call is causing a slowdown in your user registration flow. Having identified the issue, you can then focus on optimizing that particular API, thereby improving the overall performance of the registration process.


In conclusion, Synthetic Monitoring with Elasticsearch and the Elastic Stack offers a powerful, integrated, and customizable solution for your APM (application performance monitoring). The capabilities go beyond basic monitoring, providing developers with the tools they need to ensure the best possible performance and user experience. 

Talk to us today, if you need any guidance or insights on setting up Synthetic Monitoring using Elasticsearch. Ashink is an Elastic partner and has enabled several enterprises with their Elastic consulting, services, subscriptions or more. 


Go to Top