Skip to content

Every top-level key of the Arion configuration file: runtime, logging, access_logging, metrics, timezone and the bootstrap forms.

The Arion configuration file is a single YAML document, passed with --config, whose top-level keys tune the process and carry the proxy resources inside envoy_bootstrap.

Top-level keys

FieldTypeRequiredDefaultDescription
runtimeobjectnosee belowWorker cores, Tokio runtimes and scheduler tuning.
loggingobjectnostdout, errorProcess log level and destination.
access_loggingobjectnounsetAccess-log pipeline tuning, rotation and custom operators.
metricsobjectnounsetMetric partition keys, renames and custom metrics.
timezoneobjectnoUTCLocal timezone for log timestamps.
envoy_bootstrapobjectnounsetProxy resources in Envoy Bootstrap form. The canonical dialect.
bootstrapobjectnoemptyProxy resources in Arion's native form. Mutually exclusive with envoy_bootstrap.

Setting both bootstrap and envoy_bootstrap fails with only one of 'bootstrap' and 'envoy_bootstrap' may be set. If neither is present, the file contributes no proxy resources; a bootstrap must then come from the --with-envoy-bootstrap flag (see Command line), which also replaces either key when both a file and the flag are given.

runtime

Values here are overridden by environment variables, then by command-line flags, in that order of precedence (environment wins).

FieldTypeRequiredDefaultDescription
num_cpusinteger ≥ 1nodetected CPUsCores to use. Detection honours container cgroup CPU limits (v1 and v2, quota rounded up).
num_runtimesinteger ≥ 1no1Number of Tokio worker runtimes the cores are split across.
num_service_threadsinteger ≥ 1no1Threads for background service tasks.
global_queue_intervalinteger ≥ 1noTokio defaultScheduler ticks between global queue polls.
event_intervalintegernoTokio defaultScheduler ticks between I/O event polls.
max_io_events_per_tickinteger ≥ 1noTokio defaultMaximum I/O events processed per tick.
affinity_strategyobjectnounsetPin worker threads to cores: type: auto, or type: nodes / type: runtimes with map, a list of core-id lists.
codemode.pool_capacityinteger ≥ 1no128Sandboxes the whole process can run at once for MCP code mode. A listener's max_concurrent_executions cannot exceed it. Needs the codemode build feature.
codemode.max_memory_bytesinteger ≥ 1no67108864 (64 MiB)Largest memory any one code-mode sandbox may use. A listener's memory_limit_bytes cannot exceed it.
runtime:
  num_cpus: 2
  num_runtimes: 2
  event_interval: 31
  affinity_strategy:
    type: auto
  codemode:
    pool_capacity: 64
    max_memory_bytes: 33554432

The codemode values size one sandbox pool shared by every code-mode listener in the process. It is created when the first code-mode listener loads.

logging

FieldTypeRequiredDefaultDescription
log_levelstringnoerrorA tracing filter directive, e.g. info or arion_lib=debug,info. The RUST_LOG environment variable overrides it.
log_directorystringno.Directory for the log file when log_file is set.
log_filestringnounsetFile name for process logs. When set, logs move from stdout to an hourly-rotated file.
logging:
  log_level: "info"
  log_directory: /var/log/arion
  log_file: arion.log

access_logging

Tunes the shared access-log pipeline. The log destinations and formats themselves are configured per listener and per HTTP connection manager inside envoy_bootstrap — see access logs.

FieldTypeRequiredDefaultDescription
num_instancesinteger ≥ 1no1Number of access-log writer instances.
queue_lengthinteger ≥ 1no1024Queue length per writer between workers and the log writer.
log_rotationstringnounsetRotation frequency for file sinks: minutely, hourly or daily.
log_max_sizeintegernounsetMaximum size in bytes before a file rotates.
max_log_filesinteger ≥ 1no10Rotated files kept before the oldest is deleted.
blockingboolyes—When true, workers block if the queue is full instead of dropping entries.
incoming_request_headerstringnounsetHeader holding a base64-encoded JSON object, read when the request arrives; its keys feed custom_operators.
ext_proc_request_headerstringnounsetSame, read from the ext_proc request exchange.
upstream_request_headerstringnounsetSame, read when the request leaves for the upstream.
incoming_response_headerstringnounsetSame, read when the upstream response arrives.
ext_proc_response_headerstringnounsetSame, read from the ext_proc response exchange.
downstream_response_headerstringnounsetSame, read when the response is sent downstream.
wasm_headerstringnounsetSame, read from WASM filter output.
custom_operatorslist of stringsno[]Operator names usable in access-log format strings, filled from the captured JSON objects.
access_logging:
  blocking: false
  num_instances: 2
  queue_length: 4096
  log_rotation: daily
  max_log_files: 14
  incoming_request_header: x-arion-metadata
  custom_operators: [TENANT, PLAN]

metrics

FieldTypeRequiredDefaultDescription
user_keyobjectnounsetPartition key for user metrics: source is !HeaderName <name> or Sni, plus an optional attribute_name.
custom_keyslistno[]Additional partition keys for custom metrics; each entry has source: !HeaderName <name> and optional attribute_name.
renamemapno{}Renames emitted metrics, old name to new name.
custom_metricsobjectnoemptyPer-hook metric lists under incoming_request, ext_proc_request, upstream_request, incoming_response, ext_proc_response, downstream_response and wasm. Each entry is a !Counter, !Gauge or !Histogram with name, description, header_name, optional attribute_name, and buckets for histograms (numbers, or MAX).
metrics:
  user_key:
    source: !HeaderName x-user-id
    attribute_name: user
  custom_metrics:
    upstream_request:
      - !Counter
        name: api_requests
        description: Requests forwarded upstream
        header_name: x-api-key
        attribute_name: api_key

See the metrics list for what Arion emits.

timezone

FieldTypeRequiredDefaultDescription
localstringyes—IANA timezone name, e.g. Europe/Paris. Empty or UTC keeps UTC. Daylight-saving transitions are tracked in the background.
timezone:
  local: Europe/Paris

envoy_bootstrap

Contains a standard Envoy Bootstrap: node, admin, static_resources with listeners, clusters and secrets, and dynamic_resources for xDS. Field-level reference lives with each resource: listeners, routes, clusters, secrets, and the supported-configuration matrix for the full accepted subset.

envoy_bootstrap:
  static_resources:
    listeners:
      - name: listener_http
        address:
          socket_address: { address: 0.0.0.0, port_value: 8080 }
        filter_chains:
          - name: default
            filters:
              - name: http
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                  codec_type: HTTP1
                  http_filters:
                    - name: envoy.filters.http.router
                      typed_config:
                        "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                  route_config:
                    name: main
                    virtual_hosts:
                      - name: backend
                        domains: ["*"]
                        routes:
                          - match: { prefix: "/" }
                            route: { cluster: api }
    clusters:
      - name: api
        type: STATIC
        connect_timeout: 0.25s
        lb_policy: ROUND_ROBIN
        load_assignment:
          endpoints:
            - lb_endpoints:
                - endpoint:
                    address:
                      socket_address: { address: 127.0.0.1, port_value: 5678 }

The bootstrap key accepts the same resources in Arion's native serialization; that form is documented only on the native bootstrap page.

Unknown and unsupported fields

  • Top level: keys other than the seven above are ignored during deserialization.
  • Inside envoy_bootstrap: parsing is strict. Unknown or misspelled field names fail to deserialize, and the error names the YAML path. Both protobuf snake_case (filter_chains) and JSON camelCase (filterChains) spellings are accepted.
  • Known Envoy fields that Arion does not implement are refused at load with an unsupported field error rather than silently ignored — this is the compatibility promise. A field marked unsupported only errors when it is actually set to a non-default value.

Continue

Start typing to search the site.

↑ ↓ to move Enter to open Esc to close