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 standardExportTraceServiceRequest 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
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:
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.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:Per-file list
List individual files with their status:File statuses
Example response
Retry a failed file
Retry a single failed file:Testing the Connection
Before uploading production traces, verify that the ingestion source can reach your bucket:{ "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../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):
.binpb):
File Naming and Organization
The S3 connector processes every file under the configuredprefix 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:
Related Documentation
- Exporting OTel Traces to Fiddler — client-side protobuf export for custom pipelines
- Fiddler LangGraph SDK — direct SDK integration for LangGraph applications
- OpenTelemetry Integration — live OTLP export for custom agent frameworks
- Fiddler OTel SDK — decorator-based tracing for custom Python agents