S3 Trace Ingestion

Ingest pre-generated OTLP trace files from Amazon S3 into Fiddler without modifying your application code. Ideal for ECS Fargate, air-gapped environments, or any architecture where direct SDK integrat

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 JSON 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

circle-info

When to use the SDK instead

If 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

Your Application
      β”‚
      β”‚  writes OTLP JSON files
      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Amazon S3  β”‚  (your bucket, your prefix)
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚  scans every N seconds
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  object-store-ingestion-manager β”‚  discovers new files, enqueues them
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  object-store-ingestion-worker  β”‚  downloads, parses, sends to collector
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚  OTLP protobuf (HTTP/4318)
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Fiddler OTEL        β”‚  authenticates, routes to Kafka β†’ ClickHouse
β”‚  Collector           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Fiddler UI          β”‚  traces visible under your GenAI Application
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

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 JSON with a resourceSpans array at the top level. This is the standard ExportTraceServiceRequest JSON envelope.

Supported file extensions

.json

Required JSON structure

Critical fields

Field
Description
Notes

resource.attributes["application.id"]

Fiddler Application UUID

Must match the application UUID in your Fiddler instance. This routes spans to the correct application in the UI.

startTimeUnixNano / endTimeUnixNano

Span timestamps as nanoseconds since Unix epoch

Must reflect the actual time of each event. Wrong timestamps cause spans to appear in the wrong time range in the UI.

traceId

16-byte trace identifier

Accepted as base64 (S/kvNXezTaajzpKdDg5HNg==) or hex (4bf92f3577b34da6a3ce929d0e0e4736). Fiddler auto-normalises hex to base64.

spanId

8-byte span identifier

Same encoding rules as traceId.

parentSpanId

Parent span ID

Set to "" (empty string) for root spans.

fiddler.span.type

Span type for Fiddler's UI

Recommended values: llm, tool. See Supported span types below.

circle-exclamation

Supported span types and attributes

fiddler.span.type

Key attributes

llm

gen_ai.system, gen_ai.request.model, gen_ai.llm.input.user, gen_ai.llm.input.system, gen_ai.llm.output, gen_ai.usage.input_tokens, gen_ai.usage.output_tokens

tool

gen_ai.tool.name, gen_ai.tool.input, gen_ai.tool.output

agent

gen_ai.agent.name, gen_ai.agent.id

chain (legacy β€” LangChain)

gen_ai.agent.name, gen_ai.agent.id, gen_ai.conversation.id

For the full attribute reference including all supported keys and their types, see Fiddler Span Attributesarrow-up-right.

Custom span attributes can be added using the fiddler.span.user.* namespace:


circle-info

Platform enablement required

The 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

Field
Required
Description

name

βœ…

Unique name for this ingestion source (1–255 characters)

bucket

βœ…

S3 bucket name (without s3:// prefix)

application_ids

βœ…

List containing exactly one Fiddler application UUID (v1 enforces 1:1)

provider

❌

Object store provider. Default: "s3". One of: s3, gcs, azure

region

❌

AWS region of the bucket (e.g. "us-west-2"). Optional

prefix

❌

S3 key prefix to scan (e.g. "traces/prod/"). Default: "" (scan entire bucket)

file_extensions

❌

List of file extensions to process. Default: [".json"]

credential_type

❌

"iam_role" (default) to use an IAM role, or "access_key" for static access key/secret

access_key_id

❌

Required when credential_type is "access_key". Write-only, never returned in responses

secret_access_key

❌

Required when credential_type is "access_key". Write-only, never returned in responses

role_arn

❌

IAM role ARN to assume via STS (cross-account). Omit to use the worker's node IAM role

external_id

❌

STS external ID for cross-account role assumption. Write-only, never returned in responses

endpoint_url

❌

Custom endpoint URL for S3-compatible stores (e.g. MinIO). Default: null

scan_interval_seconds

❌

How often the manager scans for new files. Default: 60. Minimum: 10

description

❌

Optional description (max 1000 characters)

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

Options

Option
How to configure
When to use

EKS Node IAM Role

Grant the Fiddler worker node's IAM role access to your bucket. Omit role_arn in the API request.

Same AWS account, simple setup

Cross-account IAM Role

Create a role in your account with a trust policy allowing Fiddler's worker role to assume it. Set role_arn in the API request.

Cross-account or tighter security boundary


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

Status
Meaning

pending

Discovered by the manager, queued for processing. Also the status a file returns to after a transient error when retries remain (retries counter increments each time).

processing

Worker is currently downloading and parsing the file

completed

Successfully ingested. spans_count shows how many spans were sent

failed

Permanently failed. Either a non-retryable error (e.g. malformed JSON, auth error) or all retries exhausted. Check error_message for details. Use the retry API to re-queue.

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:

circle-info

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

Symptom
Likely cause
Fix

File status: completed but no spans visible

Time range filter in UI doesn't cover the span timestamps

Change the UI date range to match startTimeUnixNano in your files

File status: completed but spans under wrong application

application.id in the file doesn't match the Fiddler application UUID

Update your transformer to embed the correct application.id as a resource attribute

File status: failed with invalid TraceID length

traceId / spanId encoded incorrectly

Use 32-char hex or standard base64. Fiddler auto-normalises hex; avoid other encodings

File status: failed with AccessDenied

Worker IAM role lacks s3:GetObject on your bucket

Update the IAM policy β€” see IAM Setup

File status: failed with CredentialError

OTEL_COLLECTOR_AUTH_TOKEN not configured on the worker

Contact your Fiddler admin to configure the collector auth token

Files never appear (stuck in pending)

Manager cannot list the bucket

Check s3:ListBucket permission and that prefix is correct

Verifying file format locally

Use the following Python snippet to validate your OTLP JSON file before uploading:


File Naming and Organisation

The S3 connector processes every file under the configured prefix that matches the configured file_extensions. 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.


Last updated

Was this helpful?