S&F historical replay loses data

Hi!

Im trying to setup store and forward (using docker as test environment) and im constantly getting constant “UnknownMetricException” after DBIRTH triggers.

I was following documentation and for our architecture, “Writing historical events directly to tags” is the best fit and that’s what I attempted to setup.
Out of curisosity I tried to write directly to historian and that method works fine.

Setup

The idea is to basically simulate an outage for a known period of time with two tags (short tests for now, 1 min) and after that get a snapshot of each historian. I expected to see some data loss because of keep alive…but actually all data is lost.

Versions used in test

  • Ignition 8.3.4
  • MQTT Engine 5.0.4
  • Transmission 5.0.3

Writing historical events directly to tags

Store Historical Events = false
Allow Back-fill Data = true
In-Order History = true
Rolling buffer disabled

Results

So basically when I simulate outage, I get “UnknownMetricException” which I believe is the cause or maybe symptom of the real issue. I have SparkplugBPayloadHandler set to TRACE, here is relevant part:

17:50:33.944  D  Processing NBIRTH from EdgeDevices_GroupID/Place_EdgeNodeID with Seq# 0
17:50:33.954  D  Processing DBIRTH from EdgeDevices_GroupID/Place_EdgeNodeID with Seq# 1
17:50:33.960  D  Initializing DBIRTH metric SimTag1
17:50:34.925  W  Throwing UnknownMetricException for SimTag1
17:50:34.925  I  Requesting Rebirth ... cause: Unknown metric
17:50:34.936  D  Processing NBIRTH with Seq# 0
17:50:34.977  D  Processing DBIRTH with Seq# 1

It seems like a race condition and I attempted to tinker a bit with birthSettleDelay (discovered with open api spec) by bumping from 0 → 1000/2000ms but results are pretty much the same.

Am I missing something here? Thanks in advance.

P.S. Full config dumps from the gateway API:

MQTT Engine
{
  "type": "com.cirruslink.mqtt.engine.gateway/general",
  "description": null,
  "enabled": true,
  "version": 1,
  "collection": "core",
  "collections": [
    "core"
  ],
  "signature": "a510dcb1015ec1f58b2584ac74ac69e7eea62d903320bf7905b212d1d4e4ba0a",
  "config": {
    "enableEngine": true,
    "blockNodeCommands": false,
    "blockDeviceCommands": false,
    "includeSecurityContext": false,
    "blockTagPropertyChanges": true,
    "storeHistoricalEvents": false,
    "reorderingTimeout": 10000,
    "enableLatching": false,
    "latchTimeout": 2000,
    "enableBdSeqChecking": true,
    "metricTimestampValidation": false,
    "customProperties": "{}",
    "rebirthDebounceDelay": 5000,
    "useCirrusEncoder": true,
    "sparkplugMessageHandlerThreadCount": 500,
    "enableAlarmEventPublishing": true,
    "alarmDisplayPathType": "IDS_AND_EDGE",
    "h2dbDirectory": "/usr/local/bin/ignition/data",
    "h2dbPort": 9098
  },
  "backupConfig": {
    "enableEngine": true,
    "blockNodeCommands": false,
    "blockDeviceCommands": false,
    "includeSecurityContext": false,
    "blockTagPropertyChanges": true,
    "storeHistoricalEvents": false,
    "reorderingTimeout": 10000,
    "enableLatching": false,
    "latchTimeout": 2000,
    "enableBdSeqChecking": true,
    "metricTimestampValidation": false,
    "customProperties": "{}",
    "rebirthDebounceDelay": 5000,
    "useCirrusEncoder": true,
    "sparkplugMessageHandlerThreadCount": 500,
    "enableAlarmEventPublishing": true,
    "alarmDisplayPathType": "IDS_AND_EDGE",
    "h2dbDirectory": "/usr/local/bin/ignition/data",
    "h2dbPort": 9098
  },
  "data": [
    "backupConfig.json",
    "config.json"
  ],
  "attributes": {
    "lastModification": {
      "actor": "admin",
      "timestamp": "2026-05-25T16:18:15Z"
    },
    "lastModificationSignature": "c8d6b45876029405ccfb67abc84aab4188d2089b2169ad2765a7f9d14513be39",
    "enabled": true
  },
  "metrics": {},
  "healthchecks": {}
}
Transmitter
{
  "type": "com.cirruslink.mqtt.transmission.gateway/transmitter",
  "name": "sim_edge",
  "description": null,
  "enabled": true,
  "version": 1,
  "collection": "core",
  "collections": [
    "core"
  ],
  "signature": "8422067dc190c0f7809cd3dabc48277ae2854da7746ff337444ce8bb7e51d4c8",
  "config": {
    "tagProvider": "default",
    "tagPath": "EdgeDevices",
    "tagPacingPeriod": 50,
    "serverSet": "Default",
    "discoveryDelay": 0,
    "historyStore": "StoreAndForwardSimulation",
    "enableStoreForwardByDefault": true,
    "inOrderHistory": true,
    "alarmEventEnable": false,
    "aliasedTags": false,
    "compressionTypeWrapper": "NONE",
    "convertUdts": false,
    "deviceLevelUdtsAsDevices": false,
    "publishUdtDefinitions": true,
    "optimizeUdts": true,
    "blockCommands": false,
    "validateSecurityContext": false,
    "securityContextHashingAlgorithm": "SHA_256",
    "publishBed": false,
    "echoRequestTimeout": -1,
    "groupId": "EdgeDevices_GroupID",
    "edgeNodeId": "Place_EdgeNodeID",
    "filteredProperties": "accessRights;clampMode;deadband;deadbandMode;formatString;historicalDeadband;historicalDeadbandMode;historicalDeadbandStyle;historyEnabled;historyMaxAge;historyMaxAgeUnits;historyProvider;historySampleRate;historySampleRateUnits;historyTagGroup;historyTimeDeadband;historyTimeDeadbandUnits;opcItemPath;opcServer;permissionModel;rawHigh;rawLow;sampleMode;scaleFactor;scaleMode;scaledHigh;scaledLow;tagGroup;valueSource;expression;expressionType;ConfiguredTagPath;eventScripts;readPermissions;writePermissions;eventScripts;parentEnabled;sourceTagPath",
    "rebirthDebounceDelay": 5000,
    "includeSparkplugDataTypes": true,
    "useCirrusEncoder": true,
    "birthSettleDelay": 0,
    "sendAllProps": false,
    "reconciliationWindow": 5000
  },
  "backupConfig": {
    "tagProvider": "default",
    "tagPath": "EdgeDevices",
    "tagPacingPeriod": 50,
    "serverSet": "Default",
    "discoveryDelay": 0,
    "historyStore": "StoreAndForwardSimulation",
    "enableStoreForwardByDefault": true,
    "inOrderHistory": true,
    "alarmEventEnable": false,
    "aliasedTags": false,
    "compressionTypeWrapper": "NONE",
    "convertUdts": false,
    "deviceLevelUdtsAsDevices": false,
    "publishUdtDefinitions": true,
    "optimizeUdts": true,
    "blockCommands": false,
    "validateSecurityContext": false,
    "securityContextHashingAlgorithm": "SHA_256",
    "publishBed": false,
    "echoRequestTimeout": -1,
    "groupId": "EdgeDevices_GroupID",
    "edgeNodeId": "Place_EdgeNodeID",
    "filteredProperties": "accessRights;clampMode;deadband;deadbandMode;formatString;historicalDeadband;historicalDeadbandMode;historicalDeadbandStyle;historyEnabled;historyMaxAge;historyMaxAgeUnits;historyProvider;historySampleRate;historySampleRateUnits;historyTagGroup;historyTimeDeadband;historyTimeDeadbandUnits;opcItemPath;opcServer;permissionModel;rawHigh;rawLow;sampleMode;scaleFactor;scaleMode;scaledHigh;scaledLow;tagGroup;valueSource;expression;expressionType;ConfiguredTagPath;eventScripts;readPermissions;writePermissions;eventScripts;parentEnabled;sourceTagPath",
    "rebirthDebounceDelay": 5000,
    "includeSparkplugDataTypes": true,
    "useCirrusEncoder": true,
    "birthSettleDelay": 0,
    "sendAllProps": false,
    "reconciliationWindow": 5000
  },
  "data": [
    "backupConfig.json",
    "config.json"
  ],
  "attributes": {
    "lastModification": {
      "actor": "admin",
      "timestamp": "2026-05-25T18:31:34Z"
    },
    "uuid": "cda0a3de-3d85-4681-b1c4-8d30904c0bea",
    "lastModificationSignature": "bf234ac2e6f858358f065f08792427d0f6722b1db87d5415c22168362e164238",
    "enabled": true
  },
  "metrics": {},
  "healthchecks": {}
}

EDIT: Broken link.

I’m not quite sure what is going on here. I suspect it might have something to do with your specific tags. Can you open a support ticket by emailing support@cirrus-link.com? You can/should also reference this forum post. If possible, can you also share an export of your Transmission side tags in that email?

I will share it, thanks. But anyway, I have 2 tags simulating a ramp. SimTag1 and SimTag2.

[default]EdgeDevices/Sim/SimTag1
[default]EdgeDevices/Sim/SimTag1

tagType: AtomicTag
dataType: Float4
valueSource: memory
historyEnabled: True
historyProvider: ignition_core
historicalSampleMode: (default)
historicalDeadband: 0.0
historicalDeadbandMode: Off
historyTimeDeadband: 0