Skip to main content

S3 Trace Ingestion

Overview

The Fiddler S3 Connector allows you to ingest OpenTelemetry (OTLP) trace data from Amazon S3 into Fiddler without requiring any live SDK integration. Your application writes OTLP trace files to an S3 bucket (or a compatible object store), and Fiddler’s ingestion service automatically discovers, parses, and forwards those traces into the observability platform. This is the recommended approach for:
  • Air-gapped or high-security deployments where direct outbound connections from the application to Fiddler are not permitted
  • Batch ingestion pipelines that transform logs or events into OTLP format and stage them in S3
  • Custom log transformers that convert raw LangGraph or other framework logs into the Fiddler OTLP format
When to use the SDK insteadIf your application can make direct outbound HTTPS requests, the Fiddler LangGraph SDK or Fiddler OTel SDK provide zero-config auto-instrumentation with no file staging required. Use S3 ingestion only when direct SDK integration is not possible.

Architecture


Prerequisites

  • A Fiddler account with a GenAI Application created — you will need its Application UUID
  • A valid Fiddler API key (from Settings → Credentials) — this is used to authenticate the worker with the OTEL Collector
  • An Amazon S3 bucket (or S3-compatible store) that Fiddler’s worker can read from
  • IAM permissions on the bucket — see IAM Setup below

OTLP File Format

Files placed in S3 must be valid OTLP data in one of the supported formats below. All formats use the standard ExportTraceServiceRequest schema.

Supported file extensions

Compression is transparent — files with .gz (gzip) or .zst (zstd) suffixes are decompressed automatically before parsing. Configure file_extensions on the ingestion source to match the format your pipeline produces.

Required JSON structure

Critical fields

application.id must be in the fileThe application.id resource attribute inside the OTLP file is the source of truth for routing spans to the correct Fiddler application. The application_ids field on the ingestion source (see below) is used for access control only — it does not override the application.id in the span data. If these do not match, spans will be ingested but will not appear under your application in the UI.

Supported span types and attributes

For the full attribute reference including all supported keys and their types, see Span and Resource Attributes. Custom span attributes can be added using the fiddler.span.user.* namespace:

Platform enablement requiredThe S3 connector must be enabled for your Fiddler environment before use. Contact your Fiddler account team or platform admin to request enablement. Once confirmed, proceed with the steps below to set up your ingestion source.

Setting Up the Ingestion Source

Create an ingestion source via the Fiddler REST API to tell the connector where to look in S3.

API endpoint

Request body

Request fields

Example using Python


IAM Setup

The Fiddler worker needs read access to your S3 bucket. The recommended approach is an IAM role.

Minimum required IAM policy

Encrypted buckets (SSE-KMS)

If your bucket is encrypted with a customer-managed KMS key (CMK), the worker needs decrypt permission on that key in addition to the S3 actions above. Without it, s3:GetObject succeeds at the S3 authorization step but the request fails at the decryption step, and the file is marked failed with an error like:
Add the following statement to the role’s IAM policy, alongside the FiddlerS3ReadAccess statement:
kms:Decrypt is the only permission strictly required for the read path; kms:DescribeKey is optional but commonly included for diagnostics.
KMS access is gated by two policies evaluated together — the role’s IAM policy and the KMS key policy. If the key policy keeps the default arn:aws:iam::123456789012:root / kms:* delegation, granting kms:Decrypt in the IAM policy above is sufficient. If that delegation was removed or restricted, you must also add the worker role as an allowed principal in the KMS key policy with kms:Decrypt and kms:DescribeKey.
Buckets encrypted with SSE-S3 (AES-256) or the AWS-managed aws/s3 key do not require any extra KMS permissions.

Options


Monitoring File Processing Status

Aggregate stats

Get a summary count of files by status and total spans ingested:
Example response:

Per-file list

List individual files with their status:

File statuses

Example response

Retry a failed file

Retry a single failed file:
Bulk retry all failed files for a source at once:

Testing the Connection

Before uploading production traces, verify that the ingestion source can reach your bucket:
A successful response returns { "status": "success", "files_found": N } where files_found is the number of files discovered under the configured prefix. A failure returns { "status": "error", "message": "<error detail>" } (e.g. AccessDenied, NoSuchBucket).

Generating OTLP Files with the Fiddler SDK

If your application can write files locally (but cannot send traces directly to Fiddler), you can use the Fiddler LangGraph SDK’s built-in OTLP file capture and upload the files to S3 separately.
Each LangGraph invocation writes one OTLP JSON file to ./traces/. Upload these files to your S3 bucket using the AWS CLI or any S3 client:
For environments where local file writes are also not possible (e.g. ECS Fargate with read-only filesystems), generate the OTLP JSON in memory and stream it directly to S3 using boto3.client('s3').put_object() without writing to disk.

Troubleshooting

Spans not appearing in the UI

Verifying file format locally

Use the following Python snippets to validate your OTLP files before uploading: JSON (.json):
JSONL (.jsonl):
Protobuf (.binpb):

File Naming and Organization

The S3 connector processes every file under the configured prefix that matches the configured file_extensions. Supported extensions include .json, .jsonl, .binpb, and their compressed variants (.gz, .zst). Once a file is processed (whether completed or failed), it is not reprocessed unless you call the retry API. Recommended S3 key structure:
This date-partitioned layout makes it easy to manage retention policies and audit ingestion history.