-
Notifications
You must be signed in to change notification settings - Fork 4.9k
Description
Helm Chart Version
Helm Chart Version**: 2.0.0 App Version: 1.6.0
What step the error happened?
On deploy
Relevant information
When deploying Airbyte Community Edition 2.x (Helm chart v2.0.0) with Temporal Cloud integration, the application fails to start due to a ConnectorRolloutApiController bean initialization error. This occurs despite:
- All required Temporal Cloud environment variables being properly configured
- The
CONNECTOR_ROLLOUT_ENABLEDflag being set tofalse - The ConnectorRollout worker being disabled
The issue appears to be a fundamental incompatibility between Airbyte CE 2.x and Temporal Cloud, as the ConnectorRollout feature's beans attempt to initialize during application startup before runtime configuration can prevent them.
Environment
- Helm Chart Version: 2.0.0
- App Version: 1.6.0
- Airbyte Edition: Community Edition
- Temporal: Temporal Cloud (managed service)
- Kubernetes Version: 1.30+
- Deployment Method: Helm via ArgoCD (GitOps)
Expected Behavior
When CONNECTOR_ROLLOUT_ENABLED=false and connectorRolloutWorker.enabled=false, the Airbyte server should:
- Skip initialization of ConnectorRollout-related beans
- Successfully start with Temporal Cloud connection
- Function normally without ConnectorRollout features
Actual Behavior
The application crashes during startup with:
ERROR i.m.r.Micronaut(handleStartupException):349 - Error starting Micronaut server:
Bean definition [io.airbyte.server.apis.controllers.ConnectorRolloutApiController] could not be loaded:
Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Message: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Path Taken:
ConnectorRolloutApiController.connectorRolloutHandler -->
ConnectorRolloutHandler.connectorRolloutClient -->
new ConnectorRolloutClient([ConnectorRolloutTemporalWorkflowService connectorRolloutTemporalWorkflowService])
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Pod status:
NAME READY STATUS RESTARTS
airbyte-ce-dev-server-755fdfd78-xxxxx 0/1 CrashLoopBackOff 2+
Steps to Reproduce
1. Helm Values Configuration
global:
serviceAccountName: "airbyte-sa"
edition: "community"
airbyteUrl: http://airbyte.example.com
# External PostgreSQL database
database:
type: external
secretName: "airbyte-db-connection"
host: "10.x.x.x"
port: "5432"
database: "airbyte"
name: "airbyte"
userSecretKey: "DATABASE_USER"
passwordSecretKey: "DATABASE_PASSWORD"
# GCS storage
storage:
type: gcs
bucket:
activityPayload: storage-bucket
log: storage-bucket
state: storage-bucket
workloadOutput: storage-bucket
secretName: "gcs-credentials"
gcs:
projectId: project-id
# Temporal Cloud configuration
temporal:
cloud:
enabled: true
host: "namespace.tmprl.cloud:7233"
namespace: "namespace-id"
clientCert: "temporal-certs"
clientCertSecretKey: "TEMPORAL_CLOUD_CLIENT_CERT"
clientKey: "temporal-certs"
clientKeySecretKey: "TEMPORAL_CLOUD_CLIENT_KEY"
cli:
address: "namespace.tmprl.cloud:7233"
namespace: "namespace-id"
tlsCert: "temporal-certs"
tlsCertSecretKey: "TEMPORAL_CLOUD_CLIENT_CERT"
tlsKey: "temporal-certs"
tlsKeySecretKey: "TEMPORAL_CLOUD_CLIENT_KEY"
airbyte:
# Disable ConnectorRollout worker
connectorRolloutWorker:
enabled: false
# Disable internal PostgreSQL
postgresql:
enabled: false
# Disable self-hosted Temporal
temporal:
enabled: false
# Server configuration
server:
extraEnv:
# Disable ConnectorRollout feature
- name: CONNECTOR_ROLLOUT_ENABLED
value: "false"
# Manual Temporal Cloud configuration injection
# (Required because chart doesn't automatically inject these)
- name: TEMPORAL_CLOUD_ENABLED
valueFrom:
configMapKeyRef:
name: airbyte-ce-dev-airbyte-env
key: TEMPORAL_CLOUD_ENABLED
- name: TEMPORAL_CLOUD_HOST
valueFrom:
configMapKeyRef:
name: airbyte-ce-dev-airbyte-env
key: TEMPORAL_CLOUD_HOST
- name: TEMPORAL_CLOUD_NAMESPACE
valueFrom:
configMapKeyRef:
name: airbyte-ce-dev-airbyte-env
key: TEMPORAL_CLOUD_NAMESPACE
# Temporal Cloud certificate credentials
- name: TEMPORAL_CLOUD_CLIENT_CERT
valueFrom:
secretKeyRef:
name: temporal-certs
key: TEMPORAL_CLOUD_CLIENT_CERT
- name: TEMPORAL_CLOUD_CLIENT_KEY
valueFrom:
secretKeyRef:
name: temporal-certs
key: TEMPORAL_CLOUD_CLIENT_KEY2. Create Temporal Cloud Certificate Secret
kubectl create secret generic temporal-certs \
--namespace=airbyte \
--from-file=TEMPORAL_CLOUD_CLIENT_CERT=./client.pem \
--from-file=TEMPORAL_CLOUD_CLIENT_KEY=./client-key.pemCertificate format: PEM-encoded ECDSA P-384 certificate chain with root and client certificates.
3. Deploy Helm Chart
helm repo add airbyte https://airbytehq.github.io/charts
helm repo update
helm upgrade --install airbyte-ce airbyte/airbyte \
--version 2.0.0 \
--namespace airbyte \
--create-namespace \
--values values.yaml4. Observe Failure
kubectl get pods -n airbyte
# Pod shows CrashLoopBackOff
kubectl logs -n airbyte <server-pod-name>
# Shows ConnectorRolloutApiController bean initialization errorRoot Cause Analysis
1. Bean Initialization Timing
The ConnectorRolloutApiController is a Micronaut bean that attempts to initialize during application startup, before any runtime configuration can be evaluated. The dependency chain is:
ConnectorRolloutApiController
→ ConnectorRolloutHandler
→ ConnectorRolloutClient
→ ConnectorRolloutTemporalWorkflowServiceFactory
→ [FAILS HERE]
2. Feature Flag Limitation
The CONNECTOR_ROLLOUT_ENABLED environment variable only controls whether the feature runs, not whether the bean is created. Bean creation happens during Micronaut's initialization phase, before the flag can be evaluated.
3. Missing Conditional Bean Creation
The ConnectorRolloutApiController bean lacks @Requires annotations that would prevent its creation based on:
- Edition (Community vs Enterprise)
- Temporal configuration (self-hosted vs Cloud)
- Feature flags
4. Helm Chart Environment Variable Injection Gap
Finding: The Helm chart generates a ConfigMap (airbyte-env) with Temporal Cloud configuration but doesn't automatically inject these as environment variables:
# ConfigMap generated by chart (verified)
data:
TEMPORAL_CLOUD_ENABLED: "true"
TEMPORAL_CLOUD_HOST: "namespace.tmprl.cloud:7233"
TEMPORAL_CLOUD_NAMESPACE: "namespace-id"However, the deployment spec doesn't reference these ConfigMap keys, requiring manual injection via extraEnv.
Verification
I verified all required environment variables are present in the pod:
kubectl exec -n airbyte <server-pod> -- env | grep TEMPORAL_CLOUD
TEMPORAL_CLOUD_CLIENT_CERT=-----BEGIN CERTIFICATE-----...
TEMPORAL_CLOUD_CLIENT_KEY=-----BEGIN PRIVATE KEY-----...
TEMPORAL_CLOUD_ENABLED=true
TEMPORAL_CLOUD_HOST=namespace.tmprl.cloud:7233
TEMPORAL_CLOUD_NAMESPACE=namespace-idDespite all configuration being correct, the application still fails at bean initialization.
Attempted Workarounds
✅ Workaround 1: Disable ConnectorRollout Worker
airbyte:
connectorRolloutWorker:
enabled: falseResult: Worker successfully disabled, but server pod still crashes.
✅ Workaround 2: Set Feature Flag
server:
extraEnv:
- name: CONNECTOR_ROLLOUT_ENABLED
value: "false"Result: Flag set correctly, but bean initialization occurs before flag evaluation.
✅ Workaround 3: Manual Environment Variable Injection
server:
extraEnv:
- name: TEMPORAL_CLOUD_ENABLED
valueFrom:
configMapKeyRef:
name: airbyte-ce-dev-airbyte-env
key: TEMPORAL_CLOUD_ENABLED
# ... etcResult: All environment variables confirmed present, but initialization still fails.
Proposed Solutions
Solution 1: Add Conditional Bean Creation (Recommended)
Add @Requires annotation to prevent bean creation in Community Edition:
@Controller("/v1/connector_rollout")
@Requires(property = "airbyte.edition", value = "enterprise")
// OR
@Requires(property = "connector.rollout.enabled", value = "true", defaultValue = "false")
public class ConnectorRolloutApiController {
// ...
}This would prevent the bean from being created at all when the feature is not supported.
Solution 2: Fix Helm Chart Environment Variable Injection
Automatically inject Temporal Cloud configuration from ConfigMap to deployment spec:
# In deployment.yaml template
env:
{{- if .Values.global.temporal.cloud.enabled }}
- name: TEMPORAL_CLOUD_ENABLED
valueFrom:
configMapKeyRef:
name: {{ include "airbyte.fullname" . }}-env
key: TEMPORAL_CLOUD_ENABLED
- name: TEMPORAL_CLOUD_HOST
valueFrom:
configMapKeyRef:
name: {{ include "airbyte.fullname" . }}-env
key: TEMPORAL_CLOUD_HOST
- name: TEMPORAL_CLOUD_NAMESPACE
valueFrom:
configMapKeyRef:
name: {{ include "airbyte.fullname" . }}-env
key: TEMPORAL_CLOUD_NAMESPACE
{{- end }}Currently, it seems users must manually inject these via extraEnv.
Questions for Maintainers
-
Is Temporal Cloud intended to be supported in Community Edition 2.x?
- If yes, this seems to be a bug that needs fixing
- If no, what do I need to change to deploy the temporal cloud integration with airbyte?
-
Is ConnectorRollout feature Enterprise-only?
- If yes, beans should use
@Requiresfor conditional creation - Current behavior suggests it's trying to initialize in CE
- If yes, beans should use
-
What is the recommended Temporal configuration for CE 2.x?
- Self-hosted Temporal only?
- Temporal Cloud supported?
- Neither (workflows disabled in CE)?
Impact
This issue prevents us from deploying Airbyte Community Edition 2.x with Temporal Cloud
Additional Context
Related Issues
- Similar issue may affect other users attempting CE 2.x with Temporal Cloud
- May be related to the architectural changes in 2.x series
Environment Variables Present at Startup
All required Temporal Cloud environment variables are confirmed present:
| Variable | Source | Status |
|---|---|---|
| TEMPORAL_CLOUD_ENABLED | ConfigMap | ✅ Present |
| TEMPORAL_CLOUD_HOST | ConfigMap | ✅ Present |
| TEMPORAL_CLOUD_NAMESPACE | ConfigMap | ✅ Present |
| TEMPORAL_CLOUD_CLIENT_CERT | Secret | ✅ Present |
| TEMPORAL_CLOUD_CLIENT_KEY | Secret | ✅ Present |
| CONNECTOR_ROLLOUT_ENABLED | Direct value | ✅ Present (false) |
Full Error Stack Trace
2025-10-29 18:45:32 ERROR i.m.r.Micronaut(handleStartupException):349 - Error starting Micronaut server: Bean definition [io.airbyte.server.apis.controllers.ConnectorRolloutApiController] could not be loaded: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Message: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Path Taken: ConnectorRolloutApiController.connectorRolloutHandler --> ConnectorRolloutHandler.connectorRolloutClient --> new ConnectorRolloutClient([ConnectorRolloutTemporalWorkflowService connectorRolloutTemporalWorkflowService])
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1894)
at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:265)
at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:3234)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:332)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:192)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:74)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:330)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:306)
at io.airbyte.server.Application.main(Application.java:22)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Message: Error instantiating bean of type [io.airbyte.connector.rollout.client.ConnectorRolloutClient]
Path Taken: ConnectorRolloutApiController.connectorRolloutHandler --> ConnectorRolloutHandler.connectorRolloutClient --> new ConnectorRolloutClient([ConnectorRolloutTemporalWorkflowService connectorRolloutTemporalWorkflowService])
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2507)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:3324)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2747)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2718)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1062)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1333)
at io.airbyte.connector.rollout.worker.$ConnectorRolloutHandlerDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2442)
... (stack continues)
Caused by: java.lang.NullPointerException: Cannot invoke "io.temporal.client.WorkflowClient.newWorkflowStub(Class)" because the return value of "io.airbyte.connector.rollout.client.ConnectorRolloutTemporalWorkflowServiceFactory.createTemporalWorkflowServiceLazily()" is null
at io.airbyte.connector.rollout.client.ConnectorRolloutClient.<init>(ConnectorRolloutClient.java:29)
at io.airbyte.connector.rollout.client.$ConnectorRolloutClientDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2442)
... (stack continues)
The root cause seems to be ConnectorRolloutTemporalWorkflowServiceFactory.createTemporalWorkflowServiceLazily() returning null, which suggests the Temporal CLI configuration expected by ConnectorRollout is incompatible with Temporal Cloud in CE.
Chart Repository: https://github.com/airbytehq/helm-charts
Chart Version: 2.0.0
App Version: 1.6.0
Thank you for maintaining this project! Please let me know if you need any additional information or logs.