Skip to main content

S3 Compatible Object Storage

S3 Compatible Object Storage

Plugin: go.d.plugin Module: s3check

Maintained by Netdata

Overview

Verify authenticated S3 operations and optional directional multisite replication.

Each single-site job measures stage state, duration, latency objective, attempts, retries, and failures. Each multisite job adds directional replication lag, RPO state, delete-propagation lag, and bounded request accounting. Both probes are intentionally active and clean up the objects they create.

The collector uses the AWS SigV4 S3 client with explicit static credentials, endpoint, region, and addressing configuration. It requires a dedicated unversioned bucket and prefix, checks bucket versioning before the job starts and again before destructive operations, and never deletes versions or foreign-owned keys. Exact object ownership is persisted before a write or reconciliation delete so restart and configuration changes cannot abandon cleanup.

Compatibility is contract-based rather than vendor-specific. The service must support SigV4 static credentials, GetBucketVersioning, PutObject, GetObject, HeadObject, ListObjectsV2, and DeleteObject. An ordinary object deletion must also remove the object completely without leaving hidden versions. Ceph RGW multisite is the reference deployment model for directional replication checks. AWS S3 satisfies the single-site contract when it is configured with virtual-host addressing and a bucket where versioning has never been enabled. AWS-native cross-region or same-region replication is not a multisite source because AWS requires versioning on both buckets. Other S3-compatible services can be used when they satisfy the same API and unversioned-bucket contract.

Every single-site cycle generates a unique small payload and key, uploads it, reads and verifies its SHA-256 digest, confirms LIST visibility, deletes it, and verifies that it disappeared.

In multisite mode, one job represents exactly one source-to-destination direction. Netdata persists sanitized pending-object state before the source write, polls destination visibility across bounded collection cycles, verifies the SHA-256 digest, deletes the source, measures destination disappearance, and cleans both sites. Daemon sync counters are not used as proof of client-visible correctness.

After an interrupted write path the collector retries deletion; after a process restart it removes at most two keys owned by this Agent and job per endpoint per cycle before creating a new object. Probe namespaces are derived from the Agent machine GUID and job identity, so separate Agents, jobs, and reverse directions can probe the same route without deleting one another's active objects. Raw S3 errors are classified into bounded reasons. Credentials, signed headers, request IDs, endpoint details, and probe payloads are not exposed as chart labels or stored in pending state.

This collector is supported on all platforms.

This collector supports collecting metrics from multiple instances of this integration, including remote instances.

No host capabilities are required. The source identity needs GetBucketVersioning, PutObject, GetObject, ListBucket, and DeleteObject on its bucket. A multisite destination identity needs GetBucketVersioning, GetObject, ListBucket, and DeleteObject on its bucket; it is not granted PutObject because the probe never writes to the destination.

Default Behavior

Auto-Detection

There is no auto-detection. A job starts only after an endpoint, region, bucket, and credentials are configured.

Limits

A successful single-site probe from a clean namespace makes nine S3 API calls: prefix LIST, pre-write bucket proof, PUT, GET, LIST, pre-delete bucket proof, DELETE, HEAD, and bucket proof after DELETE. On the next collection, Netdata performs one owner-prefix LIST to clear the probe quarantine and then starts the next nine-call probe, for ten calls in that steady-state cycle. A still-present object is retried on a later cycle. Reconciling two stale keys also makes nine calls. A multisite cycle makes at most eleven calls while it advances one persisted lifecycle. Each call uses the configured timeout and bounded retry count, and the worst-case per-cycle deadline must fit inside update_every.

The probe payload is 4 KiB. Prefix reconciliation lists this job's owner namespace before every new write and deletes at most two exact keys from the persisted ownership journal per endpoint per cycle. Visibility and delete objectives must be at least one collection interval. Multisite polling spans collection cycles until the configured visibility or delete deadline; it does not continuously retry inside one cycle. After multisite cleanup deletes the exact source and destination keys, Netdata waits for the larger configured replication or delete deadline, lists both owner namespaces, waits one more collection interval, and repeats the lists in reverse endpoint order before releasing the ownership journal. This bounded confirmation window follows the configured replication policy and uses only owner-scoped requests.

Performance Impact

Each single-site cycle performs one small object write, read, list request, delete, and metadata check. Each multisite cycle follows the persisted lifecycle through as many immediately successful write, visibility, delete, and cleanup steps as its bounded operation budget allows. Use dedicated buckets, explicit directions, and intervals appropriate for the endpoints and replication policy.

Setup

You can configure the s3check collector in two ways:

MethodBest forHow to
UIFast setup without editing filesGo to Nodes → Configure this node → Collectors → Jobs, search for s3check, then click + to add a job.
FileIf you prefer configuring via file, or need to automate deployments (e.g., with Ansible)Edit go.d/s3check.conf and add a job.
important

UI configuration requires paid Netdata Cloud plan.

Prerequisites

Create a dedicated unversioned bucket and prefix

Create a bucket used only by Netdata. Bucket versioning and Object Lock must be disabled; both Enabled and Suspended versioning states are rejected. Keep the configured prefix reserved for this collector.

Verify S3 compatibility and addressing

Single-site checks require the documented API operations and a never-versioned dedicated bucket. AWS S3 uses virtual-host addressing, so set path_style to no. Multisite checks also require replication that copies the probe payload to the configured destination prefix without versioning either bucket. Ceph RGW multisite is the reference deployment model for this contract.

Create restricted S3 credentials

Create credentials for one dedicated probe identity. The identity needs S3 read and write access to the selected bucket and permission to read its versioning status. Prefer Netdata secret references instead of storing credentials directly in configuration files.

Choose the client vantage

Run the job on the Netdata Agent whose network path represents the client view you need to test. For Ceph, run jobs at each site or RGW vantage whose client-visible S3 correctness matters.

Configuration

Options

Every job requires an endpoint, region, bucket, access key ID, and secret access key. The default retry and timeout budget is chosen to fit the default 120-second interval.

Config options
GroupOptionDescriptionDefaultRequired
Baseupdate_everyProbe interval in seconds.120no
autodetection_retryRecheck interval in seconds after a failed initial configured-job check; zero disables retries.0no
modeRun a single-endpoint lifecycle probe, or run one explicit source-to-destination multisite replication probe.singleno
Base / Multisitesource_siteBounded source-site label used by multisite charts and alerts.no
destinationExplicit destination object; required in multisite mode and rejected in single-site mode. No other site is probed automatically.no
destination.siteBounded destination-site label used by multisite charts and alerts.no
destination.endpointAbsolute HTTP(S) destination S3 endpoint without a path, query, or credentials.no
destination.regionS3 signing region for the destination endpoint.no
destination.bucketDedicated unversioned destination bucket.no
destination.prefixDedicated destination key prefix, ending with a slash.netdata-s3check/no
destination.path_styleUse destination path-style bucket addressing, common for Ceph RGW; set it to no for virtual-host addressing.yesno
rpo_threshold_msSource-write to destination-visibility objective for the silent RPO alert.900000no
replication_timeout_msBounded source-write to destination-visibility polling deadline.1800000no
delete_threshold_msSource-delete to destination-disappearance objective for the silent policy alert.300000no
delete_timeout_msBounded source-delete to destination-disappearance polling deadline.900000no
verify_deleteWait for destination disappearance after deleting the source; disabling this still removes the destination probe object but does not measure delete propagation.yesno
BaseendpointAbsolute HTTP(S) S3 base endpoint without a path, query, or credentials.yes
regionS3 signing region, for example us-east-1.yes
bucketDedicated unversioned S3 bucket used by the probe.yes
prefixDedicated key prefix, ending with a slash.netdata-s3check/no
path_styleUse path-style bucket addressing, common for Ceph RGW and many S3-compatible services; set it to no for AWS S3.yesno
max_retriesAdditional attempts allowed per S3 operation, from zero through two.1no
latency_threshold_msSuccessful stage duration in milliseconds that raises the silent latency alert; zero disables it.0no
vnodeAssociates the job with a configured Virtual Node.no
Authaccess_key_idS3 access key ID. Use a Netdata secret reference in configuration files.yes
secret_access_keyS3 secret access key. Use a Netdata secret reference in configuration files.yes
session_tokenOptional static S3 session token.no
Base / Authdestination.access_key_idDestination S3 access key ID. Use a Netdata secret reference.no
destination.secret_access_keyDestination S3 secret access key. Use a Netdata secret reference.no
destination.session_tokenOptional destination static S3 session token.no
HTTPtimeoutTimeout in seconds for one HTTP attempt.2no
not_follow_redirectsReject redirects so signed requests cannot be resent to an unconfigured origin.yesno
proxy_urlHTTP proxy URL; empty uses standard proxy environment variables. If the URL contains credentials, use a Netdata secret reference.no
TLStls_skip_verifySkip TLS certificate and hostname verification. This is insecure.nono
tls_caAbsolute path to a CA bundle.no
tls_certAbsolute path to a client certificate.no
tls_keyAbsolute path to a client private key.no
Base / HTTPdestination.timeoutTimeout in seconds for one destination HTTP attempt.2no
destination.not_follow_redirectsReject destination redirects so signed requests cannot be resent to an unconfigured origin.yesno
destination.proxy_urlHTTP proxy URL for the destination; empty uses standard proxy environment variables. If the URL contains credentials, use a Netdata secret reference.no
Base / TLSdestination.tls_skip_verifySkip destination TLS certificate and hostname verification. This is insecure.nono
destination.tls_caAbsolute path to a destination CA bundle.no
destination.tls_certAbsolute path to a destination client certificate.no
destination.tls_keyAbsolute path to a destination client private key.no

via UI

Configure the s3check collector from the Netdata web interface:

  1. Go to Nodes.
  2. Select the node where you want the s3check data-collection job to run and click the (Configure this node). That node will run the data collection.
  3. The Collectors → Jobs view opens by default.
  4. In the Search box, type s3check (or scroll the list) to locate the s3check collector.
  5. Click the + next to the s3check collector to add a new job.
  6. Fill in the job fields, then click Test to verify the configuration and Submit to save.
    • Test runs the job with the provided settings and shows whether data can be collected.
    • If it fails, an error message appears with details (for example, connection refused, timeout, or command execution errors), so you can adjust and retest.

via File

The configuration file name for this integration is go.d/s3check.conf.

The file format is YAML. Generally, the structure is:

update_every: 1
autodetection_retry: 0
jobs:
- name: some_name1
- name: some_name2

You can edit the configuration file using the edit-config script from the Netdata config directory.

cd /etc/netdata 2>/dev/null || cd /opt/netdata/etc/netdata
sudo ./edit-config go.d/s3check.conf
Examples
Ceph RGW authenticated S3 check

Run one job from each client vantage whose authenticated S3 behavior matters. Replace the bucket, endpoint, and secret references with values for a dedicated unversioned probe bucket.

Config
jobs:
- name: ceph_rgw_site_a
endpoint: https://rgw.example.net
region: us-east-1
bucket: netdata-s3check
prefix: netdata-s3check/
access_key_id: ${env:NETDATA_S3CHECK_ACCESS_KEY_ID}
secret_access_key: ${env:NETDATA_S3CHECK_SECRET_ACCESS_KEY}
path_style: yes
update_every: 120
timeout: 2
max_retries: 1
latency_threshold_ms: 0

AWS S3 lifecycle check

Replace the Region endpoint, bucket, and secret references. Use a dedicated bucket where versioning has never been enabled, and use virtual-host addressing by setting path_style to no.

Config
jobs:
- name: aws_s3
endpoint: https://s3.us-east-1.amazonaws.com
region: us-east-1
bucket: netdata-s3check
prefix: netdata-s3check/
access_key_id: ${env:NETDATA_S3CHECK_AWS_ACCESS_KEY_ID}
secret_access_key: ${env:NETDATA_S3CHECK_AWS_SECRET_ACCESS_KEY}
path_style: no
update_every: 120
timeout: 2
max_retries: 1
latency_threshold_ms: 0

Ceph RGW directional multisite replication check

Configure one explicit job for each replication direction that needs client-visible verification. Both buckets must be dedicated and unversioned; the reverse direction is a separate job. The destination prefix identifies where the replicated probe key is expected; if it differs, the replication policy must map the source route namespace to it.

Config
jobs:
- name: ceph_rgw_site_a_to_site_b
mode: multisite
source_site: site-a
destination:
site: site-b
endpoint: https://rgw-site-b.example.net
region: us-east-1
bucket: netdata-s3check-site-b
prefix: netdata-s3check/
access_key_id: ${env:NETDATA_S3CHECK_SITE_B_ACCESS_KEY_ID}
secret_access_key: ${env:NETDATA_S3CHECK_SITE_B_SECRET_ACCESS_KEY}
path_style: yes
endpoint: https://rgw-site-a.example.net
region: us-east-1
bucket: netdata-s3check-site-a
prefix: netdata-s3check/
access_key_id: ${env:NETDATA_S3CHECK_SITE_A_ACCESS_KEY_ID}
secret_access_key: ${env:NETDATA_S3CHECK_SITE_A_SECRET_ACCESS_KEY}
path_style: yes
rpo_threshold_ms: 900000
replication_timeout_ms: 1800000
delete_threshold_ms: 300000
delete_timeout_ms: 900000
verify_delete: yes

Alerts

The following alerts are available:

Alert nameOn metricDescription
s3check_stage_failed s3check.stage_statusThe authenticated S3 lifecycle probe reported stage ${label:stage} with bounded failure reason ${label:reason}. Raw provider errors are intentionally not exposed.
s3check_stage_latency s3check.stage_latency_statusSuccessful stage ${label:stage} took at least the configured latency_threshold_ms. Tune the objective to the client vantage and workload.
s3check_multisite_phase_failed s3check.multisite_phase_failureThe active S3 probe cannot write, verify, delete, reconcile, or clean up its configured ownership namespace. Inspect the phase status chart for the bounded phase and reason.
s3check_multisite_payload_mismatch s3check.multisite_payload_mismatchThe destination site returned a different SHA-256 payload than the source probe wrote. The probe removes both objects and keeps the incident open until a later verified payload clears it.
s3check_multisite_replication_rpo_breach s3check.multisite_rpo_statusThe current directional probe from ${label:source_site} to ${label:destination_site} has not become client-visible within rpo_threshold_ms. Tune the objective to the replication policy.
s3check_multisite_delete_propagation_breach s3check.multisite_delete_statusThe destination copy from ${label:source_site} to ${label:destination_site} remains visible after the source delete for longer than delete_threshold_ms. Tune the objective to the replication policy.

Metrics

Metrics grouped by scope.

The scope defines the instance that the metric belongs to. An instance is uniquely identified by a set of labels.

Every stage is emitted on every cycle, including skipped stages.

Per stage

One lifecycle stage of one configured S3 job.

Labels:

LabelDescription
stageLifecycle stage: setup, put, get, list, delete, or cleanup.
reasonBounded result classification; raw provider errors are never exposed.

Metrics:

MetricDescriptionDimensionsUnit
s3check.stage_statusS3 Probe Stage Statusok, failed, skippedstatus
s3check.stage_durationS3 Probe Stage Durationdurationmilliseconds
s3check.stage_latency_statusS3 Probe Stage Latency Objective Statusexceededstatus

Per stage requests

Cumulative request accounting for one lifecycle stage of one configured S3 job.

Labels:

LabelDescription
stageLifecycle stage: setup, put, get, list, delete, or cleanup.

Metrics:

MetricDescriptionDimensionsUnit
s3check.stage_requestsS3 Probe Stage Requestsoperations, attempts, retries, failuresrequests

Per multisite route

One explicit source-to-destination replication direction.

Labels:

LabelDescription
source_siteBounded operator label for the source site.
destination_siteBounded operator label for the destination site.

Metrics:

MetricDescriptionDimensionsUnit
s3check.multisite_phase_failureS3 Multisite Phase Failure Statusfailedstatus
s3check.multisite_payload_mismatchS3 Multisite Payload Mismatch Statusmismatchstatus
s3check.multisite_replication_lagS3 Multisite Replication Laglagmilliseconds
s3check.multisite_rpo_statusS3 Multisite Replication RPO Statusbreachedstatus
s3check.multisite_delete_lagS3 Multisite Delete Propagation Laglagmilliseconds
s3check.multisite_delete_statusS3 Multisite Delete Propagation Statusbreachedstatus

Per multisite phase

One lifecycle phase of one directional S3 multisite job.

Labels:

LabelDescription
source_siteBounded operator label for the source site.
destination_siteBounded operator label for the destination site.
phaseDirectional phase: setup, source_put, replication_wait, source_delete, delete_wait, or cleanup.
reasonBounded result classification; raw provider errors are never exposed.

Metrics:

MetricDescriptionDimensionsUnit
s3check.multisite_statusS3 Multisite Probe Phase Statusok, waiting, failed, skippedstatus
s3check.multisite_phase_durationS3 Multisite Probe Phase Durationdurationmilliseconds

Per multisite phase requests

Cumulative request accounting for one directional S3 multisite phase.

Labels:

LabelDescription
source_siteBounded operator label for the source site.
destination_siteBounded operator label for the destination site.
phaseDirectional phase: setup, source_put, replication_wait, source_delete, delete_wait, or cleanup.

Metrics:

MetricDescriptionDimensionsUnit
s3check.multisite_phase_requestsS3 Multisite Probe Phase Requestsoperations, attempts, retries, failuresrequests

Troubleshooting

Debug Mode

Important: Debug mode is not supported for data collection jobs created via the UI using the Dyncfg feature.

To troubleshoot issues with the s3check collector, run the go.d.plugin with the debug option enabled. The output should give you clues as to why the collector isn't working.

  • Navigate to the plugins.d directory, usually at /usr/libexec/netdata/plugins.d/. If that's not the case on your system, open netdata.conf and look for the plugins setting under [directories].

    cd /usr/libexec/netdata/plugins.d/
  • Switch to the netdata user.

    sudo -u netdata -s
  • Run the go.d.plugin to debug the collector:

    ./go.d.plugin -d -m s3check

    To debug a specific job:

    ./go.d.plugin -d -m s3check -j jobName

Getting Logs

If you're encountering problems with the s3check collector, follow these steps to retrieve logs and identify potential issues:

  • Run the command specific to your system (systemd, non-systemd, or Docker container).
  • Examine the output for any warnings or error messages that might indicate issues. These messages should provide clues about the root cause of the problem.

System with systemd

Use the following command to view logs generated since the last Netdata service restart:

journalctl _SYSTEMD_INVOCATION_ID="$(systemctl show --value --property=InvocationID netdata)" --namespace=netdata --grep s3check

System without systemd

Locate the collector log file, typically at /var/log/netdata/collector.log, and use grep to filter for collector's name:

grep s3check /var/log/netdata/collector.log

Note: This method shows logs from all restarts. Focus on the latest entries for troubleshooting current issues.

Docker Container

If your Netdata runs in a Docker container named "netdata" (replace if different), use this command:

docker logs netdata 2>&1 | grep s3check

S3 check does not start

Verify that the endpoint is absolute, the region and bucket are set, credentials resolve, and the account can call GetBucketVersioning. In multisite mode both source and destination must pass this check. Netdata rejects buckets whose versioning status is Enabled or Suspended.

Cleanup remains pending

The collector found stale probe keys. It reconciles the prefix before every new write, deletes at most two collector-owned keys per cycle, and creates no new object until that prefix is clean. Confirm that no other writer uses the prefix. A persisted ownership journal is rejected after its mode, source, destination, endpoint, bucket, or prefix changes; restore the matching configuration so the pending object can be cleaned safely.

AWS multisite replication is rejected

The multisite probe requires both buckets to remain never-versioned so an ordinary object deletion proves complete cleanup. AWS-native replication requires versioning on both buckets and therefore does not satisfy this contract. Use the AWS single-site lifecycle check, or select an S3-compatible replication implementation that meets the documented unversioned-bucket contract.


Do you have any feedback for this page? If so, you can open a new issue on our netdata/learn repository.