Visit Azul.com Support

Installing the Forwarder

The Forwarder is the single point of contact between the JVMs in your environment and your Azul Intelligence On-Premises installation. Your JVMs talk to the Forwarder, and only the Forwarder talks to the installation. That keeps your firewall rules small, and it keeps every byte inside your own network.

Register the Forwarder before you install it. See Connecting Your Data Sources for how an Admin registers one and where to find the access key it needs.

For Intelligence On-Premises, you start the Forwarder in on-premises mode with --mode=local. Forwarder 2.0.7 and earlier name this mode --mode=ljvmi. In that mode it accepts the data of the Azul IC Agents and of AMT itself, writes it into delivery files, and hands these over to your installation. It makes no connection to any Azul service. The mode is chosen at startup and stays fixed for the lifetime of the process.

Server Requirements

The Forwarder runs on any server in your environment that many JVMs can reach, and from which it can reach your Intelligence On-Premises installation.

  • Java runtime version 8 (minimum 1.8.0_252) or newer

  • CPU: 2 vCPU cores minimum

  • Memory: 2 GB minimum

  • Network: inbound connections from your Agents and AMT on the Forwarder’s port (default 443), and from your monitoring on the metrics port (default 9090). Outbound connections to your installation, and to the S3 endpoint when your installation assigns S3 storage. The Forwarder doesn’t check credentials of Agents or AMT, so allow connections to its port only from your hosts.

Don’t run the Forwarder with the Agent. Make sure that no -javaagent option reaches the Forwarder’s JVM, for example through JAVA_TOOL_OPTIONS, JDK_JAVA_OPTIONS, or _JAVA_OPTIONS in its environment.

Starting From the Generated Settings File

The shortest path skips this page’s option tables. On the Forwarder’s own page under Settings > Data Source Setup, your installation offers a settings file pre-populated with the real access key and the address of your installation, which you can copy or download.

Take it to the Forwarder host and add how the Forwarder serves your Agents and AMT: a keystore, or the plain HTTP setting (see Choosing HTTP or HTTPS). The rest of this page is reference rather than procedure.

Downloading the Forwarder

Download the Forwarder from the Azul repository:

 
curl -O https://cdn.azul.com/forwarder/2.1.0/forwarder.jar

Configuring and Starting the Forwarder

You configure the Forwarder in four ways. When a value is set in more than one way, the first one in this list wins:

  1. System property on the command line, before -jar

  2. Properties file, passed with -DforwarderSettings=<file>

  3. Properties file, using the old property name (kept for backward compatibility)

  4. Environment variable

Note
A value in the properties file wins over an environment variable.

Using a Properties File

In on-premises mode, the Forwarder needs from you where to reach your installation, its access key, and whether it serves your Agents and AMT over plain HTTP or HTTPS. Everything else, such as the storage backend, the path it writes to, and the limits of the delivery files, comes back from your installation when the Forwarder checks in.

  1. Create the file:

     
    touch forwarder-settings.properties
  2. Add your settings, replacing every value that starts with < and ends with >:

     
    azul.forwarder.access.key = <forwarder-access-key> azul.ljvmi.url = https://<your-installation-address>:8443 azul.forwarder.keystore.path = <path-to-keystore> azul.forwarder.keystore.password = <keystore-password>

    azul.ljvmi.url is the address at which your installation is reached, https:// on port 8443 by default. The access key is the one minted when an Admin registered the Forwarder. The keystore holds the certificate that the Forwarder presents to your Agents and AMT. On a network you trust, you can replace the two keystore lines with azul.client.tls.disabled = true to serve plain HTTP instead. See Choosing HTTP or HTTPS.

  3. Check the setup without starting the Forwarder:

     
    java -DforwarderSettings=forwarder-settings.properties -jar forwarder.jar --mode=local --validate-args

    The command prints PASS, FAIL or SKIP for each check. It does not contact your installation.

  4. Start the Forwarder and point it at the file:

     
    java -DforwarderSettings=forwarder-settings.properties -jar forwarder.jar --mode=local
  5. Add system properties when you need them, for example to raise the log level. Put them before -jar: after -jar, the Forwarder treats them as program arguments and refuses to start.

     
    java -DazulLogLevel=debug -DforwarderSettings=forwarder-settings.properties -jar forwarder.jar --mode=local

Use --mode=local --dump-config to see the effective value of every setting and where it comes from, and --mode=local --help args to list the settings of the mode. Settings that don’t apply to on-premises mode, such as azul.ic.host, azul.forwarder.domain.names, and the proxy settings, are ignored with a warning in the log.

Frequently Used Options

Properties File
Environment Variable
Description

azul.forwarder.access.key
AZUL_FORWARDER_ACCESS_KEY

Required. The access key minted when an Admin registered the Forwarder. It is the Forwarder’s entire credential towards your installation.

azul.ljvmi.url
AZUL_LJVMI_URL

Required. The URL of your Intelligence On-Premises installation. Use http:// or https://. The scheme chooses plain HTTP or TLS. With https, the default port is 443. See Choosing HTTP or HTTPS.

azul.forwarder.keystore.path
AZUL_FORWARDER_KEYSTORE_PATH

Required, unless azul.client.tls.disabled=true. The keystore (JKS or PKCS12) with the certificate and private key that the Forwarder presents to Agents. You supply it: the Forwarder doesn’t create one in this mode, and doesn’t start when it is missing or can’t be opened.

azul.forwarder.keystore.password
AZUL_FORWARDER_KEYSTORE_PASSWORD

Required with the keystore: its password. Without it, the Forwarder can’t open the keystore and doesn’t start.

azul.client.tls.disabled
AZUL_CLIENT_TLS_DISABLED

Set to true to serve plain HTTP to Agents and AMT, as a deliberate opt-out on a network you trust. The default is false, which serves HTTPS. See Choosing HTTP or HTTPS.

azul.forwarder.port
AZUL_FORWARDER_PORT

The port on which the Forwarder accepts connections from your Agents and AMT. The default value is 443, also with plain HTTP. On Linux, a port below 1024 needs root or the CAP_NET_BIND_SERVICE capability, so choose a port above 1024 when the Forwarder runs as a regular user.

azul.forwarder.metricsPort
AZUL_FORWARDER_METRICS_PORT

The port that serves the Prometheus metrics of the Forwarder. The default value is 9090.

azul.forwarder.state.checkPeriod
AZUL_FORWARDER_STATE_CHECK_PERIOD

How often the Forwarder polls your installation. The poll refreshes the connection status, the clock and the S3 upload grant, and tells the Forwarder when an Admin disabled it. The default value is 10sec.

azul.log.level
AZUL_LOG_LEVEL

The log level of the Forwarder. Raise it to debug while you work out a connection problem.

Delivery File Limits

The Forwarder completes a delivery file when it reaches a number of lines, a size, or an age, whichever comes first. Your installation can make these limits smaller than the defaults, never larger.

Limit Default Setting

Lines

10,000

azul.local.merger.max.lines

Size

16 MiB

azul.local.merger.max.bytes

Age

10 hours

azul.local.merger.max.duration

Storing in a Directory

With filesystem storage, the Forwarder writes its delivery files straight into your installation’s inbox directory, so the Forwarder host needs that directory, writable: the same disk when both run on one host, otherwise a network share or a container volume. Grant the Forwarder access to the inbox only, not to the databases or the configuration of your installation.

At check-in, your installation tells the Forwarder where to write. By default, that is the installation’s own absolute path, <INBOX_DIR>/<tenant>/<forwarder>/, so mount the inbox at exactly the same path on the Forwarder host. When the Forwarder sees the inbox at another path, for example /mnt/ljvmi-inbox, set INBOX_WRITE_PREFIX on your installation to that path. Check-in then hands back <prefix>/<tenant>/<forwarder>/. See Storage Locations.

Storing in an S3-Compatible Bucket

Your installation decides the storage when the Forwarder checks in. With an S3-compatible bucket (AWS S3, Silo, RustFS, Ceph), the Forwarder uploads with a short-lived upload grant that your installation issues and renews, so it holds no bucket name and no S3 credentials.

Uploads to the bucket use HTTPS, and the Forwarder verifies the bucket’s certificate and host name. A bucket with a certificate from a public CA, such as AWS S3, needs no setting. For a private or self-signed certificate, such as a self-hosted Silo, RustFS, or Ceph, point the Forwarder at a truststore with the issuing CA before you start it: azul.local.s3.truststore.path and, when it is protected, azul.local.s3.truststore.password. This truststore replaces the default truststore of the JVM for the bucket. Your installation assigns the storage only at check-in, so prepare these settings whenever it may assign S3. Otherwise the Forwarder doesn’t start.

Choosing HTTP or HTTPS

The Forwarder sits on two hops, and each has its own transport setting.

The Forwarder reaches your installation. Set azul.ljvmi.url to http://<address>:<port>; or https://<address>:<port>;. The scheme chooses plain HTTP or TLS. Check-in and status polling carry the access key, so use https, which is what your installation serves by default. An installation that serves plain HTTP does so only when its operator set ALLOW_PLAIN_HTTP=true or HTTP_MODE=enabled. With http://, the Forwarder logs a warning at startup that the access key is sent unencrypted, so use it only on a trusted internal network. See TLS and HTTP.

HTTPS to the installation. With an https:// URL, the Forwarder verifies the certificate of your installation:

  • Trust: The Forwarder uses the standard JVM truststore, which is cacerts by default. To use another truststore, start the Forwarder with -Djavax.net.ssl.trustStore=<file> and -Djavax.net.ssl.trustStorePassword=<password>. There is no Forwarder-specific setting for this.

  • Host name: The host in azul.ljvmi.url must be in the Subject Alternative Names (SAN) of the certificate. There is no option to skip this check.

  • Redirects: The Forwarder doesn’t follow redirects. When your installation redirects HTTP to HTTPS, the Forwarder doesn’t start, and it logs the target URL. Put that URL in azul.ljvmi.url.

Important
-Djavax.net.ssl.trustStore also applies to the uploads to an S3-compatible bucket, unless you set azul.local.s3.truststore.path. A truststore with only your internal CA rejects a public S3 endpoint. Copy the cacerts of the JVM, import your internal CA into the copy, and use the copy as the truststore.

Your Agents and AMT reach the Forwarder. The Forwarder supports HTTP and HTTPS, but serves only one of them on its port, so all clients of one Forwarder use the same one. To let the Forwarder serve plain HTTP:

  1. On the Forwarder, set azul.client.tls.disabled = true. No keystore is needed, and the Forwarder logs a warning at startup.

  2. On the Agent, set noSsl=true and use an http:// address. See Installing the Agent.

  3. In AMT, give an http:// address. See Choosing HTTP or HTTPS for AMT.

Only the Agent version released with this Forwarder supports noSsl. Older Agents connect over HTTPS only.

Warning
With plain HTTP, all observations travel unencrypted on your network. Use plain HTTP only on networks you trust.

HTTPS is the default of the Forwarder when azul.client.tls.disabled isn’t set, with TLS 1.2 or 1.3. Set azul.forwarder.keystore.path and azul.forwarder.keystore.password to the keystore (JKS or PKCS12) with the certificate and private key that the Forwarder presents. You supply it: the certificate must be issued for the host name that your Agents use in their api.url, and at startup the Forwarder only checks that the keystore opens with the password. Each Agent verifies the certificate against its own keystore or the default truststore of its JVM. See Installing the Agent. AMT verifies it against the trust store of the operating system on each scanned host, so the CA must be trusted there. See Choosing HTTP or HTTPS for AMT.

When your installation or an unreachable network connection interrupts the status polls, the Forwarder keeps running, as explained in When the Forwarder Cannot Deliver.

Checking That the Forwarder Runs

Reading the Log

The Forwarder starts accepting connections only after the settings are valid, your installation accepts the access key, your installation assigns a supported storage, and that storage works: the directory is writable, or the S3 endpoint is reachable. Otherwise, it logs the reason and stops, so a misconfigured Forwarder fails at once on the host where you configure it.

A successful start ends with a line like this:

 
[INFO] c.a.c.f.LjvmiForwarder - Start Forwarder in local mode: scheme=http://*:443, storageType=FS, writing to <delivery-directory>

A failed start logs the reason. When the check-in with your installation fails, the reason is followed by Failed to authorize the forwarder, the application will be stopped. These messages tell you what to fix:

Log message Cause

Invalid settings are specified when starting the forwarder: error=<reason>

A required setting is missing, azul.ljvmi.url doesn’t use http or https, or the keystore can’t be read or opened with the password. The reason names the problem.

LJVMI check-in unauthorized: responseCode=<code> or LJVMI check-in returned disabled: reason=<reason>

Your installation doesn’t accept the access key, or an Admin disabled the Forwarder.

LJVMI request failed: call=check-in or LJVMI check-in failed: responseCode=<code>, responseContent=<body>

Your installation can’t be reached at azul.ljvmi.url, or the URL doesn’t point to your installation. With an https:// URL, the message adds cause=<reason>: the certificate isn’t trusted, the host name isn’t in the certificate, or the port doesn’t serve TLS. See HTTPS to the installation.

LJVMI request redirected, redirects are not followed: call=check-in, responseCode=<code>, location=<url>

Your installation redirects to another URL, for example from HTTP to HTTPS. Put the location URL into azul.ljvmi.url.

An error occurred while running the forwarder: error=<reason>

The storage that your installation assigned doesn’t work, for example the delivery directory isn’t writable, or the S3 endpoint isn’t reachable or its certificate isn’t trusted.

With plain HTTP, the Forwarder also logs a warning at startup that it serves plain HTTP and that the traffic from your Agents is unencrypted.

Opening the Status Screen

After a successful start, the Forwarder serves a status page at http://<FORWARDER_IP:PORT>/, or at https:// when it serves HTTPS.

Querying the Health API

 
curl http://<FORWARDER_IP:PORT>/forwarder/health

When the Forwarder serves HTTPS, use https://, and when your own CA issued its certificate, add --cacert <ca-certificate>.

The response contains a localDelivery block with the state of the delivery:

 
{ "state": "GREEN", "mode": "local", "version": "2.1.0", "uptime": "3600000", "formattedUptime": "00d 01h 00m 00s", "localDelivery": { "state": "GREEN", "storageType": "fs", "writePath": "<delivery-directory>", "deliverySuspended": "false", "droppedObjects": "0" }, "connectionState": "UP", "sessionId": "<session-id>" }
Field Meaning

state

GREEN, or YELLOW while delivery is paused. The overall state of the response also turns YELLOW when the host is under load, for example high CPU usage, so check localDelivery.state and reasons for the cause.

storageType

fs or s3.

writePath

Filesystem storage only: the delivery directory.

s3Target

S3 storage only: the bucket URL and key prefix. It never contains the upload credentials.

deliverySuspended

true while delivery is paused.

droppedObjects

The number of delivery files dropped since startup.

droppedSince

When the first drop happened. Only present when files were dropped.

sealLimits

The delivery file limits in effect, when your installation set any.

Add ?extended=true for memory and CPU details.

The Forwarder also publishes Prometheus metrics at http://<FORWARDER_IP>:<METRICS_PORT>/metrics. Most of them have a type label that is events or amt. A series appears once it has a value, so the S3 metrics are present only with S3 storage, and the drop counter only after a drop.

Metric Meaning

azul_forwarder_local_delivery_objects_total

Delivery files handed to storage.

azul_forwarder_local_delivery_bytes_count, azul_forwarder_local_delivery_bytes_sum, and azul_forwarder_local_delivery_bytes_max

The number, total size, and largest size in bytes of the delivery files.

azul_forwarder_local_dropped_total

Data dropped instead of delivered, with a reason label: ingest (the Forwarder is overloaded), store_error (completing a delivery file failed), or, with S3 storage, spool_overflow, grant_ceiling, or store_reject.

azul_forwarder_local_s3_upload_total

S3 storage only: upload attempts, with a result label: delivered, retry_transient, or retry_grant.

azul_forwarder_local_s3_spool_used and azul_forwarder_local_s3_spool_capacity

S3 storage only: the delivery files waiting for upload, and the maximum. These have no type label.

The Forwarder’s metrics are the only view of drops on the Forwarder side. They do not count data dropped while delivery is paused. The web interface of your installation also lists every Forwarder that has authenticated, with its last check-in and its last delivery. Use that list to confirm your data arrives. See Checking That Data Arrives.

When the Forwarder Cannot Deliver

Once it runs, the Forwarder never stops by itself.

  • Your installation is not reachable. The status poll fails and the connection status shows DOWN. Delivery continues, because it does not go through your installation. With filesystem storage, the Forwarder keeps writing files to the directory and nothing is lost. With S3 storage, uploads continue until the current upload grant expires, 15 minutes by default. After that, completed files wait in memory, up to 1,000 by default (azul.local.s3.spool.capacity), and only when that limit is reached are the oldest dropped. Files still waiting in memory are lost when the Forwarder stops. It recovers with the next successful poll. A Forwarder can only start while your installation is reachable, so don’t restart Forwarders during an outage.

  • An Admin disables the Forwarder or deletes its registration. The Forwarder pauses delivery. It keeps running and accepting connections, but drops the data it receives. Its health state turns YELLOW, the connection status shows DOWN, and reasons says that delivery is suspended. A failed status poll alone doesn’t pause delivery. When the Forwarder is enabled again, delivery resumes without a restart.

  • The S3 bucket is unavailable. Completed files wait for their upload in a bounded in-memory queue. When the bucket stays unavailable for long, the oldest waiting files are dropped first, and files still waiting at shutdown are lost. The Forwarder logs and counts every drop.

  • The Forwarder is overloaded. It drops incoming events instead of letting memory grow, and counts them.

The Forwarder delivers the JVM events and AMT reports that your installation uses. It accepts other Agent events and ignores them, and it answers requests to upload artifacts with HTTP 501. The recommended Agent options avoid sending these events and uploads at all. See Installing the Agent.