Synadia Insights
Configuration
Insights uses a layered configuration system. Every setting can be specified through CLI flags, environment variables, or a YAML config file.
Priority Order
When the same setting is defined in multiple places, the highest-priority source wins:
- CLI flags (e.g.,
--server nats://host:4222) - Environment variables (e.g.,
INSIGHTS_NATS_SERVER=nats://host:4222) - YAML config file (loaded via
--config config.yaml) - Built-in defaults
Config File
Load a YAML config file with the --config (or -c) flag:
./insights --config /etc/insights/config.yaml
An annotated example of the common options with their defaults:
# Insights Configuration Example
#
# Annotated example of the common configuration options with their defaults.
# Load this config with: insights --config config.yaml
#
# Configuration priority (highest wins):
# 1. CLI flags (e.g., --server)
# 2. Environment variables (e.g., INSIGHTS_NATS_SERVER)
# 3. Config file (this file)
# 4. Defaults
# Log level: debug, info, warn, error
log-level: 'info'
# License configuration.
# Provide either a raw JWT string or a path to a file containing the JWT.
# If both are set, the file takes precedence.
# Required in production builds. Not required when simulator is enabled or in dev builds (--tags insights_nolicense).
license:
# Raw license JWT token string.
# Env: INSIGHTS_LICENSE_TOKEN
token: ''
# Path to a file containing the license JWT.
# Env: INSIGHTS_LICENSE_FILE
file: ''
# Base directory for persistent storage (DuckDB database + JetStream data).
# If empty, a temporary directory is created and data is lost on restart.
# Set this for persistent deployments.
data-dir: ''
# Top-level NATS connection for serving the API.
# These credentials are used by the API server and as defaults
# for indexer and scraper if not explicitly configured.
nats:
# NATS server URL
server: ''
# Path to credentials file (.creds)
creds: ''
# NATS context name (from nats context)
context: ''
# Username for basic auth
user: ''
# Password for basic auth
password: ''
# NKey seed for NKey+JWT auth (requires jwt to also be set)
nkey: ''
# User JWT for authentication.
# If nkey is also set, used as NKey-signed JWT auth.
# If standalone, used as a bearer token (server must have bearer_token enabled).
jwt: ''
# TLS certificate path
tls-cert: ''
# TLS key path
tls-key: ''
# TLS CA certificate path
tls-ca-cert: ''
# Perform TLS handshake first (before NATS protocol)
tls-first: false
# SOCKS proxy URL for connections
socks-proxy: ''
# NATS system account credentials for the target system being scraped.
# This connection is used to issue $SYS requests to collect metrics.
# This is required if the simulator is disabled.
sys: {}
# Database configuration for DuckDB.
db:
# DuckDB memory limit. Caps the buffer pool to prevent swapping on large databases.
# Examples: "4GB", "8GB", "16GB". Default: "4GB".
# Env: INSIGHTS_DB_MEMORY_LIMIT
memory-limit: '4GB'
# DuckDB worker threads. 0 uses DuckDB's default (all cores).
# Reduce to leave cores for the indexer and web server.
# Env: INSIGHTS_DB_THREADS
threads: 0
# Max wall-clock time a single $INS.db.query statement may run before it is interrupted.
# Guards against a pathological query (e.g. a count over a cartesian relation, which is pure
# CPU and never trips the memory limit) pegging the server. 0 disables the cap.
# Env: INSIGHTS_DB_QUERY_TIMEOUT
query-timeout: 2m
# Max rows the non-streaming $INS.db.query endpoint may return. That endpoint buffers the
# whole result before responding, so an unbounded SELECT * could return enough rows to run
# the server out of memory (the DuckDB memory_limit does not bound this buffered reply).
# Oversized results are rejected with a 413 pointing at the streaming endpoint
# $INS.db.query.stream. 0 disables the cap.
# Env: INSIGHTS_DB_QUERY_MAX_ROWS
query-max-rows: 100000
# Streaming query endpoint ($INS.db.query.stream). Pushes results as windowed Arrow IPC
# chunks (rendered to CSV/JSON client-side) so arbitrarily large results never accumulate
# in memory on either side, so it is not subject to the query-max-rows cap (it carries only
# the large query-stream.max-rows safety limit below).
query-stream:
# Max chunks kept in flight unacknowledged before the server pauses producing. Bounds
# client-side buffering to roughly window × chunk-size.
# Env: INSIGHTS_DB_QUERY_STREAM_WINDOW
window: 16
# Target size of each chunk message (IEC units). Clamped below the connection max_payload.
# Env: INSIGHTS_DB_QUERY_STREAM_CHUNK_SIZE
chunk-size: 512KiB
# Max time to produce each Arrow batch (incl. the first), bounding a stalled or slow-to-
# first-row query. 0 disables.
# Env: INSIGHTS_DB_QUERY_STREAM_BATCH_TIMEOUT
batch-timeout: 30s
# Abort the scan if the client sends no acknowledgement within this window (dead/Ctrl-C'd
# consumer). 0 disables.
# Env: INSIGHTS_DB_QUERY_STREAM_ACK_IDLE_TIMEOUT
ack-idle-timeout: 30s
# Per-buffer Arrow IPC compression for streamed chunks: none, lz4, or zstd. Clients
# decompress transparently. Compression uses additional CPU; leave none unless bandwidth
# is the bottleneck.
# Env: INSIGHTS_DB_QUERY_STREAM_COMPRESSION
compression: none
# Abort a streamed query after this many rows, failing fast with guidance to scope it.
# Streaming stays memory-bounded, so this is not a memory guard — it is a safety limit
# against an unscoped SELECT * over a per-epoch table/view tying up the endpoint. Bounded
# queries (epoch-scoped, entity-scoped, or LIMITed) never reach it. 0 disables the cap.
# Env: INSIGHTS_DB_QUERY_STREAM_MAX_ROWS
max-rows: 1000000
# Retention policy for automatic epoch cleanup from DuckDB.
retention:
# How long to keep data. 0 disables retention.
# Env: INSIGHTS_DB_RETENTION_DURATION
duration: 768h
# How often the retention sweep runs.
# Env: INSIGHTS_DB_RETENTION_INTERVAL
interval: 10m
# Live memory profiler: samples duckdb_memory() so `ops sizing` and
# `ops memory` can use measured peaks instead of estimates.
memory-profile:
# Enable the background memory profiler.
# Env: INSIGHTS_DB_MEMORY_PROFILE_ENABLED
enabled: true
# How often to sample duckdb_memory() (metadata-cheap).
# Env: INSIGHTS_DB_MEMORY_PROFILE_INTERVAL
interval: 2s
# Rolling window retained in memory for the peak and the Realtime chart.
# Env: INSIGHTS_DB_MEMORY_PROFILE_WINDOW
window: 15m
# Scraper configuration for collecting metrics from NATS servers.
scraper:
# Enable or disable the scraper
enabled: true
# Timeout for scrape requests
timeout: 30s
# Interval between scrapes
interval: 1m
# Optional NATS connection for publishing scraped data.
# If not specified, uses the indexer NATS config (or top-level NATS).
nats: {}
# Indexer configuration for processing and storing scraped data.
indexer:
# Enable or disable the indexer
enabled: true
# Start consuming from the latest message in the stream
stream-latest: false
# Start consuming from a specific epoch number
stream-epoch: 0
# Filter specific Z endpoints to process (comma-separated: varz,jsz,connz)
stream-filters: ''
# Downsample interval for consuming epochs
stream-interval: 0s
# Optional NATS connection for consuming scraped data.
# If not specified, uses the top-level NATS config.
nats: {}
# Sink configuration for the embedded NATS server.
sink:
# Use an embedded NATS server for storing scraped data.
embed: true
# Optional NATS server config file for the embedded server.
# The file is parsed first, then Insights-specific settings are applied on top.
# config-file: /path/to/nats-server.conf
# Host to bind the embedded NATS server to
host: '127.0.0.1'
# Port to bind the embedded NATS server to (0 = random)
port: 0
# JetStream stream name for storing scraped data
stream: 'scrape'
# Batch size for sink operations
batch-size: 500
# How long to keep scraped data in the sink stream. 0 disables retention.
# Env: INSIGHTS_SINK_RETENTION
retention: 24h
# Embedded NATS simulator configuration.
# When enabled, starts real in-process NATS clusters with traffic workloads
# so you can try insights with zero configuration.
simulator:
# Enable the embedded simulator
enabled: false
# Profiles: core-{small,medium,large}, js-{small,medium,large},
# super-{small,medium,large}, leaf-{small,medium,large},
# super-leaf-{small,medium,large}
profile: 'js-small'
# Web server configuration for the Exo-based UI.
web:
# Enable or disable the web server
enabled: true
# Hostname to bind the web server to
hostname: '127.0.0.1'
# Port to bind the web server to
port: 8080
# Session seed for secure cookies.
# The default "insights" preserves sessions across restarts but should be
# changed to a unique value for production deployments.
session-seed: 'insights'
# Enable TLS (HTTPS). When enabled, HTTP/2 is automatically available via ALPN.
# You must provide tls-cert and tls-key below; enabling TLS without them fails at
# startup (no self-signed certificate is generated).
tls: false
# Path to TLS certificate file.
tls-cert: ''
# Path to TLS private key file.
tls-key: ''
# Path to TLS CA certificate file for verifying client certificates.
tls-ca-cert: ''
# Timeout for collecting metrics
metrics-timeout: 30s
# Interval between metrics scrapes
metrics-interval: 1s
# Prometheus metrics endpoint configuration.
# Exposes check failure counts as Prometheus gauges for external scraping.
prometheus:
# Enable or disable the Prometheus metrics endpoint
enabled: true
# Hostname to bind the Prometheus metrics server to
hostname: '127.0.0.1'
# Port to bind the Prometheus metrics server to
port: 9091
# Backup configuration for creating transactionally safe DuckDB backups.
# Backups are created via NATS micro service endpoints and optionally
# uploaded to a NATS object store for remote access.
backup:
# TTL for backup files uploaded to the NATS object store.
# After this duration, uploaded backups are automatically deleted.
# Env: INSIGHTS_BACKUP_OBJECT_STORE_TTL
object-store-ttl: 24h
# Version checker configuration.
# When enabled, periodically checks GitHub for a newer release and notifies
# via a log message and a badge in the web UI. Does not download or restart.
# The release repository is baked into the binary at build time, so there is
# no URL or channel to configure.
# For licensed builds, the info dialog shows a direct download link for
# the current OS/architecture. For nolicense builds, users are directed
# to purchases.synadia.com.
updater:
# Enable or disable version checking
enabled: true
# Interval between update checks
interval: 1h
# Per-check threshold overrides for the audit checks (optional, YAML-only — there
# is no equivalent flag or environment variable).
# Many audit checks accept tunable parameters (a CPU percentage, a lag percentage,
# a byte size, ...) that control when they produce a finding. Defaults suit most
# deployments; override only what you need, keyed by check code and parameter name.
# Run `insights checks list` for codes and `insights checks info <CODE>` for the
# parameters a check accepts. Duration parameters take Go duration strings (e.g.
# 5m, 1h) and must be >= the scrape interval. Unknown parameters are logged and
# ignored; unknown check codes are silently skipped.
# Example (uncomment and adjust):
# check-thresholds:
# SERVER_003:
# cpu_percent: 80 # flag servers at or above 80% per-core CPU (default 90)
# JETSTREAM_001:
# lag_percent: 20 # flag stream replica lag at or above 20% (default 10)
# OPT_COST_002:
# max_memory_mib: 500 # flag memory-backed streams above 500 MiB (default 100)
# # Optimization checks (codes prefixed OPT_) also accept `lookback`, the analysis
# # window for range-based checks (default 6h):
# OPT_PLACE_001:
# lookback: 4h
# Outbound notification endpoints (optional, YAML-only). Delivers an alert to an
# external endpoint when an audit check changes state. `webhook` endpoints receive
# the full Alertmanager-compatible envelope; `alertmanager` endpoints receive a bare
# alert array for the Alertmanager v2 /api/v2/alerts API. Set web.external-url so
# alert links resolve. Example (uncomment and adjust):
# notifications:
# webhook:
# - name: "PagerDuty Relay"
# url: "https://example.com/webhook"
# auth-type: "bearer" # "", basic, bearer, hmac
# auth-token: "…"
# subscriptions: [SERVER_001, JETSTREAM_001]
# alertmanager:
# - name: "local-am"
# url: "http://localhost:9093/api/v2/alerts"
# subscriptions: [SERVER_001]
Environment Variable Naming
Every flag has a corresponding environment variable. The naming convention is:
- Start with the
INSIGHTS_prefix - Replace dots with underscores
- Convert to uppercase
| Flag | Environment Variable |
|---|---|
--log-level | INSIGHTS_LOG_LEVEL |
--data-dir | INSIGHTS_DATA_DIR |
--sys.creds | INSIGHTS_SYS_CREDS |
--scraper.interval | INSIGHTS_SCRAPER_INTERVAL |
--web.port | INSIGHTS_WEB_PORT |
--db.retention.duration | INSIGHTS_DB_RETENTION_DURATION |
--sink.retention | INSIGHTS_SINK_RETENTION |
--simulator.enabled | INSIGHTS_SIMULATOR_ENABLED |
Nested sections add their prefix. For example, a scraper NATS connection uses INSIGHTS_SCRAPER_NATS_SERVER.
Configuration Sections
log-level
Controls logging verbosity. Accepted values: debug, info, warn, error.
| Flag | Env | Default |
|---|---|---|
--log-level | INSIGHTS_LOG_LEVEL | info |
license
License key for production deployments. Provide either a raw JWT string or a path to a file containing the JWT. If both are set, the file takes precedence.
A license is required for production use. It is not required when the simulator is enabled (--simulator.enabled). See Installation › Configure a License for how to obtain and configure a license, and Trial for evaluation.
| Flag | Env | Default |
|---|---|---|
--license.token | INSIGHTS_LICENSE_TOKEN | (empty) |
--license.file | INSIGHTS_LICENSE_FILE | (empty) |
data-dir
Base directory for persistent storage. This directory holds the DuckDB database file (insights.db) and JetStream data (nats/).
When unset, a temporary directory is created and all data is lost on restart. Set this for any deployment where you want data to survive restarts.
| Flag | Env | Default |
|---|---|---|
--data-dir | INSIGHTS_DATA_DIR | (temp dir) |
sys.*: System Account Connection
NATS connection used to scrape the target NATS system. Insights issues $SYS requests over this connection to collect server metrics. This is required when the simulator is disabled.
| Flag | Env | Description |
|---|---|---|
--sys.server | INSIGHTS_SYS_SERVER | NATS server URL |
--sys.creds | INSIGHTS_SYS_CREDS | Path to credentials file (.creds) |
--sys.context | INSIGHTS_SYS_CONTEXT | NATS context name (from nats context) |
--sys.user | INSIGHTS_SYS_USER | Username for basic auth |
--sys.password | INSIGHTS_SYS_PASSWORD | Password for basic auth |
--sys.nkey | INSIGHTS_SYS_NKEY | NKey seed for authentication |
--sys.jwt | INSIGHTS_SYS_JWT | User JWT for authentication |
--sys.tls-cert | INSIGHTS_SYS_TLS_CERT | TLS certificate path |
--sys.tls-key | INSIGHTS_SYS_TLS_KEY | TLS key path |
--sys.tls-ca-cert | INSIGHTS_SYS_TLS_CA_CERT | TLS CA certificate path |
--sys.tls-first | INSIGHTS_SYS_TLS_FIRST | Perform TLS handshake before NATS protocol |
--sys.socks-proxy | INSIGHTS_SYS_SOCKS_PROXY | SOCKS proxy URL |
nats.*: Top-Level NATS Connection
NATS connection used by the API server and as the default for the indexer and scraper if they do not specify their own connections.
This connection is only needed when using an external NATS sink (--sink.embed=false). When the embedded sink is enabled (the default), Insights manages its own internal NATS server automatically.
The top-level connection flags are nats-CLI-style and unprefixed — --server, --creds, --context, --user, --tls-cert, --tls-key, --tls-ca-cert, --tls-first, --socks-proxy — the same options as sys.* above, without the prefix. The pre-rename --nats.* forms remain as hidden aliases, and the YAML uses a nats: block (shown in the example above). Environment variables keep the INSIGHTS_NATS_ prefix (for example --server reads INSIGHTS_NATS_SERVER).
Connection fallback order: scraper.nats falls back to indexer.nats, which falls back to nats (top-level).
db.*: Database
DuckDB configuration options.
| Flag | Env | Default | Description |
|---|---|---|---|
--db.memory-limit | INSIGHTS_DB_MEMORY_LIMIT | 4GB | DuckDB memory limit. Caps the buffer pool to prevent swapping |
--db.threads | INSIGHTS_DB_THREADS | 0 | DuckDB worker threads (0 = auto, uses all cores) |
--db.retention.duration | INSIGHTS_DB_RETENTION_DURATION | 768h | How long to keep data in DuckDB (0 = disabled) |
--db.retention.interval | INSIGHTS_DB_RETENTION_INTERVAL | 10m | How often the retention sweep runs |
--db.query-timeout | INSIGHTS_DB_QUERY_TIMEOUT | 2m | Max duration for a single $INS.db.query statement (0 = unlimited) |
--db.query-max-rows | INSIGHTS_DB_QUERY_MAX_ROWS | 100000 | Max rows the non-streaming $INS.db.query may return; a larger result is rejected with 413 pointing at the streaming endpoint (0 = unlimited) |
--db.query-stream.* | INSIGHTS_DB_QUERY_STREAM_* | — | Streaming query controls: window (16), chunk-size (512KiB), batch-timeout (30s), ack-idle-timeout (30s), compression (none/lz4/zstd), max-rows (1000000) |
The $INS.db.query.stream endpoint streams results as windowed Apache Arrow chunks so neither side buffers the whole result; insights query uses it automatically. --db.query-max-rows caps only the legacy non-streaming endpoint.
scraper.*: Scraper
Controls how Insights collects metrics from NATS servers.
| Flag | Env | Default | Description |
|---|---|---|---|
--scraper.enabled | INSIGHTS_SCRAPER_ENABLED | true | Enable or disable the scraper |
--scraper.interval | INSIGHTS_SCRAPER_INTERVAL | 1m | Time between scrape cycles |
--scraper.timeout | INSIGHTS_SCRAPER_TIMEOUT | 30s | Timeout for individual scrape requests |
--scraper.filter.allow.servers / .clusters / .tags | INSIGHTS_SCRAPER_FILTER_ALLOW_* | (empty) | Scrape only servers matching these exact names / clusters / tags |
--scraper.filter.deny.servers / .clusters / .tags | INSIGHTS_SCRAPER_FILTER_DENY_* | (empty) | Never scrape servers matching these exact names / clusters / tags |
The scraper optionally accepts its own NATS connection via --scraper.nats.* flags, falling back to the indexer NATS and then the top-level NATS connection.
Server filter. By default every discovered server is scraped. The --scraper.filter.* lists restrict the set by exact match on server name, cluster, or tag. Deny wins over allow, and a non-empty allow list restricts the set. Excluded servers receive no monitoring requests at all.
indexer.*: Indexer
Controls how scraped data is processed and stored in DuckDB.
| Flag | Env | Default | Description |
|---|---|---|---|
--indexer.enabled | INSIGHTS_INDEXER_ENABLED | true | Enable or disable the indexer |
--indexer.stream-latest | INSIGHTS_INDEXER_STREAM_LATEST | false | Start consuming from the latest message |
--indexer.stream-epoch | INSIGHTS_INDEXER_STREAM_EPOCH | 0 | Start consuming from a specific epoch number |
--indexer.stream-filters | INSIGHTS_INDEXER_STREAM_FILTERS | (empty) | Comma-separated list of endpoints to process (e.g., varz,jsz,connz) |
--indexer.stream-interval | INSIGHTS_INDEXER_STREAM_INTERVAL | 0s | Downsample interval. Skip epochs closer together than this |
web.*: Web Server
Controls the built-in web UI and HTTP server.
| Flag | Env | Default | Description |
|---|---|---|---|
--web.enabled | INSIGHTS_WEB_ENABLED | true | Enable or disable the web server |
--web.hostname | INSIGHTS_WEB_HOSTNAME | 127.0.0.1 | Bind hostname (0.0.0.0 for all interfaces) |
--web.port | INSIGHTS_WEB_PORT | 8080 | Bind port |
--web.session-seed | INSIGHTS_WEB_SESSION_SEED | insights | Seed for secure session cookies |
--web.tls | INSIGHTS_WEB_TLS | false | Enable TLS (HTTPS). HTTP/2 is automatically available via ALPN |
--web.tls-cert | INSIGHTS_WEB_TLS_CERT | (empty) | Path to TLS certificate (PEM). Required when --web.tls is set |
--web.tls-key | INSIGHTS_WEB_TLS_KEY | (empty) | Path to TLS private key (PEM). Required when --web.tls is set |
--web.tls-ca-cert | INSIGHTS_WEB_TLS_CA_CERT | (empty) | Path to a CA certificate (PEM) for verifying client certificates (mTLS) |
--web.metrics-timeout | INSIGHTS_WEB_METRICS_TIMEOUT | 30s | Timeout for collecting metrics |
--web.metrics-interval | INSIGHTS_WEB_METRICS_INTERVAL | 1s | Interval between metrics scrapes |
--web.external-url | INSIGHTS_WEB_EXTERNAL_URL | (empty) | Public base URL of this instance (e.g. https://insights.example.com); used to build links in notification alert payloads |
TLS behavior: TLS is off by default. When enabled (--web.tls), you must supply your own certificate and key (--web.tls-cert / --web.tls-key); enabling TLS without them fails at startup. Insights does not generate a self-signed certificate.
Session seed: The default value "insights" preserves sessions across restarts but should be changed to a unique secret for production deployments.
sink.*: Embedded Sink
Controls the embedded NATS server used for storing scraped data as a JetStream stream.
| Flag | Env | Default | Description |
|---|---|---|---|
--sink.embed | INSIGHTS_SINK_EMBED | true | Use the embedded NATS server |
--sink.host | INSIGHTS_SINK_HOST | 127.0.0.1 | Bind host for the embedded server |
--sink.port | INSIGHTS_SINK_PORT | 0 | Bind port (0 = random) |
--sink.stream | INSIGHTS_SINK_STREAM | scrape | JetStream stream name |
--sink.batch-size | INSIGHTS_SINK_BATCH_SIZE | 500 | Batch size for sink operations |
--sink.retention | INSIGHTS_SINK_RETENTION | 24h | How long to keep scraped data in the sink stream (0 = unlimited) |
Set --sink.embed=false to use an external NATS cluster with JetStream instead of the embedded server. See the deployment guide for external sink topologies.
simulator.*: Simulator
The built-in simulator starts real in-process NATS clusters with traffic workloads, allowing you to explore Insights with zero external dependencies.
| Flag | Env | Default | Description |
|---|---|---|---|
--simulator.enabled | INSIGHTS_SIMULATOR_ENABLED | false | Enable the embedded simulator |
--simulator.profile | INSIGHTS_SIMULATOR_PROFILE | js-small | Simulator profile |
Available profiles control the size and topology of the simulated deployment:
| Profile Family | Variants | Description |
|---|---|---|
core- | small, medium, large | Core NATS servers |
js- | small, medium, large | NATS with JetStream |
super- | small, medium, large | Super-cluster topology |
leaf- | small, medium, large | Leaf node topology |
super-leaf- | small, medium, large | Super-cluster with leaf nodes |
backup.*: Backup
Controls database backup behavior. Backups are created via the NATS micro API and can optionally be uploaded to a NATS object store for remote access.
| Flag | Env | Default | Description |
|---|---|---|---|
--backup.object-store-ttl | INSIGHTS_BACKUP_OBJECT_STORE_TTL | 24h | TTL for backups uploaded to the NATS object store. After this duration, uploaded backups are automatically deleted |
check-thresholds: Per-Check Threshold Overrides
Per-check threshold overrides. Many audit checks accept one or more tunable parameters (e.g. a CPU percentage, a lag interval, a byte size) that control when the check produces a finding. Defaults suit most deployments, but production environments often need different thresholds.
Overrides are keyed by check code and parameter name. The parameter names and default values for each check are listed in the Audit Checks Reference — any value shown as a backtick-quoted identifier in the Threshold column (e.g. `cpu_percent`) is tunable here.
Configure overrides in your YAML config file:
check-thresholds:
SERVER_003:
cpu_percent: 80 # flag servers >= 80% CPU (default: 90)
JETSTREAM_001:
lag_percent: 20 # flag replica lag >= 20% (default: 10)
OPT_COST_002:
max_memory_mib: 500 # memory-backed streams > 500 MiB
Duration parameters accept Go duration strings (e.g. 5m, 1h, 24h). They must be greater than or equal to the scrape interval — startup fails with a validation error otherwise.
Optimization checks also accept a special lookback parameter that controls the analysis window for range-based checks:
check-thresholds:
OPT_PLACE_001:
lookback: 4h
notifications
Outbound notification endpoints. When an audit check changes state (fires or resolves), Insights delivers the transition to any endpoint subscribed to that check code. Endpoints are declared under two keys by delivery format: webhook (the full Alertmanager-compatible payload envelope) and alertmanager (a bare alert array for the Alertmanager v2 POST /api/v2/alerts API). Both take the same per-endpoint fields:
| Field | Default | Description |
|---|---|---|
name | (required) | Human-readable; must be unique across all endpoints |
url | (required) | Destination URL; must be http or https |
enabled | true | Whether the endpoint is active |
timeout | 10s | HTTP request timeout (1s–300s) |
max-retries | 3 | Delivery attempts before giving up (1–10) |
auth-type | (none) | Authentication scheme: basic, bearer, or hmac |
auth-user | (empty) | Username for basic auth |
auth-token | (empty) | Password (basic), token (bearer), or secret (hmac) |
subscriptions | (empty) | Check codes this endpoint receives |
notifications:
webhook:
- name: 'PagerDuty Relay'
url: 'https://example.com/webhook'
auth-type: 'bearer'
auth-token: '…'
subscriptions: [SERVER_001, JETSTREAM_001]
alertmanager:
- name: 'local-am'
url: 'http://localhost:9093/api/v2/alerts'
subscriptions: [SERVER_001]
Notifications are a YAML-only setting. Every endpoint is validated at startup: a malformed URL, a duplicate name, an unknown auth-type, or an out-of-range timeout/max-retries fails startup rather than being silently dropped. Set --web.external-url so alert payload links resolve. See the Notifications guide for the full workflow.
Unknown parameter names are logged at startup (unknown check parameter override ignored) and discarded — the check continues to run with its defaults. Unknown check codes are silently ignored, so renamed or removed checks do not prevent the server from starting.
Threshold overrides are a YAML-only setting — there is no equivalent command-line flag or environment variable. Use --config to load a YAML file that contains your overrides.