I'm running into a challenging configuration issue with the Debezium Operator on Kubernetes and hope someone can provide some insight.
My Setup:
Environment: Kubernetes
Operator: Debezium Operator
Pipeline: MySQL (Source) -> Debezium Server -> RabbitMQ (Sink)
Debezium Server Version: 3.1
I am implementing the outbox pattern and need to use the io.debezium.transforms.outbox.EventRouter SMT. The key requirement is to set the dynamic routing property: debezium.transforms.outbox.route.topic.replacement=${routedByValue}
The EventRouter transform itself needs to process the literal string ${routedByValue} at runtime.
I cannot find a reliable way to get this literal string ${routedByValue} into the final application.properties file inside the Debezium pod. The Kubernetes and shell environment consistently tries to substitute this variable at startup, which causes the application to fail with errors like a NullPointerException.
I need to substitute environment variables like ${RABBITMQ_PASSWORD} (from a Kubernetes Secret), but I must prevent the substitution of ${routedByValue}.
What is the canonical, recommended way to set a property that contains a Debezium-internal placeholder like ${routedByValue} when using the Debezium Operator?
It seems like a fundamental use case, but I've hit a wall with shell escaping. Is there a simpler, more official method that I'm completely missing?
Any help would be greatly appreciated!
Isabel.
La información contenida en este mensaje de correo electrónico y, en su caso, en cualquier fichero anexo al mismo, tiene carácter reservado y confidencial para uso exclusivo de su/s destinatario/s, por lo que su divulgación, copia o distribución a terceros están expresamente prohibidas. En caso de haber recibido este mensaje por error se ruega comunicarlo inmediatamente al remitente y eliminarlo a continuación.
Sus datos serán tratados por Zertiban S.L.U. con la finalidad de mantener las relaciones contractuales, comerciales y profesionales que nos unen a Ud. Para obtener más información sobre cesiones, legitimidad del tratamiento, plazo de conservación de sus datos y dirección donde ejercer sus derechos de protección de datos, por favor, acceda a Política de Privacidad de Zertiban S.L.U. o diríjase a le...@zertiban.com--
You received this message because you are subscribed to a topic in the Google Groups "debezium" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/debezium/KoaWgfAOLEY/unsubscribe.
To unsubscribe from this group and all its topics, send an email to debezium+u...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/6b661df3-37b8-4468-81d5-c11dd8cfd5b5n%40googlegroups.com.
You received this message because you are subscribed to the Google Groups "debezium" group.
To unsubscribe from this group and stop receiving emails from it, send an email to debezium+u...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/CALDUC%2Bbofyn4xA0_DmnUMeZPgyS_80pfKudcTLsksZcJ1ZFisQ%40mail.gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/c8a90116-0dc6-499d-bb31-1c7090e43c16%40gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/CALDUC%2BayksNYBto5bXcNQfHBi1%2BF5BjDBKkfN02cyu%2B-gaaSOw%40mail.gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/09ab9728-7b61-47f0-908f-e89a3f93b4f3%40gmail.com.
debezium.api.enabled=true
debezium.format.header=json
debezium.format.key=json
debezium.format.value=json
debezium.sink.http.url=https://www.postb.in/1755786226203-2970293918624
debezium.sink.type=http
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.database.dbname=postgres
debezium.source.database.hostname=localhost
debezium.source.database.password=postgres
debezium.source.database.port=5432
debezium.source.database.user=postgres
debezium.source.offset.flush.interval.ms=60000
debezium.source.offset.storage=org.apache.kafka.connect.storage.MemoryOffsetBackingStore
debezium.source.schema.history.internal=io.debezium.relational.history.MemorySchemaHistory
debezium.source.schema.include.list=inventory
debezium.source.topic.prefix=inventory
debezium.transforms.t0.condition=value.schema().field("op") && value.getString("op") == "c"
debezium.transforms.t0.language=jsr223.groovy
debezium.transforms.t0.negate=false
debezium.transforms.t0.type=io.debezium.transforms.Filter
debezium.transforms.t1.negate=false
debezium.transforms.t1.route.by.field=EXCHANGE
debezium.transforms.t1.route.tombstone.on.empty.payload=true
debezium.transforms.t1.route.topic.regex=(?<routedByValue>.*)
debezium.transforms.t1.route.topic.replacement=$${routedByValue}
debezium.transforms.t1.table.expand.json.payload=true
debezium.transforms.t1.table.field.event.id=UUID
debezium.transforms.t1.table.field.event.key=ROUTING_KEY
debezium.transforms.t1.table.field.event.payload=PAYLOAD
debezium.transforms.t1.table.field.event.timestamp=PRODUCED_TIMESTAMP
debezium.transforms.t1.table.fields.additional.error.on.missing=true
2025-08-21 16:32:38,115 INFO [io.deb.con.com.BaseSourceTask] (pool-9-thread-1) Starting PostgresConnectorTask with configuration:
connector.class = io.debezium.connector.postgresql.PostgresConnector
transforms = t0,t1
schema.include.list = inventory
transforms.t1.table.field.event.timestamp = PRODUCED_TIMESTAMP
record.processing.threads =
transforms.t1.route.topic.replacement = ${routedByValue}
To view this discussion visit https://groups.google.com/d/msgid/debezium/ab7a36dc-b8ce-422a-a7e1-95f9e26a83a2n%40googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/debezium/966a0cfd-5c2b-42b5-bb15-89c96599b48cn%40googlegroups.com.