Integrator

The Integrator is a high-throughput data forwarding engine that receives monitoring data and dispatches it to third-party systems and notification channels.

Overview

Property Value
Service name MugnsoftIntegrator
Default port 8052
Configuration file integrator.json
Version v4.0.0
Architecture Worker pool with configurable concurrency

Service Management

CLI Commands

# Install as service and register with the Webserver
integrator install <webserver_ip>:<port>

# Re-register with the Webserver
integrator register <webserver_ip>:<port>

# Migrate to a new Webserver
integrator migrate <webserver_ip>:<port> <jwt_token>

# Start / Stop / Restart
integrator start
integrator stop
integrator restart

# Run in foreground (Docker or debugging)
integrator run

# Remove the service
integrator uninstall

# Display help
integrator help

Configuration

Core Settings

{
  "name": "integrator1",
  "port": "8052",
  "logLevel": "info",
  "nbworker": "4",
  "queuesize": "10000"
}
Field Description Default
name Unique integrator identifier required
port API listening port "8052"
logLevel debug, info, warn, error "info"
nbworker Number of worker goroutines "4"
queuesize Task queue capacity "10000"
backupInterval Hours between KV store backups 24
nbDaysBackup Days to keep backup files 336

Directory Structure

<install_dir>/
├── integrator(.exe)         # Executable
├── integrator.json          # Service configuration
├── config/
│   ├── sec/                 # RSA keys for JWT signing
│   └── ssl/                 # TLS certificates
│       ├── certificates/
│       └── private/
├── dbs/                     # embedded key-value databases
│   ├── integrator.db        # Main KV store (settings, users, JWT)
│   ├── event.db             # Incoming monitor data cache (for pull integrations)
│   ├── metrics.db           # System metrics (CPU, memory, uptime)
│   └── backup/              # Automated backups
├── log/                     # Rotated log files
├── data/                    # CSV/JSON data exports
├── notif_buffer/            # Disk-backed retry queue for failed notifications
└── scripts/                 # Custom alert scripts

Worker Pool Architecture

The Integrator uses a producer-consumer pattern for high-throughput data processing:

HTTP Handler (producer)                   Workers (consumers)
     |                                         |
     |-- parse JSON, create Task -->           |
     |-- enqueue with 5s timeout -->  [Queue]  |
     |-- return HTTP 200 immediately           |
     |                                    +--> Worker 1 --> process + forward
     |                                    +--> Worker 2 --> process + forward
     |                                    +--> Worker 3 --> process + forward
     |                                    +--> Worker 4 --> process + forward

Key characteristics:

  • Non-blocking: HTTP handlers return immediately after queueing
  • Configurable workers: Set via nbworker (default: 4)
  • Queue capacity: Set via queuesize (default: 10,000 tasks)
  • Graceful reconfiguration: Workers drain the queue before restarting with new settings

Cross-Agent Correlation Engine

The Integrator includes an optional correlation engine that performs root-cause analysis. When a monitor breaches, the engine looks back over a configurable window for an earlier breach of an upstream monitor type that can be shown to concern the same host. If it finds one, it attaches a root-cause reference to the event instead of letting every symptom travel as an unrelated alert.

Opt-in feature. The correlation engine is disabled by default. Enable it with correlationEnabled (see below). It runs in a fire-and-forget goroutine and never adds latency to the alert path.

Example

Without correlation, a single failing host produces three independent alerts:

22:48  disco/agent       on probe-prod-01  → CRITICAL  (agent unreachable)
22:50  url/shop-frontend on probe-prod-02  → ERROR     (connection refused)
22:50  api/checkout-api  on probe-prod-02  → ERROR     (connection refused)

With correlation enabled, the downstream failures are linked back to the earliest breach — here across two different probes, because the Sentinel Agent that broke first runs on the very host the url and api checks target:

[RCA] url_shop-frontend_probe-prod-02 — [Correlated: disco/agent (declared) breached 2m ago — root cause]
[RCA] api_checkout-api_probe-prod-02  — [Correlated: disco/agent (declared) breached 2m ago — root cause]

The Webserver Events page then shows this as 3 events → 1 incident.

Configuration

Parameter Type Default Description
correlationEnabled "true" / "false" "false" Master switch — opt-in
correlationWindowMinutes string (integer) "10" How far back to look for upstream breaches

These can be set two ways:

  1. integrator.json — edit the file in the install directory (persists across restarts).
  2. Live from the Webserver UI — go to Settings → Integrator → [your integrator]. The Webserver pushes the values to the Integrator’s /setsetting endpoint and the engine reconfigures immediately, no restart required.
Integrator correlation settings: correlationEnabled and correlationWindowMinutes fields

Causal model

The engine uses a fixed dependency graph defining which monitor type can be the upstream cause of another:

Downstream type Possible upstream cause
url db, tcp, nslookup, ping, disco
api db, tcp, nslookup, ping, disco
db tcp, nslookup, ping, disco
tcp nslookup, ping, disco
nslookup ping, disco
ping disco
disco (root — never correlated downstream)

The layering follows what a check actually depends on, from the network up: a url failing can be explained by anything below it, while a ping failing can only be explained by the host itself being in trouble. The monitor types eum, sys, snmp, wmi and app are not in the model and are never correlated — app is an aggregate rollup downstream of everything, and the others are not hooked into the window.

Host linkage — how a candidate becomes a cause

Being upstream and in-window is not enough. The engine keeps a candidate only when it can establish that the two monitors concern the same host, and it records how it established that in the event’s rca.link field. Ranked by confidence:

rca.link Meaning Crosses probes Confidence
service The vanished process owned the very port the failing check connects to. The only link backed by service-level evidence rather than host-level inference — see below. Yes Highest
declared The downstream monitor was provisioned from that Sentinel Agent’s own configuration — it watches that agent’s host by construction. Nothing is inferred. Yes Very high
address The Sentinel Agent runs on the host the monitor targets, confirmed by address match. Yes High
target Both monitors ran on the same probe and reported the same target. No High
probe Same probe only — the targets could not be compared (one side predates target reporting). A hint, not a conclusion. No Low
Cross-probe correlation is supported, but only when it is earned. declared and address links come from a Sentinel Agent running on the target host, so a breach it reports can explain a url, api or db check executed from a completely different probe. A link resting on the probe alone (probe) is never allowed to cross probes.

Links with rca.targetMatch = true (declared, address, target) are treated as confirmed. A probe link is flagged as unverified everywhere it is displayed — a question-mark icon in the Events table and on the incident chip — so an operator can tell a real dependency from a coincidence of scheduling.

Service linkage — did the cause serve the port under test?

Host linkage asks “is this the same machine?". For a Sentinel missing cause — a monitored process that disappeared — that question alone is too coarse: on a host running a dozen monitored processes, any one of them vanishing would adopt every tcp and api failure on that box as its symptom, whether or not it had anything to do with the port being tested.

Port evidence adds the narrower question: “is this the same service?"

How the two sides get their ports. The probe reports the port its check connects to as hostport (proto/port, e.g. tcp/5432) — taken from the explicit port for tcp, udp and db checks, and from the URL (or 443/80 by scheme) for url and api. The Sentinel Agent remembers, for every monitored process, the set of ports it was last observed listening on while it was still alive, and sends that set (procports) with the missing event. A missing process has no sockets left to inspect, so a remembered value is the only kind of port evidence that can exist for it.

The verdict then lands in rca.portEvidence:

rca.portEvidence Situation Outcome
matched The check’s port is in the cause’s observed set. Link is upgraded to service and keeps the top tie-break tier. This is the only RCA wording on the Events page allowed to drop the word “possible”.
indirect Both sets are known and disjoint, and the symptom is a url or api check. Link is kept but demoted, and flagged. A local reverse proxy (nginx on 443 forwarding to an app on 8080) makes disjoint ports routine at the application layer — that is evidence of indirection, not of irrelevance.
unknown The ports could not be compared — an older probe or Sentinel, a process never observed with a listening socket, an agent that cannot attribute sockets to processes, or an observation older than 24 h. Link is kept but demoted.
(rejected) Both sets are known and disjoint and the symptom is a tcp or db check. Dropped. A tcp check is a connection to that exact port; a process that never listened on it cannot be the cause.
(rejected) The symptom has no port at all — ping, nslookup. Dropped. A dead process never explains an ICMP failure.
Reject on positive evidence, never on missing evidence. This is the invariant the whole correlation engine is built on, and port evidence follows it exactly: a mismatch is only ever asserted when the symptom named a port and the cause has a non-empty, non-stale observed set for the symptom’s own protocol and the port is not in it. Anywhere the answer is not known, the link survives, hedged — it never switches correlation off.

Ranking. Unproven, missing is no longer top-tier: “a process vanished somewhere on this host” is weaker evidence than “this host is saturated”, which at least applies to every service on the box. A missing cause therefore only keeps tier 0 while portEvidence is matched; unknown and indirect drop it to the default tier, where a cpu, mem or fs breach in the same window wins the tie.

Note:

Port evidence gates exactly one class of Sentinel metric: the ones confined to a single service. Host-scoped metrics are unaffectedcpu, mem, fs, loadAvg* and tcpSockets describe the whole machine, so they can starve any service on it and port evidence is neither available nor meaningful for them. dirmissing is likewise unaffected: a vanished directory has no port to speak of.

Mixed fleets degrade, never break. An older probe sends no hostport, an older Sentinel sends no procports; both land in unknown, which is hedged and demoted but never rejected. An older Integrator ignores the new fields entirely. The one behaviour change on an un-upgraded estate is the demotion of missing from tier 0 — which is the intended correction.

Onset — could the cause have started it?

Host linkage answers “could this candidate explain the failure”. Onset answers “could it have started it”, and it is the one thing the look-back window alone cannot show.

A failing monitor re-reports on every tick, and the engine re-evaluates each of those reports. Without an onset rule, a monitor that has been failing for days adopts whatever fresh breach happens to be in the window at that moment:

11 API monitors on probe-win1, ERROR since 3d 3h   ← all provisioned by the Sentinel legion-vi7
discovery-win1-missing-Notepad.exe, CRITICAL 17m   ← same Sentinel, unrelated process
→ all 11 wrongly grouped under "disco/missing"

Declared ownership made that Sentinel breach eligible for every monitor it provisioned — correctly, they do watch that host — and nothing asked whether those monitors were already broken before it happened. Something already broken cannot be a symptom of something that started later.

Two independent tests, and either one disqualifies a candidate:

Test Evidence used Reach
Window precedence — this monitor already has a breach of its own in the window from before the candidate broke Integrator clock on both sides — nothing to skew Only as far back as the window, and only for monitors whose interval is shorter than it
Reported onset — the probe’s since (when the monitor entered its current status) predates the candidate’s breach by more than 2 minutes Probe clock vs Integrator clock Arbitrarily far back
Why the 2-minute allowance, and why the second test is guarded. since comes off the probe’s clock and the window timestamps off the Integrator’s, with nothing synchronising them — so the test only catches gross impossibilities (three days versus seventeen minutes), never fine ones. And on the very tick a status flips, the probe still reports the previous status segment’s start, which makes a monitor that has just broken look ancient. The reported-onset test is therefore applied only once the window proves this is not the monitor’s first failing tick — otherwise it would reject exactly the fresh correlations the engine exists to find.

A probe that sends no since disables the second test for that event rather than dropping the correlation — the same “reject only on positive evidence” principle host linkage follows. Rejections are logged at DEBUG level:

[RCA] api_influxdb3_health — dropped disco/missing: already failing at 2026-08-02T18:03:41+02:00, candidate breached 2026-08-02T18:10:41+02:00

The rca payload

Correlated events carry an rca object alongside the usual result fields. The Webserver reads it to build the Events page:

Field Description
causeName Record name of the cause — the join key back to the cause’s own event
causeType Monitor type of the cause (disco, db, …)
causeMetric Metric of the cause, when the type has one
causeStatus Status the cause was in
causeTarget Host the cause concerns
causeAgent Sentinel Agent that reported the cause (declared / address links)
probe Probe that ran the cause’s check
link service | declared | address | target | probe — see above
crossProbe true when cause and symptom were executed by different probes
targetMatch true when the host linkage was confirmed
portEvidence matched | indirect | unknown — written only for a port-scoped Sentinel cause, so it reads as a finding rather than as “not applicable”
causePort The port both sides agree on (tcp/5432), on a matched verdict only
portAttr none when the Sentinel Agent reported it cannot attribute sockets to processes at all — lets the UI say “unknown because this agent is blind here” rather than a bare “unknown”
at Epoch of the cause’s breach
ageMinutes How much earlier the cause broke — the evidence for the link

Incidents on the Events page

When at least one enabled Integrator has correlation on, the Webserver Events page grows an RCA column and an incident strip:

  • Each event is shown as a root (something points at it, with its symptom count), a symptom (naming its cause and how many minutes earlier it broke), or independent.
  • The strip headlines the ratio that is the whole point of the feature — 24 events → 9 incidents, with the folded-away symptom count.
  • Clicking an incident chip, or an RCA cell in the table, isolates that incident and re-sorts it oldest-first so the root cause reads at the top followed by what it took down. Clicking again clears.
  • A root cause that is not in the current view (filtered out by tags, or handled by another Integrator) still forms an incident and is flagged with an eye-slash icon.
  • A grouping that is not fully confirmed — one unverified host link, or any symptom whose port evidence is indirect or unknown — carries a question-mark icon on the chip and on the row. It is all-or-nothing: one hedged symptom hedges the whole incident.

For how to read and drive that column day to day — filters, the incident strip, isolating an incident — see Events page.

How it works

non-OK result arrives (url / api / tcp / db / ping / nslookup / disco)
        │
        ▼
recordRecentEvent()  ──►  in-memory sliding window
        │                  (capped at 500 entries, RWMutex-protected)
        ▼
correlateEvent()
        │  1. look up upstream types in the causal model
        │  2. scan the window for in-window, different-monitor,
        │     upstream-type breaches
        │  3. qualify each candidate by host linkage
        │     (declared → address → target → probe)
        │     then, for a port-scoped Sentinel cause, by port evidence
        │     (matched → service link | disjoint → reject or hedge)
        │  4. drop candidates this monitor was already failing before
        │     (window precedence + reported onset)
        │  5. pick the EARLIEST qualifying match
        ▼
attach `rca` to the event  +  log "[RCA] … [Correlated: …]" at INFO level

Only non-OK statuses are recorded. A cron job (purgeOldRecentEvents, every minute) removes entries older than correlationWindowMinutes; the window is also hard-capped at 500 entries.

Environment correlationWindowMinutes
Fast (monitors every 1 min) 5
Standard (every 1–5 min) 10 (default)
Slow / batch (every 5–15 min) 2030

Set the window to roughly 2× the longest monitor interval so an upstream breach is recorded before downstream monitors fire. With cross-probe links in play, take the longest interval across all probes involved, not just one.

Ticketing: one incident instead of one per monitor

With ServiceNow enabled, serviceNowIncidentScope decides how many incidents an outage is worth:

Value Behaviour
all (default) One incident per breaching monitor.
root An event the engine tied to an earlier upstream failure opens no incident of its own — it is added as a work note on the root cause’s incident instead.

root needs the correlation engine enabled: with it off nothing is ever a symptom, so every event still opens its own incident. See ServiceNow integration.

Current limitations

Limitation Detail
Earliest breach wins No confidence scoring between qualifying candidates — the earliest one is reported
Seven types hooked Only url, api, tcp, db, ping, nslookup, disco results enter the correlation window
Onset is blind for one tick after a restart The window is rebuilt from scratch when the Integrator restarts, so on the first report of each monitor there is nothing to prove it was already failing. A long-standing failure can be correlated once, and stops being from its next tick on
Alerting unchanged Correlation enriches events and ServiceNow incident scope; it does not suppress emails/Slack/Teams
Window is per-process The sliding window is in-memory and per Integrator — events split across Integrators do not correlate

Supported Integrations

Push Integrations (Integrator sends data outbound)

InfluxDB (v1.x / v2.x / v3.x)

{
  "influxDBEnabled": "true",
  "influxDBVersion": "2.x",
  "influxDBServer": "influxdb.example.com",
  "influxDBPort": "8086",
  "influxDBOrg": "myorg",
  "influxDBBucket": "mugnsoft",
  "influxDBToken": "your-token",
  "influxDBSSL": "true"
}

Data is sent in line protocol format:

eumResponseTime,name=MyScenario,type=eum,status=NORMAL,location=Paris responseTime=125.5,statusInt=0 1234567890000000000

Features: connection pooling, retry logic (2 retries, 5s wait), SSL support.

Splunk (HTTP Event Collector)

{
  "splunkEnabled": "true",
  "splunkCollectorServer": "splunk.example.com",
  "splunkCollectorPort": "8088",
  "splunkAuthorizationToken": "your-hec-token",
  "splunkIndex": "mugnsoft",
  "splunkSSL": "true"
}

Data is sent as JSON events to the Splunk HEC endpoint.

Elasticsearch

{
  "elasticEnabled": "true",
  "elasticServer": "elastic.example.com",
  "elasticPort": "9200",
  "elasticUser": "elastic",
  "elasticPwd": "password",
  "elasticSSL": "true"
}

Data is sent via the Bulk API (_bulk endpoint) as JSON documents.

Kafka

{
  "kafkaEnabled": "true",
  "kafkaBrokers": "broker1:9092,broker2:9092",
  "kafkaTopic": "mugnsoft-metrics",
  "kafkaTLS": "true",
  "kafkaSASLMechanism": "SCRAM-SHA256",
  "kafkaSASLUser": "user",
  "kafkaSASLPwd": "password"
}

Supports: TLS with custom CA/cert, SASL authentication (PLAIN, SCRAM-SHA256, SCRAM-SHA512), connection pooling.

Canopsis

{
  "canopsisEnabled": "true",
  "canopsisServer": "canopsis.example.com",
  "canopsisPort": "8082",
  "canopsisUser": "root",
  "canopsisPwd": "password",
  "canopsisSSL": "false"
}

ServiceNow

{
  "serviceNowEnabled": "true",
  "serviceNowServer": "dev12345.service-now.com",
  "serviceNowPort": "443",
  "serviceNowUser": "mugnsoft.integration",
  "serviceNowPwd": "password",
  "serviceNowSSL": "true",
  "serviceNowResolvedState": "6",
  "serviceNowCloseCode": "Resolved by caller"
}

Unlike the other push targets, ServiceNow follows the full incident lifecycle: it opens an incident when a monitor breaches and auto-resolves it when the monitor recovers. Incidents are correlated through the ServiceNow correlation_id field, so resolve works even across Integrator restarts. Actions are taken only on a confirmed status change, so repeated non-OK polls never open duplicate incidents. Auto-resolve respects ITSM ownership: an incident a human has already taken (assigned / past New) is left open with a recovery note rather than being closed automatically.

GLPI

{
  "glpiEnabled": "true",
  "glpiServer": "glpi.example.com",
  "glpiPort": "443",
  "glpiUser": "mugnsoft.integration",
  "glpiPwd": "password",
  "glpiAppToken": "app-token",
  "glpiSSL": "true",
  "glpiSolvedStatus": "5"
}

Like ServiceNow, GLPI follows the full ticket lifecycle: it opens a ticket when a monitor breaches and auto-resolves it when the monitor recovers. GLPI has no native correlation field, so the open ticket is located through an embedded key stamped into the ticket title — resolve therefore works even across Integrator restarts. Actions are taken only on a confirmed status change, so repeated non-OK polls never open duplicate tickets. Auto-resolve respects ITSM ownership: a ticket a human has already taken (assigned / processing / pending) is left open with a recovery follow-up rather than being closed automatically. Authentication is HTTP Basic against the GLPI REST API, with an optional App-Token when the GLPI API client requires one.

Jira (Cloud)

{
  "jiraEnabled": "true",
  "jiraServer": "your-domain.atlassian.net",
  "jiraPort": "443",
  "jiraUser": "you@example.com",
  "jiraPwd": "api-token",
  "jiraSSL": "true",
  "jiraProjectKey": "OPS",
  "jiraIssueType": "Bug",
  "jiraResolveTransition": "Done"
}

Like ServiceNow, Jira follows the full issue lifecycle: it opens an issue when a monitor breaches and auto-resolves it when the monitor recovers. Jira has no native correlation field, so the open issue is located through a sanitized label (mugnsoft-<type>-<name>-<probe>) matched server-side with an exact JQL query — resolve therefore works even across Integrator restarts. Jira has no direct status-set, so resolve is a workflow transition looked up by name (jiraResolveTransition, default Done). Auto-resolve respects ITSM ownership: an issue a human has already taken (assigned / In Progress) is left open with a recovery comment rather than being transitioned. Authentication is HTTP Basic with the account email and an API token (Jira Cloud, REST API v3, ADF descriptions).

Pull Integrations (Third-party queries the Integrator)

Zabbix

{
  "zabbixEnabled": "true",
  "zabbixServer": "zabbix.example.com",
  "zabbixPort": "443",
  "zabbixAuthType": "token",
  "zabbixToken": "your-api-token",
  "zabbixVersion": "6.x",
  "zabbixSSL": "true"
}

Zabbix retrieves data by querying the Integrator’s REST API:

GET /integrator/{bucket}/allV

Data is cached in the Integrator’s embedded key-value store with configurable TTL.

Data Export

Format Setting Description
CSV send2CSVEnabled Export to local CSV files in data/
JSON send2JSONEnabled Export to local JSON files in data/

Data Reception Endpoints

The Integrator exposes type-specific endpoints for receiving monitoring data:

Endpoint Monitor Type
POST /integrator/data2integrator EUM (End User Monitoring)
POST /integrator/data2integratorApp Application monitoring
POST /integrator/data2integratorApi API monitoring
POST /integrator/data2integratorUrl URL/HTTP monitoring
POST /integrator/data2integratorTcp TCP monitoring
POST /integrator/data2integratorUdp UDP monitoring
POST /integrator/data2integratorPing Ping monitoring
POST /integrator/data2integratorNslookup DNS monitoring
POST /integrator/db/data2integrator2 Database monitoring
POST /integrator/sys/data2integrator2 System metrics
POST /integrator/snmp/data2integrator2 SNMP monitoring
POST /integrator/wmi/data2integrator2 WMI monitoring (Windows)
POST /integrator/data2integratorDisco Discovery agent data

Incoming Data Payload

Each payload contains:

{
  "name": "My Monitor",
  "shortname": "mymon",
  "probe": "probe1",
  "monType": "eum",
  "timestampEpoch": 1234567890,
  "hostname": "target-host",
  "status": "NORMAL",
  "statusInt": "0",
  "location": "Paris",
  "value": 125.5,
  "transactions": { "Login": 45.2, "Search": 80.3 },
  "dnsLookup": "5.2",
  "tcpConnTime": "12.1",
  "tlsHandshake": "35.4",
  "serverTime": "52.8",
  "responseTime": "125.5",
  "emailR": "ops@example.com",
  "emailOnF": true,
  "emailOnSC": true,
  "resSC": "status_has_changed",
  "alerting": "true"
}

Alerting

The Integrator handles centralized alerting when monitors are linked to it.

Notification Channels

Channel Configuration
Email SMTP with TLS, HTML formatted with inline logo, color-coded status
Slack Block kit formatting, emoji indicators, configurable channel
Microsoft Teams Adaptive card format, color-coded, webhook-based
PagerDuty Incident triggering via API
Custom Scripts Shell scripts in scripts/ directory, 30s timeout, path traversal protection

Alert Triggers

Trigger Description
emailOnF / slackOnF / teamsOnF / pdOnF / scriptOnF Alert on failure
emailOnSC / slackOnSC / teamsOnSC / pdOnSC / scriptOnSC Alert on status change

Status Colors

Status Color Hex
NORMAL/OK Green #5cb85c
MINOR Yellow #D5D94F
MAJOR Orange #D9984F
CRITICAL Red #d9534f
CONFIG Blue #428bca
TIMEOUT Gray #E1DFDF
EXCEPTION Orange #faa05a
ERROR Dark Red #992A26

Notification Buffer (Reliable Delivery)

If a notification cannot be delivered — the SMTP server is down, Slack returns an error, a webhook times out — the Integrator does not drop it. The failed notification is written to disk and retried by a background worker.

Property Value
Buffer directory ./notif_buffer/ (one JSON file per failed notification)
Channels buffered Email, Slack, Teams, PagerDuty
Flush interval Every 30 seconds
Max retries 3 attempts per notification
Buffer capacity notifBufferSize (default 500); oldest dropped when full

Each buffered item records the channel, monitor identity, status, message, recipient, creation time, and attempt count. The flush worker is started at boot (initNotifBuffer) and stopped gracefully on shutdown. This guarantees that a transient outage in a notification channel never causes a lost alert, as long as the channel recovers within the retry budget.


REST API

Authentication

Method Path Description
POST /api/auth Login (JWT 15min)
POST /loginComponent Component login (24h)
POST /loginComponent1Year Long-lived token (1 year)
POST /loginComponent15Years Extended token (15 years)
GET /refresh_token Refresh JWT

Management

Method Path Description
GET /api/setting Get configuration
PATCH /api/updateSetting Update configuration
POST /backupDatabase Manual KV store backup
POST /reinitDatabase Reset databases
POST /testIntegration Test integration connectivity

Data Access

Method Path Description
GET /integrator/{bucket}/allV All values in bucket
GET /integrator/{bucket}/allK All keys in bucket
GET /integrator/{bucket}/allKV All key-value pairs
GET /v1/db/{dbname}/bucket/{bucket}/key/{key} Specific key lookup
POST /integrator/events Query data by tags/apps

Users

Method Path Description
GET /api/users List users
POST /api/users Create user
PATCH /api/users Update user
DELETE /api/users/{username} Delete user

System

Method Path Description
GET /ping Health check
GET /uptime Service uptime
GET /api/metrics System metrics (CPU, memory)
GET /docs/* Swagger UI

Connection Pooling

The Integrator maintains connection pools for outbound integrations:

Integration Pool Type Configuration
InfluxDB v1/v2 HTTP client pool Reusable connections
InfluxDB v3 Dedicated pool Separate implementation
Kafka Writer pool SASL/TLS-aware, config caching

Error Handling

  • Retry logic: 2 retries with 5-second wait between attempts
  • Non-blocking: Failed deliveries are logged but don’t block task processing
  • Status verification: Checks HTTP status codes (200/204 for success)
  • Graceful shutdown: Workers finish current tasks before stopping

See also

Translations