Redpanda Connect supports a wide array of connectors for integrating with popular data systems. While many are community-contributed, certified connectors are officially supported by Redpanda.
This document outlines the criteria for certification, ensuring a great user experience and sustainable supportability, while continuing to welcome high-quality community contributions.
To certify a connector, it must meet the following requirements:
- 1.1.1 Concise, well-organized documentation with configuration examples.
- 1.1.2 Includes expected usage patterns, troubleshooting guidance, and known pitfalls.
- 1.1.3 UX should be intuitive and require minimal explanation. Follow a “don’t make me think” philosophy.
- 1.2.1 Exposes useful metrics for debugging that avoid excessive cardinality.
- 1.2.2 Provides relevant logging to support troubleshooting. Unexpected behavior should emit warning or error logs. Normal operation should emit no logs.
- 1.2.3 Known limitations and edge cases are documented.
- 1.2.4 Strongly lints and validates user-provided configuration, clearly telling users of any problems.
- 1.3.1 Code is idiomatic following Effective Go recommendations, is readable, and is consistent with the broader Redpanda Connect code base.
- 1.3.2 Tests should cover end-to-end functionality and prove that the connector works across supported configurations.
- 1.3.3 Integration tests verify core workflows and are runnable in CI.
- 1.3.4 Benchmarking covers two distinct phases, both of which are required:
- Local benchmarking (localhost): unit and local integration benchmarks that run without external infrastructure, giving fast, repeatable feedback during development.
- Real-endpoint benchmarking: benchmarks run against a real deployed server / real endpoint, exercising the connector against the actual target system rather than a local stand-in.
- Follow the standard process, directory layout, and reporting requirements in
docs/benchmarking.md; record results underdocs/benchmark-results/.
- 1.3.5 Across both phases, benchmarks have been run at various throughput levels so that we can determine CPU and memory trendlines based on usage.
- 1.3.6 If a corresponding Kafka Connect connector exists, benchmarks have been run against it so we can compare it against our throughput and ensure Redpanda Connect's is comparable or better.
When deciding which connectors to prioritize or certify, Redpanda considers:
- 2.1.1 Integrates well with Redpanda as a company.
- 2.1.2 Represents widely used and recognized tools in the data engineering ecosystem.
- 2.1.3 Is well documented and has an active, engaged user base.
- 2.2.1 Niche, outdated, or declining technologies.
- 2.2.2 High barriers to testing (e.g., requires proprietary infrastructure).
- 2.2.3 Fragile, costly, or hard to operate in real-world environments.
We hold certified connectors to a consistent engineering bar so that they are reliable, maintainable, and supportable.
- 3.1.1 Connector code is either authored by Redpanda engineers or reviewed and scoped by Redpanda before community contribution (e.g., defined in a GitHub issue or an internal PRD) — and the PR stays within that agreed scope; additional components or capabilities beyond it are proposed and reviewed separately.
- 3.1.2 Code adheres to standard Go practices: idiomatic, well-structured, self-documenting, and formatted with
gofumpt(task fmt) so it stays consistent with the rest of the codebase. - 3.1.3 Connectors are written Go-first — idiomatic Go, never a line-by-line port of an implementation from another ecosystem (e.g. Debezium for CDC). We build toward a goal: supporting the target endpoint well, where "well" is defined by the rest of this document — clear documentation and UX (§1.1), well-designed configuration knobs and validation (§1.2.4), observability (§1.2), and reliability (§1.3). A reference implementation may be consulted to understand the endpoint or protocol, but it is not a specification to replicate, and we are not bound to its abstractions, idioms, or naming. Design the connector for our users and our codebase, not for parity with another tool.
- 3.1.4 The implementation is complete and correct, with no known bugs or missing core functionality.
- 3.1.5 The codebase feels consistent with other Redpanda Connect connectors, avoiding bespoke or idiosyncratic implementations.
- 3.1.6 Integration tests are easy to run locally and in CI environments, ideally with containerized dependencies.
- 3.1.7 Supports live credential rotation (e.g., for tokens or certs) with no downtime where applicable.
- 3.1.8 Has sufficient observability: logs, metrics, and tracing hooks as expected.
- 3.2.1 Incomplete implementations.
- 3.2.2 Poor error handling or difficult-to-diagnose bugs.
- 3.2.3 Unfamiliar or confusing UX patterns.
- 3.2.4 Code that is difficult to test or maintain.
- 3.2.5 Excessive resource usage (e.g., unnecessary goroutines, memory or CPU overhead).
- 3.3.1 Changes are split into reviewable units. As a rule, neither a single PR nor an individual commit should reach ~10K lines of code that a reviewer must read — this keeps changes reviewable. AI-generated code counts in full: it needs more review, not less, and the limit is not a license to autogenerate past it. Only content that isn't reviewed line-by-line is excluded — mechanically generated/derived files (codegen output, mocks, bundle imports), vendored code, lockfiles, and non-code such as documentation, skills, Terraform, templates, and test fixtures/data. When a large PR is genuinely unavoidable, say why in the description and point reviewers at what matters.
- 3.3.2 Large features are broken into a series of smaller, self-contained PRs that can each be reviewed and reasoned about independently, rather than landed as one monolithic change.
The connector’s reliability also depends on the underlying client library:
- 4.1.1 Maintained by the vendor of the target technology.
- 4.1.2 Actively developed and well adopted in the Go ecosystem.
- 4.1.3 Stable, performant, and well understood.
- 4.1.4 Adheres to semantic versioning and is v1 or greater.
- 4.2.1 Outdated or inactive libraries.
- 4.2.2 Known security issues or critical bugs.
- 4.2.3 Poor runtime behavior: excessive goroutines, memory leaks, or non-linear scaling.
This standard governs every CDC connector — the current fleet (oracledb_cdc, microsoft_sql_server_cdc, mysql_cdc, postgres_cdc, mongodb_cdc, aws_dynamodb_cdc, cockroachdb_changefeed, salesforce_cdc, gcp_spanner_cdc, tigerbeetle_cdc) and every new one. Existing connectors may retain prior behavior where conforming would be a breaking change; new CDC connectors must conform from the start, enforced by the conformance test at internal/plugins/cdctest. Requirements are tiered: Core applies to every CDC connector; Relational applies to snapshot + change-log connectors.
The rule throughout is conformance to the existing fleet: mirror the shape the fleet already establishes (referenced per item) rather than introducing a new shape or porting another ecosystem's abstractions (see §3.1.3).
- 5.1.1 A CDC input is registered as
<system>_cdc(or<system>_changefeedfor changefeed-style sources). This naming is the fleet and tooling contract and is required.
- 5.2.1 Emit flat, top-level metadata plus the raw row/document as the message body. Do not wrap the row in a nested
before/after/source/openvelope. A foreign-compatible output format may be offered as an explicit opt-in, but the default and internal representation is the flat fleet shape. Reference:oracledb_cdc,mysql_cdc,postgres_cdc. - 5.2.2 Required metadata keys (use the fleet names; do not invent component-prefixed variants):
operation;schema(immutable; relational — see §5.5.1); a source-position key under its DB-native name (scn,lsn,binlog_position, …); table identitytableand namespacedatabase_schema;source_ts_msandcommit_ts_ms(int64);transaction_id.
- 5.3.1 Use the canonical field names:
tables(orinclude/exclude),stream_snapshot,snapshot_max_batch_size,max_parallel_snapshot_tables,checkpoint_cache,checkpoint_cache_key,checkpoint_limit,heartbeat_interval,batching.snapshot_mode(enum) is acceptable only where a connector genuinely needs more than two snapshot modes. - 5.3.2 Renaming an existing field is non-breaking: add the canonical field, keep the old one accepted, and mark the old one
Deprecated(). Precedent:postgres_cdc'ssnapshot_memory_safety_factor.
- 5.4.1 Durable checkpoint + resume via a
checkpoint_cacheresource; never an in-memory-only cursor. Checkpoint as soon as the snapshot completes, not after the first streaming message. Reference:oracledb_cdc. - 5.4.2 At-least-once delivery, with progress gated on downstream ack and correct transaction boundaries.
- 5.4.3 A
ConnectionTestvalidating connectivity, auth, and minimum privilege before the input starts. - 5.4.4 Tracing spans around the snapshot, stream, and checkpoint-commit paths.
- 5.4.5 TLS + auth, with IAM where the endpoint supports it; on connection loss, reconnect with freshly-resolved credentials.
- 5.4.6 Deterministic type mapping; emit
DECIMAL/NUMERICas canonical decimal strings viasqlutil.CanonicaliseDecimal, neverfloat64. Reference:mysql_cdc. - 5.4.7 Benchmarking per §1.3.4–1.3.5.
- 5.5.1
schemametadata derived from the system catalog, including primary keys and per-column nullability, with addition-only drift detection. Reference:oracledb_cdc,postgres_cdc. - 5.5.2 Snapshot + streaming with a gap-free handoff: capture the stream position before the snapshot read and resume streaming from it.
- 5.5.3 Parallel snapshotting (
max_parallel_snapshot_tables). - 5.5.4 Incremental, signal-driven snapshotting.
- 5.5.5 Snapshot query filtering.
- 5.5.6 Idle keepalive that advances the read position/watermark during idle (
heartbeat_interval). Reference:postgres_cdc. - 5.5.7 Include/exclude regex table matching. Reference:
oracledb_cdc.
- 5.6.1 Snapshot↔streaming type parity: every supported type serializes identically whether produced by snapshot or by streaming, proven by unit and integration tests.
- Run
task fmt,task lint, andtask testlocally — all green. - Run
task docsand commit the result: the generated component pages and theinternal/plugins/info.csvrow. CI fails on stale docs. - Every new component has an
internal/plugins/info.csventry with the correct distribution and cloud classification. - A license header on every new
.gofile (including test and benchmark helpers), matching the component's distribution. - No binaries, build artifacts, or local tooling committed.
- Keep the PR within the scope agreed in the issue or PRD (§3.1.1); propose extra components or capabilities separately.