Delivery promises
When a connection fails, MaestroHub keeps a buffered write and sends it once the destination answers again (store and forward), so the outage itself does not lose it. A write gets one of three promises. The promise depends on what the destination can do.
| Promise | What it means |
|---|---|
| Effectively once | The destination drops a repeat of the same write: it lands on the same row, object or document, or the destination recognises the write key. One effect per write, within the destination's window. |
| At least once | A write can arrive one extra time. This happens only for a write that was on its way when an outage, a crash, a restart or a replica move happened. It is never one extra copy per retry or per minute of outage. Every copy carries the same write key, so the receiver can drop the repeat. |
| At most once | The write is never buffered (UDP). Delivery cannot be confirmed. |
Sent, not confirmed. Some destinations give no acknowledgement at all: raw TCP, and syslog over TLS or TCP. Their writes are buffered while the destination can't be reached, so an outage does not lose them, and they keep the at least once promise for what MaestroHub controls. But once the network has taken a write, nothing tells MaestroHub that the receiver got it. Such a write ends as sent, not confirmed: it is never sent again, never counted as delivered, and one taken just before the receiver fails may be lost. Outage reports, the Overview and notifications count these writes on their own. Where every write must be confirmed, use a destination that acknowledges it (MQTT, Kafka, REST, a database).
Where you see it: in the Pipeline Designer, a write node shows its promise at the top of its Delivery tab: the promise in two words, what a copy carries, and a link to this page. A write its connection cannot buffer (UDP, or syslog over UDP) shows At most once there, with the reason and what to use instead, in place of the delivery choices. A node that only reads shows no promise.
How a receiver drops a repeat (idempotent receiver)
Every buffered write has a write key. The key is the same on the first attempt, on every resend and on a replay from Failed messages. The table below says where each connector puts it. Examples:
- a Kafka or NATS header
maestrohub.write-key - an AMQP or RabbitMQ message-id
- an MQTT 5 user property
- a Pub/Sub attribute
A consumer that must see each write once keeps the keys it has processed for longer than an outage can last. When a key comes again, it skips the message. A database sink gets the same effect from a unique column on the key.
Skipping or moving a write that is still on its way (Failed messages, a purge) also stops the request it went out in. When several writes went out in one request (a batch, for example to InfluxDB), the others in that request can each arrive one extra time too, when they are sent again.
A repeat appears only in the cases above, so a short memory is enough. A few hours of keys covers a day-long outage, because the copy arrives right after the connection comes back.
Per connector
The table is generated from each connector's declaration. A test fails when it is out of date.
| Connector | Operation | Promise | Destination drops a repeat | Write key on every copy | Note |
|---|---|---|---|---|---|
| Amazon Data Firehose | Put Record (firehose.put_record) | At least once | No: a repeat is a second copy | None: a record is the pipeline's bytes and Firehose has no id, attribute or header the sender sets | |
| Amazon Data Firehose | Put Record Batch (firehose.put_record_batch) | At least once | No: a repeat is a second copy | None: a record is the pipeline's bytes and Firehose has no id, attribute or header the sender sets | |
| Amazon DynamoDB | Delete Item (dynamodb.deleteItem) | Effectively once | Yes: the same target (no window) | None: a delete removes the item: nothing remains to carry a key | |
| Amazon DynamoDB | Put Item (dynamodb.putItem) | Effectively once | Yes: the same target (no window) | item attribute maestrohub.write-key (unless the item sets it); a conditional put a replay fails on an item with the write's own key is delivered | |
| Amazon DynamoDB | Update Item (dynamodb.updateItem) | Effectively once | Yes: by the write key, unless the function writes maestrohub.write-key itself or uses the placeholders #maestrohubWriteKey/:maestrohubWriteKey; window: until the item's next write with another key | item attribute maestrohub.write-key, set by the update, which applies only when the item does not carry the key yet | |
| Amazon EventBridge | Put Event (eventbridge.put_events) | At least once | No: a repeat is a second copy | None: an event's Detail, Source and Resources are the pipeline's, and EventBridge has no attribute or id the sender sets | |
| Amazon Kinesis | Put Record (kinesis.put) | At least once | No: a repeat is a second copy | partition key, when the function sets none (Kinesis drops no repeat; a consumer can by it) | |
| Amazon Kinesis | Put Records (kinesis.put_batch) | At least once | No: a repeat is a second copy | partition key "<key>#<i>" of record i that sets none (Kinesis drops no repeat; a consumer can by it) | |
| Amazon Redshift | Copy From S3 (redshift.copy_from_s3) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| Amazon Redshift | Write (redshift.write) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| Amazon S3 | Put Object (s3.write.object) | Effectively once | Yes: the same target, with a fixed object key; with overwriteExisting off a replay finds its own object (by its write key) or goes to name_<key digest> again (no window) | object metadata maestrohub-write-key (x-amz-meta-maestrohub-write-key), unless the function's metadata sets it | |
| Amazon SNS | Publish (sns.publish) | Effectively once | Yes: by the write key, on a FIFO topic, when the function sets no messageDeduplicationId; window: 5m | message attribute maestrohub.write-key (when the function leaves room: SNS allows 10); MessageDeduplicationId on a FIFO topic | |
| Amazon SQS | Delete Message (sqs.delete) | Effectively once | Yes: the same target (no window) | None: a delete names its receipt handle | |
| Amazon SQS | Send Message (sqs.send) | Effectively once | Yes: by the write key, on a FIFO queue, when the function sets no messageDeduplicationId; window: 5m | message attribute maestrohub.write-key (when the function leaves room: SQS allows 10); MessageDeduplicationId on a FIFO queue | |
| Amazon Timestream | Write Records (timestream.write) | Effectively once | Yes: the same target (no window) | None: a record is identified by its dimensions, time and version | |
| AMQP | Publish (amqp.publish) | At least once | No: a repeat is a second copy | message-id ("<key>#<i>" for item i of a batch) | |
| AMQP | Publish Batch (amqp.publish_batch) | At least once | No: a repeat is a second copy | message-id ("<key>#<i>" for item i of a batch) | |
| Apache Cassandra | Delete Rows (cassandra.delete.rows) | Effectively once | Yes: the same target, an INSERT is an upsert by primary key (no window) | None: the primary key is the row's own; the columns are the pipeline's | |
| Apache Cassandra | Write Rows (cassandra.write.rows) | Effectively once | Yes: the same target, an INSERT is an upsert by primary key (no window) | None: the primary key is the row's own; the columns are the pipeline's | |
| Apache Iceberg | Append to Table (iceberg.table.append) | Effectively once | Yes: by the write key; window: the table's snapshot history (until snapshots expire) | snapshot summary property maestrohub.write-key | |
| Apache Pulsar | Publish (pulsar.publish) | At least once | No: a repeat is a second copy | property maestrohub.write-key | |
| AWS IoT Core | Publish Message (awsiot.publish) | At least once | No: a repeat is a second copy | None: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload; a shadow update is the pipeline's document | |
| AWS IoT Core | Update Device Shadow (awsiot.shadow.update) | At least once | No: a repeat is a second copy | None: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload; a shadow update is the pipeline's document | |
| AWS IoT Greengrass | Publish Message (greengrass.publish) | At least once | No: a repeat is a second copy | None: an MQTT 3.1.1 PUBLISH carries only the topic and the pipeline's payload | |
| AWS IoT SiteWise | Write (sitewise.write) | Effectively once | Yes: the same target (no window) | None: a value is identified by its asset property and timestamp | |
| AWS Lambda | Invoke Async (awslambda.invoke_async) | At least once | No: a repeat is a second copy | None: Lambda passes the client context to synchronous invocations only; an Event invocation is the pipeline's payload and has no id the sender sets | |
| Azure Blob Storage | Delete Blob (azureblob.blob.delete) | Effectively once | Yes: the same target (no window) | None: a delete leaves no blob to carry it; deleting the same name twice leaves the same state | |
| Azure Blob Storage | Put Blob (azureblob.blob.write) | Effectively once | Yes: the same target, in overwrite mode (a fixed blob name) (no window) | blob metadata maestrohub_write_key on a Block Blob write (unless the function sets that name); an Append or Page Blob write carries none: an append has no metadata of its own and a page write updates a fixed range | |
| Azure Cosmos DB | Delete Item (azurecosmosdb.delete.item) | Effectively once | Yes: the same target (no window) | None: a delete leaves no item to carry it; deleting the same id twice leaves the same state | |
| Azure Cosmos DB | Transactional Batch (azurecosmosdb.execute.batch) | Effectively once | Yes: the same target, by the items' ids: a batch of upserts leaves the same items; a repeat refused by an item this batch already put (it carries the batch's key for it) is answered delivered, as a batch is atomic (no window) | item property maestrohub.write-key <key>#<i> on the item of operation i (create, upsert, replace), unless the item sets it | |
| Azure Cosmos DB | Patch Item (azurecosmosdb.patch.item) | At least once | No: a repeat is a second copy | item property maestrohub.write-key, set by the patch while it has room (Cosmos DB takes 10 patch operations; the function's own come first) | |
| Azure Cosmos DB | Write Item (azurecosmosdb.write.item) | Effectively once | Yes: the same target, by the item's id: an upsert or replace leaves the same item; a create or an ETag-conditioned write that meets the item this write already put (it carries the write's key) is answered delivered (no window) | item property maestrohub.write-key (unless the item sets it) | |
| Azure Event Hubs | Send Event (azureeventhubs.send) | At least once | No: a repeat is a second copy | event application property maestrohub.write-key (unless the function sets it) | |
| Azure Event Hubs | Send Batch (azureeventhubs.send_batch) | At least once | No: a repeat is a second copy | event application property maestrohub.write-key "<key>#<i>" on event i | |
| Azure IoT Edge | Send to Output (azureiotedge.output.send) | At least once | No: a repeat is a second copy | message id | |
| Azure IoT Edge | Report Module Twin Properties (azureiotedge.twin.report) | Effectively once | Yes: the same target (no window) | None: a reported-properties patch has no message id; the last patch wins | |
| Azure IoT Hub | Send D2C Telemetry (azureiothub.d2c.send) | At least once | No: a repeat is a second copy | message id ($.mid), unless the function sets a $.mid message property | |
| Azure IoT Hub | Update Reported Properties (azureiothub.twin.report) | Effectively once | Yes: the same target (no window) | None: a reported-properties patch has no message id; the last patch wins | |
| Azure Service Bus | Send Message (azureservicebus.send) | Effectively once | Yes: by the write key, the queue or topic has duplicate detection enabled; window: the entity's duplicate-detection window (10 min by default, up to 7 days) | MessageId, when the function sets none | |
| Azure Service Bus | Send Batch (azureservicebus.send.batch) | Effectively once | Yes: by the write key, the queue or topic has duplicate detection enabled; window: the entity's duplicate-detection window (10 min by default, up to 7 days) | MessageId "<key>#<i>" for message i, when the function sets none | |
| Azure Synapse Analytics | Copy Into (azuresynapse.copy.into) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| Azure Synapse Analytics | Write (azuresynapse.write) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| ClickHouse | Write (clickhouse.write) | Effectively once | Yes: by the write key, on a table that deduplicates inserts (Replicated*/Shared MergeTree, or a MergeTree with non_replicated_deduplication_window > 0, which is 0, off, by default) with insert_deduplicate on (the default); window: the table's deduplication window: the last replicated_deduplication_window inserts (1000) and replicated_deduplication_window_seconds (7 days) on Replicated*/Shared MergeTree by default; the last non_replicated_deduplication_window inserts on a plain MergeTree | each INSERT's insert_deduplication_token (<key>#<i> per batch when the write has several); a setting kept in the table's deduplication log, not a column | |
| Couchbase | Remove Document (couchbase.remove) | Effectively once | Yes: the same target (no window) | None: the document id is the write's own key | |
| Couchbase | Upsert Document (couchbase.upsert) | Effectively once | Yes: the same target (no window) | None: the document id is the write's own key | |
| Databricks Storage | Write File (databricks_storage.write) | Effectively once | Yes: the same target, with overwrite (a fixed path) (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| Discord | Send Message (discord.sendMessage) | Effectively once | Yes: by the write key, on a bot connection (Execute Webhook takes no nonce); window: a few minutes (Discord's enforce_nonce window) | nonce (the first 25 hex digits of the key's SHA-256) with enforce_nonce, on a bot connection; a webhook message carries none | |
| Elasticsearch | Delete (elasticsearch.delete) | Effectively once | Yes: the same target (no window) | None: a delete names its document id; a repeat deletes nothing more | |
| Elasticsearch | Index (elasticsearch.index) | Effectively once | Yes: by the write key, when the function sets no documentId (the write key is the _id, created with op_type=create); a documentId of the function's own makes a repeat an overwrite of the same document (no window) | the document _id (op_type=create) when the function sets no documentId | |
| FTP / SFTP | Delete (ftp.delete) | Effectively once | Yes: the same target, in overwrite mode (a fixed name) (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| FTP / SFTP | Rename (ftp.rename) | Effectively once | Yes: the same target, in overwrite mode (a fixed name) (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| FTP / SFTP | Upload (ftp.upload) | Effectively once | Yes: the same target, in overwrite mode (a fixed name) (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| GitLab | Add Comment (gitlab.addComment) | At least once | No: a repeat is a second copy | None: GitLab's API takes no idempotency key | |
| GitLab | Create Issue (gitlab.createIssue) | At least once | No: a repeat is a second copy | None: GitLab's API takes no idempotency key | |
| GitLab | Update Issue (gitlab.updateIssue) | Effectively once | Yes: the same target (no window) | None: GitLab's API takes no idempotency key | |
| Google Cloud Bigtable | Delete Row (bigtable.deleteRow) | Effectively once | Yes: the same target, the row key and the produce-time cell timestamp (no window) | None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write | |
| Google Cloud Bigtable | Write Row (bigtable.writeRow) | Effectively once | Yes: the same target, the row key and the produce-time cell timestamp (no window) | None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write | |
| Google Cloud Bigtable | Write Rows (bigtable.writeRows) | Effectively once | Yes: the same target, the row key and the produce-time cell timestamp (no window) | None: a cell holds the pipeline's columns; row key and produce timestamp already identify the write | |
| Google Cloud Firestore | Delete Document (firestore.deleteDocument) | Effectively once | Yes: the same target (no window) | None: a delete names its document | |
| Google Cloud Firestore | Set Document (firestore.setDocument) | Effectively once | Yes: by the write key, when the function sets no documentId: the write key names the document, created, and a repeat that finds it is answered delivered (with a documentId the write overwrites its own document) (no window) | the document id, when the function sets no documentId | |
| Google Cloud Firestore | Update Document (firestore.updateDocument) | Effectively once | Yes: the same target (no window) | None: an update names its document; the fields are the pipeline's | |
| Google Cloud Storage | Compose Objects (gcs.compose.objects) | Effectively once | Yes: the same target, a compose names its destination object, so a repeat overwrites it (no window) | destination object custom metadata maestrohub.write-key | |
| Google Cloud Storage | Delete Object (gcs.delete.object) | Effectively once | Yes: the same target, a delete names its object (no window) | None: a delete removes the object; nothing is left to carry a key | |
| Google Cloud Storage | Put Object (gcs.put.object) | Effectively once | Yes: the same target, a put names its object, so a repeat overwrites it; with overwriteExisting off, a repeat finds its own write key on the object and is answered delivered (no window) | object custom metadata maestrohub.write-key (unless the function sets that name itself) | |
| Google Pub/Sub | Publish (googlepubsub.publish) | At least once | No: a repeat is a second copy | attribute maestrohub.write-key | |
| Google Sheets | Append Rows (googlesheets.appendRows) | At least once | No: a repeat is a second copy | None: a row is the pipeline's cells | |
| Google Sheets | Update Range (googlesheets.updateRange) | Effectively once | Yes: the same target (no window) | None: a row is the pipeline's cells | |
| Grafana | Create Annotation (grafana.createAnnotation) | At least once | No: a repeat is a second copy | None: an annotation takes no id the sender sets | |
| GraphQL | Mutation (graphql.mutation) | At least once | No: a repeat is a second copy | header Idempotency-Key (with Send Idempotency-Key on; a key set in the connection's Headers wins) | |
| InfluxDB | Write (influxdb.write) | Effectively once | Yes: the same target (no window) | None: a point is identified by its series and its produce timestamp: a repeat is the same point | |
| Kafka | Produce (kafka.produce) | At least once | No: a repeat is a second copy | header maestrohub.write-key | |
| Local File | Write File (localfile.write.local) | Effectively once | Yes: the same target, not in append mode: a repeat replaces its own copy, finds its bytes under the name, or lands on the variant named by its write key (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| Mattermost | Send Message (mattermost.sendMessage) | At least once | No: a repeat is a second copy | post property maestrohub.write-key (props; create-post and the incoming webhook take no idempotency key: every copy is posted) | |
| Microsoft Fabric OneLake | Write File (onelake.path.put) | Effectively once | Yes: the same target, a fixed path (no window) | None: a file is the pipeline's bytes under the config's name; the Data Lake create takes no metadata, and setting it would be a second request after the upload, so a cut between the two would leave a copy without its key | |
| Microsoft Fabric OneLake | Append to Table (onelake.table.append) | Effectively once | Yes: by the write key; window: the table's transaction log | Delta transaction appId | |
| Microsoft SQL Server | Write (mssql.write) | Effectively once | Yes: by the write key, with writeKeyColumn set on a column with a unique index (no window) | the writeKeyColumn column, <key>#<row> | |
| Microsoft Teams | Send Message to Channel (msteams.sendMessageToChannel) | At least once | No: a repeat is a second copy | None: Graph's channel-message create takes no idempotency key | |
| MongoDB | Delete One (mongodb.deleteOne) | Effectively once | Yes: the same target (no window) | None: a delete names its document by filter | |
| MongoDB | Insert One (mongodb.insertOne) | Effectively once | Yes: by the write key, when the document has no _id of its own (the write key becomes its _id) (no window) | _id, when the document has none | |
| MongoDB | Update One (mongodb.updateOne) | Effectively once | Yes: the same target, a $set update by filter (no window) | None: an update names its document by filter; its fields are the pipeline's | |
| MQTT | Publish (mqtt.publish) | At least once | No: a repeat is a second copy | MQTT 5 user property maestrohub.write-key (MQTT 3.1.1 has no field for it) | |
| MySQL | Write (mysql.write) | Effectively once | Yes: by the write key, with writeKeyColumn set on a column with a unique index (no window) | the writeKeyColumn column, <key>#<row> | |
| NATS | Publish (nats.publish) | Effectively once | Yes: by the write key, with useJetStream; window: the stream's Duplicates window (2 min by default) | header maestrohub.write-key; JetStream also Nats-Msg-Id | |
| ODBC | Write (odbc.write) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| Oracle Database | Write (oracle.write) | Effectively once | Yes: by the write key, with writeKeyColumn set on a column with a unique index (no window) | the writeKeyColumn column, <key>#<row> | |
| PagerDuty | Send Change Event (pagerduty.sendChangeEvent) | At least once | No: a repeat is a second copy | payload.custom_details maestrohub.write-key (a change event has no dedup key: PagerDuty records every copy; the function's own value under that name wins) | |
| PagerDuty | Send Event (pagerduty.sendEvent) | Effectively once | Yes: by the write key; window: while the alert is open | dedup_key, when the function sets none | |
| PostgreSQL | Vector Upsert (postgres.vectorUpsert) | Effectively once | Yes: the same target, an upsert by id (no window) | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| PostgreSQL | Write (postgres.write) | Effectively once | Yes: by the write key, with writeKeyColumn set on a column with a unique index (no window) | the writeKeyColumn column, <key>#<row> | |
| Prometheus | Write Samples (prometheus.write_samples) | Effectively once | Yes: the same target (no window) | None: a point is identified by its series and its produce timestamp: a repeat is the same point | |
| QuestDB | Write (questdb.write) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| RabbitMQ | Publish (rabbitmq.publish) | At least once | No: a repeat is a second copy | message-id | |
| Redis | Publish (redis.publish) | At least once | No: a repeat is a second copy | None: a PUBLISH is a channel and the pipeline's message | |
| REST API | PATCH Request (rest.patch) | At least once | No: a repeat is a second copy | header Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins) | |
| REST API | POST Request (rest.post) | At least once | No: a repeat is a second copy | header Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins) | |
| REST API | PUT Request (rest.put) | Effectively once | Yes: the same target (no window) | header Idempotency-Key (with Send Idempotency-Key on; the function's own Idempotency-Key header wins) | |
| SAP HANA | Write (sap_hana.write) | Effectively once | Yes: by the write key, with writeKeyColumn set on a column with a unique index (no window) | the writeKeyColumn column, <key>#<row> | |
| SAP IDoc | Send IDoc (sap_idoc.send) | Effectively once | Yes: by the write key, a structured send whose function leaves DOCNUM blank (a raw send keeps its own DOCNUM); window: unlimited (SAP's duplicate check on the sender IDoc number) | EDI_DC40/DOCNUM: 16 digits derived from the key's SHA-256; SAP's 'already received' answer to a repeat is delivered | |
| SAP IDoc | Send IDoc Batch (sap_idoc.send_batch) | Effectively once | Yes: by the write key, IDocs whose function leaves DOCNUM blank; window: unlimited (SAP's duplicate check on the sender IDoc number) | EDI_DC40/DOCNUM of each IDoc, derived from <key>#<i> (i = the IDoc's position in the packet; one IDoc: the key); SAP refuses a repeated packet as already received (409, reported refused: the packet may have landed in part) | |
| ServiceNow | Create Record (servicenow.createRecord) | At least once | No: a repeat is a second copy | None: the Table API's create takes no idempotency key | |
| ServiceNow | Update Record (servicenow.updateRecord) | Effectively once | Yes: the same target (no window) | None: the Table API's create takes no idempotency key | |
| Slack | Send Message (slack.sendMessage) | At least once | No: a repeat is a second copy | message metadata: event type maestrohub_write, payload maestrohub.write-key, with a bot token (xoxb-; chat.postMessage takes no idempotency key: Slack posts every copy) | |
| SMB Share | Write File (smb.write.file) | Effectively once | Yes: the same target, not in append mode: a repeat replaces its own copy, finds its bytes under the name, or lands on the variant named by its write key (no window) | None: a file is the pipeline's bytes under the config's name; there is no field beside them | |
| SMTP | Send Email (smtp.send) | At least once | No: a repeat is a second copy | Message-ID header, derived from the write key | |
| Snowflake | Write (snowflake.write) | At least once | No: a repeat is a second copy | None: an INSERT writes the pipeline's columns: a key needs a unique write-key column the table's owner adds | |
| Snowflake Streaming | Stream Rows (snowflake_streaming.append_rows) | Effectively once | Yes: by the write key; window: the channel's committed offset token | channel offset token | |
| SOAP | Invoke Operation (soap.invoke) | At least once | No: a repeat is a second copy | None: a SOAP body is the pipeline's envelope | |
| Sparkplug B | Publish Device Data (sparkplugb.ddata) | At least once | No: a repeat is a second copy | None: a Sparkplug B payload carries only the spec's fields (timestamp, seq, metrics) | |
| Splunk | Send Events (splunk.send) | At least once | No: a repeat is a second copy | indexed field maestrohub.write-key (the key for one event, <key>#<i> for event i of an array; HEC has no dedupe: every copy is indexed; the function's own field of that name wins) | |
| Syslog | Send Message (syslog.send) | At least once | No: a repeat is a second copy | None: RFC 5424 structured data needs an IANA enterprise number MaestroHub does not hold; RFC 3164 has no field | Over TLS or TCP: buffered while the collector can't be reached. A message the network accepted is counted sent, not confirmed: syslog has no acknowledgement, so one handed over just before the collector fails may be lost. Over UDP (the default transport): never buffered, at most once: messages sent while the collector is down are lost. |
| TCP | Request (tcp.request) | At least once | No: a repeat is a second copy | None: a raw TCP stream is the pipeline's bytes and framing | Buffered while the receiver can't be reached. A message the network accepted is counted sent, not confirmed: raw TCP has no acknowledgement, so one handed over just before the receiver fails may be lost. Where each write must be confirmed, use a connector whose destination acknowledges it (MQTT, Kafka, REST). |
| TCP | Send (tcp.send) | At least once | No: a repeat is a second copy | None: a raw TCP stream is the pipeline's bytes and framing | Buffered while the receiver can't be reached. A message the network accepted is counted sent, not confirmed: raw TCP has no acknowledgement, so one handed over just before the receiver fails may be lost. Where each write must be confirmed, use a connector whose destination acknowledges it (MQTT, Kafka, REST). |
| Twilio | Make Call (twilio.makeCall) | At least once | No: a repeat is a second copy | None: Twilio's Messages and Calls APIs take no idempotency key | |
| Twilio | Send Message (twilio.sendMessage) | At least once | No: a repeat is a second copy | None: Twilio's Messages and Calls APIs take no idempotency key | |
| UDP | Request (udp.request) | At most once (not buffered) | Not applicable | None: a datagram is the pipeline's bytes | Fire-and-forget: delivery can't be confirmed and messages sent while the receiver is down are lost. |
| UDP | Send (udp.send) | At most once (not buffered) | Not applicable | None: a datagram is the pipeline's bytes | Fire-and-forget: delivery can't be confirmed and messages sent while the receiver is down are lost. |