> For the complete documentation index, see [llms.txt](https://docs.bindplane.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bindplane.com/integrations/destinations/azure-blob-storage.md).

# Azure Blob Storage

The Azure Blob Storage destination exports telemetry from a Bindplane pipeline to a container in an Azure Storage account. Logs, metrics, and traces are written as [OTLP JSON](https://github.com/open-telemetry/opentelemetry-proto#otlpjson) blobs, organized into a time-partitioned path inside the container.

### Supported Telemetry

| Metrics | Logs | Traces |
| ------- | ---- | ------ |
| ✓       | ✓    | ✓      |

### Prerequisites

You need an Azure Storage account and a container to export into, plus a connection string that authorizes writes to that account.

* An [Azure Storage account](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create).
* A [blob container](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal) created in that account. Supply its name as the `container` parameter.
* A [connection string](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string) for the storage account. The connection string carries the account name and an account key (or a shared access signature) that grants write access. It is available under **Access keys** on the storage account in the Azure portal and has the form `DefaultEndpointsProtocol=https;AccountName=<name>;AccountKey=<key>;EndpointSuffix=core.windows.net`.

The connection string is a credential. Treat it as a secret and avoid committing it in plaintext.

### Configuration

<figure><img src="/files/0ih6dJIgl4Vq4bmNcVYt" alt="Bindplane docs - Azure Blob Storage - image 1"><figcaption></figcaption></figure>

**Telemetry and destination**

| Parameter         | Type               | Required | Default               | Description                                                                         |
| ----------------- | ------------------ | -------- | --------------------- | ----------------------------------------------------------------------------------- |
| Telemetry Types   | Telemetry Selector | No       | Logs, Metrics, Traces | Which signals this destination exports.                                             |
| Connection String | String             | Yes      | *(empty)*             | The connection string for the Azure Storage account. Sensitive. Stored as a secret. |
| Container         | String             | Yes      | *(empty)*             | Name of the Azure Storage container to export telemetry into.                       |
| Folder Prefix     | String             | No       | *(empty)*             | Root directory of the blob path to export telemetry into.                           |
| Blob Prefix       | String             | No       | *(empty)*             | Prefix for the name of exported telemetry files.                                    |

**Advanced**

| Parameter     | Type                   | Required | Default  | Description                                                                                  |
| ------------- | ---------------------- | -------- | -------- | -------------------------------------------------------------------------------------------- |
| Granularity   | Enum: `minute`, `hour` | No       | `minute` | Granularity of the timestamps in the blob path.                                              |
| Compression   | Enum: `none`, `gzip`   | No       | `gzip`   | Compression algorithm to use when sending data.                                              |
| Drop Raw Copy | Boolean                | No       | `true`   | When enabled, the raw copy of the log stored in `log.record.original` is dropped. Logs only. |

**Retry on Failure**

| Parameter               | Type    | Required | Default | Description                                                                                                                                          |
| ----------------------- | ------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Enable Retry on Failure | Boolean | No       | `true`  | Attempt to resend telemetry that failed to transmit to the destination.                                                                              |
| Initial interval        | Integer | No       | `5`     | Time in seconds to wait after the first failure before retrying. Applies when retry on failure is enabled.                                           |
| Max interval            | Integer | No       | `30`    | Upper bound in seconds on backoff. Applies when retry on failure is enabled.                                                                         |
| Max elapsed time        | Integer | No       | `300`   | Maximum time in seconds spent trying to send a batch before giving up, to avoid a never-ending retry loop. Applies when retry on failure is enabled. |

**Sending Queue**

| Parameter                 | Type      | Required | Default                         | Description                                                                                                                                |
| ------------------------- | --------- | -------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Enable Sending Queue      | Boolean   | No       | `true`                          | Buffer telemetry temporarily before sending so data is not lost during a brief network outage.                                             |
| Number of Consumers       | Integer   | No       | `10`                            | Number of consumers that dequeue batches. Applies when the sending queue is enabled.                                                       |
| Queue Size                | Integer   | No       | `5000`                          | Maximum number of batches kept in memory before dropping. Applies when the sending queue is enabled.                                       |
| Enable Persistent Queuing | Boolean   | No       | `true`                          | Buffer telemetry to disk before sending so data survives network outages or collector restarts. Applies when the sending queue is enabled. |
| Persistent Queue Storage  | Extension | Yes      | `file_storage_persistent_queue` | The storage extension used for the persistent queue. Applies when the sending queue and persistent queuing are enabled.                    |

### Examples

#### Basic export with gzip and minute granularity

This destination writes all three signals to the `otel` container under a `telemetry` root folder, with file names prefixed `bindplane`. With the default `minute` granularity and `gzip` compression, blobs land at paths like:

```
telemetry/year=2026/month=06/day=18/hour=14/minute=00/bindplanemetrics_{random_id}.json.gz
telemetry/year=2026/month=06/day=18/hour=14/minute=00/bindplanelogs_{random_id}.json.gz
telemetry/year=2026/month=06/day=18/hour=14/minute=00/bindplanetraces_{random_id}.json.gz
```

```yaml
apiVersion: bindplane.observiq.com/v1
kind: Destination
metadata:
  name: azure-blob-storage
spec:
  type: azure_blob
  parameters:
    - name: telemetry_types
      value:
        - Logs
        - Metrics
        - Traces
    - name: connection_string
      value: 'DefaultEndpointsProtocol=https;AccountName=accountName;AccountKey=REPLACE_WITH_ACCOUNT_KEY;EndpointSuffix=core.windows.net'
    - name: container
      value: otel
    - name: prefix
      value: telemetry
    - name: blob_prefix
      value: bindplane
```

#### Hourly granularity, uncompressed

Setting `partition` to `hour` and `compression` to `none` drops the `minute` path segment and writes plain JSON:

```
telemetry/year=2026/month=06/day=18/hour=14/bindplanelogs_{random_id}.json
```

```yaml
apiVersion: bindplane.observiq.com/v1
kind: Destination
metadata:
  name: azure-blob-storage
spec:
  type: azure_blob
  parameters:
    - name: telemetry_types
      value:
        - Logs
        - Metrics
        - Traces
    - name: connection_string
      value: 'DefaultEndpointsProtocol=https;AccountName=accountName;AccountKey=REPLACE_WITH_ACCOUNT_KEY;EndpointSuffix=core.windows.net'
    - name: container
      value: otel
    - name: prefix
      value: telemetry
    - name: blob_prefix
      value: bindplane
    - name: partition
      value: hour
    - name: compression
      value: none
```

### Configuration Tips

* Use `gzip` compression (the default) to reduce blob storage volume and egress. Switch to `none` only when a downstream reader cannot decompress.
* Pick the `partition` granularity to match how you query the data. `minute` produces fine-grained partitions for high-volume pipelines; `hour` produces fewer, larger blobs that are cheaper to list.
* Keep the persistent queue enabled (the default) so buffered telemetry survives collector restarts. The default storage writes to `${OIQ_OTEL_COLLECTOR_HOME}/storage` on disk.

### Troubleshooting

#### Authentication or authorization fails

Symptoms: blobs are not written and the collector logs report a 403 or an authorization error from Azure Storage.

Solutions:

1. Confirm the connection string is current and copied in full from **Access keys** on the storage account. Rotating the account key invalidates an old connection string.
2. Verify the account key or shared access signature in the connection string grants write access to the target container.

#### Container not found

Symptoms: the export fails with a "container not found" or 404 error.

Solutions:

1. Confirm the `container` value exactly matches an existing container in the storage account named in the connection string.
2. The destination does not create the container. Create it in the Azure portal or with the Azure CLI before exporting.

#### Telemetry is dropped during outages

Symptoms: gaps in stored blobs after a network interruption or collector restart.

Solutions:

1. Keep the sending queue and persistent queuing enabled so data is buffered to disk rather than dropped.
2. If the in-memory queue fills (Queue Size reached), raise the queue size or the number of consumers to clear batches faster.

### Standalone Destination

```yaml
apiVersion: bindplane.observiq.com/v1
kind: Destination
metadata:
  name: azure-blob-storage
spec:
  type: azure_blob
  parameters:
    - name: telemetry_types
      value:
        - Logs
        - Metrics
        - Traces
    - name: connection_string
      value: 'DefaultEndpointsProtocol=https;AccountName=accountName;AccountKey=REPLACE_WITH_ACCOUNT_KEY;EndpointSuffix=core.windows.net'
    - name: container
      value: otel
```

### Related Resources

* [Azure Blob Storage exporter (`azureblobexporter`)](https://github.com/observIQ/bindplane-otel-collector/blob/main/exporter/azureblobexporter/README.md)
* [Configure an Azure Storage connection string](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.bindplane.com/integrations/destinations/azure-blob-storage.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
