Skip to main content

Azure Blob Storage

Overview​

Azure Blob Storage exports logs, metrics, and traces to containers in an Azure Storage account. Each batch is written as one blob in OpenTelemetry Protocol JSON or protobuf format, with optional gzip or zstd compression.

Use it for low-cost long-term retention, or as a hand-off point for an Azure-side consumer such as Synapse, Data Explorer, Microsoft Fabric, or an Azure Function blob trigger. If you want telemetry queryable in Sentinel, use Microsoft Sentinel instead — blobs are not indexed by Log Analytics.

Supported types: Logs · Metrics · Traces

Note: The container you configure must already exist in the storage account. This destination writes blobs; it never creates containers.

Authentication Configuration​

All authentication lives in the attached Azure Blob Storage credential — the destination node itself has no auth fields and stores no secret. Pick the Authentication Type on the credential:

Auth TypeWhat it needsStores a secret?
connection_stringConnection string (embeds the account key)Yes
service_principalStorage Account URL, Tenant ID, Client ID, Client SecretYes
system_managed_identityStorage Account URL onlyNo
user_managed_identityStorage Account URL, Client IDNo
workload_identityStorage Account URL, Tenant ID, Client ID, Federated Token FileNo

The credential form shows only the fields the chosen type needs.

Storage Account URL is the blob service endpoint, e.g. https://myaccount.blob.core.windows.net/. It is required for every type except connection_string, where the endpoint is read from the connection string.

Prefer a managed identity where the collector runs inside Azure. Those three types store no key at all — the collector resolves a short-lived token from Entra ID — so there is nothing to rotate or leak. Use connection_string when the collector runs outside Azure, and note that some organizations disable account-key access entirely (allowSharedKeyAccess), which rules it out.

Note: Whichever identity you use must hold Storage Blob Data Contributor (or equivalent write permission) on the container scope. A missing role assignment surfaces as a 403 on upload, not a configuration error. Assigning it requires Owner or User Access Administrator — the Contributor role cannot grant it.

Configuration​

ParameterTypeDefault ValueRequiredDescription
urlstringnoneCond.Blob service endpoint, e.g. https://myaccount.blob.core.windows.net/. Required unless auth type is connection_string.
containerstringnoneYesContainer that receives the blobs. Must already exist.
folder_namestringnoneNoOptional folder inside the container to store blobs under.
blob_prefixstringnoneNoOptional prefix to prepend to all stored blob names.
partitionstringminuteNoTime-based partitioning scheme (minute, hour, day, month, year).

Container names follow Azure's rule: 3–63 characters, lowercase letters, digits and single hyphens, starting and ending with a letter or digit.

Note: Logs, metrics and traces share the one container — the blob name carries the signal (logs, metrics, traces), so the three streams stay distinguishable. Hand-written collector config can still target a different container per signal.

Blob Naming​

Blobs are written to:

[folder_name/]year=YYYY/month=MM/day=DD/hour=HH/minute=MM/[blob_prefix]<signal>_<serial>.json[.gz]

The key=value folder layout is what Synapse, Microsoft Fabric and Databricks recognise for partition pruning, so a query filtered to one day reads only that day's prefix.

partition controls how deep the folder tree goes:

partitionPath
yearyear=2026/
monthyear=2026/month=09/
dayyear=2026/month=09/day=15/
houryear=2026/month=09/day=15/hour=07/
minuteyear=2026/month=09/day=15/hour=07/minute=32/

Coarser partitions produce fewer, larger blobs. Timestamps are UTC.

A random serial number is appended before the extension (logs_4821.json) so two batches landing in the same second cannot overwrite each other.

Note: folder_name and blob_prefix are passed through literally. A folder named archive2006 or a prefix of 01- stays exactly as typed — only the generated year=/month=/… portion is date-formatted.

Advanced Configuration​

ParameterTypeDefault ValueDescription
formatstringjsonEncoded telemetry format: json (OTLP JSON) or proto (OTLP protobuf).
compressionstringgzipCompress each blob before upload: none, gzip, or zstd. The matching .gz / .zst suffix is appended to the blob name.
timeoutint60Maximum time in seconds to wait for a single upload attempt. Raise it if large batches fail with context deadline exceeded.
retry_on_failurebooltrueEnables automatic retry when an upload fails.
backpressure_queuebooltrueEnables an internal queue to manage high volume and reduce data loss.

Retry Settings​

If retry on failure is enabled, the following fields are available:

ParameterTypeDefault ValueRequiredDescription
initial_intervalduration5YesInitial wait time after a failure before the first retry.
max_intervalduration30YesMaximum wait time between any two retries.
max_time_elapsedduration300YesTotal maximum time to keep retrying for a single batch.

Sending Queue Settings​

If Enable Backpressure Queue is enabled, the following fields are available:

ParameterTypeDefault ValueRequiredDescription
number_of_consumersint10YesNumber of parallel workers uploading from the queue.
queue_sizeint1000YesMaximum number of batches to hold in the queue.
enable_disk_backed_queuebooltrueYesSaves the queue to disk so buffered blobs survive restarts.

Example Configuration​

{
"auth": {
"type": "connection_string", // default: "connection_string"
// tenant_id / client_id / client_secret / federated_token_file
// apply to the other auth types only.
},
"url": "", // required unless type is "connection_string"

"container": "praxis-logs", // required, must already exist
"folder_name": "", // default: none
"blob_prefix": "", // default: none
"partition": "minute", // default: "minute"

"advanced": {
"format": "json", // default: "json"
"compression": "gzip", // default: "gzip"
"timeout": 60, // default: 60

"append_blob": {
"enabled": false, // default: false
"separator": "\n", // default: "\n"
},

"retry_on_failure": true,
"retry_on_failure_settings": {
"initial_interval": 5, // required, default: 5
"max_interval": 30, // required, default: 30
"max_time_elapsed": 300, // required, default: 300
},

"backpressure_queue": true,
"backpressure_queue_settings": {
"number_of_consumers": 10, // required, default: 10
"queue_size": 1000, // required, default: 1000
"enable_disk_backed_queue": true, // required, default: true
},
},
}

Troubleshooting​

SymptomCause
Every upload fails with 404The container does not exist. Create it in the storage account — this destination does not.
Every upload fails with 403The identity lacks Storage Blob Data Contributor on the container scope.
403 only with a managed identityThe role assignment is missing or still propagating; assigning it needs Owner, not Contributor.
Connection string rejected by AzureThe account has allowSharedKeyAccess disabled by policy — switch the credential to a managed identity.
Config rejected when saving the pipelineNo Azure Blob Storage credential is attached — one is always required.
Writes stop after a long runadvanced.append_blob is enabled and the blob hit the 50,000-block ceiling.
DNS failure on the account hostnameThe storage account name in the connection string is wrong, or the account is in a different Azure cloud (Gov / China need a different EndpointSuffix).