Netprobe Router configuration

Use this page as a reference when you secure and configure a Netprobe Router for productions. It covers TLS and authentication first, then the YAML settings for self-monitoring and the routing pipeline.

For hands-on walkthroughs, see Introduction to Netprobe Router. If something is not working as expected, see Troubleshooting.

Security Copied

You can configure the Netprobe Router to:

Enable TLS on the Routing Collector (ingress) Copied

To require TLS from senders (Gateways, Netprobes, or other Collection Agents) that connect to the router’s gRPC ingress, add a tls block under the RoutingCollector plugin in collectors. When this block is present, the collector listens with TLS. Omit tls to accept plain-text gRPC (typical for local examples).

certFile and keyFile are the server certificate and private key that the collector presents to clients. Both are required for TLS. For more information, see Routing Collector configuration.

The following example shows a TLS-enabled collector:

collectors:
  - type: plugin
    className: RoutingCollector
    name: routing-grpc
    port: 4317
    tls:
      certFile: /path/to/server-cert.pem
      keyFile: /path/to/server-key.pem

After you enable TLS, senders must use TLS when they open the gRPC connection. If you configure mutual TLS (mTLS), senders must also supply client certificates. Plain-text clients are rejected.

Configure username and password authentication on the Routing Collector Copied

You can require username and password authentication from clients that connect to RoutingCollector. The configuration shape mirrors RoutingReporter credentials, except the collector validates credential headers instead of setting them:

RoutingReporter attaches these headers automatically from its own configuration, so clients can connect to either this collector or an ITRS Analytics instance by changing only the address.

Validation is local to this configuration. The collector does not contact IAM or another external service. Failed authentication is rejected with UNAUTHENTICATED, the same as an ITRS Analytics instance.

If you do not configure credentials for a service, clients of that service are not authenticated.

Do not put real secrets in the YAML file. Use Collection Agent environment-variable interpolation. At startup, ${env:VAR} is replaced with the value of the VAR environment variable defined for the router process. Supply those variables from your secret store at runtime (for example, Kubernetes secrets mounted as environment variables).

Use shared credentials when the same account is used for both the internal ingestion protocol and OTLP:

collectors:
  - type: plugin
    className: RoutingCollector
    name: routing-grpc
    port: 4317
    username: ${env:INGESTION_USERNAME}
    password: ${env:INGESTION_PASSWORD}

Use per-service credentials when different credentials are required:

collectors:
  - type: plugin
    className: RoutingCollector
    name: routing-grpc
    port: 4317
    internal:
      username: ${env:INTERNAL_INGESTION_USERNAME}
      password: ${env:INTERNAL_INGESTION_PASSWORD}
    otel:
      username: ${env:OTEL_INGESTION_USERNAME}
      password: ${env:OTEL_INGESTION_PASSWORD}

For setting details, see Routing Collector configuration.

Enable TLS on the TCP reporter (selfMetrics to Netprobe) Copied

The type: tcp reporter used for the standard workflow (selfMetrics toward Geneos) can use tlsConfig so the router connects to the Netprobe Collection Agent reporter over TLS instead of raw TCP. This matches a Netprobe that listens for TLS on the reporter port.

Typical fields:

The following example shows TLS configuration for a TCP reporter:

reporters:
  - type: tcp
    name: netprobe-reporter
    hostname: netprobe.example.com
    port: 9137
    tlsConfig:
      insecure: false
      trustChainFile: /path/to/netprobe-ca-chain.pem

You must also configure the Netprobe and Gateway:

Connect to ITRS Analytics by using HTTPS/TLS Copied

To secure the connection from the router to ITRS Analytics, configure each RoutingReporter to use TLS:

The following example shows TLS configuration for a RoutingReporter:

reporters:
  - type: plugin
    className: RoutingReporter
    name: iax
    hostname: ingestion.example.com
    port: 443
    usePlainText: false
    tls:
      trustChainFile: /path/to/iax-ca-chain.pem

The supplied Unix test receivers do not provide an HTTPS endpoint, so you cannot validate this configuration by using only the local example harnesses. In production, validate TLS connectivity against a real ITRS Analytics ingestion endpoint or another compatible TLS-enabled receiver.

Recommended checks:

  1. Confirm that the certificate chain is trusted by the router host or supplied through trustChainFile.
  2. Confirm that the server hostname matches the certificate.
  3. Confirm that every intermediary device supports HTTP/2 and gRPC.
  4. Review router logs for TLS handshake and certificate validation errors.

Configure username and password authentication on the Routing Reporter Copied

You can configure shared credentials or per-service credentials on the RoutingReporter.

Use shared credentials when the same account is used for both the internal ingestion protocol and OTLP:

reporters:
  - type: plugin
    className: RoutingReporter
    name: iax
    hostname: ingestion.example.com
    port: 443
    username: ingestion-user
    password: change-me

Use per-service credentials when different credentials are required:

reporters:
  - type: plugin
    className: RoutingReporter
    name: iax
    hostname: ingestion.example.com
    port: 443
    internal:
      username: internal-user
      password: internal-password
    otel:
      username: otel-user
      password: otel-password

The supplied local test receivers do not implement authenticated HTTPS ingestion. Validate credentials against a real ITRS Analytics environment or another compatible secured endpoint.

Recommended practices:

Configuration Copied

This section describes the YAML settings for the Netprobe Router. Use it as a reference when you configure a router for production or adapt the local examples.

The router uses two separate configuration paths. They share the top-level reporters list but serve different purposes:

Path What it does What to configure
Self-monitoring Sends the router’s own operational metrics to Geneos or stdout Enable self-metrics and labels, route output through workflow, and define logging or tcp reporters
Routing Accepts inbound telemetry and forwards it to downstream destinations Configure ingress, define routes and conditions, and add RoutingReporter destinations

Configure self-monitoring when you want Geneos to monitor the router itself. Configure routing when you want the router to receive and forward customer telemetry. Both paths can be used in all deployments.

The sections below follow the self-monitoring path first, then the routing path. Routing path configuration example shows how the routing components fit together. For hands-on walkthroughs, see Run the local examples. For TLS and authentication, see Security.

Self-monitoring configuration Copied

Enable selfMetrics under monitoring to publish the router’s own self-monitoring data back into Geneos.

The monitoring.selfMetrics block switches on Collection Agent self-metrics and adds labels that can be used by Geneos mappings.

monitoring:
  healthProbe:
    enabled: false
  selfMetrics:
    enabled: true
    dimensions:
      hostname: ${env:HOSTNAME}
      app: ${env:APP}

In this configuration:

Workflow configuration Copied

Configure the top-level workflow section to control how locally generated self-monitoring data is processed and where it is sent.

Note

This is separate from routingWorkflow, which handles forwarded ingress traffic.
workflow:
  storeDirectory: .
  metrics:
    reporter: tcp
    processors:
      - type: plugin
        name: geneos-workflow
        className: GeneosProcessor
  logs:
    reporter: stdout
  events:
    reporter: stdout
  attributes:
    reporter: tcp

In this configuration:

Reporting configuration Copied

The top-level reporters list defines all Collection Agent reporters, including both workflow sinks and routing plugins. This section documents the standard workflow reporters (logging, tcp) that carry the router’s own self-monitoring data.

Important

This self-monitoring path is independent of the routing path. The reporters here export the router’s own operational data back into Geneos; RoutingReporter plugins forward customer telemetry to ITRS Analytics or other recipients. For more information, see Routing Reporter configuration.

Logging reporter Copied

Send router diagnostics to stdout:

reporters:
  - type: logging
    name: stdout

Gateway reporter Copied

Send self-monitoring data to Geneos over TCP:

reporters:
  - type: tcp
    name: tcp
    hostname: localhost
    port: 9137

In this configuration:

To use TLS on the TCP reporter, see Enable TLS on the TCP reporter (selfMetrics to Netprobe).

Routing Collector configuration Copied

Configure RoutingCollector under collectors to receive inbound streaming telemetry for RoutingWorkflow. It is the only collector that supports this path. It accepts both the ITRS internal ingestion protocol and OTLP on the same port, so add only one instance per Netprobe Router.

collectors:
    # Optional, but recommended component name.
  - name: router-ingress
    # Required.
    type: plugin
    # Required.
    className: RoutingCollector
    # Required. Port on which to expose services.
    # All gRPC services are bound to the same port.
    port: 8200
    # Optional. Set an upper limit on the number of concurrent http/2 streams per connection.
    # Defaults to 2000.
    maxConcurrentCallsPerConnection: 2000
    # Optional. Set the flow control window.
    # Defaults to 64 MiB.
    flowControlWindow: 67108864
    # Client authentication, mirroring the username/password authentication performed
    # by an ITRS Analytics instance so that clients can connect to either this collector
    # or an ITRS Analytics instance, changing only the address. The configuration shape
    # mirrors the Reporter's credentials configuration, except the collector validates the
    # credential headers instead of setting them (internal ingestion service clients
    # authenticate via ingestion-client-username/ingestion-client-password headers,
    # OpenTelemetry clients via otel-client-username/otel-client-password headers;
    # the RoutingReporter attaches these automatically from its own configuration).
    # Validation is entirely local to this configuration - no IAM or other external
    # service is contacted - so values are typically injected via environment
    # variable interpolation (e.g. from Kubernetes secrets). Failures are rejected
    # with UNAUTHENTICATED, exactly as an ITRS Analytics instance would.
    # Shared credentials.
    # Can be used when the internal ingestion service and OTel service credentials
    # are the same.
    # Optional. If no credentials are configured for a service, clients of that
    # service are not authenticated (previous behaviour).
    username: user
    password: pass
    # Per service credentials.
    # Optional. Internal ingestion service credentials.
    # Only required when internal ingestion service and OTel service credentials are different.
    internal:
      username: user
      password: pass
    # Optional. OpenTelemetry service credentials.
    # Only required when internal ingestion service and OTel service credentials are different.
    otel:
      username: user
      password: pass
    # Optional. Use to enable TLS.
    # If omitted, the server accepts any connections over plain text.
    # Otherwise, the server enables TLS and can either authenticate clients
    # (i.e. use mTLS) or not depending on whether the trustChainFile is specified.
    tls:
      # Mandatory.
      certFile: /path/to/cert.pem
      # Mandatory.
      keyFile: /path/to/key.pem
      # Optional. Used only when mTLS is desired.
      trustChainFile: /path/to/trust-chain.pem
      # Optional. List of TLS protocols to enable. Defaults to TLSv1.3 and TLSv1.2 only.
      protocols: [ TLSv1.3, TLSv1.2 ]
Setting Required Description
type / className Yes Must be plugin / RoutingCollector. Registers the ingress collector as a RoutingCollector plugin.
port Yes gRPC listen port (ITRS ingestion and OTLP share this port).
name No Recommended logical name for the collector.
maxConcurrentCallsPerConnection No Upper limit on concurrent HTTP/2 streams per connection (default 2000).
flowControlWindow No Flow-control window size in bytes (default 64 MiB).
username / password No Shared credentials for both the internal ingestion service and OTLP. If credentials are not configured for a service, clients of that service are not authenticated. For more information, see Configure username and password authentication on the Routing Collector.
internal No Per-service credentials (username / password) for the internal ingestion protocol. Use when internal and OTLP credentials differ.
otel No Per-service credentials (username / password) for OTLP. Use when internal and OTLP credentials differ.
tls No If present, enables TLS server mode; certFile and keyFile are required. trustChainFile enables mTLS client verification.

Routing workflow configuration Copied

Configure RoutingWorkflow under the top-level routingWorkflow key (camelCase) to define routing rules and delivery behavior for inbound telemetry.

Here is an example:

routingWorkflow:

  # Circuit breaker auto-close timeout in milliseconds.
  # When a destination reporter fails, its circuit breaker opens and all
  # data destined for it is dropped until the timeout expires, at which
  # point the breaker closes and delivery resumes.
  # Optional. Defaults to 10000 (10 seconds).
  autoCloseTimeout: 10000

  # Global enrichments applied to every batch before route evaluation.
  # Optional. See the Enrichment section.
  enrich:
    - # ... enrichment configuration (see below)

  # List of route definitions. Required.
  routes:
    - # ... route configuration (see [Routes](#routes))
Setting Type Default Description
autoCloseTimeout Integer (ms) 10000 Duration in milliseconds that a circuit breaker remains open after a delivery failure. While open, data is dropped for that destination. After the timeout expires, the breaker closes and delivery is reattempted.
enrich List – Global enrichments applied once to each incoming batch before route conditions are evaluated. Route conditions can use the enriched values.
routes List Required One or more route definitions. Each route specifies destinations, optional filtering conditions, and optional enrichments.

Routes Copied

Define each route in the routes list under routingWorkflow to specify destination reporters and, optionally, conditions that filter which data points are forwarded to them.

routingWorkflow:
  routes:
    - reporters: [ reporter-a, reporter-b ]
      scope: all
      any:
        - field: dimensions
          operator: contains
          key: service.namespace
          value: production
Setting Type Default Description
reporters List of strings Required Names of destination reporters. Must reference reporters defined in the reporters section that implement the AsyncRoutingReporter interface. All matching data is delivered to every reporter in this list.
scope all or first all Controls how conditions are evaluated across a batch. For more information, see Batch scope.
any List of conditions Conditions combined with logical OR. A data point matches if any condition is true. Mutually exclusive with all.
all List of conditions Conditions combined with logical AND. A data point matches only if every condition is true. Mutually exclusive with any.
enrich List of enrichments Per-route enrichments applied to data points that match this route after condition evaluation and before delivery to this route’s reporters. Other routes are unaffected.

Important

If neither any nor all is specified, the route matches all data points unconditionally. You must specify exactly one of any or all if conditions are desired. Specifying both is a configuration error.

Batch scope Copied

Data arrives at RoutingWorkflow in batches. The scope setting controls how conditions are applied to the batch:

Multi-route evaluation Copied

All routes are evaluated for every incoming batch. A single batch may match multiple routes and be delivered to different sets of reporters simultaneously. Routes are evaluated independently; there is no first-match short-circuiting.

Routing conditions Copied

A condition compares one field of a data point to a value using an operator.

- field: <field_type>
  operator: <operator>
  key: <key>          # required for map-valued fields (dimensions, properties)
  value: <value>      # required for most operators
Fields Copied

Each field accesses a specific attribute of the data point. The available fields depend on the data point type being evaluated, but the configuration is unified. RoutingWorkflow automatically selects the appropriate field accessor for the data type being evaluated.

Field Accessor Type Description
type String The data point type. For more information, see Type values.
name String The data point name. For ingestion service types, this is the header name. For OpenTelemetry metrics, this is the metric name.
namespace String The data point namespace (ingestion service types only).
dimensions Map (key-value) For ingestion service types: the header dimensions map. For OpenTelemetry types: the resource attributes.
properties Map (key-value) / MultiMap For ingestion service types: the header properties map. For OpenTelemetry metrics: the data point-level attributes across all time series. For OpenTelemetry logs: the log record attributes. For OpenTelemetry spans: the span attributes.
message String The data point message body (available on log events and generic events).
severity String The data point severity level (available on log events, generic events, signal events, and OpenTelemetry logs).
value Double The numeric value of the data point (available on gauges and counters).
status_value String The string value of the data point (available on status metrics).

When a field is not applicable to the data type being evaluated (for example, value on a log event) the condition evaluates to true, allowing conditions to coexist across different data types without unintended filtering.

Type values Copied

Ingestion service types:

Value Description
gauge Gauge metric
counter Counter metric
status_metric Status metric with a string value
generic_histogram Generic histogram metric
entity_group_snapshot Entity group snapshot
log_event Log event
generic_event Generic event
signal_event Signal event
snooze_event Snooze event
audit_event Audit event
entity_attribute Entity attribute
entity_attribute_group_snapshot Entity attribute group snapshot

OpenTelemetry types:

Value Description
otel_gauge OpenTelemetry gauge metric
otel_sum OpenTelemetry sum metric
otel_summary OpenTelemetry summary metric
otel_histogram OpenTelemetry histogram metric
otel_exp_histogram OpenTelemetry exponential histogram metric
otel_log OpenTelemetry log record
otel_event OpenTelemetry event
otel_span OpenTelemetry span
Severity values Copied
Data point type Severity values
log_event, generic_event none, trace, debug, info, warn, error, critical
signal_event none, warning, critical, ok
otel_log All OpenTelemetry-defined severity levels
Operators Copied
Operator Applicable To Description
eq String, Map, Double Equality. For maps: tests whether the value at key equals value.
ne String, Map, Double Inequality. Logical inverse of eq.
eq_ignore_case String, Map Case-insensitive equality.
ne_ignore_case String, Map Case-insensitive inequality.
contains String, Map For strings: tests whether the field contains value as a substring. For maps: if value is provided, tests whether key exists with that value; if value is omitted, tests whether key exists at all.
not_contains String, Map Logical inverse of contains.
starts_with String, Map Tests whether the field or the map value at key starts with value.
not_starts_with String, Map Logical inverse of starts_with.
ends_with String, Map Tests whether the field or the map value at key ends with value.
not_ends_with String, Map Logical inverse of ends_with.
matches String, Map Regular expression match. value is a Java regular expression.
gt Double Greater than.
ge Double Greater than or equal to.
lt Double Less than.
le Double Less than or equal to.
Key and value semantics Copied
Condition examples Copied

Route all gauge metrics:

any:
  - field: type
    operator: eq
    value: gauge

Route data points with a specific resource attribute (OpenTelemetry dimension):

all:
  - field: dimensions
    operator: eq
    key: service.namespace
    value: production

Route data points whose name matches a pattern:

any:
  - field: name
    operator: matches
    value: "myapp\\..*"

Route log events with severity error or critical:

any:
  - field: severity
    operator: eq
    value: error
  - field: severity
    operator: eq
    value: critical

Route metrics where a dimension key exists regardless of value:

any:
  - field: dimensions
    operator: contains
    key: k8s.pod.name

Route only OpenTelemetry data:

any:
  - field: type
    operator: starts_with
    value: otel_

Route gauges with a value above a threshold:

all:
  - field: type
    operator: eq
    value: gauge
  - field: value
    operator: gt
    value: "100.0"

Enrichment Copied

Enrichment modifies the dimensions or properties of data points as they pass through the routing workflow. Its primary purpose is to guarantee and harmonize metadata for downstream consumers: ensuring a key is always present, normalizing key names and values from heterogeneous sources, and removing internal keys before delivery.

Enrichment is deliberately lightweight — it is not a general transformation engine. Only the dimensions and properties fields can be enriched.

You can configure enrichments in two places. Placement determines both when they apply and what can see the result:

routingWorkflow:

  # Global: applied once per incoming batch, BEFORE route evaluation.
  # Enriched values are visible to every route's conditions.
  enrich:
    - field: dimensions
      action: rename
      key: env
      value: environment

  routes:
    - reporters: [ prod-ingest ]
      all:
        # Matches on the normalised key guaranteed by the global block above.
        - field: dimensions
          operator: eq
          key: environment
          value: production

      # Per-route: applied to the data points matching THIS route, AFTER
      # condition evaluation and before delivery to this route's reporters.
      enrich:
        - field: properties
          action: delete
          key: internal.debug

The processing order for every batch is:

  1. Global enrichments (in declared order) — normalize everything before routing.
  2. Route condition evaluation — conditions can use globally enriched values.
  3. Per-route enrichments (in declared order) — harmonize for that route’s destinations only.
  4. Delivery — store-and-forward reporters persist the fully enriched batch, so replays after a restart are identical to live delivery.

Per-route enrichment is applied only to data points that match the route, and its effect is visible only to that route’s reporters. A batch matching several routes can be delivered with different enrichment per destination. Data points are never modified in place. Enrichment creates copies, so routes cannot affect each other or the collector.

Enrichment settings Copied
- field: <dimensions|properties>   # required
  action: <action>                 # required
  key: <key>                       # required - the map key to operate on
  value: <value>                   # required for set, set_if_absent, rename, prepend, append
  pattern: <regex>                 # required for sub
  replacement: <replacement>       # required for sub
  when:                            # optional conditional guard
    any: [ <conditions> ]          # exactly one of any/all
    all: [ <conditions> ]
Setting Type Description
field dimensions or properties The map field to enrich. Meanings by data type are the same as for routing conditions.
action Action The operation to apply. For more information, see Actions.
key String The map key to operate on. Required for all actions.
value String The value to write (set, set_if_absent), the new key name (rename), or the text to concatenate (prepend, append).
pattern String Java regular expression (sub only). Validated at configuration time.
replacement String Replacement text (sub only). Supports capture-group references such as $1.
when Guard Optional condition guard. For more information, see Conditional enrichment.
Actions Copied
Action Required settings Behavior
set key, value Sets key to value, overwriting any existing value. Adds the key if absent.
set_if_absent key, value Sets key to value only if the key is not already present. Use this to guarantee a key for downstream consumers without clobbering source-provided values.
delete key Removes key. No-op if absent.
rename key, value Renames key to the key name given in value, preserving its value. Overwrites any existing entry at the new name. No-op if key is absent or the names are equal.
prepend key, value Prepends value to the existing value of key. No-op if the key is absent.
append key, value Appends value to the existing value of key. No-op if the key is absent.
sub key, pattern, replacement Applies a regular expression substitution to the existing value of key (according to Matcher.replaceAll). No-op if the key is absent or the pattern does not match.

Enrichments within a block apply in declared order, so actions compose: a set followed by a sub operates on the value just set.

OpenTelemetry value typing Copied

For ingestion service data types, dimensions and properties are string maps, and all actions apply directly. OpenTelemetry attributes are typed (AnyValue):

For OpenTelemetry metrics, properties enrichment applies to the attributes of every time-series data point within the metric. This matches how properties conditions read across all data points. For logs and spans, it applies to the log record or span attributes. dimensions enrichment applies to the resource attributes for all three.

Conditional enrichment Copied

Any enrichment entry can include a when guard that uses the same condition lists as routes. The enrichment is applied only to data points that match the guard:

enrich:
  # Tag error events for downstream alerting - guard field differs from target field.
  - when:
      all:
        - field: severity
          operator: eq
          value: error
    field: dimensions
    action: set
    key: alerting
    value: "true"

  # Only stamp OpenTelemetry data.
  - when:
      any:
        - field: type
          operator: starts_with
          value: otel_
    field: dimensions
    action: set_if_absent
    key: telemetry.source
    value: opentelemetry

Guard semantics:

Performance considerations Copied

Routing Reporter configuration Copied

RoutingReporter forwards streaming telemetry from RoutingWorkflow to downstream destinations. It accepts both the ITRS internal ingestion protocol and OTLP on the same port. Configure one reporter instance per destination.

Delivery mode is set per reporter via storeAndForward:

Different destinations on the same route can use different modes.

reporters:
  - type: plugin
    className: RoutingReporter
    # Required. Name used by routing rules to identify this reporter.
    name: destination
    # Optional. Reporting target hostname. Defaults to 'localhost'
    hostname: localhost
    # Optional. Reporting target port. Defaults to 4317.
    port: 4317
    # Optional. Number of channels (connections) to use for this destination. Defaults to 8.
    # Traffic sent to this destination is balanced across all channels.
    numChannels: 8
    # Optional. Outbound gRPC client: max inbound message size (bytes). Default 8192 (8 KiB).
    maxInboundMessageSize: 8192
    # Optional. Outbound gRPC client: max inbound metadata size (bytes). Default 8192 (8 KiB).
    maxInboundMetadataSize: 8192
    # Optional. Outbound gRPC client: HTTP/2 flow-control window (bytes). Default 67108864 (64 MiB).
    # Distinct from RoutingCollector flowControlWindow, which applies to the ingress server.
    flowControlWindow: 67108864
    # Optional. Outbound gRPC keep-alive time in milliseconds. Default 60000.
    keepAliveTime: 60000
    # Optional. Outbound gRPC keep-alive timeout in milliseconds. Default 20000.
    keepAliveTimeout: 20000
    # Optional. Send keep-alive pings when there are no active RPCs. Default true.
    keepAliveWithoutCalls: true
    # Optional. Switch compression on/off. Defaults to true (gzip).
    useCompression: true
    # Optional. gRPC call deadline in milliseconds. Defaults to 10000.
    callDeadline: 10000
    # ITRS Analytics authentication shared credentials.
    # Can be used when authentication is enabled and internal ingestion service and otel
    # service credentials are the same.
    # Optional. Only required when username/password based auth is enabled on the target.
    username: user
    # Optional. Only required when username/password based auth is enabled on the target.
    password: pass
    # ITRS Analytics authentication per service credentials.
    # Optional. Internal ingestion service credentials.
    # Only required when internal ingestion service and OTel service credentials are different.
    internal:
      username: user
      password: pass
    # Optional. OpenTelemetry service credentials.
    # Only required when internal ingestion service and OTel service credentials are different.
    otel:
      username: user
      password: pass
    # TLS configuration
    # Optional. Defaults to false.
    # When false (default), and there is no 'tls' section, default is to use
    # 'insecure' TLS (i.e. we trust the server certificate presented during TLS handshake)
    # over the more recent and supported TLS protocol out of TLSv1.3 and TLSv1.2.
    # When true, overrides any TLS configuration and uses a plain text connection.
    usePlainText: false
    # Optional. Used only when usePlainText is false (the default).
    # When not using plain text this section is only required when mTLS is desired,
    # else the client trusts whatever public key it receives from the server during the
    # TLS handshake.
    tls:
      # Optional. Used only for mTLS.
      certFile: /path/to/cert.pem
      # Optional. Used only for mTLS.
      keyFile: /path/to/key.pem
      # Optional. Used for mTLS and trusted server TLS (i.e. contains trusted server keys).
      trustChainFile: /path/to/trust-chain.pem
      # Optional. List of TLS protocols to enable. Defaults to TLSv1.3 and TLSv1.2 only.
      protocols: [ TLSv1.3, TLSv1.2 ]
    # Optional. Specify store and forward based delivery for at least once delivery.
    # Note: This section is not specific to the OpenTelemetry Reporter in that it is
    #       also available for all other reporters. It is repeated here for convenience.
    storeAndForward:
      # Optional. Root directory for store and forward persisted messages.
      # Defaults to current working directory.
      directory: .
      # Optional. Store capacity. Defaults to 10000000 messages (1 message is 1 telemetry batch).
      capacity: 10000000
      # Optional. Max length of a single store file. Defaults to 1 GiB.
      maxFileLength: 1073741824
      # Optional. Number of milliseconds between explicit forced flushes.
      # -1 (default): no explicit flush (highest performance, slight risk of message loss)
      # 0: explicit flush on each write (highest resilience, lowest performance especially on slow disks)
      # N: explicit flush every N ms.
      flushOnWrite: -1
      # Optional. Switch on advisory file locking. Defaults to false.
      fileLocking: false

The following optional keys configure the outbound gRPC client channel for this RoutingReporter. They are separate from RoutingCollector settings such as flowControlWindow, which apply to the router’s ingress server.

Setting Type Default Description
maxInboundMessageSize Integer 8192 (8 KiB) Maximum accepted inbound message size per gRPC message (bytes).
maxInboundMetadataSize Integer 8192 (8 KiB) Maximum accepted inbound metadata size (bytes).
flowControlWindow Integer 67108864 HTTP/2 flow-control window for the client connection (bytes); default 64 MiB.
keepAliveTime Long 60000 Interval between gRPC keep-alive pings (milliseconds).
keepAliveTimeout Long 20000 Time to wait for a keep-alive ack before closing the connection (milliseconds).
keepAliveWithoutCalls Boolean true Whether to send keep-alive pings when there are no active RPCs.

Best-effort delivery Copied

This is the default delivery mode. When storeAndForward is not configured on a reporter, delivery is best-effort:

  1. RoutingWorkflow invokes the reporter’s async delivery method on the collector’s thread.
  2. If the reporter succeeds (the onSuccess callback), the circuit breaker is updated and a success metric is recorded.
  3. If the reporter fails (the onFailure callback), the circuit breaker opens and a failure metric is recorded. The failed batch is not retried. While the breaker is open for autoCloseTimeout milliseconds, all subsequent batches destined for this reporter are silently dropped.
  4. After the timeout expires, the breaker auto-closes and delivery resumes with the next incoming batch.

Characteristics:

When to use:

Store-and-forward delivery Copied

When storeAndForward is configured on a reporter, RoutingWorkflow adds a disk-backed store between the routing logic and the actual reporter:

  1. RoutingWorkflow writes each batch to an on-disk sequential store on the collector’s thread. This operation is fast (it is an append to a memory-mapped file) and decouples the collector from reporter availability.
  2. A dedicated background delivery thread per data type reads batches from the store, deserializes them, and delivers them to the actual reporter.
  3. On successful delivery, the store entry is committed and the read cursor advances.
  4. On failed delivery, the batch is retried with a 1-second backoff. A per-store circuit breaker prevents flooding a failing reporter. When the breaker is open, one retry is attempted periodically to test for recovery. When it closes again, all pending retries are delivered.
  5. Corrupt store entries, for example, from an unclean shutdown—are skipped and logged.

Seven independent stores are created per reporter, one for each data type:

Store Subdirectory Data Type
metric~batches/ Ingestion service metrics
log~batches/ Ingestion service logs
event~batches/ Ingestion service events
attribute~batches/ Ingestion service attributes
otel~metrics~batches/ OpenTelemetry metrics
otel~logs~batches/ OpenTelemetry logs
otel~traces~batches/ OpenTelemetry traces

Store directories are created under <storeAndForward.directory>/<RoutingWorkflow-instance-name>/<reporter-name>/, where RoutingWorkflow-instance-name is the on-disk folder name for that workflow (derived from the configured routingWorkflow instance).

Characteristics:

When to use:

Store-and-forward configuration Copied

Store-and-forward is configured in reporters under the storeAndForward key:

reporters:
  - type: plugin
    name: iax
    className: RoutingReporter
    hostname: ingestion-iax.com
    port: 443
    # more reporter config

    # Store and forward configuration.
    # Optional, but strongly recommended for production use.
    # Without this routed messages are not buffered or retried and are therefore silently dropped on error.
    storeAndForward:
      # Optional. Defaults to true.
      enabled: true
      # Path to use for on disk store.
      # Optional. Defaults to a relative path in the current working directory.
      directory: ./some/relative/path
      # Maximum number of batches the store can hold before dropping new writes.
      # Optional. Defaults to 10,000,000.
      capacity: 10000000
      # Maximum size in bytes of a single store file.
      # Optional. Defaults to 1,073,741,824 (1 GiB).
      maxFileLength: 1073741824
      # Control force-flush behaviour for writes.
      #   -1: disable force flush (default)
      #    0: force flush on every write
      #   >0: force flush at approximately this interval in milliseconds
      # Optional. Defaults to -1.
      flushOnWrite: -1
Setting Type Default Description
directory String Optional Root directory for store files. Defaults to a relative path in the current working directory.
capacity Integer 10,000,000 Maximum number of serialized batches each store can hold. When reached, new batches are dropped. Applies independently to each of the 7 stores per reporter.
maxFileLength Integer (bytes) 1,073,741,824 (1 GiB) Maximum size of a single store segment file. Larger values mean fewer files but coarser granularity for space reclamation.
fileLocking Boolean false When true, uses advisory file locks to prevent two agent instances from writing to the same store directory. Stale lock files from unclean shutdowns, for example SIGKILL, require manual removal.
flushOnWrite Long (ms) -1 Controls fsync behavior. -1 disables explicit flushing. 0 forces a flush on every write. A positive value flushes at approximately that interval. Lower values improve durability at the cost of write throughput.

Note

The enabled property defaults to true when the storeAndForward block is present. Set enabled: false to explicitly disable it without removing the configuration.

Note

The maxRetries and maxAges settings from the store-and-forward configuration are not used by the store-and-forward path in RoutingWorkflow. RoutingWorkflow retries indefinitely until delivery succeeds or the store entry is committed. This differs from the standard workflow store-and-forward behavior.

Routing workflow self-metrics Copied

RoutingWorkflow emits the following selfMetrics, dimensioned by reporter (destination name) and kind (data type):

Metric Type Description
ca_reporter_batches_reported Counter Number of batches successfully delivered.
ca_reporter_batches_dropped Counter Number of batches permanently dropped, circuit breaker open or capacity exceeded.
ca_reporter_batches_retried Counter Number of batch delivery retries, store-and-forward only.
ca_reporter_batches_skipped Counter Number of corrupt batches skipped from the store, store-and-forward only.
ca_reporter_datapoints_reported Counter Number of individual data points successfully delivered.
ca_reporter_datapoints_dropped Counter Number of individual data points permanently dropped.
ca_reporter_datapoints_retried Counter Number of individual data points retried, store-and-forward only.
ca_reporter_store_size Gauge Current number of entries in the store, store-and-forward only.

The kind dimension takes one of: metrics, logs, events, attributes, otel_metrics, otel_logs, otel_traces.

For store-and-forward reporters, the delivery task tracks its own metrics independently. For best-effort reporters, RoutingWorkflow tracks metrics directly.

Routing path configuration example Copied

collectors:
  - name: ingestion-in
    type: plugin
    className: RoutingCollector
    port: 8200
    maxConcurrentCallsPerConnection: 2000
    flowControlWindow: 8000000

reporters:
  # A best-effort destination (no store-and-forward).
  - type: plugin
    name: dev-ingest
    className: RoutingReporter

  # A production destination with store-and-forward.
  - type: plugin
    name: prod-ingest
    className: RoutingReporter
    storeAndForward:
      # Enabled with defaults.
      enabled: true

routingWorkflow:
  autoCloseTimeout: 15000

  # Normalise every batch before routing: harmonise the environment key so the
  # route below can rely on it, whatever the source called it.
  enrich:
    - field: dimensions
      action: rename
      key: env
      value: environment
    - field: dimensions
      action: set_if_absent
      key: environment
      value: unknown

  routes:
    # Route production metrics and logs to the production ingest service.
    - reporters: [ prod-ingest ]
      scope: all
      all:
        - field: dimensions
          operator: eq
          key: environment
          value: production
      # Harmonise for this destination only.
      enrich:
        - field: properties
          action: delete
          key: internal.debug

    # Send everything to the dev sink (no conditions = pass-through).
    - reporters: [ dev-ingest ]

In this example:

["Geneos"] ["Geneos > Netprobe"] ["User Guide"]

Was this topic helpful?