Skip to content

Monitoring & Jobs

Synclet provides built-in tools for monitoring your data syncs — a real-time dashboard, detailed job history, per-connector logs, and Prometheus-compatible metrics for external observability.

The dashboard is the landing page after you log in. It provides a high-level view of your workspace’s sync health.

The dashboard: five stat cards for the last 24 hours, the sync timeline and throughput charts The dashboard: five stat cards for the last 24 hours, the sync timeline and throughput charts

The 24h / 7d / 30d selector in the top right sets the time range of the stat cards and charts; 24h is the default.

CardWhat it counts
Total SyncsSyncs that ran in the selected range.
Success RateShare of those syncs that succeeded.
Records SyncedRecords read from sources in the range.
Active ConnectionsConnections whose status is active, whatever the range.
Failed SyncsSyncs that failed in the range.

Every card but Active Connections carries its range in the label, for example Total Syncs (24h), and a trend line that compares it with the range before (the previous 24 hours, 7 days or 30 days): a percentage change, and for Success Rate the change in percentage points. Green means better and red worse, so for Failed Syncs a rise is red.

ChartWhat it shows
Sync TimelineSucceeded and failed syncs per hour (24h) or per day (7d, 30d).
ThroughputRecords read per hour or per day.
Duration TrendsAverage sync duration per hour or per day.
Failure BreakdownThe range’s failed jobs by cause: connector, timeout, oom, infrastructure or unknown, read from the error message.

Top Connections lists the five connections with the most records synced in the range, with their records, bytes, last sync and a trend sparkline.

The Connection Health grid has one tile per connection, linked to the connection’s page, with one of these labels:

HealthMeaning
HealthyThe last sync did not fail and the next one is not overdue, or the connection has not synced yet. A connection without a schedule is never overdue.
WarningMore than twice the schedule’s interval has passed since the last sync, or the schedule cannot be parsed.
FailingThe last sync failed, or more than three times the schedule’s interval has passed since the last sync.
DisabledThe connection is not active (inactive or paused), so no syncs are scheduled.

The Topology page draws every source, connection and destination as one graph, coloured by health, with filters for failing and enabled connections only.

Topology of sources, connections and destinations; the failing partner feed and its destination are red Topology of sources, connections and destinations; the failing partner feed and its destination are red

Every sync run creates a job. You can browse all jobs from the Jobs page in the sidebar.

StateDescription
ScheduledThe job is enqueued and waiting for a worker.
StartingThe job is initializing (pulling connector image, preparing workspace).
RunningThe job is actively syncing data.
CompletedThe job completed successfully.
FailedThe job failed after exhausting all retry attempts.
CancelledThe job was manually cancelled by a user.

You can filter the job list by:

  • Connection — Show jobs for a specific connection.
  • Status — Show only failed, succeeded, or running jobs.
  • Date range — Narrow down to a specific time period.

Click any job to view its details.

The job detail page shows everything about a specific sync run.

A job page: the run timeline with its attempt, and the combined source and destination logs A job page: the run timeline with its attempt, and the combined source and destination logs

Each job may have multiple attempts if retries are configured. For each attempt, you can see:

  • Start time and end time.
  • Duration.
  • Status — whether the attempt succeeded or failed.
  • Error message — if the attempt failed, the connector’s error output.

For each attempt, the job detail shows aggregate sync statistics:

MetricDescription
Records readNumber of records read from the source.
Bytes syncedData volume transferred.
DurationTime spent on this attempt.

If a job failed, the error section shows the connector’s error output with timestamps. Common errors include authentication failures, schema mismatches, network timeouts, and rate limit violations.

Synclet captures logs from each connector during a sync. Logs are available per attempt in the job detail view.

LevelDescription
INFONormal operational messages — records processed, state checkpoints.
WARNNon-fatal issues — skipped records, deprecated features, approaching limits.
ERRORFailures that caused the sync to stop — authentication errors, connection drops.

Logs can be filtered by level to focus on warnings and errors during troubleshooting.

While a job runs, its log lines are stored in PostgreSQL and the UI tails them from there. Each attempt keeps at most PIPELINE_LOG_MAX_LINES_PER_ATTEMPT lines (100,000 by default, 0 disables the cap); later lines are dropped and counted in a single [synclet] log truncated: N further lines dropped line.

PIPELINE_LOG_ARCHIVE_BACKEND decides where the logs of finished jobs go:

BackendWhere logs of finished jobs live
none (default)They stay in PostgreSQL until job retention deletes the job.
filesystemFiles under PIPELINE_LOG_ARCHIVE_DIR. Every server replica must see the same directory, so use a shared volume.
s3Any S3-compatible bucket: AWS S3, MinIO, Cloudflare R2, Google Cloud Storage through its S3 interoperability endpoint (HMAC keys), or the Garage store bundled with the Helm chart. Set PIPELINE_LOG_ARCHIVE_S3_ENDPOINT for anything but AWS, and PIPELINE_LOG_ARCHIVE_S3_USE_PATH_STYLE=true for MinIO. Without static keys the default AWS credential chain is used (environment, IRSA, instance profile).
gcsGoogle Cloud Storage through its native API. With PIPELINE_LOG_ARCHIVE_GCS_CREDENTIALS_FILE it uses that service account key; without it, Application Default Credentials (GKE Workload Identity, GOOGLE_APPLICATION_CREDENTIALS, or gcloud auth application-default login locally).

With an archive backend, a finished job’s logs move out of PostgreSQL into one gzipped NDJSON object per attempt, keyed logs/<workspace>/<connection>/<job>/<attempt>.ndjson.gz, and the UI reads them back from there. Job retention and workspace deletion remove the objects too.

The server logs which GCS credential source it uses at startup. Credentials are resolved on first use, so missing credentials show up as archive errors and in synclet_log_archive_failures_total, not as a startup failure.

Switching back to none leaves already archived logs where they are, but they can no longer be read from the UI.

All variables are listed under Environment Variables: Job Logs.

Synclet exposes a Prometheus-compatible metrics endpoint for integration with external monitoring systems like Grafana.

GET /metrics

The endpoint is served on the internal port (INTERNAL_HTTP_SERVER_ADDR, 8081 by default), not on the public UI port, and returns metrics in the Prometheus exposition format.

Terminal window
curl -s http://localhost:8081/metrics
MetricTypeDescription
synclet_syncs_totalCounterTotal number of syncs by workspace, connection, and status.
synclet_sync_duration_secondsHistogramDuration of sync operations in seconds.
synclet_records_synced_totalCounterTotal records synced by workspace, connection, and direction.
synclet_bytes_synced_totalCounterTotal bytes synced by workspace and connection.
synclet_active_syncsGaugeNumber of currently running syncs.
synclet_failed_syncs_totalCounterTotal number of failed syncs by workspace and connection.
synclet_pending_jobsGaugeNumber of pending jobs in the queue.
synclet_connector_sync_duration_secondsHistogramDuration of sync operations by connector type.
synclet_log_archive_failures_totalCounterJob attempts whose logs failed to archive, by archive backend (filesystem, s3, gcs).
synclet_log_archive_bytes_totalCounterTotal size in bytes of the job log objects written to the log archive.
synclet_log_lines_dropped_totalCounterJob log lines dropped by the per-attempt line cap (PIPELINE_LOG_MAX_LINES_PER_ATTEMPT).

With the Prometheus Operator, let the Helm chart create the ServiceMonitor. It scrapes /metrics on the internal Service port:

server:
serviceMonitor:
enabled: true
interval: 30s
labels:
release: prometheus # match your Prometheus selector

Synclet serves two probes on the internal port (8081 by default):

EndpointReturns 200 when
GET /liveThe process answers HTTP.
GET /readyEvery health check passes: the database answers, background jobs have started and the event router is running (the last two only in processes that run them). Otherwise 503, with the failing checks in the JSON body.
Terminal window
curl -s http://localhost:8081/ready

Point load balancer health checks and Kubernetes probes at these endpoints. Images up to 0.4.0 serve only GET /health on the public port.

Airbyte is a trademark of Airbyte, Inc. Synclet is not affiliated with, endorsed by or sponsored by Airbyte, Inc. Connector images keep their own licenses: see Connector licenses.