From 3f5102d371f12321b1dc6bbe2b9810d54f357dd7 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 06:26:15 -0800 Subject: [PATCH 01/31] remove collapsible --- .../partials/connectors/sinks/monitoring.adoc | 11 ++++------- .../pulsar-io/partials/connectors/sources/manage.adoc | 4 +--- .../partials/connectors/sources/monitoring.adoc | 7 +++---- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc index 14ec323..ccba816 100644 --- a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc @@ -30,8 +30,6 @@ curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESP ---- + .Result -[%collapsible] -==== [source,json] ---- { @@ -145,7 +143,7 @@ curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESP "transformFunctionConfig": "string" } ---- -==== + -- ====== @@ -186,11 +184,9 @@ curl "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTAN -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- -.Result -[%collapsible] -==== Status response for all connector instances: +.Result [source,json] ---- { @@ -229,6 +225,7 @@ Status response for all connector instances: Status response for individual connector instance: +.Result [source,json] ---- { @@ -255,7 +252,7 @@ Status response for individual connector instance: "workerId": "string" } ---- -==== + -- ====== diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index 8f239d7..937b392 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -151,8 +151,6 @@ include::example$connectors/sources/{connectorType}/curl-update.sh[] ---- .Result -[%collapsible] -==== [source,json] ---- { @@ -209,7 +207,7 @@ include::example$connectors/sources/{connectorType}/curl-update.sh[] "batchBuilder": "string" } ---- -==== + -- ====== diff --git a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc index c3bcf2f..4d1045c 100644 --- a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc @@ -118,11 +118,9 @@ curl "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- -.Result -[%collapsible] -==== Status response for all connector instances: +.Result [source,json] ---- { @@ -161,6 +159,7 @@ Status response for all connector instances: Status response for individual connector instance: +.Result [source,json] ---- { @@ -187,7 +186,7 @@ Status response for individual connector instance: "workerId": "string" } ---- -==== + -- ====== From 96bacc03db68c0916f5ddc6d5eb01ded2405c458 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 06:44:45 -0800 Subject: [PATCH 02/31] remove tabs from connector pages --- modules/pulsar-io/pages/connectors/index.adoc | 34 +++----- .../pages/connectors/sinks/cloud-storage.adoc | 31 ++----- .../connectors/sinks/get-started.adoc | 35 +++----- .../partials/connectors/sinks/manage.adoc | 83 +++++-------------- .../partials/connectors/sinks/monitoring.adoc | 34 ++------ .../connectors/sources/get-started.adoc | 35 +++----- .../partials/connectors/sources/manage.adoc | 78 +++++------------ .../connectors/sources/monitoring.adoc | 37 +++------ 8 files changed, 108 insertions(+), 259 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index e553573..dc48efe 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -238,24 +238,19 @@ Zeebe + == Listing Sink Connectors -To list available sink connectors in your Astra Streaming tenant, use any of the following. +To list available sink connectors in your Astra Streaming tenant, you can use the {pulsar-short} Admin CLI or API. + +=== {pulsar-short} Admin CLI -[tabs] -==== -{pulsar-short} Admin:: -+ --- include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- ./bin/pulsar-admin sinks available-sinks ---- --- -curl:: -+ --- +=== {pulsar-short} Admin API + You need a {pulsar-short} token for REST API authentication. This is different from your {astra-db} application tokens. @@ -283,29 +278,22 @@ export ASTRA_STREAMING_TOKEN= ---- curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -==== == Listing Source Connectors -To list available source connectors in your Astra Streaming tenant, use any of the following. +To list available source connectors in your Astra Streaming tenant, you can use the {pulsar-short} Admin CLI or API. + +=== {pulsar-short} Admin CLI -[tabs] -==== -{pulsar-short} Admin:: -+ --- include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- ./bin/pulsar-admin sources available-sources ---- --- -curl:: -+ --- +=== {pulsar-short} Admin API + You need a {pulsar-short} token for REST API authentication. This is different from your {astra-db} application tokens. @@ -333,8 +321,6 @@ export ASTRA_STREAMING_TOKEN= ---- curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -==== == See also diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 4ea937d..53480c7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -139,26 +139,19 @@ include::partial$connectors/sinks/manage.adoc[] include::partial$connectors/sinks/monitoring.adoc[] -== Connector Reference - -With the Cloud Storage Sink there are two sets of parameters: Astra Streaming parameters and cloud storage provider parameters. - -=== Astra Streaming parameters for Cloud Storage Sink +== Astra Streaming parameters for Cloud Storage Sink configuration [%header,format=csv,cols="2,1,1,3"] |=== include::example$connectors/sinks/astra.csv[] |=== -=== Cloud storage provider parameters for Cloud Storage Sink +== Cloud storage provider parameters for Cloud Storage Sink configuration Set your cloud storage provider and other required values in the `configs` area. -[tabs] -====== -Google Cloud Storage:: -+ --- +=== Google Cloud Storage + [cols="2,1,1,3"] |=== |Name |Required |Default |Description @@ -283,11 +276,9 @@ Google Cloud Storage:: |true |When it is set to true, include the topic partition number to the object path. |=== --- -AWS S3 Storage:: -+ --- +=== AWS S3 Storage + The suggested permission policies for AWS S3 are: - `s3:AbortMultipartUpload` @@ -436,11 +427,9 @@ If you don't want to provide a region in the configuration, then enable the `s3: |true |When it is set to true, include the topic partition number to the object path. |=== --- -Azure Blob Storage:: -+ --- +=== Azure Blob Storage + [cols="2,1,1,3"] |=== |Name |Required |Default |Description @@ -579,6 +568,4 @@ Azure Blob Storage:: |no |true |When it is set to true, include the topic partition number to the object path. -|=== --- -====== \ No newline at end of file +|=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 55e8dac..721b52b 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -1,42 +1,33 @@ // TODO: include details about retrieving a tenant name // TODO: include details about creating a topic -Set the following environment variables using `pulsar-admin` or curl: +Set the following environment variables using the `pulsar-admin` CLI or the {pulsar-admin} API: -[source,shell,subs="attributes+"] +[source,shell,subs="+quote,+attributes"] ---- -export TENANT= -export INPUT_TOPIC= -export NAMESPACE=default +export TENANT=**TENANT_NAME** +export INPUT_TOPIC=**TOPIC_NAME** +export NAMESPACE=**NAMESPACE_NAME** # or default export SINK_NAME={connectorName} ---- -[tabs] -====== -{pulsar-short} Admin:: -+ --- +=== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] ---- --- -curl:: -+ --- +=== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/curl-create.sh[] ---- --- - -Sample Config Data:: -+ --- -include::example$connectors/sinks/{connectorType}/sample-data.adoc[] --- -====== \ No newline at end of file + +=== Sample Config Data + +include::example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index 30cd89a..a7aace9 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -1,10 +1,7 @@ === Start -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -17,11 +14,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only start an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -34,16 +29,11 @@ curl -sS --fail --location --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$T curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/start" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Stop -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -56,11 +46,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only stop an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -73,16 +61,11 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NA curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/stop" \ --H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Restart -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -95,11 +78,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only restart an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -112,49 +93,35 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NA curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/restart" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Update -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/curl-update.sh[] ---- --- -Sample Config Data:: -+ --- +==== Sample Config Data + include::example$connectors/sinks/{connectorType}/sample-data.adoc[] --- -====== === Delete -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -165,11 +132,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] --name "$SINK_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -177,6 +142,4 @@ include::partial$connectors/sinks/curl-tab-prereq.adoc[] # Delete all instances of a connector curl -sS --fail --location --request DELETE ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" ----- --- -====== \ No newline at end of file +---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc index ccba816..5b56332 100644 --- a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc @@ -1,10 +1,7 @@ === Info -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -15,11 +12,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] --name "$SINK_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -28,7 +23,7 @@ include::partial$connectors/sinks/curl-tab-prereq.adoc[] curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" ---- -+ + .Result [source,json] ---- @@ -144,16 +139,10 @@ curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESP } ---- --- -====== - === Health -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -165,11 +154,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] --name "$SINK_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sinks/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -253,9 +240,6 @@ Status response for individual connector instance: } ---- --- -====== - === Metrics Astra Streaming exposes Prometheus formatted metrics for every connector. Refer to the xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index dc8ebae..df88c70 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -1,40 +1,31 @@ -Set the following environment variables using `pulsar-admin` or curl: +Set the following environment variables using the `pulsar-admin` CLI or the {pulsar-admin} API: -[source,shell,subs="attributes+"] +[source,shell,subs="+quote,+attributes"] ---- -export TENANT= -export DESTINATION_TOPIC= -export NAMESPACE=default +export TENANT=**TENANT_NAME** +export DESTINATION_TOPIC=**TOPIC_NAME** +export NAMESPACE=**NAMESPACE_NAME** # or default export SOURCE_NAME={connectorName} ---- -[tabs] -====== -{pulsar-short} Admin:: -+ --- +=== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] ---- --- -curl:: -+ --- +=== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/curl-create.sh[] ---- --- - -Sample Config Data:: -+ --- -include::example$connectors/sources/{connectorType}/sample-data.adoc[] --- -====== \ No newline at end of file + +=== Sample Config Data + +include::example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index 937b392..9b7e529 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -1,10 +1,7 @@ === Start -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -17,11 +14,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only start an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] Start all instances of a connector: @@ -39,16 +34,11 @@ Start an individual instance of a connector: curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/start" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Stop -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -61,11 +51,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only stop an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] Stop all instances of a connector: @@ -83,16 +71,11 @@ Stop an individual instance of a connector: curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/stop" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Restart -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -105,11 +88,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] # optionally add --instance-id to only restart an individual instance ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] [source,shell] @@ -122,27 +103,20 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/restart" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -====== === Update -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] [source,shell,subs="attributes+"] @@ -208,16 +182,10 @@ include::example$connectors/sources/{connectorType}/curl-update.sh[] } ---- --- -====== - === Delete -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -228,11 +196,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] --name "$SOURCE_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + include::partial$connectors/sources/curl-tab-prereq.adoc[] [source,shell] @@ -240,6 +206,4 @@ include::partial$connectors/sources/curl-tab-prereq.adoc[] # Delete all instances of a connector curl -sS --fail -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ----- --- -====== \ No newline at end of file +---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc index 4d1045c..ffa064c 100644 --- a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc @@ -1,10 +1,7 @@ === Info -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -15,11 +12,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] --name "$SOURCE_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + You need a {pulsar-short} token for REST API authentication. This is different from your {astra-db} application tokens. @@ -50,22 +45,15 @@ curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NA -H "accept: application/json" \ -H "Authorization: $ASTRA_STREAMING_TOKEN" ---- --- -Sample Config Data:: -+ --- +==== Sample Config Data + include::example$connectors/sources/{connectorType}/sample-data.adoc[] --- -====== === Health -[tabs] -====== -{pulsar-short} Admin:: -+ --- +==== {pulsar-short} Admin CLI + include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] [source,shell] @@ -77,11 +65,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] --name "$SOURCE_NAME" \ --tenant "$TENANT" ---- --- -curl:: -+ --- +==== {pulsar-short} Admin API + You need a {pulsar-short} token for REST API authentication. This is different from your {astra-db} application tokens. @@ -187,9 +173,6 @@ Status response for individual connector instance: } ---- --- -====== - === Metrics Astra Streaming exposes Prometheus formatted metrics for every connector. Refer to xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file From 2f1f037d0d4c9ed0e1c8eabfe1c8f6ed25442612 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 06:45:52 -0800 Subject: [PATCH 03/31] delete functions stuff cause im working locally --- modules/ROOT/nav.adoc | 12 +- .../images/astream-advanced-config.png | Bin 376902 -> 0 bytes .../images/astream-delete-function.png | Bin 17382 -> 0 bytes .../images/astream-exclamation-function.png | Bin 368617 -> 0 bytes .../images/astream-function-controls.png | Bin 6390 -> 0 bytes .../functions/images/astream-function-log.png | Bin 88529 -> 0 bytes .../images/astream-function-update.png | Bin 67305 -> 0 bytes .../functions/images/astream-io-topics.png | Bin 139593 -> 0 bytes .../images/astream-name-function.png | Bin 191289 -> 0 bytes .../astream-optional-destination-topics.png | Bin 318393 -> 0 bytes .../images/astream-provide-config-keys.png | Bin 182536 -> 0 bytes .../images/astream-transform-functions.png | Bin 157592 -> 0 bytes .../functions/pages/astream-functions.adoc | 515 ------------------ modules/functions/pages/cast.adoc | 51 -- modules/functions/pages/compute.adoc | 326 ----------- modules/functions/pages/deploy-in-sink.adoc | 58 -- modules/functions/pages/drop-fields.adoc | 52 -- modules/functions/pages/drop.adoc | 27 - modules/functions/pages/flatten.adoc | 49 -- modules/functions/pages/index.adoc | 210 ------- modules/functions/pages/merge-key-value.adoc | 35 -- modules/functions/pages/unwrap-key-value.adoc | 46 -- 22 files changed, 1 insertion(+), 1380 deletions(-) delete mode 100644 modules/functions/images/astream-advanced-config.png delete mode 100644 modules/functions/images/astream-delete-function.png delete mode 100644 modules/functions/images/astream-exclamation-function.png delete mode 100644 modules/functions/images/astream-function-controls.png delete mode 100644 modules/functions/images/astream-function-log.png delete mode 100644 modules/functions/images/astream-function-update.png delete mode 100644 modules/functions/images/astream-io-topics.png delete mode 100644 modules/functions/images/astream-name-function.png delete mode 100644 modules/functions/images/astream-optional-destination-topics.png delete mode 100644 modules/functions/images/astream-provide-config-keys.png delete mode 100644 modules/functions/images/astream-transform-functions.png delete mode 100644 modules/functions/pages/astream-functions.adoc delete mode 100644 modules/functions/pages/cast.adoc delete mode 100644 modules/functions/pages/compute.adoc delete mode 100644 modules/functions/pages/deploy-in-sink.adoc delete mode 100644 modules/functions/pages/drop-fields.adoc delete mode 100644 modules/functions/pages/drop.adoc delete mode 100644 modules/functions/pages/flatten.adoc delete mode 100644 modules/functions/pages/index.adoc delete mode 100644 modules/functions/pages/merge-key-value.adoc delete mode 100644 modules/functions/pages/unwrap-key-value.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index df6fd49..c993a80 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -31,15 +31,5 @@ *** xref:pulsar-io:connectors/sinks/kafka.adoc[] *** xref:pulsar-io:connectors/sinks/kinesis.adoc[] *** xref:pulsar-io:connectors/sinks/snowflake.adoc[] -* xref:functions:astream-functions.adoc[] -* Transformation Functions -** xref:functions:index.adoc[] -** xref:functions:cast.adoc[] -** xref:functions:compute.adoc[] -** xref:functions:drop.adoc[] -** xref:functions:flatten.adoc[] -** xref:functions:merge-key-value.adoc[] -** xref:functions:unwrap-key-value.adoc[] -** xref:functions:deploy-in-sink.adoc[] -** xref:functions:drop-fields.adoc[] +* xref:astra-streaming:developing:astream-functions.adoc[] * xref:astra-streaming:ROOT:astream-subscriptions.adoc[Topic subscriptions] \ No newline at end of file diff --git a/modules/functions/images/astream-advanced-config.png b/modules/functions/images/astream-advanced-config.png deleted file mode 100644 index 5ef7dc291bf477af1301a4655313988a83c8e16b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376902 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�m*X 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ĕ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 Rx`POOso&F4E>nCQ{9j*^Nh<&V diff --git a/modules/functions/images/astream-delete-function.png b/modules/functions/images/astream-delete-function.png deleted file mode 100644 index b51cade85f88849e017133ab8ab9c4160751b4da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17382 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¯gET;`5F)dvuV7d)FHC1kMu(YFmR)^ns8v@e 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 diff --git a/modules/functions/images/astream-exclamation-function.png b/modules/functions/images/astream-exclamation-function.png deleted file mode 100644 index 0f06eef1d2dc561078efd0b13856deb0cd40dfa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368617 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%0AJ0mXV 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

G_zQ8#_1FN9@Is}WBYbY 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%0A>!GWEwDzjWO(dYN<^c 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 U?I3zy`j!R z{{!P%S~ytvGO(kginaKsxEyGs0Wq5%W*M+6q+lL`KkgyE1SQzq`Q@}ILZ|)Mt82D+q)2?sS?4Mm+CYvUfx;UBOwfTsJ4wZEkmYG*` zFC~4!ny>1~d{Sh;XcfBhQ@JtycOe-->rHkDzxw8^O?A&5VjcROuP^`k?>7ul$Gtc;xDua5j^$O<{Ny0Fz0k$+lzlF2(?1uQ6_B9eME11A(~CFZ z_>|9D9Y>h^4S5@vp`&|YCg>xNSz=Xv1`hY7)P66AJic!V<^lG7XsO2`^+5#h0^=MvV+giwX}7rGXJrXJ#&%GBFnDS=g!5&rq4R3NP< z*3S~$<2$h@2(j*~Z%`p|x53J!HJldB>@z%jgy2e!syY|+9FLrHX(6Ert7kP3QuEpx zR4Y$NF|l_S4*Bad7C}<8@VBBnTPJ2+07)m2VMi>*TI>=9TETqGCuWcbs3F8!@?Cp4 zH1GTIVrce5oxq3NN=JX|kdL*l=Fy7)=#O@%!F?zd>t>`r64R z8x&tcD;JgJ5~vU_Jbn8KLrb`kA{LwExMtl*Cg`7e18&A%qu<7YdYD-&v& z^<)ON3?OO}&TQ;;0_ zi8V$}(`43j4O8D?n-br2{34s=5oV1ZCH-+jjg@CSAx?mBgxetBC}w}zV96uE`v@st zjZW2030)5&9awT+EA@O$_fV$U#x~6Z`J-P}3T&Us@Bz@8%etrK*8T`aiy-bJZiU!4 zXT97)BD>wxXAjv8La~=n6FT=sii0P$RQVzsq0PE7pFG;dcdQ;1sh*hM~5j<^JR~xaOj~mM@c&`%^&@?~}J^3%Z~ir>!c7 z69uO3HI%cXQj= z$aK9F9Pc(i;m~=*RhMsml1BF!^bhaLkg<06*Ps3`g_*wZjr1n}AKblXTvOe)FKkCd zKtYOBm8Nu1dWoQdK5&Y9mJ=Xe;rVH-L zFA57oiv9ea2=28U4gLtmdG36ArFz!m-ngk7i5mj@e4UpC{IJKv^_t8T?l*S$&(#^s zsu;zgWVWu!1DQe+yZW8A3hqn2F)LpKy*n(EjKh*r(mpQJ@ImuaIm6rJUUg-Gf;fqh zp@+!@D$w!LMa^iJzrEr;gJ4J31pmWMBWVfgwr(Nl5(-K0tT>n!j#)qLf=frxa4__I zkt#D=5xf(c+2YqTDErnO%A|R<_0k;Ln9(QEZ zC~8Ws&f|z?m9<&GEL$3L7S~6x02DoC*73?@G@fCr_tP6ge(K^B>B`bmL5S}cHTDpl zfSug^MGgkH4Hb6M!VD*6%;C`bcI^Z5Bn>xH({ibb)1QzQ!Td(gz1FJca7!a7@)Kdd zLYZ3visEOZsDKHJi-TG8fG?sQsN^%ecyZj2dWW+}6np z$oYQhsjI)=>GrFT!ZZugIFgU;y4)}^HX==%23#Z*Zg$H!KGUO1yT0x-u`-@c)7d$M zxK3cfa`Xe1rho$nTp;R$o+5hIy=DQ1ac2r~o1Jr(T>U9CigLetqY9-vM`5Qh*M-vM z?^b3_4yX!z2A*%L4A0UE6q*Jh`#}S=<}g$hP^qI5#t|m&?7uUSOE%4mWMmdUzcQ^o zRj8`z{2_xI0YxtJimBUp*b!Z`QmZ=e6uQQH(PS zBCe+~4^E(O(9Pzm{4$RBm8;qISqBi}f>S}yssD+zwY%N_<_*78;J?9Uy3_Y6M4?25UD(o(gN{lS z$ppU`#*|g-dSQVZ;%&hBGBc zSh|&*2H6eW@5?98ef0fDjb`K%v30YN$q;6*H@-b&5r-JJR}2<3RA%2hEmXRN%q`IRt z5oM6RayL$oG;;P{rq8G-&5`EDVj}?ts5gj7&Vt{z5oZheEYg1bFe*$Sm>$5q#w;y5 z$#`=)oB|K1->=cJ7l3sXw2U$cv_6Ll1HJ!g>*N%hS<<7Odx1t_zUN*S$^gq|(H_Dz zx#5WzGcdrmOg%fCyMKu*1LXnjWfq?1pb3rX2~=x72jHna0Sj;miZs zx4g|I@USpo`DRF}^Z$83bJkR&{~rIW4O%&}rd{t|r1)Ya=;J@3%7)keLNy5+fdm#|K891mQ``!sS>EXwoke8=zHJ*e>d9E7r@VC0D{T;gusZam+g*e$dQnEs)Mg_(WoG7#?6JW@KUg)m zxMBmC=sJ3`TvI>(QVGJl!A*YqblfjwqN`hUzk2gnblXQHcpo2~OA$kp3EA--8M$$J zC*6rv6Ddqe&QO%_&{3s&(bi|O#-K^<$G)$1*;2>T95`oLyJ-x9AFhc7zd^=M)1 zl+E?+(5ZL^+F|?Pb%k5JVNtwv$Z9^YR9dJ4zdqE&<-4q;laCH$B#^8vHaf;x^8~@) z=KUO>H0QaqY^_LrO348w2_c6j_sM3cw5ep7wx42Fyt* zaxF(D)0h(PQHL0&1>4pfV1S)g;sYx^Eq07^=>X@q=a26Mf8u=k?d7%0GIBC#U?|i{ z)_~E&>8dNc;fy_dNAgJMMx6miPHrv7yN~xJW`esb?VFu`ez2oqeLA9@s!T8E9&JBm z$rIKmM@hCmX>&ai_ieJVqWbpCe64e*bIfnyg`J#J`>+I2G{hUrQVBB(eYP zIk)Tn=bsENMs#)&b6*a<-dV6DeX?_vHAQjsZoQLOKq^aVYs8hwDKJS>}F)F+M$exCpnUWoL z$V@Pd8am$;Kog>^VDr^^ymm+Ej+q`z`knUR9}iQG8((p}R14V!wvD+=Mq+5Hav1IG znJEAs|E_lLeV@grty@}EjOMMI1w>ony38L|@jduO*vft(3+zmnVRj9&oqC$-@ib6g4kN-T~Db^t)LV&x4!q=ZN~@W*sr zFF9HtRDqp_>8LOhdP7Pgc2=^jm{T2EPqaOMv1^!MIVst#VT)%BULm3Q;O_ZP=M(iv z(BO8U>H@x%dw*-`M1=;dlaw8qaC;;#nXi7{UL%X!?_gxlsksih`9Y_@@UG?+skJAn zDVfK40ynBm9x9)x$Tuk^t_%7|kq*`ayY>E}pO!$s+DnTEe8`ih>F+AeE}YYgD> zUqj3+`ZWWLQtofa4^L0)B83=S`0+P?rYRM;M5D8Q9C;2rckmM}g`?7A6s~xg^c=2^ zy1>xo35-2&N*|S|5izkmm!h3am~Eo9rp~9&JPry`L7>A;xZYF>9WnR!s{jY^MTu4= zCYYGVX-j(lDUwDT?4;UrVS-4#*?S<6<7=tB$L$p}XGW0}(rXnAqsgM07+&A4?!YLL zx$2qw`h*Z~#d#$ALKn;)@%d>n`RCpOCQVrRIAL9p`eadnCex?$dIT`IS=Kzb#YpE_ z*b6&*Yf`+gWs|o#U-b)ey2z}AgJGr{W^-HlUTz^xkTw!LICwbz~YGGV#Po92kvyAtlI`10BR4@U{6J zAJ6T#8L=y%dM@_c?7gQEULl@|NwurxlY+zE`%%F|0YzE7nRN;p~ z#5iEpOz;|S8h;Ejy6yo1f?wuPSv-w&R{lM+s0y_BvJp|TSA75uUsJFve-I&ZcG`-^ zSFU+12)7!t2chWI^^fJe47bw|go(|@MJ^m~dJWu47WmYh^ic zVGY|HrESX_rSXld{+DJ-sxz+5iY7$?*dI1-hw4c@jmc;<(`TnA^Vv%pT~?7?cf0Hv zXV~2j{NX&*BZx2aqZd||wub;2CA)VBu`w2_oATfXSQxUZe} zy2N7sP{#g3v(DaE40h8@r2pwu>BXTG=LUmc$IBP`PX$D$S)O}tZi{(sa&bVtw=o7@ z#Jlu_KjmvVYP?Zv0jqb>6f^Sk-rw)O^*g#1{d&-Cmn=@D>f&dT-%ftHGkrZYSuz`x^8=7FS`&0^lA`~hs>qz@ z>ao${6H0dd;PF6j$mtX|3d!7p~=(3z`KC-C|BkY9rj^ zfZF+j*hoiw{@40^!_(jKYky&16Toa|u%W-xtU^|{MIYUh91IjR^xwdN;y|9MT4u8$ zJ-*psFg>Ock8L#{T<{>wTOF%JRiitleHV$NkEIdRsMmjv6$s=dkCRZ zHMy;{we#BUj+H+F((ChEI%S6WbaNKbI3N7z73>cT>*BTf{UYYtuP-?8SAkp89=NyU zEK_ZZ4{`n(J2;u?8xn2Nu#*|M3W7C@>L<=FdNF(&$e4kEY{1A)G{eY#n!u3qIA&WI z8v9!F_in{oQah5p~S&Q?mL zdC(aMZM8{};j-lZl_r~KlmJ~MMP|QWkI5(SLqGYGF7BH)- ztGKzUA)a+j#3FhQT!^|(3iTOI(XyxzNZ%dGG| zu@L0VcTxE8;s$azED&lu+-qT|SQxwX`F89q6;Vpd*BE3&yb4=8>3!CEE;2zc8J0Mw zCmD(X^n$M)bQmnq0dnjh=@b4%`bg-{d{<6lhu#Mu&7+YdbSV)^|2(jj2XQpd1n(#P zE@o|b7>IK3mSN|!{%Zr8e{En>%5u={>szL07a`0Y6qkVG>JC9OXW2b|F)xNJDuV5O z?lt+6h)yqjf)nLBbMdA1hY>~61$Exp+m9ULyV-<2bt?$(8d+AD3H7RDN2zq3VbHxZ zlRnnoaQ_SCQIIb?biLgi4w;>g@LXcRYh!HFy+wBDj)0mUYluhk>(Vcw#4#{-K7T)S zoI~Bka-B%%(!L)8-{Akl4ZC-5LsZ0nmYgthd_I&lA#OUG$Txv+@n6xo_vE{W4}Q7% z)g}(^i77cK2g(fs?Anz~4)x5W>ParILr_3Ad80oz3r4t)roa->-3|65`gOc;HZL&m z-LL%Z#|7UkBl{QTBREY2;fKe(u-{odthmi?OmSW4JM5gfMc()}uHHW9!3SBwWE22d zQ!+8IbPqvt)KJ)o43ht5j!{+i^a3oOcT_0^ledr3LIY5aJ$}odw|cLl0Es^GzV-$ z5#(+oHZ;PWOCj39XO?Ku*ly_qexBp6lf6?Mo(w&OD00O8@3<=e?yiPP`mpv`r=;6e zmnxj_JZ|NERrUL5@(N|aJtfzoPe7PXA5U4j=rO51w#v;3=-F_Eet05pe%6KUX@#MS=f8$B*czvd-;b6=_38% zR);iVKAYP-TQySFxQDZ6(-P7ge0~>Fr6=KS)`Z_W_d3EaA0n4T2!#M^eRbxkcUfG0 z%OX12pr8=4yE$42IVs*;1V)&P_hrbvhmT7av89{3z@nfTI%TLgSL!#R4ZvlxP_jGw z97n_MO@J5M{{ub?t94%8VJEe;{EpXGn|2rUZx*N7p-ZbBeo{^pajNAR(vRSzj7f;h z6$LNDKdYD}hqzh9>gqtbrFGkah_bHhOC7A)tM@2*`h|k27q3|`T9#9-#hvm{HAiMJt?vgC5qA3O2 zk84$74GW}~DYgg=b5D+BQ=mP>Fb)28cYxEBhI=&Yoyhb@Jba01BK2P4APiAz; z)m#80W`d|f*kD`i)mxx>0O9tC3L>V2*~xF|zK6jZ*JMWFl4pmbNk|FhGRR|(r?vQ8 zm3fczrs1r<$}i{g+!8Id5ySQuguZ>G99aE(dP}^q3%G@~CvB!WuC%q*5{*88p z;Y>%Bh<*x){DA%(@Kzp`qxx>VxH-~N1&dY<#}fI(c%e9YVzf5&voJo2-L>kaQE zG1spxMe|0!hI9UMZPqS$%sNNQcht``hj;|V^66SF+t}XlC+e`7`EL2kAHW11+4=jy z49bOK=eQOLOF!aT3D>XPIqnY+d9=A}nWSoY`J9c>933*EiuZFaA=`Jy^oYNil_F$r7omc5KG`o@EHnerWe;mb4S zdK0Q431uqv+IVp&ICV5i1i^bXQmXH<$H@Eeg7ueo37aotFWFK053J@FdZN}=VK86p zu)H+is>`gkwD@m#T;?92;oC~kod)E4m0Xy;kJ>j|(X_u9v!sf}2<`ig_E;IO{hLWy z7xL&>t#i&uuqkTJHK5>yBy`LBn8h*vEH^zxnh@Gtpz6C7#5kCMnQ*Q+a-ZTmBbfAI zMBXl1uIvRthnEFPRTY{?$4uS$b^#@0%rh?rd1I`%8ao(Ym}qT2gEr@rFOe%mCrhEFDN5Wgz% z*GU_XaRNyYpfdP+5W z%}=c|O4q3W`sY^mM@M@D4?QIH6JWn)WzjiLRx%a-@l`z<@=oa_81+iCODgW=pZSy* z4r{Q1#4QqJc)=GR_RxXmry+BFKr+v`0eYqJ>7S=&>c>J^f=XZEtG!)FJujWk;?csB zd6kAvR3qf@25vc>SO4HBIg462!u!zi6h|SD$ITlcbE)Us`x_&b$?uHUzo_$>&YK#J zIm5!?h0hLNF-nrv)PW8~Ql^;H=Ap>b_E8VXefS!jOEBe;R|(#BrY!Ze5S03VIjc=3 zd%U1H-nfR1)e+P6d8x_dgw?hqYCzMsrAIbXQ4J}mh!zFIO@lS1yRLk%U@)-{NlB_ZL>L-&-%Fy zIgu+CL{%9Vbt}*L{q?JF=ZjTSlNjpab#qqAt*Y1AU8<<7_0AE|r_4_$T+&Mm1V-bh z#rf1h_FLt!vgRXWy#4FlFETptkGqcLlppu_7MV?%K+RKUES5O{6D zOLFZAI-=$HWZ*s+6KjzmF+qAQsJ6=Nh|2dHJ;sbjnmDyI%kGNyRf%9eg-nyqQE-a) zeO+*O_b3px_(XK(xI~~ftKqCAtJE{%&tc+LxueaN>@X$b(=BEcBnQP|I7ja#ekK$B5=r2v^m zKC>BYry72zEXUUkN>qg`?;NWy7!hx$2oXYj#at_5SKCWC`_;4wF`v>&`-z{rIA#Hy zgxWY*3V$U>P;01Xztd9LU5gt;bw3qV)a`D~5N>rkX%&ak3R<~CUw)K^iM;+==UrlE zGJ`3tdv&+oki#7nNZL$zXrDVjest0fCXjJky}b#Ra8W;ubt;D%N3tOQhL zsk#HaiyShtP8nqF=QQxUHI4DoF|v>HxOXK>>%UzhCzm5U}p-p&?GTwF?YqBlccyuPm@g@iZJ!wtzmqL9?1-nA3zOt3OZXL z(?Mf5j=w-QFV-mn9ky}>?ra2Y%jJg+FxVJKix`VxT{Z! z7+;;5f0gSM8Yetu7C5RoNq?s_VJ1K#kUJ1N?L8q8X4l>LrCI)| zTb$GGt83AgbxgInz1r#F4L;BQx*^6dFX_G8R+k8n=YWcCrx|AZ-p&@qJd56PZj9b3 zGQN!uzdV*;S%_&!?zr9$x-A+_jC=Qp1eTgSR+N6(*K-$@k#?|!KSl#1Z+qT2Fgti8 zH>lPr5f*KxZ2NEVk1(&T&zhXBwK;|2OZ1{TT^^l zSzWY;_V)JDXdHYi4GxiyVi;ZavBgC{(<&xX`tr%g)Z^`nEEcWDzzt3AUAGH1AvFBdwL5Oy%O6CgHQ>&kZRba{1-Fn$s`5 z7Yn#uPbq`!Egq6HOiB0+)%$NA+XG7iXf2v^XY$_y-21p6jH4v5T_9uO_>XF@(<>|| zpks>z)&GfS2-1zHPzratsbu1@X$u7hvUG-1O?(StiIf(c321Hy2OIg>=f(J%jR>&G zKHU($B%~2mkV!mvZ$n;WI3RiYJ>IHEo4M9z=>w1H_v4WYT~HNft>gJ+Ike?TwC*+f-I{54a7OtW#lgRxyT+mwCL&}a` zJ%uOvt%(gF0p`YM2*%uS6vG%XC8+bD$ve|57qU!<7#tK8r~aG#!1e|8_DOb@ZjX(` zJBE4rT~X!9SQ0KiC6i}C1d;CrE0gEzD}xX_Glidj3ZkrwPS@8FI6Z)bl6~TVbM=o0 zkCmQ9MauiNa?eSHv_80-uN|k|N|qS1riGRjHGE

7Y&iprid^2C6Ocd17m!~v>B5aO3`)~A1Li1Hfqt;gsAb(daHYb15>r-t z=mMGdT9zYunbyBG@|}{^j)vp+$Fjh>L4>kpg&Tdfy6~-#n1+uQK0lodB+3J34}u+% zMf;oU%hbm%xW+aqVn6aY8xfC~()BM)Ovc!>EKj@l^?7$^baNy7gupoh4<`r90_IVS zDWrv?uCB3%vD3wl4d3joL1z0wqtTDDoSCpTAhtPqFF19Nzh#A-sac?+D-SS)_Hm_B zwo_LEh@nq7Cr8&JEvu|drIrpOyA34$GO*QE8+}p?thA#LVKe9T zF3FMf3EpF*r8EmSk)@~=wFOEW%LRHTj$wp#H}t<0WS6aSe{N*x2wmMFu- zl=RMImN~po3cQusFO=o~^DHA>rVY>P`*B&19`{x@Co{o%dta%!nN^J+^9@;g{5oKr zVvVzE(R%*E?+FM`%X++-*_r4u)mJOtJ$S4~_in@P2Y;?ueKFV_xL=7?dkBs2 zMQG3u77q6ymp+XbYsR0~p9TA!c}&v*mB}ri^Pil(ks<+tm=7$~&`7T^E`R@dRsc_BU%W2!8$P&U<gMRI222BB!lTq6dC#s4M}QGL(v zhG{cDdKZ&@YotW82IdHvAg-nNyoqnvR&I8FY`=ERENc2h{4UNrh}3^Degw`4OQu<9 zQP=&DU(34em#Jv;?**5wti zjNrSo18194xF1*>is%FkEzQ|g8Gf_KQdyZWkPg6?)8Q*V8fQzS9Jn9QGJe_>mO5>7D_L$IZIFdi+ z#}bhaYCI`urp=$@%Oql0)sC-Uj$3s!WYxelqZ*2nddf|WW=TK!yS@7ho$iahFL^@z zo{o7x{q3-X3!YENv#UsS_WMSOwkwWn-XJ<$f8+P-JS?Yc=*A{dPbPsU#|}x|a#Gqy zE8eE*cVR%HJ2fXuUFq_iZ7ix=GD!O>I!izD*f>}l^nE)n);@1w zy#lS3ua7fAqnjT*%srShQcgs{K5w?HEA8b{OGxj!R1nvfognprzMVA4uzpZh(>`EC z-P80O!L71gIVfbik{2?H=dy}pe!sq?lr1Xu+_NI~sRN0{+{YH8$*tO+@+d0H;uM24 z1>-Be1ie4$xgER;CN3sB^G6ow8L}O+c(U%o6=|hXJ>X{Q1LW`@**{uDeU!@*&e%aq z!$`l3H8m-3-Gq@$(brC3>h#yBwBG@DbL<9uC^q|ZQbd#E`*C%E?HTv=j+h~Ubd`)h zaPXZNtH~JGl&H2&%-qLZy|em^dBwNV(!4r$8Fq)HCwNkOX{X$pcj?T&g)b(Ow%2!Q z3&AI=nfFD~HkLIOi61NA{%1?y6>Q2`?PW83XY>21yF4%Uweu{eV7}88OX9bSwlJ$n z##EWx0g8?W z=I&*eYRhp2l~1q^J~|2G9RSi9Z#^Ai8aUG&A&OH<%t5X9MyJ|1Iv(FKcj|mQ5SCT~8V9b?fC$xpzmCqgv|6+O{}C7K7-rA)Do+{_OK!@`qVhw_u*wVYTYf zHh4~{R9OMT;KtMkZUxxhSVO2VW2;Vrh0kRp<;sxSm0yY6HFk}cq+S54VAk%-AXAQI zDF0#;iuM$2On(uA?=enJBxcsEJjtY)5zGgJO<=p{q)v}1Y_`_J>c94MeyCSaDpj}X8W%m53XUlx^h#{kwAICP zS7Hk9`SCYXxzPlw;?rAgu5NJ%g)jLX&aqMXaHi2Zj&f?s0jm+Z=WW$^?exX!6g`1y zof=a*?`R19^1&-iMxnoJ;v!wucRZo|mzyi8MZ1(ZPA}e4O<{b)!rnbCBu1V^`EguX zvhClm|Mwn;n~M>)#WYl+RT@e*mw6v`NZ7Wnq^4QBdzv-djJ+D&OJcJC&k{dtebyDf z6EJ&E%&ty2{^jJ3rk~q1w3%ShBK)lPHl%9&-EwBtwt#^A`}gs(J3ImVnrU&PW--~}Yk})M7s~4n`gfZFiweA~0(hY-l3dmGqUOFb7g#%zpe^JjwtUBoW;G>M1$p6RxmKQBf{s7w$0dCSg$ z#!QNEB0UUvvTFfDNP?u@)H@LxWHBdTAQsgq8bZ0AG#7C*W5Oh{RO-n^i1>wFtZ4aHhkz-CsT7_eK5HoC5xxe3HN$-#ht%S|4z=`P5O_XP0AtWe$Hl zSzKzW$~AKTj%;O`n)U)+qsMizC)MITwr{S7y|pnyhiS+j->#(Q1yl3`imyAp_N>C; zY8(A_1FuHM?&Q+hvtP|J?c?G`h0RD&U;i?hW-X>j-S%Cy*thK_>sOgV1qvhc$|%)O z!6rU0#A83Sae1wZ*|yp{BoCewzjP5^vhsK5{vNqMbMEe`zVV^0#-_;xn~!TdR@GwZ zn3GDcW!`7a3x5#Pskwjx@6TWC(Odf&Y%v@#`F&2yWvbZm%Yp18?%id!x;V=VKKxEK z3b@Vw^xK6n&+>|S>8iev#zr6q;D9xsd=c!#Ov=}rDQViXOP5kDHsFr?ZSB?cI%&8K zuv|IQP_%*;W|nCEqELwl?w&|!g{d#o=x~e|oF^zyLu#v7dcMmowjhOdOG`-3A_=#e z!mwN9TE@Wt1gXZu@s%@;hYd>vx$Ow1Oxs7AZ;BPxQAS(wlfu}60CBi&jOXG|W6v-`oj=FnX;#>ZhM|R8$*==3 zWRjxG&#O3(=n+kt>kEe$ePeCS=%Oj|E$QVItUo-5#+YS+2z7}qrA_w_Z!=iHnxQmZw28%8wpEJ&b6;$zU>vb) zbNg0xV6Znk;N{t#2SSVoJRt3X)i)uyE`CtJ$rL+A?+2Fv@07;f?4Cg*+e(K-t)fl)y9Vk@EeMvAgK^130sXg zTOFm}OspZPKtKUO%Gw6(+e(rL<=q5@XJR)r;XBuQnE|)12PFi9Absx2D^iihPSRe^ z?Rwz%uH(rHfRP+SGk7*Oi0#!hH8tsV_S@fSKg@3V7`zzOGZH;%$q)s)W5i8lsG3YQ zX3J&QqwFdAwI$-1ki=go3BlM@t!_TIgPR-PTKSBqFKa@Ag%Szzsn3g_ET3Aw8BjL& zrW|aj`*HM#tVV~>Cz*HLaln*7`qGa6xOFJ`-pCf@06kOm(#DcHkeR@P(LNL7SC8Oo zXuqQW^*zRGlIL&$IuK!7p?|AFtt#Ees$qkU(Cl!IE|>_}MSACkuhlG5+7qX1%LUXR z^X`o#3F6N&F*+Uke8rE=HFmGjidl0vL$qCo@`@kVouc9C2&$spGi;(2W1*e4jdt&* z^FOze*i;e+4pU=0I5mmJz67QM4g)29rxye^KM8Yu4X0UoU1`_~;p=MW7&Fib6*H+< zxK*4oezBz@FGHQbZJDwwXpI=8@=`!y;j;_gv>tnJ_Jx)1gl+R^cgkR(|Z;cUEz(;@qam(_flo(~Y*! z$v3BoSv8nTWnT8ZfQmjZn(ESF_PK2A^vdceDMvj2FvL;_`6ZXY2 zf&6-e@>7aQ;@wy8Dm8~R={r#pWZ-Hr&>nv2Y4e+m*?x;{rHP~zqqNq*&m^5+Y0sCu z8ZV}deye8q-8Ugn^Zi*47;nq&K<&Jo@Y{a)PU8Hc7)QY6Qoa>9;EOH>rm;0`ni-HR zCL3Ql1x#!6%Yd}_gFJ=TwI||hdJdO38tvrVv$7e!7^gt+BBO?}m?o>x-CuH3_n746 zYgSAYT=o|QgnV|>!OETJA<|wS|K}`zJ4NF~ExD#`QEsSebyFkd;nOz--X-HesWs;(;*FFYUObr6#^RaA z2aV`cems~}7P4Dn7?h+bq0cCJ-g8!0XdMM51*?G{2sS8!+d74OWhoNJUTVN)cWtV~ zJ02T2pLFU&-I_>KDrfj=a#SiM*?oI2p{qts3|J{jrLt6~v|Wi<5^ke~gTVf!`B8Rt zz4S?y8hot}`zPx<@v|Gys}x`7dp1Ge$z)_a~of{ z>#h<_GO?%MF7-DP%9n#e1J?BNnNtwyH7kctex*@(CO7z*)uQGOFkzYF0&IEBz3~vs z`hN3IuDEoqboHLB`F(?!!c8mPkHptR?~NYsJF$~afsM~%Qx_vqw&EU?LAM}^rZ5wcVR(HzC}e0iukWlY`L;=@$JY&XBl@8#FKzm~%# z{P6CNLqeiGxoc=7d0<(V?H%TiTo*YoDZb^u^}vb|H3bsG_Jf6TO*(Cp+HAs(r%cOI zYFFkM29XcDq?UWC*w9m;z}sKl0br zITBXm%?Q|+mnwTKRh(%g3CQfUJLUGw2F*;`qFKcn0UEHg<)k7e7`n9D-;`XlQWxdp z7udvk#MH#uz=}_3RH>pqL)-FPNM#SoxUCeh+1Eg5=N6j?XlROyLuO_(3<3d1=A(-5 zXOQvRPE~4RWx2ubyrp5pd*xv(A>4*~a<46o>gLyrhOv}szXIFS`#&EsPj34J`UdCF zow|RbbN$T)(?zthSb13cqM4C0D8W5AzToP35@M3bT7|;z{**uljdN7-idqjYSOeSS zYMxyX=>stMv6b-XR^5c?SgIh;kV(w8{EsDkQxT5y+c$^ zJ`gymk6V=uH|gdl`Ji`G^aA1}i#3GLNQN6dW8?8xMnB@%-kdfPA(@m#g2xI`q_lOZ zI3y}5E_Re2R`bS4`FX7EWLn6&uUKh`WfC6EI(Sr}ILVb}%r+iw`^JB~5FpVAuZ)z( zaU^9R1sha=9~YtSpLoTQ!tiyYlfMn|`)t_qzC}B|K=w6Li~~ zJ{Ao-+Z?xDH@@`@BV_IYY__bnJ_%;V%HtI`FOj~`2dMyk>><2VmnL+|EnB}m#Jj}F z<#?)yL7EOK6iYRCd%R>CZfrfu4v*GlBdsUw>g`o1j!6+Ys+zllJY#L!Y~YBXy@lN$ z7oC%19kP0wlOxy`O{>)QzKPYBZF=ZR?P$>6Dfek#(H6j0eCH9!E0sEjCTurrSlp)Hly<{)JPi|Tq^Y`0gB%p+tuXjF>W^{ zq}w=KW|1VF7A;s&#`%P|%pSM)cgF7&^bdTF76JZ=P>73~MQ3oi=u7+dLMnA#)ys=I zsU%!GI`&2h$s+G$<8bRZleD2`gj3tR4i>w*3IQJyJE+HMwZ`|%%@5jRrazbVhW$vd zAlLxBVmaa{0Jifu8b$t)IF8NzUcxmOa@_D3-eqEWZhd7mkxjI1h)KFyUzK_GJ$c)N zMWQ;4lw&1U2X2NB=_vWu8r`=MpPV51Q@Z+iIq!{+wR|stEhobGz$8@k%QFGgqRSjI zCFWz6nFj@~DQztbdoU@nTix_7poX0lcSeDc<@3Mye_OvT9FE*wc}SPVV&VSdaTUh- zv7M$T{#zL`1v8x0m;K#Oh-cvD9!ku#OP+|(uSiG*4E^2YfrwEX*kj~V1ee$2+9p!D z9rEr*u?%ra?N_cdxR!ImCFu9%ay!^9P;U6bR_p_3u>jmp~g)ZAbFw zAh4-gJ--o+vkOqXpBY`V^%R#`F?q2XAB?blETENA3g8^g!u8_W4MPX_27QP2d!Mt~ z%YP2hd#OR{qt9ns>C)}%Ph_p(DE&3lzW^dVUQGc%uGHQWw-t(aVcEaLr*@_h4&eY& z^su0A`oXlthjtDzX9s$y-Q*;u{TKlQE!?)Hg()*^rBrawz3ZJ4+R7#ca`)&Eu(B@e zC`V@US*X(w0+EjCk7qu_r^xIkb33k*0@spcQbLFASA1-jF!(9!<@c4g*3v&$4=`nn zE?}ao-eW?`UQA<8A`R)Yk=|R(taad|a|kAEtfI7q2|NFK3b8Z!UJ#nNu?(ba9()v? zRm0{xtfZASF6&ORE?E#1-tF&o@c9@tZrTv{B7{ z*9E%WZEmX<4z{b&***DQf-}KSZRI&J&H6Z-dNFR>eM{^{cc&m4QcBK^-L6F)x=8*` zSqAlIZ?gK#<(_Sm0XHf6PAjb&U9*y&V_8k=DJ#@4C`zss|G(Nh@2DoCcHM&@ND~zm zkq%N65v59v6zPak1tg##MLH-QLQxTrCQU&IB1M6K^iD(sLT?HJN(&+M7OJdQ=dN|vy5_H}*^_zq?3p#$`+cA1H#2VMeZK^=M29!tY6-p?&iOLQ zo^OHcC{nrWbEI;%xrVVdAuLmm?W5x(hB=N9i`iZ0iWG@Qd(at}ysS-fBAAm}UPX(o zs56*k#E&KNVhL_5F;4MD-KtfX%}24AM7-GM;-k2-@#fWrxT)lUommm^t(I-$?n~Uk zWC(c`*5kvoNi~Gq+DC?3^egNNtDPoSdVGED+RWfxQnlhyU);1B!k!|AdK48n3&>S0 zRr}iaNFFV2R|C2^`;!j%XhRUbE2)%aZH7<1u`h$g<=Kx5r$JweH_9b!_=6rZ#ra18 znf8Fu*UQSE_JaMU;WMKf83`A16P`a!AvZ5|#cLQ`DlhNAg(H=jlN zWO-CE=1Xyjij9NsO3Q%sQSqM9rGvoZ?LyG=vRYZgrWI39rF%Ol`Kr#HYQ62d3Bj3U z{h%z&yBDE{dxM8=paIdFA0n$n^E1?IwT-qX`p~fKQWRCGpNv58?4gVqbW;N|JIE}B zo!ckewf#dAy<1b@q_2j%&b9UKD$mOOlhmsRE+*+2j*~<1=!_%$NS_PROfT8p6cO>3 zy)SVCz&$tcAcoEyh3m;5Y@U%aBFhDnb3h;by+ppna*ob_7+-K-0NaWlOS#<|p2<@A5tIsU z+2xs7F_TCEhwUN`-kqhMd>EsiWr`cEmpeJNp}HRF3QVu5n`hkV>#Z*kWF|!RVbF%B zErQQ{E_iU42L{L)m|@Cg)`Sc?ftTHWO1W1<%6>5Pu1mep`GmpLJ z3ojf^HSXAMLbp$*eyg?Cay1%2zs-iOJcNOHVDCc4<2OFEn|8tVHF{ze>+en}1zNnC z%!rI^#!CTf0lzX44RgKSEgkUD=0};w*;zgMybR>iN_C#8?~)7HU9GcQc7=V<(sN&B z8`AT?T4f|_85AnNe0MVa8&Clxsa*9*N3|77T!7*RT!fmHP~8%Ogt<)KTV{m}-YNK* zv#~veY%xTFopeb^+hL*wZWf8>7_*OC+kt3kS3NqJ}3zqAdiCVjjoxU#Ve%HbNHm>W8wO>OGE&PYuQ6lW( zCm6>zpDT|^5G3^>-_cc1z-9;>n%B604krJVB|Ct}?Wi}Q-C;6YxO{qZc&+DTid=l? zWW@;-(Wb5`cqxj2d^AOlb>d7)2W8ce2dy?{h3~Kr-!VAHTX##4(_x9s7O9~1MoKi^ zWcGa)mSQh>P}SQUW+vvZ zXkJ!XZ^BZFT&v_BUgH)>_DW8U)EY~PzuFFB+&rLg41{CV?@ zvh3DX#F9tEC0=n7(#c~MC7sm8lkGpR9PYB2l#AIvZ=eB5s7=U;jLGT^(imA@RUtRY zbe2OK^<^bz^+MTTPeL19`(9xuN4ctV11(m{6ydIwUCR}LX(Eq4m!RRe5%F#tB~tjU z_wnu0mxA6ahJx1%wCl(+&cnVw8HcRZS`^pkPF{)X0U18Y-aiS{Acb?cNjCRaCAx7{ zxra_~P`9+gVM!#5x&llM4QNc~ma}O*pWkIi8frZ}=dt@x%01K;6?LC84$2CImsMjG%5%cPH}PC z9Wd9(;4U(E!O+I8R-&fI3NPKBWyB%&oF+qJOv^^6-gYIYIFN|RbkUaeXv3Nxc9;(r zpC;uO2zBy;G;exSi7Hc^1F;y$n&LGTNO1AsdW55t%TpWzZKwiKlS(ve6>$@_)(e=O4x{3A=`L^phHFAtVq!!dpT>8m_0;FXl>xf6TpKDU)7 zQ4Sy84s6rMZ11FgRu3@Sdv|#`)rap~Ty2v-kK3!(MwLzb@rdn(^pVA@zDgc7lAVg6 z5NG){{FqgpIT?Erg)_|Q8nz@=xTL2>faP3{WvCrDfb;OZ-Q^rne{}ueqYVz5%2Zq#Ow%grrMkLv+`V6$OTJS?&7X!$ zy^kL={dPw9Ip-|+y66BSFJKW+U$8kHS(P++{a&E9{zbVD%{kYzPpDK7op~yVI(CV& z$4=`Sutqa1Xx6bG2V(wII)j{H$n}#wGcan0f-%uIMoSlCs7&Y zKcf7UK<8c3=44>WFNpd`>m&G;i4kQnD>w;Vc;%2ToV)Vr4#Es|Mho4Z1 zFmuZ!^5o0i@gyVD(*{Y+Rc>l=N|(USv&~e#c~;-aunxlCNC3I>yBW5M-CQyrjCPuc zY2^miI_K7oiYEu!lWEt?n=4)Wj&73crJMvBfNUmcK#qiyMJ++zODv8EUh_=bfNBxJ zvjcNX)6JuEK58{z{NudeBjv=Ejw<`k)U@c2ZH14drC2!|9q$a*l>}_;wKbQw6~|JM z@YYE?1i8n#LZD&&?&>;OYPzK$_-W1XO<$3*UUKS&?Zg389h?*TL^F6{f7(9JRv8Rys zsxI(w+oNT#Bd{ke*TH6&r+D6IqXtq&oS9w>5YRHH;o|h6(Q~V_pTGKayH}m)6ZHF* z!?ib0-(7UiYcIJ6!aF_E@h$;$mTXjdH0rZ`@cxk{<3g^xq@nDnKKtI`4AT{eol?Ks z;?3+7ih^?oPDx?*p$&J5Js{x@&!7?@cL^uYdW0vX4WI5Fd@&8$z-xt)5x?fIUk%}q zr>=cBpphHj?N$q$C#1Y<&;^7WtjkVV%fOoWZO{>D+43>V?H;yAio>)yrOe#T;p1p= zr|dm*^Kblk%z72d@^0T}B%?9M4f(R&a(t&&$41U>Hb(febG|r6S)U$qUe5_1EhLR= zV1qrI^0an^^1Ca033%OKYTPeS>_JsAhO`DY<#(J0W~K4DLXJ2BCNJF#?A_-b7(V;$ zu1{e3l*5+I&1hvkf~9=)^es}rN_uSCU>g6{CD0QyIgl-lC3Re8gocWC_b6A?a1Y}W zPeAbttyO&q<-9eAy}Hbr$MrI{XHW4$aP-2*tN@g#l26T@GDgIja@GIAH?TAVu9>nVUBQQsk@es~>xSyN}6d?twEidHAuHN{f?gCtmUU&92UAT}xW zc!12;He^?Yo2RTSK3&|vcZMwBqk!T|bIp$7*6p;RPYUmpcymWi7}I}E)I3C2c=?dK zv?+_GcA`NMjXR>>+7$iZ$XBPL(@zumGEIPevKou}SNQ6NOk_^+tIEDTT*t5IXPPyp z8ow(!S0ZU;k$L=Xbtj5;05J$Ga^HxBZ8|69=-m{F?7cVy* zj^H#fjXZkHJ{dT4g^&5?0B%~jj3PS0GYH|&)N=Od(xOd;fAS3e`!242HGKf4Z;dM` zYCXhI@wY?&@gn|zKSG};%`_reobw-FIh!1@&~W?8t3QH-TrU*+-GimM?d!jTAXMIr{LzE^*uXcxgV^(aTKc004gSg| zzk^h;F5my72Y*lVe||N?CwPWVvRp_D{xp7xz!_NAh0GbrO?CMW2;-hFh`uYI7ewk6 zKss@tMbU{2WXz-xxq^NB5^H6Gn#!?_ndCXcx6VUFExxj4R3oPWXA3XyE_{IOJ8=vd z9R=v;_I+EL{VWVca#5j4$#@KLQ>2JjYTeYmDciOOKlbn|c>)qj8YfkfjXB>SA>4aK z2<$*M?pYESnIr5%))x z`om5Pr{~C~twEO29=-F#6$26}IB`4eK#=q%GN4%bU z+A+2PbfpyvuxY^MCw6JT!-23QoNJf9oz=fR%J}&|MIaUbI|S0o^)EkROB-Jf(E)6s zP6P+kXcn@R+7$OE-Kdhd{r@1j=zk5RWWC`kFaf}FX>Y%F?z{+$_Txfg2Wv{WiP@*% zuBV1&w+O2?;!Og`bXP@36Z6vn=QDs`rN8yk*J$ z=>e+exic7sx%fZ(37LtQAe?J{{qWbk^1C0y26W#ig)>C{qyyRSp_yU1S6rdVA+~Yj zuWw2sT_XDkdUR??1W@Wq=(xNO0SudTa$g&%&FK%X$kFZJ9@|1t)N(eY58#Bs%i3LN zU=JYcx*7F2BA8^GXwN~XTj=X+lQ)MzpgmLozftBisDqCF^w}Tyz;28Uju`tm0zU^x zHjb{fP|aP{{5Fo0?o82`l(9ClG}P!N__+CIo+MoIk!j1gt`4LrM$`Uch|lsq4>ID|IV zmX&IHb&Vq^*>tWTxz8iV40&H{ES$QXQ?f-#GFbO~$O}l&OUqDZdwjA zGDGIF(`QO>KMFiV1&_71EAjAWjOnZ^a@?l?n9NVsVjr3{jw4cMG#Gf80m-&u@zo?} zJ~%}C+%1)cGVTHj(B^kW6kdcq2fQceD(w*0J2{I3Qwb%r#^&_6?Oh?&k#uO{BPKy%3K zt_Sbu+a;2W?6eP#y;?7cd$y(~8HxxKI#e$>9;neLu5GHBgwqO4`~tYT0mXmPl&y6e zm4Z%cbBIY)dAF!HK{YUO;-}yiu(fuFv9Qox)HWHP)Ov8L`00m(s#zL9t)%P9!UTO1 zj+Nsb?W?uKUO31y<_t*NDD{RtSv@eZnm|fM0{=&OayQ2=hFvrI)uk9NNFq<3Y$tU3 z+n$}3PhB3;$2NL^ZWteyS;oJ|*DmF$sNPY_$}Mjf&8!;8>$xdI%bVv<=kACgIFeS> zdEFihSsu#UrIz~#S%Km+uOPl^e6GP7E*(YFH1t(6 zq?e_ssA%1FG*nHZdOS9Z%g5pr?lX&Px`$~?ZNW;`?LV(x2@z^OJcSrTMw^JK^C2Bc z6tWeQp6^$xAy$EA_fN0voGy9OXmn#GI?2H#oRAMJh?!@FP4V;KrK-9>>Pj+dFL?lH zL2vR3-bo?yO{{eA{PN!e!wI}|8E+U$c8-itC-M!iXmbB*`gx(yEmEY9(N0S_4F}W$ z*B;t*m1s4B%LX}~)0&=ve$n8CRJVyAelSdxgoOpzle8fDTWbd)dQMi$md63xeK#=u zkf5BqGhdGC$+k#lW`)ZXX*JwG?>fz^ladv>A8XkYtHmFPGZty9pni(3yU?sGw3Kys znJi7{`9;-)Cj`8CgJvJS&>1M)iCg{bv{=c~VB#FJE5#%Iuc90RNtLEGWECHEO~dZ} zvsb!?L-W$~+#w228u+Zm|9<~F4*$3Zv^!1=nQ@YxS;(IW=FZ%+O`ywZfP)wXZz$-gIWeKLGp|l#F{eoyn zkxe>KyrJhYea~>a^@yD@N82-sf(5RS6zZ;6y?9lcak8iZjwlsh4|}i`lCXUg^F&8C z<{!q+h{hun!=^DsPz=814M2Pe#u*jlPL(lBtu-6fr~X>{Mj8}r=zHC2IGHt8*?_Yx SQ^|x1_~=}{rctV98}TnaA>s`H diff --git a/modules/functions/images/astream-name-function.png b/modules/functions/images/astream-name-function.png deleted file mode 100644 index de6ce75078f12e1842b09d4b8a64510f5037b15c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191289 zcmeFZbx>T-wlE4I!3lvRxCM82n-Cm=yAE!_-NHafa0~7PcLpbT(BLGvySvN4%)Ci{ z=iYPPdw+jbU){R9s%3XC>D{_|_39n2sw|6xNrH)lgoGn6C#8;r^i&QB33&${6_H}1 z)q0AAge_((DXA(iDM_X3>SSeWZ;6B?7oMbprmHbXkZqv;rXJ~u`a7pjayV3Up9y?r zUnIpnMW^e3t6GyEiCJaDY9gs4{i-5RSG9L6Z|=cNLRyay%X3=^bFT&Lf9k)w^sovV zd)ysqb{j_e7Ldt8u$xPQv=xa-=kf+Qii@cfdqN`+2|KP!?(OacW^YAmDms$G*`t@A z7rC!w>ju>%#2OCbQ|kB@h=zoZ;)2>4n1XwbjC97Ft*efXq}HFI!v1QQ)Bdf&lb4^p zgRrfcoRhGv8P6!1Ro;=2Ztx=wlo?jhVj(ps##z5Qul*LHPuZ(X-J$w4P#DE*_3<&> zKWy?%W01I6m?dN+iqgFnR+Pq7Ft}}nW7=o9CG-3hLD=PY4fwe0qtozs!t?&>PfC0S z_#_M&JQa(hOX2I>6__qyMjB=kGqx}Q`n@YCOwF#5msf2)mgE9+uG;D?p&5g?04JH5 zWLU7Yj~bqWIE@C;NDxug3-^fXxCEpcie9Xz&m_(ja+Ko3U50dRB#ShyIW^#F+6?6oXf9MdUVeC)t86{<0`bt+tA#qE44 z$=~rm%m>incv)DaxH}nW85Qu=%itrgkY{P=bTs5q1FDo)w5WI};kmsgd2Eh>4;w4q zPema;J5f9?<6S=fw+y0h-0>;!tMFRTo9NLMX#tkR7%krds%r^|0W(jUKBYT)Bb}g3 z=W_hiLO+L41eGA2~ z&a6qjppSU7s_b2?cd(bX_TZCZ{bGt@j);zTU9aXvNU9kkiWNTV&40lrc%()rBEuVZ zdD=5SIR6Z3{#N=N;`@>X?nu>gyxQChLRy>T=Hzs~6Cs>=^1~SS?v4^NHqW_UEcq<3 zF4S9H{_Ce6OSC8ciX}Y^N|Zz>ZYC(Zo7hW10%vFvRM=9%Pvf5S_Z-!&3#SAQnh2+& zC`btDVrmC@n9$5U@eEuxp|p7_`vb$7#1JXv2cI)qRkq{VldB-FHJ(pYw4XzM;eG6V zS|fFYXZ<<+j#@(QDSl`H)xI17^}B)rcMEp)7*^StHyK|^EI3@zg@Q6Ag})jMpcJ6_ zMEk$v(tJHF6RpbPPCF!}XCs&%7$aHtOWuY{7}qGON}~L?kqwIPllDMk$<|+lHUL!4 z*Y62=`p7ux`}^~1G+AFJnDEqaS3D{2Kd83y&H2loQF>JVJ28sN5O%}nhA?lAW z{u1~Z+~c)|<4qdy3>0{~zKYKK=}lMmn)KR>{uj0A2^fW+F}wM@CAyjJSUp~@;Dt*W zd&$V{6QKNIiyRbMVeez^eG z;&m;?d>Yw%WxB`#x-HBLj>1o_zmgsqBAB9CPhXArqRU6M8_fPGWzNC z14*TCJF2^?v#N(B#U);)PMVsUBbuUGW?G+_>$GM{j?{$8FWzqFmnD~FF&pqHX_d9; zdbA$6OdFIr+3=>n9?eNsU@2fLn*OCcaWW}h@_U+WTF}nFLC-G94#zHK+PF+(ifvl& zU~@Whnq}&?9H@CZ{mn+#wwmud2@fAL-*elgUwg9!A7Un=W=3WW3z{`9Gk18{;**oK z;|PEsvS$b?6ZB*Eh?XGA0q4ml+aSbV`(&lAOyY4yFYdbxUa zV2-g@&c1$TuRsl4Q&rRH5_7JwY2GhJ@BR|_GIvlRfgoWQn;bRr>rdSt8}q9)lJt;t z1tozD&(r|^I(|i77OrxER%>NG>vZdMFs~EeX&q-xSbeIa+6R}#c(cL!kw!xYpZ<&X zqz0|pY5#JWa_br28L~sOL;b^6eqK^QhCKf?zm7wAxwt*HYQI{`1h~1n z4Y@5GxLYUAlvJzH<)_QGdp5f52ky83L}oiaNwulY_!pAhWxuU1YU zm$!zt_O_3;|Lp0eSAlQPY1PS{6$f{=k+-?Ed-(!L z9mMoGeGm6!#jV5*b4JCDI{}wTiWcwT>4}akg)MN@C=$=MKMfa*h%d zRmLgi7@@J3(KYyP=k0&jau$l`i5DNXBgf0l>MFgp%s9-brfJR_wj%`&>mW2I=V97$ zX653iZ{)s_Un=>&?_#~NfBtgAtG`nbT~0UNnc+9RTKZgiL3U!YX2O-Y5T}oi>ul;* zbE~N4II}qF_qGajh4h7vipP|syq?o@C%jGd6ZMCi6+e}Ty&T)R?%K{}8A?>vl;?7k zl;dFQ=MFGc!pHq>2aX~FX4 z^w;v;bc>jApIn|PeOWk@?J%;Vfl5QZ4K$V1?)7XH3_cXwDB~&F=GX~%tWOp9b@g>B z^%S2MH7E;YiCaU0i7SXRtf_f;tQyC-bNHOJZ;#^UMG!N^*4TY}Z>fdP;9~QjTgEQ& zXolG7Z;m&eQ^{pX3JOjmx7nR8$Q^ILe>2Y=?ry;9OgbMPOA$%ZNd)Qj8o0w|)jF&0 zJxpA7He%>b6!}@{*k7}?cZ@jA$84t$N2UPu@tX5Y>C7$XhnmXiD};5{^=n-CJR00R zX4Av?ls>S{up2#C8r`&fNJ37!)(X+WDqjKbB6?UCNOD;wKYE)K;DGPg(kx`*CfT6n z(MPb6oX4ipNbewaNqX6o?tr>D)bw$gePN}6#!=QFT2^UPxhG4}?zg_J!+2G_QHm$p ziDQ{t$)X|H0N8fS@LR8RgbuU>I!7r)P-NOsmpWIi4#*k zj7O>;>bx$ydSXJGD7nPceKdFX;?1YbFJo}(Uo~A(5>lRuef8K-JN!H&!tgV*ZGm8M z#)bKDYJRe-SS8yu%U0;n?Pfp->=ru4GcI84-1+O*$xOhRSJNu4=XWn&!>jLe?t_== zZo7M9<|$D2obUMF+gDm+(^#{4RUXDFZ2^}u3(-{>j~U~R+snQlt$R1SB6X+uC&|l` z-*sG8&jPL~8$nZE&0gdmU)+6znm+c3#CpdXi?Vw^7W%EcTu6v0rdRopEd&smc)8@Z ze?Pao%+bpsewz#{y|*@8M9d`&02w zj)!k>)1R_CKY4QE0b)?md#wH8bZ{duqw@=>RU{6;NwuT!{Q`)L&Ckp8GH`Yg`CB2< z+t3G|1KmEDies4BIJ4{;z_gD-&G7_jstbNQXME@7h7u@duzrJeP+pAuLK20l>*Y6g zc1Z_kF#W2|P!#$ta)w!l)s}T2$UH)97uN^wkIJp3b9Q+T<@;t=i+&Oaea zdAkSIlLNb{g_D^jySIb$A38{)-ol8egQdGEmA8Yv zqnog|81-KWVMP2-G6yx)Ul8{XV$`}ys#KCru9j5%?40bJ)Z&;_R8*p_7FNRQQZoNS zN4$wq+qkw%yHGfXR2a@kZxi*bfJRH=?MoK&{NHj;jU{qY>F9C=OQ-Nm z#7gdF<+*xlEPl^$=Z1QceKV4|T*p&)Iwrs)!WW$=6VF(jM-gGmSdw6^*gbpjACa~UBN2^ABthkQ8f?h*>+>O+o~;EPc~f+wk_B6pqwdVHqY!1faLy0E)C=6dX8oGoA@=X_!iI(FZG>f#9mP3_3hjskJe*~7p{WChbgt4%-TtiZ4S6mG(_H$Xxp&Y5VAM4HA=zA;Bcd0n>;cf zNu8YvGYZK~qTND#9vAnPYrO3NFE~li*SM=Y1J%d5!_~9OqNYv^5V;+xW+Kh%9~M+k zXtX{l@T|}Md8yA=Xonv|PxpYki_htXzMhWfz#jMic+%uHIc!3VGX`sOAP~0s6=!y* z@LPOY`D3(fcYx3Zi7jpukxi-N7n1%D_U!nUQR1&m`Z3%Rs~%Ex6%Wp5IjO+exuVAu%80Dl3+P-iDh!U0@Mr3ah0A!|_c{;xOx3M=eWG)kbpG-sM`X_P#dlE;b zWahFfttqevAj|XT(EFFn(xwlW#Q+dR{!0qGECuwXz*p+IP8L#+t-ABFGs@ z-S(83WnKodU}{@bI#lu5G$yDS(G^dxRY)@hp4sxZLvci6G1ALaNFJeB^Bc9Z<(MkylRKhsEWaiUl%T1-2m)GU-D`tl>Y;}a+nkPu6yQiwff@yFHMg! z{19SPD_mbNhyoMC01WCG;*rppE>$41B1#q8YlrzT(%QGfa9GBlDrprno2HtY+$r@!~-Ue=_?kYr(EBr3^%^ph%?d z$<5V6pcCk5-xU<3OgDq+#0s;(&n)=UQJTt7^;xz|_?TuHv{{<0P$4Vu{^b6**EfXu zW({9z@Z`Pa|8`|9oO4g{K?M>--xAr$_5vI&SJPr!RLFP>HQCTNV-DgTgIg zgoJ4JM{2o)>+y|WhdJ7)l{8w?gX_p?-`E51owWk+Xs;pGE_>H1EWtBh%kp%+hv+M5 z`pG1wREaF1WCL^A95JM(3N_~W4R0ioQ7x@n;S_LVxbMRuROJ+OPIR%#-^0-NR)c~C zde8It!4zEwLsQkN5deC)L`-A<;hn~=b9@d@zo^?7zr39tz|XkLm%BU9$=~jlHKUO! z`h6rMFwl!k2vwv15=FpySz>lOzNdl?jO|1%n(bVH(Tkn=!4n>0R^Z8F_0G*`Y!L(3 zyDH)RHrIcLphVvuVt_mzkFTB!Wd0o}zpQunQ0hD38-)Gd7AD?LL7;nlQmAwSs3{RB zuv4BXcW;_+E%2$S&FWj))Nti133S$)24+Rgc>JR&Y~BR^9ahv2CgGJ@dU^4QCdCM# zdM;}&T@*$8$|3xuf~O*UD5C|@LXll0x@I4=l1pgm=1Pfe=p9D%uxEbY8ai=gyNAX!MVwuZ&-KwQX${tQ(@kfdTc zQ>~kYoI$Y!|A58XuL-+|BQoNNHLxWPH?d%SeLA&>Y)HKaiAC^x)aPuKMFV4B-{8Rh z7xn+zY8r(NQP2iFkwQiRAjoG;2<^r7gz@Xnj#{ zPssA2a9A`g7f#M8N3E|usI${Dvf8=Tpq9+V>hX>a2U?CvK>d10y^_yBs6~r71@jxT z?9_6n3QC{@y8!NGB3;$u2Pm^ zMQ3=VQL<6bhPrz;1wZMl=S6Q|bV&>HsE0g6?r0E-LBVemgWItjHW4}ix%1v zJ~%vux%t1SqJSHkHylLG=ICbh<4wi)leNPT668b9-Qzyg=@i8GWRLx?XjBjQCA)if z$s?}x^Dh|mele%>uQxHwOPZM1x;LH!h~14HqbhCjBFrrHgW`n`h@J!mAse>ANtE`7 z${kgH<^+)MIg}8EG}@Ve;p$Wn0&A9%y(5RbDCJb&wwI2GwP<<~ppgsWrTCIS8ExBXU(q+R)J_9zJg=>i7V8 za)m$^yCUw^wf8s_U&9K3>Y?~+5$UBP?1CD>vb29ler%f{`ghz@H@o-7%vKKArBK5rZDceFEQhG(o>w+5lhKC zCtetV>aS~JWJ(@!GqL^WYAH(SfXbF|JjS-Rk*QvVFUrhv{x%l9*XHU@;2M~|U=yK6`pm)-ksM`~ zH?_IC3B2xXhbh?@)=a+-tgjrd6P%>>FDjt6)7`X?G5>*zpyv(`dmANl3ipN2K6Eb8 zoAscJMbz++pa`#JddRq_9UTAJkHdT)CdJ=)V&}@R2Tm}+c18iO`^OHw zmp^Pl{L}djdPC%*QbaE}Vy!JQnLONeGM}gpjYUN94pzhjsf&zM%pngutVE3(rjgVq z9jApyh=1sy8fc(X2PhlV4=uyLed>#o3Lw&|8;fFU)~_F;Ny}%xD5Q0@$|9CzJye%q z(UC%v(b^(ki_)|17ZhwN{G?qK_B^U=K;#E80>{PqHdb}6Lt(;i8^Vd-Rua)>RrVZ# ztHE7wlO)S6tF@&lzcnJv6EbHEU$iL|{R843PAh~!ebe}}Gdg*QrYo{+AVn^o=Wv9` z%T${5U{H$K591i>C97uhl+N3g_NSPV zGm#EI>bIXecg&!rvkk4)7)3mL`w`;fkK1M!F)7 z%@s8_ZmEPFlhxrrt-i5VCXn0Ri~4dwH(&cJTl5rX!>h|biU`EsvK{(`qFc|}EEG8) z-q@u6tNx5WH#yrMJ;g0(8pauHL2+OOTj$`L_)x}E)2QtqovNI&dD-sw@r;{=mS}rp zYna#exghycoSC5WyKkzr>@TJo1lQX}^p#b<-RZozpdu8)ZL!E_YtkDU-mY&mT>6%% zZe!%zMOYx=p7Y5iEdamV&N3P)z>^I7Jf@9F(`VcD|L;EY%4pVc>7nO^(b`-;^h zjN9m3|9hBr$JoY>w$i+fs4oGhR9clco1qj7(AveVyvUxHLJW&2@4ZeN0efB&xbAzi zmIgmbZ1yv3wIUW{EW+PIvwBNQWlW^evg1!e7$;wYzeL(>AF?_+PA5k9=UXF7ChkYf zc1zb^cn}CQ*$v5T{;msrGvwa)VVzq49#K4l|1IACxZ1laL!l*`&Q*VdOc|*uK38ut z;C9=|YZNqocOdtf!XgAcevAySES{q5$m~;h%7~mX@&1oqg2{QkL8M5Wih&>KNG(C( zuR=%ksoagL38-ZDiYC%Oux7;wI@2V`#>DnsAJ(JasxY`Z3K9xs5v$*F+yWhQa58L5 z-mymG{4|-&sH!FS)k_jW0jH<$iJ1GNT}4a{2rVT-w%l~1>gJi5bH;8&s0%rHDWJEq z_t4Q*B7D-`XYldFzv^9tDi@*LrHJkXbYsUCVU<&SGK-AxXVUX{w4F6y#j_v6)U&dg zdyf~E-ACMGauE9Xs)oDpXek`?{Ywj@Nb_M!RxfPe8OIBHB!+vylN|Uo$D)m?Hg#R} z1Tro2C%D8e<=AAMpm|C~&JwXjg$j)Ym!zgU9HPM=(wjfKc?!4`6Cb;R6z8I!pZQL5 zqR44pA!a>FV>j7<^}TWDZWTOIXkTjSht=>e zz2J1pTXJmb=QhbUUMs{sz>n8j`?sB)A`aDEST8UXZ^UN@taoZ-?oT`9fK)Ka(-hXqNmf zXV`O0OQq!e0%JJq^LAL0@4J{pJmx9Z-zRPVRU~yVh#=G$t|0bCb_o5oU9ydiafjKa zg0(CE*vH^KdTZ>>oU6XKA<<4-qdKn{w6uuctQFTr7lvb;3LMCA2_`ON;S@PHjmd=+ z)V-V0_1Jf(?#Si=z(v|%&39L)Ljy@zrQzibCPJ(~uARQGhwKNTQ6PCTSGM2i@4Mx| zGcBFQCJmK~gP#ivX8D~6{dixvE56&jUyz`(F+VcYDU{$gO>IP$f>FkixnN46OIsrM zlIvjtKn)t$!n_7Q$^3SLyy6C z!g#*FGz(@yA)yk-=cnVHu*cb%HKiV6{`fRVM&NJ%kxW}9UwF?Mr+qv89&id8!j5<5 z@dkaq$o?vmamFzjttV6}s~T?~fko$&JGGJf%LN~0ok(F6w!Ir>W2?q|Z;3AtGv^A` zo6&dJzd8@L*B-zq9^%e9bRA59f)0<^xMk4W(Xqt6LXg+O0;6{7HzHVy9w@)Bg73m; zV&n`Q?^`fwKJEN8&AC0v7!%#ZZUDDkDD0O5q3Nd9`>Vq<>hxKb=fKV-v`2U@oDzQb z(>6h;9dmK)8^wBJ<3dr}-37M%Huvo+JkWhYo97{V)*#lAHuj8~V!Cl0uQNn)CDtmGc46ur+o|x1QM%rv~S(f=)r^ zM?`NXY-oV?U-F|h*-+e6ukLQ|#y4(@r@-owm_L1G%aVhH7=59K*Wg(IKVh-`n*vAl z_cgECQIxQxWht2ZJxwFclm{t`=YS$C1>OoLQwtQe=b$v z-rGf5$fu)6V(Fqi`S}fh2--9)>K? z`n~PEHS33BO7?@~)unjj$9Tfx2Rye@2k^ZArTZ3u+*XhbWy%8u^_%SC^-nj$^JbPJ zG>UjVc_y**aFzEe{@pJXp|hy;I!riHGC0K(iolBr_caMLJ3P?XENDtiwlLOzi_`Gd zUElG`_QbPY;J4XVP6yJ2#)&t5RGS}fp(+a>z|H$gPQD4I7w6;m5a_!FgxnSW11@j? zYFqU!g+dk`JZ|dBi0x|0<4&V>URVw^WA4PHtnlTm9C2D$r>S+cz0~qsb*5|?;o@o zJxnB{xcS~*zb(PWw#W?JnZiX1j^%mZ%g;6`A~j< zO?X^=Jj|F>1VSdRWV50ZCT>&Sf!42F#IVN)Yiu%Qzb8|oHmmiGGNj>?uu;FI%>-+qP z+|Z9wr^l|tgGht-!4DkYeJ*zjeRPc*&blMLpEW8r4=Jb^0bk_3N*kP$3JMy$gr*` zjI{wbuy(MW-~Y_}O27QmE8U=BSM=rJr)|a>?3F3pEaSMscZlJW)IYyeGOOXLzN!vN@ z$p?Nv(%^J%Z$@@y9{Jrm4F4|jyA zzQ4Uc$V+1|Aov^xN=xFUJ7%CymL{=p7%D)ckb2N9!5(^gccd%)2B&bUjOrQx59^<` ztP`pVm6+-#DE^+T!_@zq@lTatYVp6t$L^mX!;UUn$@HLDSv;zgZ}RVpjAP3l6mFQ= z6oI6uGreRYU=woZM;#ir>Kmv?;5(yBr+L1hY6*A?dXhYy=}cl3L&b(@iI26YHymk? z*@WYaek5w)mVLWs;iJKzdX`>~@eDL7%z&HKM?O>ljE^mX@T1jhh_Rkou$bHyMCU7V zJUE1yc0NgJ4FKCj+drxsSJnZ3^k`W}wSOBqGQ3f!*0EG`=(m!P9B`3+x@7d{+HdQ?!jOUjt}5!z!8&t6C=p8FDhmAQ$udDV>i({$ujv zK4WeZ%mZ}~6n+K8faB7)5uvW2V^*zcg5n{OlkYU`TYVhLw@ZGwuFC6=aPi}&)qw1E zb4s{3WW*XKt@!b1lOkj6Cw^41=slD3O9fQF!{eqxjq3Yjq2271fa`K#VJPS3njYv< zpoQ#!+zI5T@6a$U1MS=-Kb7lj-zJzVnlyl~SK40AcFgz>bG3SJlCGx0oKM>$<{g@r zCl%p0g(skKvD^0m=%C7Vt=GqK_Wf`bebJ8>12mJk0e6zD2|n*2FwmoHOcjOOkH-Lh7RO12g-UJ^w4v| z5R9+lgJ~A#e%?n|O!LCL8DCH z*W})$wI2+zOc2Hh@f&$9d+ZmV-Ov3LrHA5-ZEth<>BS3jV9wjgD!|WXnu-wT0Blf# zUC^*oKt7DJZqIzejq8rlHk8~`&cLam!FYC8{I>ZD417p8n=y2&bYBa#O#b}~9xY&) z6C-wV=l%wD-tqp}X&PRq2ADN8kFH0wW>H}>MI&6~w2cP}HCV~BRD?ckFclZ%z#n%@ z+;Ze~j9e@s(_m0mHe||j;&KKEXg`IX_NeuB_=ZYT4YT6yZ zWKTg+oRYH4E|H>=hI?TiQia~rX!&(x-@$qNFmqOgrNL-jSxqrmSYSWh)1P|QzEH{3 zEj6$kz;**Oz;?Eyq21dSyZh}IO zwYz8Swbdy%JosnF>rzq#ebQdTYlX_Oy_Z06s4rXVX^X*v!>tiip?9`J*NlcEvl}5- zGyllZxlghAxHFlf48Kx=7Yw7*VvF%l5A_P8?NOXKnDsQ^w)Jdq$`AD%=)L}Bl8f;}K4JU7 z$Fua){>Y1&Mf?0<_M(J~;g10m3E7F_kl(RII&B-TfAJ8`MG)$#lfyyXfny9V$MFPy zOPdqYghrXkx_0uJn?|-hI06%07&YxLGdxaO$Hjy3;V8i`{&1T-CbI9!M4lV=8H~Jo zmx^37sVuUuSUY;a2oqTGHvfo`47o-2*W0c1c1h`FdBMyvce~^kdmtXdQDXmvqm&bt zVGejj{42hG-zuXJtHUjzA3K4uvL8W&ys`eyc2!n;iiSgx>x{ZNJ$r#sS`SyHk4`laHh; zi=OvhnX-a!=?J0UE zUWIQM+LPQ<8DqwZUQn85DMYfi$U#Ut)Xh0QC7V)?Q2hqaA%Xqk?y&J$ZsUTv23$sd zrvsHwgvNb57rZwKiw~3lCx>>Pa7-Kq@XyFqR~4t&dSA3)0!d72&{+t!Qz{YRq?=DFJk@4g%S2)2cBla$wz2?gjG~**=2@F zBjN40OOZ;t0?J-XF2yUEUhRijwmI#$ecuMZ?&rij(z;(xY^0{SyfHq?3A>EhC+xg? zX6!4_hnju+PV9@D?|Xf$I_%^h{mlT#`0ym#J)PmneaFL5#!67_CNxEG^{PDM3IaF_ z!reiR_wP@usOdkDA5-HFc=a$cP;8ZEAGk#lMhA;pG>iS{-vUW5XH;$rK(6>c;pPD( zJ?HW|$+q3i@;tvo3vtX^KpN~nfs^?w`!;ClxV3WX0Ns=p3{mCQWH&&AeT1fg7J9lx z=lA=U6OKevn@~bH)_UDAx5nm4>xnV|cCKQQfyRe@2bWul9p!xSY7&DXGgbU57n;i* zwFGZCyFXl|fqQlOrLlW`dIludr~7z+R5y{QJJGO;21q@5T+Z6J20Zw*z=W~)a$#(Z zbDNWjup7F!%EhAsAP3*RVa~absE5-|pzwV`Lei>9FyVm-#@p<%u5Z6i$P%9#9}Kk| zR%V>QH&ONh@XOHDEO+p$U|}(atbiS2+pLD!F`wee%BGc&mPh|<@bjnW@bPZ@bh_;N zrx);n#hh0c{Q_n=nfGkxLxl-jcC>xs)KJ`EBh>}yVHQH|f-r#vT$wKP+3tSzL#10$ z{DFV{B#M9ZuKIa4>B!vWYJ`{O`7X0HMKbV{m_X`D=bt@fMshAruYo+m=I>OLc8t>* zH`3RUvmNepbqg>JEa(^ypec29+{>nH<2CXbt*jpU6*7WU^Y!f)MJv4%@M*Z!DqbCb zRohOZd*3vXCbB1HgQUr(ynUmMwG#2j0BLPMrpFRfs*r1o|BP4HV@k}6IwWl%CJOCM z%8d(L-LB2&ps4H@WY*%<5R`fgf|x=%jKt3ll#H_i5Yojuqh_fW#VDVkWsNyBcSkmJT49Wi?qRH58cgo4WUL7+oIMOlU%aLwc+ zvCNxu=q|h!C+UD1-Vb6v4x*zvo%bM|E1r;?3zdM`fds9@dhbq~cb8~`UvQgCO_+v~ z7iCzw{+<#zm!=?JlSspd-)>-0Ltay$tN1N&?q$V2#Jo8TNXN_(3P+boN+~vmj zJ3w11C)Oz+N+7Z4l;Ks7o%QeLv5J)aI(oF@n+TQC75GjOx|89UeA4!Cdti+iUh=2@ zyRGSZDwA__*Gk?P@G1iMR55^!{Nanad$mLr5Vhu}D=Go(zs=$cjrAMZoS21O13mar zpa}IDaP>1X{@Uto(5-oM#3+@TUk8kDwii3Tl`Ht^ES$?Q13OOc`!-}-+Sod7>kiy{ zBW$~P+$djO*%2~^s_!waRmU>?^$W6|ZC{dqo&LSTaO0vQOB3s8k4;`9$r+i4u~iy_ zd2`Z;S?UZjdzM5zG{@~mXU%V#88&MYxW$*@v~zr#7s);`Pwk4&9c*#C%=z}y#1;%3 za+x$wB#a))4Thgb+m_Edq@6tUd^`ZTCA!fjzX%sO2hAFF&PIElCU&u99`frFxDDi@ z6@RHtD_a_-gzm}Ol8%U`3q(VmUv#2yeW!XD;2d<#>8bBfF%_EU(U=c@ir#GX%Jm0w zs)Q@GRovS-=N=q?{_wjL$ZdQ|8!hx?Y_$}=3x>B{&5wVihrULY?}fAJiqqA7s%k$W zx#m!G9P6PUjAS+Q09wVht=$t*4bH*~Iw34ZGDWvIFsJ6@nX4+V4oQGCD~#?24m%}c zoI+epE#EDBu4M^LxZ_|liLBi~MQ7ZC=ska+9JH8=3$BmFxWyWCjK$D?mQBJT*^}ac%J9GrTqsI1iRVgSo{s2xtv9lLyfKR zM%9|;GaZMrE9)4!i5P3jL@glsf2O^UCotKiaF%b`P#~uL>R(7422v~2M>XL5Udw+& zcK;nahF9JyW}t(Hd#{=bMklhoKHLpS11|10+yFf`FPj7USsW)2W2_@KC`zEs)Gu>U z@<0!je2Y$p-DUOGG;p1lwWbTBGOAtNf*_2R=~TIGF3WSFlzDh<=+OAKrG7-CW?Vv! zqo0Dj796s+8f{7cU_$>?L(hySOB?7AeU;=^O&M;~{O+Xn7S~n`dv3|=^kbRv$Lr|{ zy}3Fme$e*ylJh2xZGsa2?=Et^2shs3i$^wNVY=mTCH0)p&g$W!{7-eOD zoD5mP51k8k<>gAasz5jLc&JQ7_joNa{De@Ig+)F(Tdn8 zP)ss=$MYP%nFFJ3KX?s(%EFbdoC7`Db!SQ);0~5TlcU|S0oC3PumG>i;wdv(O%pun zy~E*rC9AQ0>ea&X^Xllfjq0>Go=hAw*2i8xlD*hQ?~kuTFbB z4t#30vkK6teJ0=U9VQm=YXFnXM=jyi^~Ez%HAOK;2Ym`u!7Z$Ir-hlDhcKVrlTZo# z5n44P{xCF_A;)(1;I1{fL-uhKI!VCjJ|JaVKrK~!vx|q0yR8fCuPhv z_dL-X3TlJL&aJ-LH^wG3a?b4#bgCPjX&I5MmCu%JM#C5~@Nzi93!;1ao>haNIEfG_ zFVb;8x-ZH7_SYTIe3Xw%al>(%(*IYNuELp2Uye(EiZjgb&^|;6izAV}^+^55+>F$} z)_*?O%!5_(s{~Oq90-R9Ow=LT=Y zs)uh)&bj#8+XWid@txjC{Spd-i(9dq*s3bK)9_Gi<*u1>W^m@ zi+aR;Qx~@0!nu2PNLTMd4st$qRSB4;VIJmu?AuYj?rihlAq3XgLWe168HTa(4L3tb z&2ZyI-%@W6qqcE-(`*mMXO0J))E&q^zv2*G4BYb!xK*|Vx8LIPp~^Wbje|Ol4$T2t zV~-PQslOXMr{P8)r?tM1gRk#EyNkQU+d8@(%s{Nj=eah$Pl&mswEUp1AAYKjXrqBe^3?=>6xzt?R3 zF_AhvRuPVx&$N<5`Rnw*K@#$I5|HQT7` zkeV^e&N?7BBwJa;zSY(Dl2n_SYMs-L^EOa%^0g1{%RU9tsoznh^#p$whk#0YNM?UF zP3@a<|4Nw<5fcL>_@}Rg9&ExnX;By-AC4YNfkKojzjGM#$?h|enV}y5$xi6*9BFDb zm#wCm-PxF(ieT^i;fdp>&i0;w?CVa|1EcPw0Z3N9LQF&CWl|lz0#d+jc4 z{1uwLsy=+u`M26tz=)ERxy*bN_6>7WR*`08;3uZE!roGMQGN%pvmdyJ*MQeRmuBpT z2u_FQzU2K277iWwMN-DH=f~J=^DFQi#x1-gUp$tWHq;hojZn2dBg_PgSNdOqkWjCb zh4-bd;oUgZXc!&Zz4c5tIn6ha4}5Tum3!s-hL1AP;cNy5bKBHcwOsrSV$ZK-CMug? z1Sqs~1+U@qaMz+EwNG~j+;9Oy5Xw#SycBd;!ir}QNnSqW(tJ{u$+7$T5TnaWUOQs& z>v$O6>)}0EVIwuB7_1PZ&J1BLo!aZU6NLQox+X}vqX`iGLr%^YZZ2_dehNCEr+fYP zvK+$HI3P@F!m~sz#(#__?*IyZ))xyhgO{Vwx+D%gVHKc)tE#G;D4#~@S`Z9u&uLgZ z7Z!;+xA?dtEk%I%Ukt4t9x%F#K_o+li*VT8ogSmQ#SnFV#t`Qrc(0a(MPukIAdM0< z6utj+*-a`U2%nIBwu1_GysfT`PJ9N}FW-n1G~FMwuL82`Dm!ey&WS{va7j-QZe)3` zNc#w721D6BS0#<(p9y6t{|I=#o9$IKrXQC&kDmeVHk28(p!qFelJgY~0R#8=Hc$)q zh3Ol=e!B`-n^N+eR_9muHDCUcf|zdkbA`K!#ee>ZIjC@B<|ub zy>{ARG76|aWS^6y1H#u^3M^TgzogTaLGV8#w!f!e$NJ*&o2zu%@axdTHLP&MK0s1N zEt^0+q^}unw?pCgC|T0eDd5<+U###&}6|Jqlx~^#tAa$3_dKY-xT^#JSV98)n&61R9KFa~g z0DXMfA^f=uANj{_^R5XhhPZ9TEESsJCf}@C!px{K3I>%ST$*rL$3FRs?GV51GEOiF zCtK}6o;)fFuhVzfW{k*l(gcbUh$Uz6Rx6SHCUHAb9Y;W6y9JVn=)%!9n0y)H6XqZ^VP383qC68v&F{98l;gT+CiB8gzeE z>v$J=m=YZZf9>~s;MxtbPs9!7;WAecaKV`cL9b_vl>|OEBr_of&8ffa?HW_eH+zju zkV(JK8Cdh)0(o#-Ze@WAsvwzEHX_Kz(rJh+Gx zzKbySL0Hg>X7wZ>ZYAPjKg|VzBnuhs;n4FvDD(r5Tsox$L^Sb10OqHDdb9-PM3LgR z?KAlF!$Lz=K3#f+jA}Tt(!QT@i2OpGw2Nq>T7OK75p9l7r$J0sAATXfp1|cM6#}Fk z%vTVn9%(?`a0r08X^(cwtlVi`*rxYg^BhLpedx4DVuo#h@g~$Wd&%znliaH}Dq2yK zAx9vI@W`z?QQ}qkh9br8ppJbl{NWTt)&9KhUDaq#L{jJb)2NFrEFMLU=K26NDJy`X z`}(s1ZnQeWY7FN8hrPEBs_Xd{J(CbDSRlA-2=49@+#x}OYk-j8eiB@RdxA@F*8nHM zEx1F1yStvVXOnz?_vX&bt(sRg_1@IH-yfVR_Sv<1b)Vj=d-q!Fvn)B}VyVp?9$s;m z&&RpM(6d&mKgO)u+Q>`lHG&n4>AQM635r`rb5B9xO`PI>+M#RYL(C zkaxQrl}j>gT1Igz8KWe1UOt{wqTR%rC{cwZKr@g8+PnRB>J6&1%~iJaPloS@Dn8~# z8D}I7LEtA3l-cHur9N9^N+Q5#r&<$TyE4NKP9>f2+n7U1BuZI9CvUkq5~`t&%llP( zV0cx<6WE_1qIGgc&`as0k!O`Sr)-qjCmVFJ@=n!mea)S??gnELaeMCF*_Al`)+nvg zF(y($f6WK_oN*c7A}O|f}J3#(d2e}mHM znpO`A?r70%-U}V1tQ2&DyRm+gf%b2~2r{Kx@uk%ZirlDp+Bc#ad}W7P2sLA~nq z`xEigAs^P&<_td!Ip|HxftN?q{jvc{iCc^6A-Cq0y+)K1wr>-aV*L~qV&Rtw_j5`Q z@kk7T_3|0gjFHZJsIlmFokX;!LC~nV?Tz?k<+Hl__X^pFSdn`ajlTk9)}tjK)q+4pHo(9l>s`;vK}KX zlK)}>2wb*Pyo9QDBDHZ&ckMuiSP$gyLJDr9e?`FTG5Hto^^@OzmCP|Tg8oWt$9w_w zgN7OnomJ;+M-4^aEwyE2$TI{7`gG^mn}sLUwX3Ogz4<*=0#*54Q0C8qfFGJOrMc!j zSBg5dycKw6;{j&$r+Yj_mJ0)R9>@Kt2(7$KI{kd`DdVM%iNIULoFI4W+ndfzT-yW; z9Wxq1PX>!{q*(g6>N*}AM3Dn%A<8b?>-I_uJ)zS!dHe|&b7-T-Jo%5@=Dg+S#X3rZvy;#6$q!##6VUt+Kf5N#Sx(5i0Pw?p!5vBAjyDvy zmAGGxvn8yPzWdSy2bwF{BM=;?yn4t+afVg?wCLlt#|-Q7$7K1c9Q0WJK?RDFa#5A~ zNa{5qrelp_(OgR9wSn9Q#3MEY-Z`_(bry$ju^DPz$pCuAw3_u7*5GdgSVvHL%jll) zcWI*jx&##M{WY{lY@cJHAxa(sO2m{Sw*6no4jJYZ*>1|N7w#+Ci86D^RY3&!1ZvMF`xWgLuZ#y2 zJlaWqQEoe97{ZPG2^8|5sPK#0*I-*RN920#H`0qNp{lAWo|Y5P=rO3p>7MD_*KE3V z9H5+e%`~r_!p0SOKUUK@3S~XwR2I0(s55!ZdeLtLcho~O(v86lPhe{>aAMhJVLh)c zPw+7jy&uqNB&x{l&*`^--mfNlCGYi)_3CI#-y2Uxw3~VBuzigSI`@n%SRR3vPE4Fy zE_LbJe#J<)E>Ks#s{DtF5MF~Nx!CPd6hx`Gq$;dS@iFq+(54J<=f(A8Ie#<~hB6RH z@G3dIahL0?W>5$@r`MH^RBzAo=eeayz?p`>KGq}m#u+`-dgPPJH z5m5@DBG4)wPozYd5GCf)vA=igrAu055{xRoU3fRQm+Vo6o!ALee;4e#s^+b7a~9UP zSARKhfRPp>)g9@bC1EI%QTWbn(lO1Rxw6OmKU*;DCxTAH+lLoy#s2A)&T z+)I7LUK)NsR>&e0W0VS9m=S0l0gIDq`?@*aUgLmEBi9)#Fo0K3pf@O$qgU~`l5khx zeA?{jc^c0tc^@LCY_U|?V#X{5=xws~-cG&%!s*SBP|s6PCIZy*=IpAKua~eOUykB- z#E>$c`L;dD*o3QIFB6Qxr_=nl0#;O?aj`B!>P1`?H+Q^_^T-kE?uND>a0IVKZv5vZEzA!i*NqjQ_(oggEx%QC#8WVHW zQI=^tt=SncXifuNhIDTVa^Q18M+7D~(?4Cv#k+KZhLuk@BO}l@e0$C@)@v0Va1Gf# zn!Y>R%RfYYMMN31rkA*?IZ*E2$uvsAar6APU%c=9ivxc7mNOqOu`g;O$4`%ql} z!9Lvf)%N7Z58ztf%h#~WW=(twtX)&!9&zCdOWS>^@y){r7sMt9-btr)|Ux5?L;VDEUXNjgDzqr z{iocYN7ei|tFvI$4upPPJbBZI2LLji3(x}Wz@VZzUN^80M`Po-Y1XHrG;}F=n@Scuze~Yx8Pl9FYthdLt+=oD2^aA z{mu&*?jx&Qa%#;9O1W!y$>UYEP?>XF89wrnK=vkDm9v*(1I_#v@@`>>`1b z_={YKU1qMw5lpkx&vT0G=ng4Buh+^)FIoYSU8#4aeo5UjX$!ZLe9pS+t{I`PpdB{( zm*Apbg<3S>7sv7KyNH}4YNIgCF{pEc<3*{FFvpeQp@t?!pqje?p%|bEahA6-HUg4zi zHatqdy4Kcv_xy~3p3`mLFsC}U3q0_c9Fj9@jL9oJq<;u6|YCX*) z8`uIvcu+v&UG*plBfxFWg|7u3NYI5t^3y-J^RNHaV_{FIMdosJha3BE| zRqC@MWy3-vzs9BOokNTKax?!qFOxJCRqth^JhaMzHF?62Y~;cu4f^Mam;Jwl*xbJ( z*_=&itKPZXYL({vS830nCS3l~_c))?lXU2%D(r|ki2U?+`z3{y?_ef1!E`i1eZR3i(~2mm z_v-Cm65J{nCj!AeI0scj1x;Cq=AGXthsExG29TGHSXK|ki8xw3ze~Rc6G!jz&9Wh+ z2h{2Ufvgj3R%PYif1vbpFPI4B91-&?JfRY~ zR~!0T(Qb2h3^?9$?!cDqd9mrzvD5vKv^ie%r=jEb9V@?+bgbA6E-3@(x}1Bts$Ug7nhiCxxnQxm^ZS ze;SuPLZnKmZKF-A>7$G^091tbvK7njos7|yy~G8^okAnytC5lHoL7u~e5xFf+(s-o zT>xMUTWf5<*U%|8k}&u()VJ`$Xg12b({jdY8a>mgvcpmvJREdd$4Q$-Jbx&-|1izv zq1sJ~kpPCSFSpx1`PPmRkZ(AsbDME=Y5|5ilf|W<>{`*t9v$9GENa=sW9t?t8N{-p znqoUMN=(>;W(?e>s37kGS8)j>3@K{VMa9kHZ<~89N7w< z0+Aedjbxs-8AhHoX`w{>2uOAj%+z>D^>6yh|0fwWmeIp<3LPjsJ>0FPPF}M+{z=P- zE0XTRD=4xYW?k{-upXv-6eA<4N_P}l&_3-nC;wOl1jI9hYPs=#TMY63 zxw>?@V4^=@Fand^eRyV|Tk*w!s_)4Bu~1n629JyU{mkPDoU7)Y3Y4+=$R8p`@Z+R{ z1^79BCb&&cmhhwF^?W+;kdZ{Wum8fqp%HP)atcZcS75pMF#jQi?Cbthw#pEJ*4E>e z{??>K-@Z}LY*NaY>`8sBw3=(B2l(m8a>wX6M9f$0mIyWQGcIWT!UqB^<~aV#$LP_< zp~`X^vn{n2)Z;Q6?R;b8k}Yfom+jkVdiz^d^Tu#y^_a_ktKcg<5{7UDT8(km zuf}mN(ckDevLVc{n2Y-uk#s;*Ki>@p6;V8qA5}FU{E{Ag0pvqUE;~H0pEiw}nql=? zuKsRY8fc;KI#rnw37)BzPiOM8R$|Bbc6RaEu!x!?g-)c{cz3Sb!12=j*pmt}d{YN$ zuh!UnQ`UcY$-#Pq+N%QAS`Oy;M6P;ON0@!_QX04WirJsl$X?H=Lh{d4w*k-tf^{8g z(@V)E*TAuZ#&P3sR5{XiED_dp*oHRR4Ms*e)3j=wF8X7M=hPY`m9&r;O~s_>#%2Th z4&69uXBiG^gslPP(i_3-cDHU-Vl+bEkx%+U#;+MGd!H} zH8j4}V-nvoVL31QexhJjtYxcjrC!)oSmH~K>{ZW=4S)}Ng(3RW)9HE#YDmS>*rDOe zC~U!|h*lt7)c5^+X%BLz;V->fpoQg3tH=JPjlnfr{M@jRXIji(ySExwR>7UYr z?&FDlCAuAIuZc-}bDiM(Vx4G6hnMAKydbksE=Tr*p?D{f)ID*g3`KlEGO1G|o9=Nq zVj~bWezt;Jv}(oIewKumPy*4rW!iY$1PR}~orORF4NVa2R^VdNc0jSG$gN_hn_EOm zI$so_cwhFj8i3fPn!&Y{@VUi-r zmP4xP#NI%~CVpIu_gFXG41r8-P3tx;u8Ln;!+C(dOb-z1+l>(>Y`+n?3g#3c$qRnB z_pmtNWxmO`P>f%z^Y7gN&tf`m;&em+erxW6E%^J+I~Lp>857)S-rT4Hu(OSu8%?WdttdW_=9A$`Gn#&56kFE3 z%}X{ttgL&qqqv|LGGS!4$*i919remLRi~Omd=1raH6eOEgB_8CGjt+Ii=Ebwv)1m+ zUm^|_4h@{4F)MWUn?SVcs?rjqK54*OHlA9fd|;r?l`w;7_4+VGnidu-7=KTDT*<=q zdkV2IHMTr77nANA9*<_qtGD?`QF79wY=u&&Z=e6rvIMpIPJ=}=$AoJE3XvetABVtM_pV+wUabY!5i-ArnFvJ!rF12zgVE zWf)u5aQ?E`=Oez13LRVE{bB^%>?blBPuu#UL(s#l9c5DrLlYi-{=wVZX;S!c(wB*f zqF^+&m?h;S|K{@qSA!mvj?EITR5}IkmxZjvNP$Dv=$r4ICR6q)utP>Rj~uokZv?X> zEqG<@tyxmRFNgx47j{Ftq1zBI7?X10vT1Q4dgSA`gMvBJ&;G%)T=7ZR5h@oKL3q$3 zB(NX7n@sryfBb=*@A>mWp&m}!M5>nu zb;5I9B1KBP1^=*p9N5$E=Y8Cl_g(r4c`2S~9;-`+kcTvY7nGpU>N1(wSYoPG7V;1| zV+5LpV3r~qhLYS?_h0EdI);k>Cz4M?H$~Rsz_ZY>E_+&cb-XJa`QOMNJ1AgZqeYHt zsP(*6I`$LD{CPaLvLK_l7PI&qWckqcrnp$5SBk*@*W5%TGgZR=o-Q+Rr79(QLe~nn zOws=QE3R;ml(V&Z5a%&y&r7J%Pi=`gQ)Aq)E45`agqG!4aNYF{G%d4qj*go`qu#eg z*=@hprWB|e+66-V4MT`%RqL`(dz_x~XtE$STqjvb-Cru<;y}2R_xvy-^IF%o*SRL% zgszd77Fo#5Q%q&Fdw?fDv6+$`%@&;7uE9a=yQrHIlB3`hAJ1D6X)>a8uW&613 zT)Kax-t%=T9wnAe@85ve0|@9B@kFuu97=}tcLR5%3y|-V70AD%WXHZpzlA76QfN_1 zH#TydG!KG(9%iJDNCbje>hWA0dU!@OyTRkAw?)eA3Tu-R=-#F;L=TwE2rL!@#IxiK zD7$`0D(%Q-I0%aJ-pg{quP1fe zKHJJ2D|6E|cDmQ)jg>bV6R*zDw%s;RjP5$nuVdr+&78Wik1&kECbn7VO_JD_ZKE)W zEVZqJhF&Ry_A7pg7lnh%`TwT&{2MCtKNrbF*0OyM6)2L-lYAhGU+7(7^PSPmoqDsp z;d+wW4XT*wFRHq|xb-l((N8j|Z}ah^L(b6;p)C2;)v@>SNpxa9U^6^P$)yxPnV{p5 zjC<45wEkMrLZ20DH1`zfK1*X0sNXj_*vMU!0*~UiZQFy08B50u!yij(ZgNa_Z9`Cb z-h-~z3^h~E)jP_>5IIE)>}uhj6or``Ka&0d&gWL>keF*$w12{~1!t;A; z3cI3dvABC6+0v6@+p5Pw1Q4%R*8_@Q01uS>-tChNs0orhL!!kLR-OCHMn>5LE364p z*Q?ud^u$a3N6yz>Gig9`y&>PIoMyOI!UAs-w-b>kU{ycQ?2)a^q5w8#)kM z-U|g?z@9hls*O5y&DX!F>Q`2+Q&?7>K=B<5$n_5k=#KsO8!2{51cNyZzY~oeT3{D9 zC42i5W8+dbFI`3LnQav*U4ob8^^=O#b$8}Q>=ql&zNwxbIuleCa>P*+?Drtxhemvw z9x+go3Xo!mLdLEUuCOg@)$-&@94~2|9o4AVPUz)dVv)_VjFOdlOmO0E8H^lXMOQBV zAEX}^3wEg4f8cnM#SB@TqKP@l6^RB8bgV+Ke)D!{*AL)|pL$~Sa+gPb!*)9U@P9O- zpdcI@s-fBw!zme0IKm10n4C&W8^(Nv#$ zaMl#$CDvrBYy-dqaV$qTc=NfJei$}X4{Vff!zidZHV;GuVOItA;TX(gsi*L$C6ihZ z1A72jKe^7q zzX3G(BFr$T?Dwcaf{flLJ*4%_%{^#60OT!*<-Gy(EpMQ|02{A=Hn{ra7%3}H{G9K- z&z^oXwLH$rj{MvKlCxKi9^DZV)KJ)zKqkbE&V$K{Eo6Qs=j1?{4QhG<*=>AsG@ve2SXwFd#`mlxMbH&7jxPYz7#OsWs{2vQ-ALa)D_ z{>c%&zA+o-l^&_9e|fGX)vmU(*miIHZfQ?*d(Cj>XP_Udm(n2dob2VRV42@obWdR6 z23Y?&^EIRnYI6r-xwy{od@n7eLNV4oA<4m6#D`B2Zt_GvOks`kK64t{2x)&Y@8`YW zo28R=4r56KPTpq^mDCGK|3!44Q=@RSBcEk2dAAts1c6`O0}a~wh64oddBJWhiEL`8 zwhEVCkkDcY{*7C|`!I5T=-$KI637T*%w(qy*hnae<_pi)5yg#by8%s15P=c@0_1s2 z-^(EDuac8usAZJtS*-< zh76R+XuVeVVHdn(u8Q{>Au3A07M10X4jI_SPSDe$h!_-H@eR+viK;~TkU_dDPxSlJ z*hoZJ zBhCN^KGk8IzX*f>?@OMy*c0&E(m8`dvi4bR8hUN{T5E|cZmZ8*Am|BxKv2>)_5 z-}Zn(4n2CHU9>d$oKA#LgCm91Wke>uCR3l4np%}qbaoDQ0X}vG7^cmEO7IUHL00{o z#Mm+PMPLd8SRDc?1_ZS{-=gvaxV8`-N@OkOgRse@F8*2YUE8-lG%9!?c>{nYZ zU1e*91>VO&>a#|Vd7T+TrZ5lvQ9*^Qn@5<{@i0RJJCFOpz|{1+yCO7fWO^V?G=?c* zB0%c zfxM{scbL7IEn1IVD{^P#Vrnj+C`t#AygxVmW)pMM=|^*q2}#z62GOjOK0DBMf{^^F zK~r7yR}GqwlXv9$=|`16;=5kFMG#UdA^|gG{-XlTDQ%_EGm-Fje-d1B|0KBl6YL-5 zOjv1DVOT(lTn8r7q=FemL0`a%A$R(nB+UU}7X8j^(<#c-XR^PB69kHryNCI^JR~}l zNI%>8NDCZ;GSTQJd+hA;K>GeE`H11f2KtFsYu&Dz)8(|)Pz}NMkHhoNyc8Q&}oF1 z!;RV_!tjO>)9D3V`%-l^VH7oA<&VE`ZOVU&$ufA|)>dVL^dTu9q!m9u~cA=Wyf7i zxZ0zC5!EZPV(P$`(^;v_99b-Y9#;N?(nduxBY25?D|B#!^10mToE~a^R5w_EMs|@K zmtBcQ{aU|?-Rt~sbwC3RM~F%mqg&>< zGjK6fd`oJEC;*HC0$CpEy%UPsFFx>^p^WpZF;U3uhU(3&y(raJ$Jq-kAETQoZ(y6f z^XV(wt$50xS1#N}mzXa8k|KgnRSU75_uks<(NDQK8y~b3l>)WrE`_c3uqWL$7e;e% zXRjsOxrI7df-ESo7b{LFk6zBwy~qb{>EK)~c>hv!EzV`1i_+L8@PEc_0UVjO}GzoA<=B0B{`ACu{{YdsBDT9c)KN8lP zRZ2;2390!kx5|${-sQv(R}@b2V~>(e$BzpLyotvlPOW{4P4)AGvi#?`6&Z#sld+O_ z)VV?x424dP^UvtGxowrHC7Te^Vg>2DBQ+%3^L1CG<=l)lH8xfo)D^6)CsU>Wv)zCo z2c`xr4oTjSZLZgraO=+9_;*BIQ#+#YnS^eDYUgS-Q43f9t~ggP8uW#-yqz zY5&&6E|o{+@5U@k<^R@Yn%nl%-;MpyiwpTnmkOKzO*_t>^20V-M-=yaG;(*;`^iRj z#*YSk1G0$3oc1T|g^%%_zV(m@I0hUdVHsjjxo1@PR5A!8^R7AURg)iD!xkpNvK0<< zVl@bb48y@H-WnY*sq2z>-iH}j+XPhTAV0Jao;@$Hho}*N*83~o>xk-NpfziGHm%$2ETPt}g7ChwUU9bez^Os=F3GlHG_eG6fD^<0MNbO(}c zy^Eukb5yzzO?+`ywpj>SKxLh-^V>>s(nU{b_s)pY5H@Wyzdte-j)n5WnZ60NOxNpY z=gRWbO*-$nUr?gCQMn9Qq<`4d; zo}Cze8+d<(SUrTrG+?O-J51{)&GjcNiP$kz~^+ zGeJ1Yh~*|N+>;R&uOyeuTdb7d5e6O45hq?>6f2Nm1xP z4ZHw(_PYBkm1ow>O)8`O6lI>K81=QpY{og<_CTyu1Kg?of`Dk-I_R;I^@7+^(5>At zZDgOA^yYN>z63niM!=-FK}J?+2^#7NJD z;^8c=H>)5vT0%&ekc<}Y+J`dFAJP+oN8S9*Cc?a2GT4=$Ci3y8sM>RVp#F?al+Q8hTys&fho9B|`UELfzh`TX_h2X%vEja;7H%7YF%f z{}bWdqiP^>Gdsg@=xv&vP}@XN6=c zOM#tVvF^wl9*G6j^a)|3zc|9|VMZ5;9YXv=pkgA0TA&*0b~`{*J?*dW9_edayYhM2 zHEt26`oL5R-4W*C3A3t|D&uec=dS;+szFQuGb;7O%1xr7&al{qZ$(alF*5P;o+F7Y z2{!#YDDPq>`TflGriTzm5nT;1Be|*D1Gl>h)GUa*axIvTwMG-6s_CW@10B4=7|i#*6i|b`u!Sp_dziwNoW(`z%K5#@+6-V!)%lj--FTS0BYj~m^_rn zDvKncH`VS#fz&=~lHT;Em3Tx&ZL|Ct6Rj`oQRYNO%#>-GQSO#~%p~X9c&!6bFOj`k zsgIG99?%_Rw>=Kj!4urHSJn}7q-)N~OCjFTbr%`#nGFJuucC(*u7BpeIWsYN;AW-| z%wGTVV2B-xkMP&+Io#Yz^oIZxrxy;T53ah)MxNu@W zxN1Vlqh{Cw=gHIzaa5L=KF;H?ux2|RO>!3Jl#ULUx-PTLp~Qy)+0<9Ba%t-N(R40+R2MQ`?tt{kLCZ^B+@J%mB?<<>%$Fc_eziy zN_m#Z|Ft`MRFp~$jc}_!VRP4U+dLz@#_@ix#Pm8}k;_IKroDJ&Y2s?68WP>}^k(7F z&$~BO(oXxNy}2R0;&tb76wQ#Wv`N4ocH)vPUw@IoOR-PVY->inHK_8G?{mky3_R~^ zq6p9=%mL?DQ+Cdz;4X6ZoW8ZScCS40gX2)FTvK&i?GOdO)a{5UWbOh>SS!qmWe156 zaY)1+XGRnv+A>7J=a=ic6ebhRIVAUrA>E?)6<>I7q}*$R`O$=q+D*#B!*OC^cQu?# zZVD(YyCK$JwF?gBCsFXu**RSn(wCh4a0qP2yqS@5SqkvDdAi zFj3ZC3|8ajS53k}KU{h1a$m&|{H8Bq0R#)Su?ihLXex!Ab9L`y(ahec8hjA+tH6Tb zxe9&ir|#f_pUhGyJr9EBEB<2a2T3?PfgEOCazC5g#zm-<_gyT4evtabPo}B8Ad)vI)vyaY$C0^nHkT8f1fJ|tVENHT)N$ERB~l01>;D&;2=Z72(nm(6;?O7 z7rMp;>cvNLGF}}AkuCSz^QN63vnV7ndIfw^sUE_O6y$zjGPk~MP-vfUpUA~w+OwFY zo!o1W#XCu(;ws+d3xIALkWKdc*6xDuz60`u1scRMjbgH)NhJ0G%QR+7f%uP}(6{2P z-yV}LCF;LP=$8(-9x~#8k(Kqj&m`WxaYW|XEJr}ZyL6A5^Bf8gv+K5Cc5!$d&bB1j zK6d$z;lk+{Kpz`=ynYJ>(0p#rF<>`m?LGApChIAdRmIrl(L*uo>g^$Fq>VBp>ZWYa z+p3Bk)~{4-FQ#3lezv81?a{r5Z0ta`843b+%AjRSKyNM7>)@+{j$w{U{SPBNK_%qm zkllA4aIx#n9Fw4}f+X)RFe+Q{>W5EPp1INV$qyURQ-K~-ldSs)hr$^F8v~z~64M;+ z>(ME!*J$N!iKu8=%Ncl>lcf?3hXDU#0sN|vv3}J3n6t}cJ!?zQWh! zIQ{lMxmbHHy(J(~G?!M$GlM+liNVenz;W^IZs63^K^l~s?L<09F0V`7oQfBqp(ux0 zGg!icMk8?RsEv0!-K)JM6q^BT<&dt)+Ra)mBwUyqSLn7kUGTUsS4m@yJ;&@VjlQM;?r9npfIr5i6 zLPbn1%SZj+1O(`=QQ!b=U-|Pmweb9bkMArJ5w+iN4Mi)Nz-+fAyF{1Ij4aj?+N+0z zNs6NrHQQ%l00hk1zwA|o5KkIrb%0v)c+io@bf35^V(~%s_Cpw z)%e(vpiBJn4HpJ&1~qVUKI^amYr6vRQ+a(RKY+$P(=Ex%pEd<6x>bzNUSCbIKrP7v zpJ9Cs3H`}o7$}7)zxn7BnD%i-Gkh_(dye6kQTOTo!=735s+`C+79|i(TD6!7d&(GdjLX9i&oVLS&tb9Xyu*#Xd!trJ`W+d4Z#B05|b_K^1%r zn|8lDna#6Q&d|KZG?k89uDP6x9hEf460+K3`=QVr1LxNUW=aBYjk9cME|qIUst-># z3PwWt(g6gxdAnm@pUtAs7;h}tQFM5V#uhL_h%Gsy4ZW^qH~xSaIC*Sc*m|1B7AS=! zApNH6=Dkr8jhwNuNCc(8b+VaOb-?SXU;&2|Pk7@-TaiCfAUJ{9&~>cE8^ElKlbbBM zL3eae6qgSy?_F+LlB|M|4Y^pyF-0zl~7X+V1@1;SM0p` zs(|U*juP8)Zi*~_8c;8Jy|8wD0A281YCd6$#$lEpJ|SUyTuv*CYb%h7i|?k`LIFQDVGL2X1Fl+LZa` z3E>yvM$9$ktjFD*eK}EC2oE*wZY#T@d2-DHU|dn6=hnO8*zfxt*x*L)CeG2#p_sA2 z7&fipO}D=9kF21)HNyTXrHOacHX&p=NyjHmLgue(<6QpC0EooR!px@7QrXvo*zY>;CZSF2PVrnL^rw zAtK+S!-@^^qvCyheLHMSk<;PiV8h)ga-R(62xA0_2ufW(Qh!XG3#90N%J_QAB9@(% zt|+vN1viM!o5r=a2(H28v2#;s&TM{4ZZX5*CvbyB&>*9ncgz;>ksi|r&bc16;Efh6 zdf`~;jh`Ru<6wV#d1O*Zca--e!J?2Z34P~F}}hM zgO8W1`^&y&`Ukd15YOEv1o z8g0XOfzA((;0uT}$QR$aQ{QwacXtQ8EB_dGo=x+#IC9x@9)|}}`Qrz0=%5-fFR#%# z@JWTTFjq}y+k8f5QD82Ocr4M4a&Q*R;YX`l8Ooo)^^}a(Cm&E-GqV0BX@ZkKFleG_ zr*K1Tc6qP~><7M1tm{4cCC@DmD4dn+Ux5IU_O}-z7jid{jaP12{;Oy|GxMInmBD#l z2hhI)>TZ7&|6GlKVPt9#1L~~-(NNG@N6U4-E5Ci^iC5a!I7=wsO(~ayb1aQ-NP}b4 zNgX0-&|nQ&mD@E%xbYvwC24nWV+hGLqxE4=I+mD0uBZ4e7Z;=>-|XwSPQ69=4HIhJ z;60H?Qa|nJv_+X>aCOj$n|3w^{;_wiZ*q6$ztLMBG@!qs=mgZoYJ3BZfvNMzYABQoB^b7$pJ53C zo$CV5(V58?#?~hgC-vrWF%32#12|54yQqp4J!f@q8-%ME3Qv>+7D=XIKd=Nk^HrxU zre3xEI>V;*6rf$*S}BH{9n+hQh-r?%eQ(Udet2wz&#AU~K9-s!T~_KeK=G%KRC#`r zKexlD`IB1l;B=HYyH&ZBkx6+>_OOeHh0E)YL$`h^2B@{12F- zvU1D?U-{EEnng}qg7U8S~7oBZbm9q%_)GyK7@hy;%%66##`{$4FU?ID6f+D z^sjOa1_FuA<=hFYeP7`wyM zxA$a=oWrCh^0G9!{m5uTu)27mjd@J+$QhjAY4T=GJTrk)uD=^?Fcy@5w{e4vDGzTx|X&L6xYmiQ8FE zAu(K_YA3vSY>esd|Harf(~r)Fk7c8o8F(yudm|}F0*Vx+)@YdjdkHTiN;?>MIsIsR z<_~5pot#=<>BWNBCW^#YZ>|penArNGuOY&hl=yDWISnWpG{mtiFT zKYEcA#H!xw$RR6u86N|-R*+}DmTcs|x*9hk!Aa{H-H=Q1NvoE)DW0yslXPoQQ>KU& z<8$I4P2VC4$+0^IEPtlw^6MBaWW`X9F19omcuzy--6sbQ;+RI2!9WbAs73Df=&%jL zT`vN6P_SFe-(tTkyIRBQqmb=J6{07f;88$PdqvzNoz7#tbl+sOL!Q%bbux`zg9Dn} zh^r}HgpKhz>`#*nG@!yNivLyN#^nFnVka@J&BIVl4v)Jb*ZA|J{WavH-wPtNUJ(nj z{NHrx|B?Lv(xd=aVV`1ZEx*L3CR19A)lz~pE_C3o1_A<%jZNG>#92VwBevx7VjBW$un%C2Kw+`_sN zcfA?N!Osh|eWsb8a_c&Xe2&=@cXHqt3&|A&6*6Qy-&wK|76<`(v>; zTaY(GEt7h-vuG90(TkmD{YL3zG;(heYRtMnVqE+ZA`V~vh4-`trjqRT%OeldiAuYC zV(j&q&+V61QZ$E;O>SE5*M$Y`J5Qd502`^ctPzZQ6yaCCFS76rJ$o%Kd#0XrMM8K; zy$`=v#iJW#s`BsGR}k2e5DoMeWU;~LN5cnV71!qk$gXyTfGh`up}KaD!%!l^?gJy2?x#=fX|NFsV2Ju5u=1I zL(h(;Zoh1tnk+TP=OT~kg8L~44fv1`9NNa%9F#c3DE!g(9BX%0V)FH-HEfr;+PH7V zXGvi^YVM$!rlfju)?}x&US-zXSb_6NNkSF?DiY)Ew0~h&?L#%=R&+R#{0=D)8J&94Zz`ZaL_%_o6(WqM2|b*)_VGJUlHvMFn43K@EDbKS&BBpknAZG^+(R7L5~zfaw$>}9a|TgtZ= zu0iTj*gpE8!qbRsEjl|pjN13vFBX3_kQh04`=^6ww06gSHj4EOht{^@)Fgv%axEd} z{y8Hc=qNaMe^B^jAPWM(<;0-ESeEf*TGX!d4ezEW9_|<|T^qscnc5cM=X{Oe9NDp* zF0^!*4!;0WZNWS$QR}$tgXR+zqC$a#`I7)de4Wg6#16ClY4V@$E0K;^z{&??4wj7x zcHs6T@cx(Xes7J=SyYhF#A(f?UWw34N2~=pF{E4=2XvQ|FkqJih@rV(8}+bLFU zT-JO5+K{a%8bLR)^iBy(*?>OV^wrSEwFh6z1Jg#%)#gmCy;}Y1f?HR(KI{Q2I_z!| z@hL;ySBDW>W>d9~4i;xbh=(5iVyamnaPi6d&~p-2D?HU#e!h@;`P6l;iR!Lo*3$iE zu>t;e^kt)c?~6zWZ>jBgyLZ(;r*+0qY4!m6 zcOqQ?pR15UMWep3-l#EPDBAp}krv_X6{_GIM~&oebBq-bbt{GCBR3c50UMr^r&=Wj zgGMsMBa>nck@m{xa`JpF+cEO9ALwxIOt4Jy&w(p~Dx()7?v`(v(%ktqbj7(XKD#Go zQsT}?HN3O(Wja8IWA3>e_s4bI{iPWd+V>L z`Y(P|Fen8?v7z*?s>lJ-n%~cPq@Fa zhO^cz4)54|ze=KZlAO2?KPB;IpX9+Jmq=4e*$0>ZdlJfeKR1aOH7tHBHgo5+MQ%3D zXVEYv;jTDvd`Mb5p%P;MZGv$uueSDUR#_3^m+U2RUc(t$*!8t~gUmxuFqi!J5 zzLFL}^YZ!r7|9sE2Vd4r7PUM0tP=Kc!)V9@zA?QC3@B zI3U6mP83#u#`uJU(`g&L?5>^WF)*0$M;ql!an}Mp$Rg}toP5z5rE88p%__-%4vQV1 z;M&qTHOm}jHSxLq3C#FKCBH+?Pwj5St7Ay)9O=oy7vEw1RQ2w5Fo&jdxn?8=l~3%w ze^cQ;;GSQ5LE}2@Fknwf0ugKJ!t+Z${fF`p->lUFt~b?pV|6a+gO{OTWTlSrU#9rd zWuz+J;adDh?l1Z-6S8^TZ-6Up(C4NfjL2-dS+wDB@zB0c(zRbG+tw8S#S#Ma!{vL~ z`j79qeX{QOrlLjSb2ebPD}xQ>}~ zUeAjB)&7VWyMbK`&K4MpM=(k5rs%_bNB3HHmNI~JHHL+w!g1l`tJ~6X-sjLdl~^yF z^z9ir3VX}za^zzQ%>Ow%r>gy(X$ShFM?D-BQvlxkQ}A}#@+pVzsKc7|_@B-h{e9uQ zn@@2=Ka%2R-Jr5oyS@=h?I@&oVfv}&2>rt_V^xt zvvf{wZ9rPq_CU_6*^+Tb$r?j#HMiZgjyz<{SccC9JS8T8+iKkF{q)H~9wPd0Vs7r! z{@S(fNI4IBV4UpwpMD7_63q+RTdRM6QK~F{{dtH)B(kXaw5_-+ zpmXADDPqHUCz#~-sTZpKDTD?H5pJ+=$QNlrRXj@1>J>NPo${tfPuyPUvm21ic9Qf- zKzt8%*Q&ntdov}{O#RA@u8IQo)R)@3&B$!z&TjeQ8nD*mc1c7YWG?-1ldZ?sCBLGw zsr1S}LtSh?YmJL`IwKgQeWO;ainbH=>$VV~cqTLaV-mV{VQ`HM)K(utV`NThX0O&; z!2-@i-zQ>qA(p{BMZIAqTXVzWjw+rL$k|PpRc&2(Dc&^|VT)LMfE-GdX{P+}Y`bAC z&FoLAk@wJ1%Q$)1m5a?mQelZ)U6T%l@i2wvzEB&kpMf%?eU@~ql&qgKJnA8sM{U13 zma|QZ`TNHVky-Lvw!%CO?P`8mUEaHkV2w_Wnf41 zB#qLB9g$KVyDN$t!aj|#_Fdn5odGJx@wgx^pDB{%e?R67ytz2rdNw!Tg^&!4;w^j! zN$oZrmXjDj_hpSXF@)N#xX8`Z&AuMBUFtPZL%^%hT|3L-uA3zo`0<}SSdp7op7CRP zpp_L0Ncof%LR|4PwrfIMYkhiW^sG-Dny>3B_IFZ)_Z{s#)S&(XsrF6U-(s`SXGv37 zAw{d{SIYB7{pnp$xbwL*Gjt5SFlR)$Pdqs@kdhV!vZpZatPQ{WFwnx;-u3OSs@X8vYA1yUd$W=U9kS@X+IuZG z7zlHtl@qs>zWjD(LwNn2;vF?)xG&JS1Ot-38_jq{^>8WOeUW_9+5KVXDDp}CiW}T$ zy@_~gjEAc2^D4PkJ!kO8JK8p8*x}Mz{6jzJ0SGHK`RsqmmY){!{6h?;$6go$>I=^t zj@%s5?;sgd+raXXG{w#DM$W>I>K*2Ryax3}(Hvkc}$;$4z}g>a{rTcxMzE`P;$wa%ukWzOhEPSKEu(av|)?b0{OR+kBvT(=-w&TxM6F%!9(Tbki_jVrvP$k{IqH5FA^0aSvm*P( zq3J%aV&X6^9loQUByH zlSYo=41Q~JH|fnm{M!^^;i)WqP3W_rCtf(V4L*Hr4?*0b;%dPB>l~KpZ@eCYX6EifqL@>HyhEasJrl=57TT|R9amiE z7(U%pCxY28d~7cxMHuYJq6WzsX}(3gs{O=;a;RT%8-Tmck689qoHM6Bd&CU9kswvO z&~8Ni_IfBh6Op6#W70wAwxEOLg$m%%n;d=M-_AIFqfxxLpH_h&_&XZ?xX7{eWj2 zj}_*pZML<^+YK*ywVaICkG`A3a$j+BCxvg~L=Db)K{H`57<$>o`Uf8A57091TR`5; zNc8CE!DG;HH>69rzU#H1tq;TD>XCS0+GE6p&c<#wP&|(L9Kal)LjnGMT;K$ zdDX!t111;`OWsgJ&*)66@#J*H!X~)+g>gtF1Mqp4+mgusF5Q`9x>tH0;YacK`zm+F z$?B<@JFE@LV$3XN1UssH>f(M|ZTzn%sqLzL<1fqap0HAFo?jMdQPg{HgnU(gQ*qKS z&LAq4$M96gM5sbdYG%hZREV5?D^|_|NF{49<>Zt+Owi?S*2!CWz8>LGHiRvYO{w(H z($C^J)#yp~G*e24{wBr+KWfICM{?C;!o+XOJuEyiMB&4J6XZBSNf1w2IbO9_Ltu~b zqI2z1Fa7)5KGp)G`H){XDEB&4=i8MvOlRYo*AnE<>+DoI@Wk38)XFF&1vz{+V{?ybFpMmYYgIAMeW)Yxv!^;Oa5~(#cn8mWD?wo(A#2N@U%vKwFA{rK#G z>zO_z6~FDO9(#%=>w!-pX6blGb)cWW#opp@)CRZTu$yM+YJd1y9@0w;;T#s&8s0!+ zoP5l-k-9^dqcQNSy6(07<)P5Y1R{a(i5*2A53lvMs`N#XrVAVTqp6=#dtT95X?V0( zjBJN}N$yl2;hcN`lS=ZXFldLHnLEAAIG#Jq_~Qcz$Kzq|yNd7sT({T86#t`|dq6#% ztz#Z;uKZ6C0A9FJfjb=-WtU^T9J9G;5-yA<$On?K+=Gb8F^15>t%bh{speVIE$fzqKGJdbpwqj`oCD9 zo+nH7;K5}`TaYYN<$7Ei@5`f(a{DFDWp6h~ZgUdZO9F|S;JJ*TGN$R&?0az92<{%X z=%<1C5Q@T0$5B9?`TL%xd%5~o!i0v(#+;H5ol@I&k`i=-^0H?uV4F3|US2(}*RZ7F zV(^0L$DGx2gXSmVO77WDsK)7r$uS?#fMjo*+=rCQT(L`p?1VowNXIIEhIx-Of?gpx%Rj zsLsk}q>V~8w7$;(hVsmU2kAHTmE9iQ4|+@C(**Vsg~+%K(X(bMpx z4Nk2g*`s4qYIY2gAXlI-MMXK9(k;OblJMz^47#Y}G|VrgnhR{wK0kl%GkSL4eUrgJ z1_iBC{YR15RQ3fF zl(qBaBD-nMRitDWo)_COj~+kjioBR96 zdWN51^O71GUhE3OS6Ti~x-XmbVQM+=v2@`F(MSK7S%&Cm-urEMmZGZrvmj~i2?-UY zu!HEP{%zuc?VCFPkCw$jP?Nkr$bB(T*}u3AWReg?6A}(8^%+FC&VR44}eE^fLhR zL9d)jXOLh2y63_q6{0wFC3;j5_`^b8C7Gu)k4ci0h>uOid9xWq*7qA`X; z#a$+yB-?-28@cYQcW1s@9{(w#($q9H))_kX`Ztw!Ze9=RRW)? z;!nU1KU{trPt`BF&gmCr$4E4Fuc@t51-54ct#pA2(84w!*9oGk1KCv8#;bZ_UG;`y z)XZh?7xF4hf|2*QrWNX9C0w{JZSp~Ai)bt!F@yFcg#O+;hx2rYNDQ9HjaP7bz{YSQbYK9icUc;%#9 zcv)mnF&^BC^)lygCs6+EXA@wLq}%pFteNDOMDU{xCRZkpwz>68g-BSCd*p1!pps+S zX8xm~DHl3tzj~`QR|o0Er2}dDlGdu0idcTJf+h81#MiHdr~5u33EjkDrgw^Xb@&Zs z?f-m7-ePKnENem116`!8)>jP8&PRW3Bb0_)!UP^j^{P5r27fFD>%iUZ>kb3C@ovfB zJ_?N3h{4agS3urhZ|t3^+|r!qXZVl4-G$8zMPtplAB=1Kw4)Q{&uVdS6>{-HVY4o* z*o?J43&mHtQ1j>G0xxM>IRkI+aa@{7JAbMZEIPl6vgEH9SJPE8dCryH_qOXOwG?;z z9U10G`L3DHwRJKh`3%o}#$-s_EY!^cqiCZXJsWqH2TQQX=n!_P)16_5;9qm0Cr7fs z*Xa~clKO6a2U11x^whGZ$cPm`s?GPX_vc%&qGi)*8epJlQ;PE${|me7;vyG42#d#k zu<^1{Q)F(zMIU=$-KLRv%)070f>6=g#9G?xd$#aa+y@3gWbVe7tPe|@5;GvzSI>Wf zb_E4zinl6XC?33Dcmk4hy$5)QZ;sb<&u4WVxcKtsowoWFp%sp{*L)&)2@pSx9PZTF zo7)9%8a6O7UCFAKje49r;v!6Tzev*nDm%Nnu2~I!+`v;OhY{}$pAH|v0IJn-dW*b8uA+Flg4`-2I3lic%UYQ zUTel|DZVsY>10WBN%iKNX>eKaRt(N0Iiru7*h#~d(&r)T3CXT&vWTbanI7S068BX| z-F$hctnxBKsj-V&R0N07GpwugP~y3S4a7(s*`p|s@KUs86bLr194LLn+(z`{VoKPw zjyAlId%W=MKX$it70Z`6lxyjkvjub9kIou zEiV+?v8TAI{7654o+aD)nO-+07O56_BCF;)PK~GJ9^W#BO8)jbWq-K*_Th2Cy0~*X}q%kJ}KVtA)4--^c89d1RceAvG`QteWrK*v2s5mInO@gf3 zxIJqZF!WW6(_Dn4QZW{M)Wi88s!&B&CK*tht&WJKVvKE)a{Nxvie%Od>n>Ct%R&ST zspH>NzAlbZS53o93E57e8hau_RfOz1Wq_P6kyA_v6!+B%^LqKr^735p` zpTNW5)~n5r!Qz!ag^mQWxDru4ZL&)LetbXeIX7Nyn@Y zA;9O~S~ZI3{(BUb@?gQBU@Upqd*-CVQtx7DbxAHO<1(&iEy)zB9%%6ibD z9;g=N%rcBo0U1+~mrZwJ2_)1Ppkz=u%FPp zlw}9yuYROU9yNmuHt#3Hk}8_-rHhgd%f0TZ1dO^4?^0>O%B}*>4&{7h(5D=EA%k~J zQIQ><@S>?MgQNeLph3X=G(T(yi)d`=j91IE-X5 zrq9xZG;cm^O^rC!_=mtR$=64E5kj2Aku-GY74as?0>DTRUQWqP&1;aPl6p@)rvZ$7 zh6=zkg}TR)>HlCGMq$FUDuu}V2#SX^!XZ}7LcDFf*VmPc?dN?ISx`gaFMptVUO<-H zMQV1uP!cTFuCDH)yy}2`21r)VZy)B2lh%@z1%0v;Uj}(Arov9QE(VS@y)w3@WM%X?)~{OWH+P6aCl}*0vU< zWY+CkoILfyHL@A|m|k>co_Z#K-td-{4e#2vX+Mu=^Ch864U8iX-Rk~!O$GL^Paxa$ z-|M4w>dvpXY~8;c%1Jclc%Fa1HwuM$dZgul!ISIR%c`z$?sld0ed8pCdI?#uf`w8U zi?$!vEh(=2)u77$P0|*0f_Eu7k;`b^7nj+7v+2v8Y8Y^j9F{iWO0U2% z8Du76qaW*F195t(c-5LMuMO8!vT(YknKDcwYetG5*JylZ*qv;XpxE!Gd0dCfF3eAq z+|uMDdlH1ai4^%sWMZx}X++3w`MrHm#@Yp;B7;4jWGTMMygqx}x&%|33+Fj72QDfr z<&|CfE>BIUKjl6Ot9A}GEk!6RTLEg-cCS`o%K~x(8|!#}fiP&5Ge*5{@{PQRf)7Z$ zBuBY8*1XK}4S)S`S|2B4g-y1S+BD%gdg25FgIrY9g5uZgo*I#|ix%o_x`ZHoQ$qI& zhe9T8B@Sz)*s8>D_zSt;H}0y2lL*>!oWdOHyO)xTGSkMQNaXG%Cn6C)&$IKv2FrJ~ z<@OoQ&@H@hc$E= zwEUDGVS99>MZX5eGL7`8e$UCyncV?_5bSN6kG5q+<(fA>$i4nrUCRwLtr^s@*7s#u zz1N_!E7%DwTY0;bnF1J=(9!O`ykOMxRwWpD0j#itZPA zN~fT^0J9cM29AjAK;JU{E_guGT_87&_#RIuA;pIpczQ4*dhwBWWheieI_% zTs?|5j*4g#;g0J@y6<)e2MKdX%bHCO>D%t1lHcj!{8KyT$BX3VtI#2t%5jtL&pUZb zACbI#Pl{vmVL=Po5cz$q-j8Vk!0-v>KmHLH+WQkoaeYdlRH+6Bx`jE7FD8{sUEk)7 z6d%(LX!7HIDMW=Sorf!l=Hl0R8!w!1Lm|k`B%(U1e*3o{-MGM)7X#gRk;>vmLpIfr zM+LPGj0&1^MX}RvecK%St74=ZQ$FIJ&wG*LHA7#r4sy-B*=_^{+-j|0p|gb0i0sl@q@B*MDF%RPf5aFbod)z+*h3#Z!MQSpNFzFv_08668zqzV%(;vy z?;M6F*T?dtiul0+Jd;bXll$EfW>GWW6JvQ;O?Cgt9<9?gB%yI?@a|zu%t<`0pj#Us zAke!JWU?3&qRC@jAmR6!p~+tp{{q1Kb2<1?l<`W6?&5uA2vf$5uxyk~1>sji$I{w4 zLPX1LrCDk2l%666mT3uU63sYFp=5O5ZU4ctL*(I-pCTVf$54gy#bHIOrj; zj>Q79xa2|cF-T^}8qT{FTa9KUNQgLG=)2gseHSJIk}_XeGbj)a*U)#gYIf@$vK zMpx$5%>G`Es>Mlk68nYFY4a3*`_XlIg>)2ictsc4eKED`1oV@hQ9hN=y@8UgC(1dw z^l^lQB-+FaiP*TU4D8tr*I@m({p#ZT+a3i{^8Ihq$MUvH9hVtAlkX3nxU4|E4WgnW z0htwKu&hT@4tCTs#BGi`)$6e5yQ#$S-!n$6*v+l{VPA>?vzllFjuQ@ClWCx_tH;eg zwzuZ-&yYeYdOjf}U%>&4;nh-#toa4mXkp_&r^p#OQ9o3~z8KB@u@*bwU$rT3MS68Z z->Ry^vjSyyTY%{AGR27+hsYXw6b5imLiHkW3An)d^D?jAH$FOh&ty=aY3$3)Jal_y z-OP0n=lvI){UM<&;3EvsUwyvJLQeGm`n{duzIq=t=6Hg19;(e>4PB7joE#!dy$Vzm zRY(&e4v$LkW(W>5h9$DStr+_Tp`&6{)7j&smvGI=Pej$rVuU}?H1oS&fw>HXUQ#ih zy+Uba_})~&RUb0vHBSWD>M#VV*W$X_-g=>EJbN6b(_eAQ>+N0F<1_wct(Tg)*{$!V zo>S1ZIBV>XEz^FN*p;}S6+-)(QaEQULmXHD2feyxW=Pr?Dg+yc{v~AW>DCg=!JBQ$ zS}R`>mvv)WaM5BHD?j3V9lbGawEF@sTi}kO1IC1AzIf<1WdAS;N>S-~^Nv?KSB1Jc zU$CXjk^{Q&8TTKYtz|y>vfC)p?vneBku8oNbPQeX$Wsp@XGw z4>P81VCm+Uo|JvCa{CA94^%C33d(8ovK57aXE1_2QV8)v0h6yPhFYFP`uTfYudU0N zF_hQ6Xf9p30Wz5bZML_$_Mi4Y2XgYVSHIrGvjOMjuBy97 zc+R|v!Y&Pb2Kj*7Q4r-*kjST*FjS%HIeybCoemLiT7sAnaVBD|TpDf&3xDRKr|kO+ zTK3^_ex_)p=pQ#UK@97rFYyTikfRWxC=GF*3{|v1*ms##W!v+s(MEml$p$~ez zyzyg{l3htm(A)^;rkO~+oU_q}2#Gf93moSBT1R&bgCCXx#$zIvoNPGme86q}kn+0c z94Fq*x~IHxLE`e~#}ClD^3QU&0|AjvzNu~V8>}!zWG@Kn|Lv;Zai@1{@FA~|rR@0= z$oN{_cn2Qy$GliUnewWMO~ zNE_K$bz`l#`aoD5#XHFs?WbX@1vThD-|EK^`@k=keEp_pHNIqp7KC_I)1y&KaFLWx zGnNJ$M!a&X+=$C1B4%ru9t1Hcw5X2nKSM@>TD1^l&EIWXuV=Lwo=4g+!ynXP7i{^a zj#;BZTQ28Z$K^GfA11XQ2t)d+O}^m$TE@SPU$p>4tx`dglIW;v;J*$(`7vLq?QW!u#HtRlO4xoa1q55&b&u=~h@+S8y zsskd?o|2aM#D*ZQz#Q#daX=^Uf^sF7%-W98P*=@&M8tIL5shFG_2Cm&woy3+ar0@D z-*}vOWo_@WzAle~oL=7p8`m0au2(C=onf+k%@`f@nJg|xqvd7RFGg|rQM(qx8&E08 z_PPDO$#tf%nvtk8PZXg7lN)Ag`iO6aK3Pn1GdK=Uw1f~_eQHa;8WlB9eTHA0{nX&F z9bzKm4>TZi;6V)|PR$6@0=``DO?#^fV6XxD5|ry7d)x5u`7LKY?;x5)-Eb}3{F3YK z54O5|!|$)l-gW6;c%b^va!9dJj7QAQrTetJ!f@cvyQ36Z`cA8cDz4h)Ro7U8=@;ml z>1A7oQbB3w!tF#eEFQ!Bxa^AE=`Q<$xN2@8GD-EJG}qV;cgmS0yyty-PPc*!t{4(a zRu<8;6M+puvOMN5fnM+?BmJFNmcV!A53WJicZBCwSI2BD>3ZodgNku1K6j)VY5S=5 zM<#I6BZ4HqKJlhnoR{m6V;{i+%vZl=Pp5a5!@(aumR)=sTs?k6@`<^dZD9Y+b11Om znBHZ5=_B1I1O;LWT9IUC(Q+`CBdk^|mv?~3?8J5lS7MU)05@gPYQ5~wBoM0L-5`M3*q=cT?y;6M^A z+vj(Z2C;*A=`GT{&d|GLdw@{o4j~sZ(6iz8BPrE)lOKI_mMmuPuG6{;Q($dE-&kiZ zhPYWE^9?JuV#fE41I(hNd!RN`@Y$0croi7A*+L>*j(=;OR%~;_EU#|NVuYZTvq`g} z_klvcaxj;a`_duF{S;-pln*luH+O2Xgj)w9T-22$LwG_u&%w z1P5`Q7;EIX|5}sA2#2OqRP~W76DYQo93p^`OF@Y$DZ@AJJMHu;O#{!|gxzJyc(oO_ zPasU0nAvhFf6iYHYYmivvTli7=zPGy;@239t-^-Z zZ7ftl6(%*;v^nxw*)o3D{Z}EZxKUi9H28Y+YKnPvT}bZ}*-W^l_1uHnHW0AUgd zdY7|+QwB}LXW^@`x)BHTyDLp28&fi)C*Dra6ca9dZuQ;!4>1?;c#EX)G7LOl(sX;t z>Y(aY%qc+ZZlFafs#7;$8C2wNI!A5q-qfT=qpzacefHJ#q`o_^qyB_uG(6$ zOOIX1iy_c%L%O0{bRk!|)Q4J@ZwIfAoCo(ZP-(CP8*{JfH6~pu{&i7>nh~x^{($yf zUU80{>T=sw&g5tRTB zxN*i1Vw)=Q2&YPPK*=j@}KHHq5`r4aT>{z=0c zBuNq>^sn;q|2%}+jPC+16#hS+g$jWaD<}ZEctsd)O?|-dBdBrcP|?<6d+hgI`?QIrjJloH ztvsATfbh%TfNVXF1dyW7-zk#TPj6RAx0Q3{)`vh#AoMj|46Jjw5t{TvEJOgnpDmL> zQ+l*X;7v_^vzfFMk>~K`kzh}gmAz?6KKo@4PqlwTOCig>%v8edG$#)bZ?0YGeq09R z>+N6U)@wUPtx}_$-s@w4b)UZ&c73mJ}9Vg1rKJoQhoy+QYl{XAO+?tK`q7iV zerBbl5l^-_JfNCviW!pCdBgn^HoRr^ir`W!y!Tk*%v9-<; zNk2UeUlke>Vml#g#;clW)}QVcwh+9WWCA~R0GT09+}m}}BUwXlk-$$J5qbFkebJtc zORQ=EjJ8p|RZqhZL74iExy1&riETFN7|)+!Eo;w4?G4TRJ8MHP80)`1dT(p_c~&t zj9(G>ZH6@nas6%EESjU!6t|x1!bRqDmPrzbVmG_Rsum(sx|Ec-Q2qEq=f9&OYnUml zMTw#rvaXO|G{85okPe2ul>E&}{UHX@ZCAXAyA3`pseUG}znnWnGg+7n{YQ0fCfF(C6u)hk}9HJBO~fQ!BW6KWHoma4tucDMV@ikuyF#{+-ju|I3c9 zUi`;7S!5?=?mO*1V5L05W5q+9A9~imnPs~h)4_^8E_%G~&dAH^rXOLW>vJo*R%nXB zKW|@iIVu4wIk@&t&E9wPfHx^{*nPmj41U0vluPbV*6R_>m5XI9;>5Ga0J`Gc2e#W4 z_x5#>T<@C{i*0?sdo9y-`k9`0%)gZF8OCm(J)|s6Ig1mMpXP*yuf}t=H!C*h|G>kk z7!yl#zG*aXXY>MYvuR#8A&0hm;@~@g6wEZ)e}gJ2E@L+(HySN#J`rKV8zLmJ`lOD1 z{?03*&JIy5j$mcx666VzxEk+P!xM2U3GBHCTb1@jO$Y)zJ}q7sd>0q!X|!Ob&%%D{ zab?K6u1H$CZ*cp~YJ$)um#s-OekOfy(XdW`r}9J=&? zDlCA#?S0X>?@>F5lMJ$b*K#&xHdjL~r@a#WL*!czVBAI~ob}b8;Jp+1FJq>x_r2sr zHJ=Z1qCeaI{lIHxU0{flZK##c_O^#`U+-BC)N@M{&pu`^N7%@CaMR60=&guCYy^YQ z-9;x!v2nz!nilw|w^jmSHWRI`TVwg|1YvF^Aj8S1pgCJIKB+U)b0U{gr=D7sxa>Z1 zB5i7vFvV+n${&(rJgnMBY(I|B@k_9m+C zP=u_$mDv&Y(^Q}PZ5(^VpXl!MpWsCQ!{n=SsJqTVjoQNg#~K z1DudZq4@X6_xbwBJuPT3QS4Y7aDpp;bt0E5{n;{)zD9HS=@Ce@FIxS0*()A(Idr>r zDo;vI+1@}6(A3nepJ9>8(`?8KKDM8A_|JRG)rf}aO|Y8uvjVh7K)Y}Cegqk-P*o8H%+ zP_qJ(Z@tP92j1Si{3Zb5VdOeR9k<7Du^~2&(tMS5+R+*^^Kk{I0ouOB%|Z%!yHC;$ zORHevqUn!MN91QZ%b}xOt}iFH2`N@~=7veX3UNasShdBIsRQ?|AJJauY8p<<>@ws{ z){wKi0q_=pqSaQBP%#!77p#c&=E0Whbe_j&Qm0fgUz2Wcww~YxPojXWUN_UeyHHpl z#n`Z&sLKfw&BZk&vQcQ|3kZr-$U@$;y)}OGK6*Lome5V~;ijIa=ovWYSmD>}G?qyJ zzQYRSLm4iM?D?Uu50X&Bmi3lQsz>BORH>5f&o9*!aw(>I!|(Senq1Yx>Qca=$;9@K zVBQK~Su5V>rb7hk=vHQ9GqK!aE#dHJrFTk2@xF(&lId5s;pQNf%8j=jr-FkHWK+-j z!c?^nv6~iI&1lNLGj6#0;3lLdw7faRQk7tXio#LH80RhN+sj{)a%dEOyIXaj72Qa zX+6lPB!+T!g|8hM%_Zogv*+fK=Zi$?E{dOefU9Hz^ys1PR^+*t%p0?WV4-3(z%*Ml z8o7W`G^c#;7bT4$f2rFZQ#`BhAZ|_}YOp*ut%C1*VE9hq=Y?r}$^K1X(pR8lr zO9Pi!#z<>T=_w5!y`H!TE^W3vrB_6@MuY`g-M@rn)2ILc`Pm4A!smiadXb?2as6fc z7rChL=qf@l^F{#w|Ft33DE-fdSe2>Rx!dA? zi#V^+J*CZLC*%H3@=`+VU5CJri@mr|ely>=-;sax{TdfQQQtu;CVf$b4beS+zG(Ii z$v!?D=DYTk?C>QtnWO;ow~Tzrz{w=4gd|X^L!SPtuu65mmYYvjFgKR#m3N#y|_@r#TB+DRYpSYrbg}}b?o_N2)>#67w(BHIcrfwXP zLoQqx@gO(Q5i1tqU2`3Iq1VoRDHiM72ZGuv+dnmH0wptrLjlKSx<4^lZ=}k>m!s`~ z2iEXGhV@h|QkT40dmsjDx;5Qx6$?m^^P_owI*1nt2c+;gUMHC1=g+-T%o6>_8cDfu zYg46^_ai{{h+;vW&39(GA@jo< zhBC1s`qBznZ_4LW$Et8`gKq}?uG;ZS+v+3-c=GgTP2lS*4ZaJLIeqt^xYeHLy_yJ+ zhHZRTK`F)*SH%cuk{=9xhPCaW?DOXOn|7rn>=fX^%*-SY_OQKZq0W~3UZgCt&&c_j zQa;QH5sE?W(;=KwG%M2|wz!-0#qGm+D5+=(ci{0CC&&cSPhc==djq|-t){a3ox$lN z0~13O;52>I60k`~Q3zrEvDVuc_>29+C@`LLuT(?9apNb+0bG3r=Pm@cOd$ zq4rD)=cBKAv-6X>pj}^PhT1bqnUHT97{sNK4LANAXv+ypD0Q?A!s5#C0Xx z#Ca{NUi0*&GUk_z=#XW{A`v+q*S7FY#sk#U82Nnun zs@|J>AqC{6iYmi?;u6gNz-QF{_l4LcNWeev#VbCVO1mBL*D(a5MpD1cyWuK}xWSft zoMo-Ei#xhN!9_=wEcza>s!5b#ste%PW6xXl>P8%f27?UXhf))Z|68*OaLQ>IFli~YlS1>~NyKBGJ2lc%df zUduPTaJo%yV#+>5Upwqs<$rmK!L2v)y?38P&#-fv`l?%pX?u@aH-~6@#7^ZVRJ}@p zGerQKpwZZOtJC|JXisUx z?c3I``MBa-?26mF#&<`t=As=J<+V2=S~dq&2Ubx66!6W+$&hluk8e;gVWn3cek!Uk z{Zoy1?Ee^=2Zabb1xEa@nYWQ3|NmNp5ATqF{$FeGSH&s+A6N6YbASH#aa*mCsQyx0bV3mTk^aCpycd+PNGL! zLMn`vB-oV%>DlSL+^8AtYB_Q?87*9W-fs(%P zk;QX{dPX}Ajl6rBgop{F0!|}X2lh1q__lmEBsWQC@kr&@m7A6W;<}3g@A5(IDY0^2 zBc482y?KV;sNa81c)`bQ_31gf&c}jkAwS5G;DbGru5cDgkdBPDNILXk9}P^+XwF0o zyt6W~5W14kCLway_-%;Cde_G021&oMRGtD_-n{SacU-M?Ua{+GjkxcC#&nERAcP1f zVrI_vA&M2*x1iCQv&BxZ~t!KRFF6RVz9#Z&5CE!+e((-Q_W2e3SqIJ4D`J z)~=W+Vi(|nZ2_{>`+u~ihnhG5o71Qvz{2m^! zTu~7dM~0TJ`NRsh`0Q>gCKRA8gOt+lnCE#j3Q}m*q|px1ygvSOh!(cMlSk~l3%kYw z!xuV@ic9OF`y8poy#x-%y$CG4-L8216`ZokYRw#951I@x2(v6$NQ||g`BcI-|FU4X zY|3cGMO%r`6!}`;(PSTVT?1bOZE^cIz%!@kYxJ4R6y6>33dj3&#OBR^9)?72ORjUz zhP0xd#98zL#TJ0V4Ofqf*m#__-gYlJsPLh(rFmXbNN^5cENELN7M-O7230mtjFNCsK}_}L7{6bpS|T`5FEGGiay(~*i^)WaN!TqHcw|# z^6(9qh8dv7=waC$ZOehn_OECXb6usI%a_L!2(n40P9oWOZ#p}l3<7jWrwzRThp1gZH zNH&y7PWV^Vb3r1nC#arT85@XP!2Zb9=puAcz;J}zLa@eNmD~+#A|XQ8)0t>ft1ar; zC@6fb+rWdxbHh{OHoKGz%x{wH6hh{dp%PSg_n2apH})(F^QG1j)6U=e_ChZ!>a{zp=8vPc}d}B)MRl11h!*9 z4?iMOjhgm1LbK5&j)GF{<-}$0%NsTadDeU`Bb3>T>&54*mXGA=7rpM{Lc4Wr%9w8E zbet80&U1c9Y5@Ao|5itrwGWLfynXRcr_tUilw~q3vgtp6Ha|gk^x2~bTkDSQ$IA?q z&->jP%b#F6efQR)*kLm=#Q1hfSYcpnv!ueswIy7cY=}`>acB1EIR0+ zW>M<=gNxa`ubxi|rF_PW6i&M!y|6r7gSj9g(}!y9e@uIC299EGTkmQ7SFnruBCJoE!!kRmry-Y?CwusrEag! z_#3+mj)+CTKZeP42;3s{bAKe-dS?9D)Ut$g)*MRth%gIhPTy@|Tis)*@-=aB2t;go za7^~(Y5;RPN8i>l-8OZNlilr?&MmoDFo#8ptS@hQ*c2v`wuK+|)N0&qE0&owA?IfEi_ps07>p`)u!;_1 zV2|1Vnn5nVo%+ZG8}p`kB3O)#dVJN)q35P4+Nj#cOQRrMk#wFKp^=!R95XM$i?i;S z&w6+vB9<9+@=xr5DynMe^~cU@*9XaV8p*8vM$za+FnqcC=gL|8rCi@M>yE1Yo~ngj z&X>zlqZEa5@HGjh3~4(ygUDAsv?;fTONsBdYw`0s5wJY@nqroBRjJ(fVP|@>YR~$439S@RG@1-_gA~4&&dRWq2{tWF5U*Ycif-fcePv5pd;c$&WDwi8=N-I-> z8U>ise)E0!sv@zGzu5~Io*I!#W+B1IyEi#Ji6(T$Q4EUXSP}UC=WP=rl55}IaYYlb zyQ`^j@%j)#3fe0dt-r%z^m4;&>ckq#bEvuHLCt6EBS@1~*lqLFd9H-A`#*?rBOMleNhbdp7QRIcjWm33$O~ zW=0Np*{@T=aAABMe)KuhpFa#Gd?_SNIpMHmQZSW}*~lSXD(E7a zvnSz#WciIMkuBctpD7H&B8mk|s}Xm~fg{>?=$=sA3n?cnZW!gcilara#y7wtkrlEt zqaKvhgUAUDdRsdMeIW&^OJCi(hMen+tYFYn!EdGTsNkbm4E+it865Ijd2&-ECaww- zK}lWBXlWzkkmaDZ#w@(nstGY51y zD9J#%toIJJrwc@vhCV}D#uJstis5UUeDo^ivI0yaAPcCh21WaI6Gb4a>2%MQ(*TxYv1axuj0et0wgNEmONya96c~#~MhVHPT?7V@v zx>2~d#qOEDcQN~= zQA)EAJ8&-KeG0gH6()CfjJOo!I7TcD3d>$B-X*$qJY=7F+JRf4R6xHByGo}(7?=f~ zQlFrPi2UZ9()Z9SIPrQ?)Q03sp-)Pu7UWw=SLr=+(;bKu^ZmP9N}W7&()%jH#_B3XO%9gE3xLYDrdT2sWH>D{u^ouERu-qoM0C zCHR^={7yNd^xOB#O z5zS7p6KZRWG}c*Dk9Pn9n4uW2tyeqjIU)chhe50Hjp$)^t2+E7fYJ* z$ZEyy;Ar4>bJk+N5lV`gOL_on7hm?=y z|Lv;%AMa)#Y;+Miab@iCMD@bSp(S@nvUfrON08#hPMER{Y;3M4mWzaY8@fS=S;LFC zyDd?jQcIy(amk#^2Q}K0S`Q2@9mX=;#h}=Ckt<(moi)&{FeUgFA#!QjoG}M>RUZ4| zx3_V1#(43jadlY30q`!BrZC0}}kNJaNIJUw2Nep0-*nMmow zn>4QuikO1bApD_PSwRIdMzHXiNg~~JFDnQ8s}V&Y<`fEDXa_;Qz$Kbf2#6Y z=}yBFp_L5RSts54JDZJm1^DIGoFU#`xU07Eud|Mz%vxV2IFN=M)jy z@hSt$#N?D*G^jYrIuDI;f`-u+iD)#tqnO*7ox!&(e!P;F@y!lxps!O1^=SAsXU84Z z%7Y<+1v^b7%2dB=h}BwYn`DGq*lgqlVJ|Lks+3?A)4qYco;da|flgSP_-(KY_u@}} zTk2m61l%zEg~%53Pnr(0aDmreYv_Z)eJ_R5W*^)p70w2?(FJ>=9H35f&7 zp8On4UQ5DkCT)0DlyZWG+QDNV@t6@kx?kXj#6{J8<=w7p_0xZg2w~ z>4bu=iDXvvjoz8e#6m&r`wDfZ-|7XAdSqI0kXGhjI(pZ4+)k-)iO)Dzk24bs*-IuA z3aRY)^ulvZVJEm`skgVxf+NFD=zVz7J=e0brqH?zRyoSE|NeW=0}{MmeqO) zvHc%5TG?DX2_Y0HV^(%ze90>b;BfK+ioDR7L46NgiL(Ek{6O|Pm}HCh6S40wmVv7To}_?^1v$MnJ4c}b3424`kR;f$;KS-=O0`T z>03CnKFI9+)%U8U%`>D1E?&W5nF1=pvMqcJ^=>1cqwj8FB40zhydP6>UJ{)Kpp0^ zd^~Dc2SF@ohrp0IP`~CSVgU*oLC>)JhQsJFdb}zc>17?`gqH{g@x^109`e++&GxN4 z6mmGDM8|+cAv6zwLSo!P2wyXgyO?x2$eWaZ{CV9u>sp|+-pG}eFSk>4s+95Y#o5WEpq8+Z=|Jvvk4pX9!0EbT| zVPnVJ&>;7Zt6xn(dl$%P0s;-n6q`Pvd)Nd4ZlHI`C4Y3=vrfV1r-W{PoW53bK5dqO zO4MR}-T5S#ZGPl98Z1j|5N>wfbOl#mRlCf^E^abv%)VM|92on#nQr5)e@W?H%SwBs zH|h{$Ho=aYQ(OJufq3wSE1qh}^-kz0C*PUjl7sWciaUN7YVt!D+T%B}!FYCd@$~Nz zr%znGz|tVNs|B=G9ze_6rAxn)#nSZ3@P_m&KNr@*IA1aPAnaW`hBk8^-zq@#<{f>;E?&6(8=m23 zxr8tki;v;b*ORUt(O>MExsY8I=Q(_{mVQLQ>*i?~7{O_36m`g~ZY@FY%Z=i>)r7U& z$_6@#iYFETa}-MkC+o32eWic&froO!00vg(JeuKi8jZAy;%FXJ89~GC4j}{{p15^V zmti4k^$r1Dke~hlc8P5%QWJIk;bHrO-`e%lKGS<*CC1fdf~NH1V&j4Jat3F|Gu*4w z8I}7?KaaCZ4mBGdBlk-3+OFJGdwLGb7Usss*Gq;JttOBJmIaRmSM4)>y&A3iJ}z#S zgv2m1JZY_)t=w@O2zA#7C-lmgN7ki>0kFr(mIoQvPYkn!Ye`MY}$uM z%?%$?o3;Y}5t6RMJP;9=e-*mM`CwOA2qw!Z;wI@+k44s})38PFfVCQx@Epem!p-}W z8s{!*kFsf}-gt031&ZAII>5T&tu1}$QxD@a35ka_xoq6ESd7ko9LW+!C2oc_Q$`2^ zsrfhv0<6xt4sktoVxvFMC$g8HE_M$kW&2KJxin zQ-F4$1`6cjt_Rvj0zY&=iKm3g?+Q}=$;zv;{}a$ymmW$T z^`<2?xwyW;!80a(6Uftqn_0Z~#CDF?O4Kp?5=tNP5JKK=USD~zJGDjcL&%Xr?RxsU z=r?j0U>XD!;5gk_xrANrPXO)p7)0_iF@T;ZE+h6u@1CoT{3`oHYM@|5lZmoG`_4TC z&>)=L{oMNH7ay+2qSm2r(}G#gL~7q}yq2F~@<7gFswQ@p@1M>8Wn;4A3S880Yg@6wdXCo zVW(URzMcnJNcuU&++)wi@b=@)CHzlm&1@c>kqXr(ZdULHJHFPu$F9pLxxl>DrXLkn z9WgamI+{MvwtxFaz#b=E#{9F+-j}gFo4}7g4u|mU*|WYGCIJK28LSo2E)?r-s9sOG zMXruVWVJ;(Uv4;bcr34)~bI4FUFj8^uva_Nq8fDL4%j47@7OC^s<-M?zQMG=?jojNmvaeBEs8!Y+*N23SPDhBkxp;RKZ;*2of69q1A zJ$AN4tW+i3)_A`7LrKAHt)4Y(5&clG$?$Xszbm>$E{nL-WAL?Oit zBWNlLzQ$-sy}|pPuDWb%jwWSuYHr*<$_xC>arw6^3tMLACyeS?8gY2QtQ~SySm&Pce#q6}^K)PLJDdR))OqtZ|YE2gd7%O#O4tvpzQ|X~J z2cJ5R=f@G(JlK`IFMeje&*s6{buyCKGyn6B77*ZLWv!kzJ;K+^egL}~qT0w#qMa&pY z66jQ0%u9UCG2M?(k9@o@sxfkaJ#GHi=#72A3&5owRGrC)Zz@D+{*cv?ujHv(Bz|=B zyvPVR?EeUKLn1;qc;#!z`?Nd{A2lVclNWu~LgQQ=3s3HE`7rjZyHm*z@C< zVKs7^n#k+L+Um$CMP3=db}s5s%3>IGF-YXLFC9T1#>#W zJ9axky)TrUu|sF}FB3g7&vD7l5i>k;Hid`r%j(`e@MJr#G|EHBPcp_QW!CY#*f^G> zi{mrIrv5`YNc`zjHwB@iLt#cE5=tgdEpsjz(2I>>{9}or8&%8YNhM?5d|y#{>py^} z4ub{m(UKbhRf$yx4?T=s1;|67c{!a(@vp(bOQC4Ee+>d$A{;>{xc^j`kait|_nn0J zd4@0VyoJUig=HstiBRUedS_{!;*}4u*9=R<=@N&aM zQrhKqbOdl3*OiB)PO>Am6uVxlaJPluN4luxNQLB@nfuLEXojUK>To~5x68OfTPG6Q zpN;ACO?3=0PpqgJYo^gjo6BS$Az3s8ezJkSkl4<1c>q}H?yUA@#@$wpRzc+bxG*4)*}uuWW-9=arX-%f7>`>dYryAWS;UUAlNQMHcZ3bhTIjj#3cIa7^ph+M})S(Kez8lh0gVhv%)$%(l=W60RvQM1OtQk_0E3P ze?G0^Z&)zSQ&S%3A38GmPl zQ>S5-PlNm#1I4I?sW*}%{W;%DXO2qhDjrh2H0!2gaOVMH@TWm!h96C~yRQjsT0`pK3_D^F$}m`^yDdUj$vTfk?*n z^nke_<*v~;5I z%SZKMf%k{?Y2^qsGMOsL$Ya%Ipse56Wr-b@du6Aq<^e>G+jp1tVM{o)EUj>nNb+{G zO+V{bCb0_+G-#mb{8&u}L)XbDPT-P`9MjAC6hRBI-^Ulu{tilgn1sOjj|S=lrN59o zXM0OZ;vm1N-NDbhXCdX~%SjDbI@`Wimsuo^X>;CZX)e1z(5q+}{muGjsFd@;H%Y)2 z)8N`YBHXv~-*D~O>oUwO#b0-?K;fSz|BTDuZ-yBm8SZ97ziUQ!lzvJpr0VVdREbqk z$BvC|?tBu!$Fskr_e1oR<*j$a>knA2k#2X~o4WeJ*!pn9Ar{-~BL?Ss;=k zjrKj^>GYYMD*aVxdXg>h?NEJXj{3;`<>kzTJ}fED2?{iz zJxG69D!FpasDjzR+-*Ew!h!i_9JCFNEd`SnV1t7gOzZ3W@_v!`SQii^tJBR-jJ z?0w+1Vv@sT=rtb@_W}QO*~4kBo40DmBRhw146W3Q2;U1E;Rptm=ZR{=oL~tefbg=C`04OH ziLOdvL;Y7VdvY!U^X=`F1xWeZcNM{3_)Hzo>px}UHH#q5+|y3B^9Q9Y4S4zvGNGc$ zR9wC=>mHG`;}S7P^;Vd>P5#;a-(py@Sw?KUW8QoXJNol!!{L#Jh0e!|!6Z*nl!u`t zq*St@Z#i5i*cYCKQ4BR8V|%RXKhvUgA_84WBC zLGhN4a!)0P(yHD*c4a%MRa0>rxOr*iD#s-U7Kt_}rGS~Vs_XH*XeK^upbwn)e}~3_ zO4OZrMu?QehYM^4B~?K7iX0j)5bcoG?r0cel9}M2u2A$ym-B=Ak>MYXy7g;8tI?xU zy)|kgC=IY4%>HT5GE8N0c?!U16$_3GNd`IE${2|6#P?b6M?Bbj*7`@pz-@zruZ0X* z(QnbjWeRB%PsVx0DDl64#a^#|)D^6e%d9Ql<#qrAxFi!CYKf!O)b{_Z{Y z(#y+9W%Oej=bmy5nmhrSy-vP#RB^D#0(|#vV46~XZktcaBkc$Tkb%-2GvuL_A0E20 zNH=iJ7xpmM-`(KEra1rNrt#dR!Za6N?n9vs@slAgW>tB2<*iIqIM{&(Mt-=OODpn% zElxE|!lkLevkliaHXVwm=?1H5m$K5?AI=i@d)Cpts(ylx`q7i)5R|6|Bv_%810`SU3jQyOFmoZQhO`iXl z&$&A`$&*-l=2xOJl-|K>a4wfGenKtsi(qWhn|{7skAGziJNOUEeB*K5d<0Vcd@b(= zF~;aM4l~*f;IOGHVLnr*b~j#Tr`#5~D)J#E^U0nQ9+9hjuxU5rGhbHyiC^elh^miE z#`a#F9+_}u8OUtB7BV@j6ne~U8!r@Bcx8s4wK~IGJY!D}6Hp2khZ9bjhtM58M86hQ zzb+dZWM)B7+d+FdZ(3_PbHy|G)sr#0PFPlrTCX&{8gC1S!aIox;jJ?zKRe?DFgXFc zzvwT@W9G*L;I}S`{A?*sP|q22(>OO~DL}2~kp>ivk^zSfv)BrmMdnW=^y_Nv-&-`U z>UHRfcBz?|(~V8%0Mud5TwbM$!y8t>H6;>e{*zy3R}sEWEzdQ|0O{ zW~q5<^}-+k2uM_E^OR#gSMAu1FFXiQI3ur~F>>sYP}l9x9(BBuLpz_e2M&a;jMMo& zGjVX_fl_2l4_vJQznpPNOGYys-o3fJ>cOEXw^uQc`RE49BmM+~)MuTm2EJH4Y+D3D z5D>k>rkcP{`nAM%M1N6%P^epv@6yx7Wy)Cw+Z{j$$95kW^D7}om z+l2Ib<)d-sB=r5&g_pPZcVF1q^%X>sDtLGHNf#3Xf$G;DdgynCA3Ud{$blvc_J6)s z)3^-i&~q2lM=fdE$Sb)R1~b*@B45@3=lNi(m0gz(UN^YtU}ndVe#=u!x8xlOqP^o5 zGjtLediM+RZ8QRmhm6L<%vHOxa-i19RQ9KQf_x|58iA%N``0P4Yq>?t=r*h!@1tjM zD0Vm2-}aH6ZPE^pW4m3-esMfRsia+BJ6&AHRd40rme2THj zEI+*;G$`$0d%p+Os_&J++jNs()AfO1ED>n*3XdVe6II%}%ES(q?Pu$;J@on7HuqcI zj$_{NDPHG3#>T4p^j!0%_%)2mOO**?`8S%tUkMJEV%Och@?VaOuF(ab&nt(&cEuyd76- zT!BG5*duQKXDt9GD5z5>;tyXCfQzY|T4)|MG8mm879gW~FnB1Op{c7OC8U`vXvB|R z93+wvC@2C!fc%td(%(3Epzd!VFGTZp$}`3%dY4a6B`*{7)t7xY&HpTPWNpM?okO9) z%0wsn5K`ha+m|h{bM>+n;eA9_YR~y`^Mq3Eo>Qm}=&S=0S$A1?z2ZvK z@MQu)CVd7-l1hr&E0^cNLPcvpabD9i=I1`ucifG9cLs=>^{v|h(a}w4TbpFqJ`al# zRpG`v``O~nh!3q^ifL`t^>UGE3hIYH`k1HWiY$2Y@F$K176U*|5@&qZwlYQ+TWL0# zXT49N0VDyvk_8#}Tpm7LepJ|~mt03z#!%a55A4m`yYZ+`{Q=D0y%MKj zYYmBH#sVj-bjiNrbCCuA87AH%GC5xfSG&S#1k&dR(I!Xgxlv2fE}`jmsqbPJRW)k7 zZ{>z#glV+Hf-bvMW+_%W#W{PiZ4caL z%T#Yjo81#alJJiGdg<=K=Iyso%ldP*mYp6Q;*s=@oqL3jmOTBkPx`JwF9yN;u9D@h zSJ3PtE0}9?c4y3&fJy|?V2_!T8+}n^e=phJAYyD8iUxZv67qoP8SHSnJb8m!Vc+HQ z+5VscXYR;IHuM_@%IxeqWgFFW-Df7n=ZHZ)9BR{CwSH@}1enMhK=4bZCLa8O234>I z-KDjP%ZwZ!P?N&svuElV#jk8M_efo}oj;qX^{7-*uaa*(3{b0oKUr5qDKcQSRez|U z^PSxxa%;>qXNMPV=^diR1{<3UF{;A5eD>3BjX1Lk>~@5Zc!6QraPy`12~jV7_x{yt)&rsAPoD* zPBBE%*e1^&dc{;YoJ@c21GbpdIC}ORSw4Trg|Ga>SkK4UPq~sqkn(*9JY9PUb3T%v zR;NYp0T~tJp&A4xYeiZ{GnYJVV5?2rGKm2WIk%eZHc=P9hJ1gn9r;WMh+hQ|;4!gU zr7z!8y&gPC4EC$&Hqd|jYxHnQb@UaUC$X_2^s4p$w&f>*RxwBh}OW$C2P=q$ZgA^2U%El z*y1O!h<4!E70>>Kd#JG;6KONSi34z69;?sabvo)JR<9skCo3umE>C;txYCvnE z_*S{|jq}y2FP}7MRE|!(a@#j8FEWJ;UH>xPu=&_}OLFAP{AhhHRma496nN^k+3*W% zn>t(ZL$5T&FkutkBw+xagM-58bCe+3sh}-Ni%Bowoo#E_qo+DUJLO0aNoXUDeG6=$ zn_BLXbYzf#1b{N`A_8gs&;@{VLqO94kgG{_6NB8r|;!K!}p|I z_3*6}&(x5=xKfL0zOX;`T35m*kc;Md!Zo}uoS~Okp)u4Pn{s~E_e5O_mSi(ZZs6A# zN+(rnhT#=|G8L{l40X#pG@>0K6>1CyfSs9q&)79S=DHY2j;LFP(k3n)f12b3CAAXn z$$Q=O+u(F~c4m3C{nDfN#LW>d6wl>0tG{n-V8<@!(AYbIxzDLXAM|C^-1)v=;?;_I z%xr%%Y>`z8`h%WPIvN{d$Qbe*|(u}R2+ zNe_Ps<_JyWuCMvi>?GCX?(*hDnQTow`lYdh3vhy@-E+Ivp8YyCtSFY_4Xw;`s^=BrN;U$Z(0M?rH+y`6&;!yqbGEdF?E}4Z zQVqz@`J7q*9z?@`SzZMn{YGGTyT53C;C$!Mi+(l#Y9OL!-d#x7Jw!5>>4RY>DC%td zl^eobBNHpn`_=mJ%jYGQHwngYhPUqqv8H>nh36+4UXWh?$@m+k9Wl5Ws)xSS?r-yU zF8W?S=l9*sWoaUY2cqeKNP28gdkLI!P>bVR(|gw_fZrv0N{s$P^!~w^|5?1NXAmQG zOqfgkFWz-QyU|5$X*3BVWml7u+q6GP+?LpgDKcXcx#fSb+yBpa;)P74K{I+sYniKf z&3=BYo&LSpQTS3J%;V9nuWd8CW*;2>P^_@^FzFWHyudp7(m!;oIyH?RfZ{;dYu=7f z5T7pnlyKSXkA5~u??*WSs6w{TLu?ugfOZ2A{gr1)%b1q&Cl-;P(OiZHaN|Bd+<*Ls4+|NN73&m(P)kr9zNS+yajmn z28X}XW6EgNH!d8fNh3p%vZY)b8>`aqNDG`D5zBXN`1c=MsOW@*eZ7!w>@+A#*`JKu z_(3*53cPyxG<#lL`hZrYzZOr(1|N0A#}s{1>Xl^FI5BR@hSA}Vjw@V7G5UIeycrIo zh(LzY-iiS7HWUMU;j+df-a*;nKLow6Z6k9B-taBeWJS;sYIEzn?QSR%1qGLq@5|iP zM6uTZnK%e|8xA&IFg^H}GZ4$!0ffNAT8RnuWk1r{-FN_R){X!V7ADh^{DJtH( zPzbUS4?b&T<&4}4KK_9BMYjE{Q_HvhGgzPrEZbuuZDvnPoP61=uJ1V>1B=xWZ@S*->>$7qbVEFP7?fZCgi6q z(;=s6^YPW!LDwj+*jHww{VfVmQPAMdJrUZMSHlTdLZSN{l`hstzo>^Ifjh^53^W{c zF5txaX2oOY{M8qp&TeN$Jr?&08)_Y7y4nB*B9tj?Z9F{NETv%b2{`CpiGv0Ru=S32 zXaBNPA$V$!e|flnWjMF+mxpeQ8;`mZ>t+}APKMljdj3fM_n3FQM57EQy5qeGr0qWR zksi{XWB#=h?o}z11;&}kzlo9pjBiJBUV7%ld+VRZci4Qh@``s=3VE%&=SJ0jDo>uXcKW>#w^yX>8vPELtJuA8qum zUMG1exanYx52y@csk3vXz@jmaHAsz~(trW30y9ZD-))v-xM%9lL}8A@O+l5x`_|?T z>%hv8nNEfOufDdqUpu-44Oz2~$D@EM2mIn#1ifW&Uk9=KK9bQc)8?MFOE+pW;%u(76H@w?`J436k zy2Io2m33h8ta0(RE~B2+{mwH&8V(Z>__E}tDQ{-duk_I`bBey*0l+*-fW3RPfiVL! zl-SOh*L`-sPb8B*UWIFR*S(zfa0|>E3f0_nm;!T`J3i zG{3Me`!%@WS>>}`(2r|+=7GlKc35RHNUGKcI-^mW9?_w8$F`kXb;wNBW#D{>*?xiW zGzd)gdxzfmg6GunL9&NLWn-Q?GX<-4IPfPypfiCgUSFcJ!(CYges^g^M}b;cv74#r z0L-9`v)tR63P17yUKt+!#Q(hhkZB1DY|W1_W~K#NE*_n}s@)d9J1$iSbuWS*5`qG+ zv3IPsrJwQroc65dQkskZ$L?m$riHWN)y3nFN2Nl%J>GE%ETN*RL+Iqr35voj^;BOS zJyJg3D5ix3_*EsL*5B^9^tu2Fj#ZD0H7%J?dN=Pnr3Lo!0Ek_qkq&%}g^A;REl*1M zfARgb#Kr_99U$bRkf8H8$VY=ceAgT~aUR05?PA|rzq<|vo+kL4sk6sO)YiI#@@W0i zbp|d2jECI==l<}@ouT&%R0#41djGQY4UqG8*~?k+?|oQlXY>PR|EG0t=b|=rfQMWC zX#UoH&#Y%Gp?^37DaL@H_+P-cUm9fO0XhA$LW|+;pWOW8C)={+3@khMUJ(=V-AO`1 z`ij5s;;#h7f66zg+qdcg{d`?#LMVGruw)oCNem@9-1eU{{7Lj92@V_-+A@%8RDQ}j zvh_SFF~9Gl19=jejsVb(Tm(cnwu3yZzZO=hY{A0yqpPw-1=O3Sp zSU?)64oF+RG97*->*C7_^L9S?ljRmEZ_Mq#2WULqOu-T`&61xC<;iT4x&sW%lAwP$4eQhPo!4#&RSmxYk;O^335ju=UTbMF7F8`h8qn-~_$9n0>)5Nn!xu_!sG zUxJxM0!p)Z+ZI5f6eGY}l(4Hpn-4Yhz>iSUG;$sonk4W%Rw&P~-MbgW|aYDz*g19!OmKDK!zj6u~9U8vV9W z)(`-H-7S8xpQ&7cx`A*`L72QKwbpE+oW93A_lpEQ7Q70FM6QU_Crx0hZW*A}nL!C5 zqm9EmK@myX`+ZbBHvNq}KhP@^Z^SP+ok%FLU9LDj@u(4~vj9B?WC;N#%akv{6?~s; z=km5Fc?cwhl4^sp-OtsF#$aPzp!8W3M45p@!Dv+F`g$UoZry|R+Hv?)$$f*?oqKrL zPusF`r5R^uNF9uZF106+oZFxFuHfmb(~oJK9p7|T#AVPYR+3+97_!co%yf|36Yjsi z;kr|kvAITqqHL~4Ze}7o7$TGHj91DZ>!%^~pPiXtY=shOj5;Iw1dhl+q~;PvwuqHj z81Zvh_B6XtU?bzlW#ez#3b<`FHmUV8zToRV-9OxRgAS?*`>wxowmLP(_EoyaG$kdf zLDv77^Wptx(^K{SY4q1Q({B;CLvNk{{3#v!QDIlWR+o$@KQ+N8J8g~a`MRC=8}=aY5Gv93y9yX>pyI(C-CKdJ{D?;|$Q29bCE_W`BM#6s$!r z(qu#-8oV;Mkt6^Ekl_SS9w54~A5^}2CI!Bx+C6E)c)OxFsgGsV`*dK+fc@UvTJHlCBg|PjQLpy- zjroqsO#E8=6HToFv@E@gEWJ!0$yg=}KvO#-zk@cho!yV+_Yg`5rf7|rY-nSJ^?i?3 zI;L>;&^&;G+FRRft$}&@D4t_N3uU(_?hu%d1bki%E27)oCXFW{+mVXwje9p)UP!m> zG=6X<4P=-U(o!&7UIpl{nJSIr5kLvGr&Hn5XQJZG-G_$te~A{4N6d8jw%D!xAS}mX zC=AEOE%4^afu*tOR44}ON1jEI=gy5k)fNBHK}{8x$%oTU)Zf*N1m}$fT%XrT&~^{{ zvd}uCFBWpzq3?S!lb^0fIHHX2NfRlwXK%0q>u#iqv4Mv(Az!-bC1ir>i;OtO; z6u>ca#U#cIe$Z%EGLUnk`I3hH59hmp^@wriDIovMyVY;AbI&Keh{&)dy=9jEo>3z@ z2|9$R51*wi*HK?1z84s$h;ERl!NE7q9t1Efi8uE^SxKKB{Wb;gg2IkQv9@e5qdbvM zzEQHh1Oc2-&l~X^XrVF-M|`%yhcZW~!Ubxd85$5`63M8;Jamq-u6MrGtCvnZyH=*g zEn1C(i@d>M#3V+7=ZQ$BPu_pxXSX`!^jecoM2+s5HE|`M$dM5xpDk&qy0mSOvrid) zOdM?RUT5rJxA$c7N_gI&&l{QH{|&0uSzUXLg`z~EW7BIB0ua4LFXY79;VlE}+ns)j zOF}Tl8}efxJoMn+8X$J6Kg<nsh>}-mg@3Jq*eDcn@KajS39jMGB$LYmX ztp)kf`j~mZLZF_-wtB93qAB0y*dEuML58hb_SO5XW*q?B%>k^4WYT5}sJ5Pz5lNpO zgOLk63!saT9@4Po5;bB#BP>2`Qb=ZZ-?wW&Y{I|wz5aIiM>QIE=;f&f?H8xofE7Wb zq)za(j@{SZikf|wr~iPy;pdmhva9zxN05>AW92IT^$#5+ksDRmYhOpy-U3rO^f4Bh zlint^06amEpOg{cgYOK$U(M7fVUNw?5h@b%fwA~yPr)lcR~Ig}bbb0tA})W}JI_>9 z;XpQAT*}vI1~ZHtZ-)nl3AeOke3>cp+N_x^}hJO zh6TM#-nidd_f``FtRNoQ+ujPLcjlfO1VS}%&Yn4|9obGFn z<3?%Y|fJ3`GbANB5lSEf5VW;IOj)%ya1wq6IUe^hZ9FGN0SvgGS69^T2P z?Tj4d(AI*rf(V+C`Bck1$4q-~dRlArp~bzDpA})ChNpUoY-ffQe{Lh~HktJ*s=F;T zqIxp*+Qre!Rx@|~HV!*{z(JXU5&#m@{pH0v&jPX3WJq(`$tumTSjDbaq)k`(vqPcO z#aP@udDo(Uwef3~U+mOsrX)nqRmb4H_Ze-MSj~_04<29xRY}&=?*6`v(!+mqh&t)h zpDKo)qP$JNKW*dPwsTKdoSb}&9#3ODwfFA2b~S;DSxsEDl+>=SfzqTK+dQSi@H01H zV0-W>hDDcqKEYV!^@>m+v&!8xrH|la1xQfDxNvyjR%YVRWu4WFLjGqr+DJrHpCjWe z@vK4n03OvDN&^{1?xNn9)J<(zWmet*cLUF~uB(31I~=302Z}Usao>7`NR&HwTbr@K z15A>RDcV5;bG6ysTUUZ+GB(z767*g*icSQ_xYZY}+IZj7Gxbx1FqyJW&wWZGw~_jW zTqR$dxJos3=boU>Ql<+u$C5s~K#9OXzK#+hyla4AU!vEYdUHJfL*+7A^a`Hnk(?tY z(WuNO%Z2_8u7Q=_%uv6V74ONGzgbPu;Q4Pv(!T{mhxK61!5PS>RI>ED{0vRbrPaKn zZ%$FV564-8wcyno`{%hXl&4%tQ*e=hQL`jEj$qBsVwt4Svf3d!UhhBtw3C@Q-9 z>W;2vIF)ul?s8pxT1CL?F1)j{D^$EYx`j+sNF5CXN>Y)1xC7FjWw5#P0Z3&ss{|QV zel*p6aXT{yLYU%D%n{{8A6BWNofwOgU)^ecWqJY8LO?`r1|Nrf44q2)frfrCP>qb0 zY5Tc2fQdy6cGa|E(xPDr>jBFJkOl0h?q7D*Z;^d1!!wX_g9K-I5Pj1^^^Sxj3m7$? zbOi7#izY0VkyE$dr*8&(;M21d55@a{N4LIOHR~N1sNtZg7qm-G5DnfX&(T14JGrZK zJF&R)5mTs8%M!$L7}+vXASO3Kp6uy&%>2!0E;pXTVr6E zT&4kzjBITa?+F~X%YW|*uQ_?7`%u*JV;pgU#<@U%6{#^UL28HNo74fuedvPtj(g4- zD|cm&3J#l?3A`Snp{U7E4+=g%z}BM1VWj|ae(;7xW?@0zj9oC^yJ~kdc zm0Q3D$L7BDLVZt#le#Hof_-OMoCjrf93Sxh)8xPTxad`bZbY=|#f`u!hkasizc;)u zE$BG?uU)NeU;cEpTK>$ji0pp@xKoR}MGrg~M3O|2cS8DaPtDqRZzyg1TL)zeYJXcv zt%Z~{|KjIB^~wI7zdfffe4BnZ4D5J&`?qhk{~q72-wjPK2K?o-Whps))%SNp$2&#h zzpbh#Ct`j#TzGPM^tau$mXP(>w%*7tfz@*d2dL&+AB80wYuffAj4(JTv|bv{h%YV&w$ z>16M-&4)>T%9>E&fcg?VjM0EKwl`bbK!_uPZss4ob8T11X8@Y>|15I_iX`1{d$aiD zjPTwfF|~C;bv^)V2Sg$|Ott81*#jiSpSf+Jh48M*uh#rGGgN{WmjfNJL5(`Exo3ZKEG#t4U9vU4l#mH7D8~)K&*1HJ!V-Nfd_-% z*d3(8k}h=GztsO*?NltY8VSl;DN``gG5%u=4=c1>_Cmrn%VniBz=$i$JlP**Rv*-t zrES}F-xyi6a!E3G%m2TzyM?JxM06VZehajay&(5#LnJfz?V1u_f{ou3?}7?t<7#Z5 zbX{=cV0%Wf@$$M2eY`2+PT-J7R)9q*eV3N}kHxjH(joKp<6CxXaNVz|$`j-nl#WLs z0o$-{G6>Xz6}WZwN?uGwa_1J*nmFa5z1{~z+trVfpd|3{SKG{(W@g}%ePy}+mGor5 zw(ys^f;2Ye7`PwOmhc*l@oRi|wB8$y35NA7hK~mO0B#l{63u{Z5;5S6k*zFngkK#V zIn8-q>9DQ9>Z%}L%8?J&S_M1q-$3lVl>f0*ayT2L{Rw~_4nIHrtdtA44wfYQgi^5= z`-8)AYJj11s`GQFZg9V8;fFg+2ddSwyJjRq)FI3r4K+1|1e_Xg-3>5p5b}zCaqluR zNjuZuNl39vwdiJlb*|udo`cc&A9!G$#uOhCP8x`E+F7zXi3?ZF0-AYRIj`qQK*h;~ zC4kJ;>|30H^^Yht=NUzaEY!vrq+bTzRL9dXz)HOswB1#MI~6tI^Ld3 z<8~~P$TyWQTosqWLMV`OFd?iyZV$!P?0xYtEw&9Pu$mKfh$4X;r1O_I^wa>4a_Nv^ zwyu^*hGP1q3p)$|L#ai5gTvTTZaH9OmD_fu?!_Mcj|E#JsMfr6g%oGR$loonTeLrX zsQ(_+{eNeQ-I~Nhd{XM;sT)R-STP*e7oFVGSOgD70aSV^+&V|iN$rXmQ7HqESqH~V zDXn4FH!)kL3(JZl*;zHv2x@<}XN{!U#?$oD7xPzWo#E8>nr}U@H!x6Dbj0`jA2Z1r z(q#k^HEb0Rg@LVdnUEj{8tTtDa~0~ck%UkG#W6aFM-LiY6gBpsav$OpH!BuBaEQ4m z*IlHB!6KAE=C(gj)2^qTUpKj=NkE@e$(>s$a3Y@CT`hfIa@WR{XrT__r@5yH37{3* zOMy1`!f60NkB|MIJhEpa8EVMu?c%$ILcV@Y1d6^g19AcnyzUge2j<)hthd1z-EV!TlG841=%kjE2(Ql;Pr~%mjf_{h#>`soj)%@kp3a}!zZF4geEC_nh zvtB5)plBma*K6iVYEeNan6s(&T|~<=6`TG2sOPjr{`i`s`RkkQRXi=*g<6L`vsg8` z51cLvyqbBu{`*SHe2y8vzR1<7WGv*Er?kwq=kRh3gEOGEc8kAIohIJbh> zFXed8X~;_J>9c|WjFaJnF+k1by8QhDhQ}?D(>H9U8iji zt=qOXG2!_f9@$8j!0U&v-H!mu#1WUp2^2IiZO8;~p>^$N?)AVtYJgp%4@c7sV zm5eE#C;1b?GR2?k(_ab4-N}sei+OJQ7c)mtnqs%qa&P58BZZGZ`u*t3oB12k?+%A< zp(l*(;oYm46HrIN_TokAftm15?&NmRQp$8@H_wx__2~TyXPnWDw?JKAp23^NpF7nU zfcY?Nri@v_nOvw{aI9&SQn%~nglQ_bLN5W+{_N?!lfR}z%!k9Mlcx_qG+I67v$qT= zr3+-2L7A>hGj1p?V&4FU6!BQs)_EBlw@e8Ac zfx>*CenQjGdfdk^qp=`}Tu8rDcjm&$hMUSaFU*1nm-TRK15i8~mhsWs??Q;%oivkB zgqdD-jtr^dd|!*(0))HeOmE>B0)u8R7Zmlm)(n zQ4C%YP{xqBpc%+yjUm1ed`86dbe`Ts>gL1g^t!`AFaY6TXdgSlWH7xJmH}cQpdHhB z&;ir~*P;D?9R>=371Ac*hG$(?fqt3A>;F*7m+1$_!~Z?tABbNtQsuz(Ojs@$!L5}8 z-d`=dKtQs9dJbg4zCCNmeM#-4yp6YKn+@^xKF;y@*2C*%FTVc|_TDops;5~OCkFvZ zl0ilUkvJkb4j{+?0wO^L$vH;}5{4WlDj5OEph%FY$ViTY}qcEgl!oK70J?DSk z`~P%5+_mny>z>7zVRrZI-nFZ%yX&cXst=!AwgLN-fMu_7+fV+!v+y73y1aw?=Vbk3 z5Pk_fgVfW>g%bh;7 z1uv)II)`Z$G2DvSe%M@=h0?hX1bFF>c`pAz%s1l11|N)2sE(BfJ`!jpMfhUf6pHUo z8sC1yDJjvp=Zfu||2D>#czT?|g8^^l6#*1f^ZNSA*;74_* zt=Ye#AE4=@M@-vSc*G=g7IM5Cfsv{lYpN)Op-AGXAC91`vP31-sCBB@c<$ELHmr!C z@F~k|00I`NCMtk<(uo{M!Hr7`2Ozv6Z50g9*g`9IA4v**j*fno%#D3ONENyOLVbS< zD2-vu3omDeQ?Mh2&hOu|n<`jSjvYm3uj!>?*2lhJdMu7VJlMQK37iNZ$F47|yZk4I zaX<_ThDV8aPQJmnh84F=Lvip|fqS*UK`aV#S#$IyccmEOhXAWL~4BV}8m;(H;2t|1nqNz@hgP@Q%B@I`w6cY}=dssHVQ6;#%5s_lPLunTqKykEUN`?6IyU4EngDXk%eapsM#|1SXK z3yxd=49~M9hv)thl4^nDM*e1A+b+obd*-#XEL~b(;F3F zBa83i1Kht4=KLNq>S6McK-_N-3hftZ+aBu?$mgE=_USDYH}D7Yt^Mi&WZUAwdwa#W zX$X_KxZzx1*!t7lfFCVa6JcG?eZMYOHmeI6c2py(Ia;X5Nhv$tFx9p z@Y?3TF+^j6y3X|Qq^!)JE8aN&Ta*dJ)cTx*K}mf^v+*ihgPaj*IE3ea#UnUDqsTG% zoK?3xjKh#@+2A$&Rb&sx)z;AV!TKk5gF#n32{heb66nYw?iLjUF@0k=BdY(Y>wd4< z;eXLY?~lzARQy-|_$y&KyzU%3ghH@;{e^s?UML_QPXZYN8^BlbIlDp>UIb>f;Gu1n z9LTN>x~;D-4c@v27X@g6r6pff!4h@@*VALFglE#id|7g@^=WT*0Py&8Kd?*Q0h}ya z*hoY7J+Z0%Xq(G^tTyE0gc86VeeuI3)gmxOA-(nz&+%lI&Mj{E8WsORBb|b|@=@*S zjG6BTVsciq*2*cS0-e*UHKl4SB zc_chN|XUVsInNeQQTAEP*@#ApTw;(8$x&SQ&Mcf2^nbw=+uu4M} zWhZ@lec{WjiWB8qig~V5c@1CZa9G&ZNPe5cp+EeGJ>mEk*T$%m&*(^-&ryrN_a-&- zAemI-_;O5=p=?{uP<6i=T%}x-ATTjWEj6sz)RkzG$XU&$J5iI2Sfb>ZB?WRk5pGL-|Th*+k0A$Qs zO8JeC&01XmBLV_R5=}J~!wx@sUW9ez{p+&OU8UXI(EWMkd0rDo%LDeg@*Z5#kXH8` zQRSD$m;l(Gv*3ry(i5+2@cTCUKg-LTy6ldoRE0Y48}yA-yb<4*L1(qkX^vGE`km67 z`?)3bmn`35ST-pe32a>TP19 zteJ<}kM3s^CS49F z`ct1c>6_d4r28iF&(aIEYZ=skA~T83z!nJxM(!1(7K&QY1vg>cLv>8{Jkuco4$g=m zh;XK1(5vt-p-7n~3m;0qSkUc}?*#h&5B($bj3hIX*hJ1XtX{vtum)lj^&skQSs?}w zO{E>4I{&(`yh)UB_O^t&xwa&Ub}^EZ3-X>wHvu1zVrZO9d%9!z`Jj2K_2`y+o~|Q1 z!T8Ko(pr`OT%w`Um&|hWbH!bYrH35uSE6T_1Ge2Yb;4|c?p4(vuy4`1%$yHO%13=; z&T=aa54;cR&7fw~ZeA>Q`%dRg@@iL4I9kzV^${$A?FWW3RF>-2#2k z59PXLWS6j!WNxk3q#r2b4=%u_)Lbq4TW=uzy9aBB^wY1)cc0gmT`4MU`DQok5))-sWITKld(H9&rkpe>{|zOc6Ew%Ch(BcYu(Hr^GA-}i`F z!z`uWub|1%2+Y#}hf7>)8{CINf?hj#ibE%!{Br{m zH%h+Ah@H5M({<`6?%X%&;H+CD_a%f;FU&%WghjFz_VVf79jCvCPhXmOC3A`w3lTVX!BymzJ5o?`!!$ z-tB5G<#=bPa3?bUVRB&Cx0^_F*NbNXF|!s5xKI7uWiPXAI?GZZmcvDag-hFS_b*Rs zhP-?ac(+;4zPOcfTXo(YH?f7k`r7hyT^xMIpq5woiU_M@)VI_+?@+n3TynpE2@8jn zHKlSO>dam1iO$}9sJ}FL8f#nEzd}5(<`~Dvk1vP!e(LLGpfHc&#EtyS&oO5;ru?}9 zIAmJ8@F11OMqFHWa9^}xG%1&8y~r)QiR==3-amp#&bi74wb=K(#T(JA$+91?_r{pA zY9C7OAp5C!^KORFSr4dmRUj@&8C(jb{Pj7SSAB6;TPwJ)WuiWX?^~~Gj!FkBLO9m! zgyc%{%Z>VPs)cA{>*e>wpx01FEJb?8|N{gw~Ro2@T5@$~!I4Df@ z!SNXL)Ps*t)3EB;5H z)Q+G%D4C&`XrI1!Dc@6Z>fg@Jbx7hpgfon6cNFdpPpVvpU#}rt{(8?>ahoZeXiz|E zc`QefV~7wDQ$GDiL|*fQ{av)?STNQ6PXxE|-IN`Coy{lv{)&e_smd2KuJ!fj=$TLD zncWa@N6jlnX4=uN)o=$A9ndn?_Ywl40)P(XL`)+5I#K>}G295tB&wWXcxq@B4 z-^45TDGRvdl@WVTK_YWF_&!Sqssl?*Q@7nzYQ+P<=7?N9$No=V3q<_9W4;Ili1jH!5;e9;fz49N-t3G@hkb(r93sgHHG;j zTa4AJOwmA}Cxv+)LKAI~FG!?vP0$A&Z-MBZk?uYY5N0$X9>9VN&aO8gg#!eR{XwK4 zzx{jlKiQQJfdwD{i(YkzF|^7IbJ!7f4(!-5HheD`7L40Kg7KLZe-K;33Vee|W+>s$ z7*nIz8G@57Fbrp2wN-1FK2!4!W*^R5u%(igZop`QlUzy}9n59Erj^9R6a1Jr*)m$N zXee<{hCJTIn!EDpuTXtjm4Sva=?FUqO%ly@I><;`5={GCJ~aGpqV^bbf0D}ebV>~$ zlEIlde|p|$AeE}nNmDF&TamiIqX;upt`J8fe4`RI9|y{breN^+L`B8xw)GWCJ>GPX z=QNSSqA5y=L(HP#xJ(z@ph&g*?MEdNxYk;E8{828&_{(`fqek!;%xr~lAYHGs`mqmOfrI07>zWc0&tQA%4*D02hy+q{ z$>1xWsYdSo&ni0%%`R>TWf2YTFw)ed1_E)Eu-aC8sQh>di}^EWSt~-Cj~21*_Yq_- zH);&^mx^4+B{>0Y;;jTrJd#=}d;;y#hZ@}-wHZA4IzOaTf3bub3V5Va_2xqFPgx!- zWiDY=!gr!u7qCNENXiD1)~8dxTTy5;UjOkf1~t3{m;x7Y-S-&mo+3f)Ivj#8rHVtZ z6~u~QaiZ_!H97$M#poj?5(ZcyA!4-A!0203j~Fo;y4mtI}hNL3Jc z(bBuwWc919M$r9zIO9tx7}8tNgOzG70F&QuBdZ~8xl+8_lnP7KXM$lK zdFWbt?L~{cIrrw(CO>_hj0Xwq?7r!E-Fs7Q?oZb^zh8w{>`h|xRai1;g_HLYJ8WIG z`W=>XcE&<_A(V0RyFtY9Og6h(n{9?<1$Rniaz&?V<9M0$tzw&UM&#kMm()Da)Rbs! zx4w3}%u|V*mv9;??sstWbxcZhu>gxj;SR6}!+?2A16HoNC>@1z>tF=8CRV&;BRN7n ziQUv}sY;TNw52g)qZi%hTnvLmeK=6DW1R?v4#!2VUQ!{1E`R^Y)Dra3ne$&II6(I= z@Pt%tfu9ueaZ}>ozM_GCjSt%M5x&lS;rIgJnS|7lXzDUdfYsWty|XlleK`6%oD**_ zyNOX4aijB*Zj(GAT;ug#j2JNt8E^p%+2@R8*Z{)bt;BvdqV>{}}@%yZqhC@nQ3(x!oyi@BuO(6ax+@1NiCy!AU zC@KWIPm(K58dN1#XVp$`` zX9(~>iRhVR9_HMBIrZ@ID&gW`{caqJ;rOwvonSF^ftfqQG}In$-Cq1~HF0Uq@w_|Y&a-)_u zK!N&>;vN3n8M8BFiqw^&=BdwN^GU0KoNK(3-147C0IlE4i3Y46%S~|KqqfsNHOkW( z%n%NG?d$8;H~5PAqa zUAvIR$LS{w6apA*ixC{|KC_*o{k_Y>L{$KX)h|G44*lJco}exSgJGL+*rD4g9%I;= zP{d0ZZ{rriUy|HF>%P3rv51ydOKpAVB+1-TC!MA;@kxgHla#3NDYY+TC*y7Nn5N0| z*?d{~z%*(bw$iNO&@YhcS^qnAS%-=m%Q-9A7PD2JTq~E6;eRw)X^qp<&4ZKCtu>XY zHN+V3Pdt$*O|^;UE2>)qMGcfhIJAHsuD5x$8m?aC3o zRO{GOQiici3I<_`d$oQoio6Wn^`1IOunm;_y7``6l^6)1D%jN2bqKPgQB8i z0%f|GHC0qrp|2AjCMSsT*}*pukyYff+CxJ^j#q9Fb)}hvd!d>WS3CjRlZ_mQ52JKS z^h+(nNUv^BfU-L>Ptu?W)8&zs$%{pg~8Jw33ix~EEI@{>A==6&8@ zmnC_XSaRv16n8tMMDDBcCW@_2C*`|)pD@fXK?xDqF;mxt^E+<&R@9|kmXO2ed1{~D z-qN7t-}vnd{GLM1TMRzq7wsV$3|gyE6H39a4t9yXo3HcgQzJO3_i{G)0h-zL-2Nwu4dGv)ki43_p4 z(c>Z}L_trQZpLK&Pw&CAWokv-cPY8nBo0b>iUXtQA!;iKb2F~4?&({VClz>|Xu~4P z_P;Cue>7h`NwD#(_m%Gy9%;DC#>*$i{0Yy$XC@dLY2ghF-$(%OP}+G>p^e!}gK@GI zQ7$;l##muU+13$vJI^2A^`oWBX`yFV(av5}z#bg-dqsdWH?Y4r>l8Cg6mQ1o4Y{{Z z02szwsTa0Hu^Z&SZPR-2;yyp$*zCFmIbKSx_)Tk-&b zum9YJ0gt+et400zu6UQL-%h9x&WCPSZeXV8-T3pHRVjyr{`#o@EAS&}EyR&Uq=-~3 zOa%jZgQ565300grGq4zFB) zoJH)o)N@r(Y1%)x9O9FHXsT_J3?b1p0dBRkNiRI$JTC4X1+K57mffU;5vQogI6Zqd zXWULj>tyr>rLeIu3J8_A)(1Pon%7^b<>_xKT+}alL+-9d|_~B zUR&;Fo5j^#O%q52Z_RxL>4*B=xt>uc<%NsdTrxv}bUqZ$rJfe+x($)aYtCKq4m=T2 zEYR#_g)JT^bEIL>PK$MTsr_q2EM0<$%Hmt}QSten=o=DV9SfPayBBJWj0uygymlBw za-**(IQ7Ot<_94-*gJT|O{ZOkX&>DY&wME3c@EK_lpRhsHa2@8?jG`!!z%eie81vV zk6#H-!t>g5h1Gw9R`=6XQ$xCZ=_L%p%Pt z+Y$ylxzKaY9DJLe2!v30YzE`34%f#D^EeJW8|q31G6oe)PcBltw1_s33RjPo{$!>J zY;0ycy4@;*Yw}Up(xKwVVf8TBwRc?m{EKtPPx_8{pgpytZG^VK?z?*(qNLvPq7%HT zoWIQz5uKH=-$ecu2v3su#GiEspO>KyQ8%<%>T@iaRY=zDyIFyWZ+;B*JGktnEEmkg z-mQIq9!-~d|I|{ZMCePzm6&mQqx(C6yuR0-bPLo;Zhe;bo4&P^sp_~^am&!P{+Nol zN<<33Hac^f4wr?$d3UpiismjG)*_rDJ(RbrG{HOftVAQ9^ELCUIvwk!-(p$Al?g4H zAQdO$pxL6!A?#+?ov(#BMP?{7&yq&?u55&wPikBg%$(q2V5Vr&7IRkEBOpc2B{Iga z1k-){B^a)!m6)(8AaQUaGZz1pNw687jISJaLsr34@6J2#Px&LoMEI5PC_)!$>KYN$ zT3-mulZhaik8PDWNDO8hh!)E)UgLfdDYA))x%mnU^e3B=o#T%=sO87&s<+8c9<42|Ld@^32-mSDK4#O%@#4@B zyES)sFTv&3uc$vJ{Yd+Lzo2z3SDuz@jQazo5AhURuy`A8O1_aC)0j2Yz@U9 zTe0kM^_){BUC`7AI8N$$&gn|e5*VSsF_<~5dL7(p*ksA_hj>{Dnr^)C>&d&;$qd)} z6;g)Nx+qEw(avDX^EVy$41eJm7Wbm+HSe=7(MWPQ|7`KYd=e2_f8uJ!6mJ&l$Y_E8B$xA@m_Dor##RiQjYx$zjOC* zKovcV#40+WVCC6kB+=maE2$`HP{evHtvWtc52JSrqRF40sQY~;b^e>*%wvVn@jX6_ zi^yw>+t2{(S)c3a-KmkhHaIW%)7zRt`200`UiU;pgO<1q?aexKqGA5c9D*XWnve zaC&Mq-kw{XgpyO*+&gufDE{-(SJrXXikmui1GgT?B)51i;v~p4Za!T#B_5WC(5gt_i_FSt3*S}$ z(@Ch78vH2NShtTTJ|46acvzdBpLsC5?8~Qg1|<!>Fdp8V3W6H>K^PU&O!w?9|I2r`IIgLeSbJ(t;Q8vxGd+ zU5>sJ)K+jh1a`IB^!b4U^y*?3HS%KoE(}2M>wL?G!#+M;c&)#*y}v5=&*37MOhKTu zb#8U*^*cGi?~>anbib0*ZYA*bi2FIH)5V5)3lvCs!M#L*85^+Qpw^mH|D97#%aZa- zyo(Rv^`ebk1%D7TKNgUR+5hFfA?Z9uktKrgS3P8JYN7s~TPiuIlFmTD-UQ3p$3sDC zsg|IoIFOgAYl542+1rp&m4?;2kRn2Tj>~KhB}Tl>uwXD-2o*_h^g|L+(kb1G|Lx{IUoH;T>=u8rRdk3nP2HP+zWENf9w83RjOGiiiH8v%OrCn1;Ql4oR~K z9h1|K+Vx*d%B53bi0O@K4O>nhF1SXgFB2Ec)}IDeNv+)IxgDnmU7`D))3W?*Wvaea zSKpha;`4VhZbnntz=V5tuDEQA;EG8J;pVr}Q|OoxodWo1>`_Vc(FrpLuTw9PrXmkC zKPt63fU+NB%^4hZDB)Tk|4TgL$@boRqkgOLm^WFgFq*>oLb7?2dgTZT)*JDlV+~;! zbaUcp>8OPW15Pc!uA9HlmdOlcwaDvQU)AT;*IDzpnW4?(D(f3ar{cCgn13Hnvpyhn z&O?F-Q*eeU0My z)!&iTB(n4fq8m*PQQAsCKKBWV|BcEfR6@T!=y3*!pU5<<`24l!;8r2>ff8VQe}FUo zPJ%yeHN(1^CDr4p0(wyt#wRo&db1EK3KPKjo4U4sNMl~|uelt4fQx3bZmnNg6okde z>E|_>*s)>2%AroV?6XEfdx;=|`)jpCt z2(Au92WgE0gu+)J)t<}}F=S*)N{v$|FWlWK$^4C+i0F+g;Db(Fizu+Z{qS^^RNk`( z3{LedR3*{uyKH*?Ws{U)RHe%=AUw(^wNBK}@D)Z8h83?-I(Qaes{HVI^{ejYDdfI| z-RoBgNiNsy0&pnkwvrmxac1t0^l#G>^}53^+Er`eL8UuUjAKP&4ZU~jYby|SKIKah z2Cgy@Jt-FKs9`+j_i;-^iWN2)8oTOfi=U47+!Y?CziIR)p?v#CY*H#BYWkCc<0rM5 zpN{KHD;ThnK+Sln6XZ`z7w|rbJl%?KO>dZ@fP(q65Bfe3kZijMSf`L`t1z9aj;!U!kPW8nU`SYzyu9;!A=KT|ST!nlH zR*p2k(d&~84&TFx%pEP;gdP))mEDc771{^S!)RAwc3TQ`m|B##6oZiD1^nl%_J=gY zXMYsK<^Yi<9}jd&{1rR3ygCn5f*cRs(RJUoN~Ga;!mf0WW3x!gWICg@5B5_gFTr4v zw@*MXT%SJ=kU6{cC9*|%WO@5Ka$Ja>7w;c)+w;4UNs>=LL#*1<@;jMD^47TC`c~Jy zcJ%6mrSUvMywr+@$Mpq+X+^&i)b|s7gZ)>)tlPxzFJ}KZvG%e%(D=o60$Dt)!qALR z)_jHYzanL5KJrf8&tesO{Hvp3J=+4_TVCv>p!2n$MX)Tkutxv-^R%+x@xnJ!LN_2>5UC)5}|l|-?jzPB8lGwS*iGX9gtQ`Zd%x^&^S&m zfS+_Lq2 z_X1uy;myRWt|=6fADo538enj<&(q;BhYf&G=XCHr38r4H+{j z^~NNcI$mA_!QBW`xn{i8QmI$Bjo9%B!aAt_MRLcpc+3r~P?o{--n+TMzuFAXG7plD z^2?JoZWc8Q!9{dj{4pS%XWPtTMUS+WR=4Ux@C;h&i}ADH((b&2WsDQjFWq{MkOd5v z?LIBxxAq@j`?#Otk^gadKY(Sso~r!)=wJz40+sZAljZQSn=)Q+!MUp z4eX7#DE7-y1*gm$Vqu{#qeP@+oc));`o9a1I!ht_AxzXz8~+uG^o-ci-iw!P8Ee@~ zJ2C~&dLy%M-FWrIaeAD5Fl|hDfQszJonREN@RI|ECbMX{yy%=wv$^UOi1(~ zl~avFA-+O7lDvM*=AG~UY~^O;Ia}ZAj2OAW(g}+dbp>J}LPV-0Z9OA#hoyuII`PYo z3x9s`yDgk5f#0;U8p_tZ3@7o%9~F$12Qho5pA$@yl~S*L`d7{o6IES@Tn7lY0@1$!I%-;OTJsO;g_1rxD7b@y=zURn%ccMLL;d=fsf)%K6qAg zJ(x48K-`pkL0s+n=p>t=$#~_ld`v@=ZoQ&&E1BV3_PQ9Kb4}NKKWaOdch*5uo-~yW zVuLnXQzp?54p@g~D4r4IbpES*0?isUvtfc9ZxqVaYK&y2{tnQ&Fx(+%E<}Pp69_!WQ zwUb~^WcN$dsZWsL>y!`0(bb?w16Laxa-E&?ze1+lH@Kj>zf``B;iA9bFdDl-=WIC! z3kg*GrymzLUxqErdc}bVqwxrD>kH&>YG-Q?Qtwo1SH}nI4`Y85D7rT*#4SqH7uD8*-e^PR|ie^ZG$r-e6zn5_rq zD32TF*SeA70h;dn>QUmSHsmSLEubdp5yUcmc&RT~TU+r1IPxFRN4^zqjPrvK_T3DY z2>wdmlIj;siFY{7Hs&2^kWlK@kBd6d$d0N^_+gp0jl?VtK zOB*f4`2VFMO_JFW@1Rbd*1Ear%Y;vq_ulFx%BA6VZuxi>AubJ@nX$a)$5Td{DC?vZ zK@KIXF_043{WrBVF^v>J#J^=0-u%x2%>6$yfcp+}i|)TI@9;a(aI;kNIdR~ne_pJ4 zoxzRcZ9OjwZi?Vz{r1Cf!gsHS%9ZqF12b$&J;IB-Eua12BX@*kZgfGSnP|NTko!M4l4QgdbM5N6*ZEHD6O;Na_8rP zx^Gc1+zb~X-3{KaXuQt<9>4r`{!wbW;O1^M8pyd%sIg!@Bm%;c=HU)XI3Ro)-y(f1#qU7q?aGaP=F_LT8@frGv$lnX zR0j$gd3@z!=D10pcviTOh{v!>TSRZap9Vtc(vLgtHm_$djTpGr^^#HX9y|lB80(;U z$ng`A9;oO~>1`+rLMDjq>*c=YlPjk+g8&#jcILCzHcIVoX zb5ecs?CC;l>>f}VX&zaFi1M`v3uB`%^ZLQp0#@SM#EfBUk^MgkP9;4_DYEGe*k|!4 z%&alUNHhjTl@bvYUa=%`-j*ia9u)lKX@)o4hEV*8)>^LiUm$>cQx%7a*0=@3E##>z z-4J6o-~zXieIg*#Ch6ivjI5m;p>TtbLc+(R=xKd0m$3mDae3Im&PSU<+qbTiWzJmE z>yLx8D#9YoE@0k zH1gH|?Rwds2l3KY^)f|zwOd_p-$lZ0G28cqHSB(92}u+u@ALDgAS-(aSi(|h=p(lk z;R8<7eKRGqGVHJ6I!`1E`@+IT4;{0ZbDvA)X3e|-Bah@zs_*A1EcZeqp{DUz*_!0n(?=9 zzGcqxMDzr9vmu|hDC6CXo+O$jgDR_P!L_H^7Tc_nf%kQeWuYH|X{C!AF8;OC_CK7e z4pQA#%gZ>HN+RU$yJu0IA;B)e+;f@9Oa4EeYE8@ahEN{CpBcErqheR?NCOR4?M@9HT|nOY!`z|xx9d!+bRLtBllVb3IRR`jepcGc4C#U77m=4 zcXq#p1IQ&f{_uK}=26tX1xuhYhR;;B%4D87pwGPb0$kCte3bIsUnE^6`4p8!k?t5k zNU5x_OZ|v%g_iPQRxYku8PucPa~_unS|LrBt@k7=KbZbBqhd%(bc>9~Pnn30s^Z?< zUKC~DmdFRQn#gTtL-qYI5>TZ8X=UlJX}N(9fBRe7g07Rd ze10WW|2&T%=Oqwib~Xp?m|pSd`czdU3>s8@{4|QqNw|Xvay{smi%g)16DH*)NONT_ zPIrE~2l_x1PDe~H4 zYEUH-~}X{A71tM>Hb4H*P#T~D|nIp{{-V;DOly# zbiG)RjzWyCo|qx*nGCUkX48k4bVlLIap7@XsRTV;Y}s1Xc)3+xBT=PR`ztx-(eH*& z4xG8vj6ihOAZz?%{uTN^4^aJI43^0|)?Qt2j9!*e`0M6J2?#Xjq6W}?-x6PwOEDj@P8rc;`_MBOobk0-mX`NWEG6%h|B-{gQ8@=F;MOKaP85= zz<#1g?U>V_S5MBhqfdCv0__g?{j^ltLcV3KQoe{02O4RDrUQSX#a;s1fr{_Ze%1Uf zg=p?tF%0Chn$HhywZ>pvXJA=-*2V+|H92>u;5#1-sM1K-(mwr&2ZsYdCz?3i;1UFd zZn^B$PhTy#X-^fUjl=y|f|ubU;uo7jb=4a&Sox0^wZU24gPOaEX^OBaQU-sa^$vVI zw^$B$K;62<2q7(38RH(EdQO(wVZBEENhINDCs90sxl&qy-2uAR`dJgR&FlU#AtTNX z@kF20x4CBmTsaR|itCxa6O{6q>jV5|qX+XGF5iyvZoUN|`|w2Jc?t^zRy&2}$H$Wa z!MI~RUA#Ft0@i6cIxvV{F+qZ?k+Sh|BNw2DWfxTNXIXpnPWs z>j+10_=EdNjcHVt1h|?-h}W{J0-5;o4aao_{AM^F;Jm*op#EC!@aKKa&y9`CY)KhC zve1CCm;9W_JhKV*&t-3OGnro`Rna+XH`LJ|7p;lTF=}KN7mCZib%2lE`3J{GDh{e@C_qBlw*Od?UI>UMli%0vY_BRAjgzFVZ-J z_l`7Tkiz(u{7l~XzJ^k8z{!KMU`0W@!E;sfU%h`|3(qr`*+xI}Qt=lU4tT|8>d!6w zpJ)c_0MYo7JCx2B01$>0Yo2wUo% zfcuKnmW1@YGK$1Pvf@X+6^E^UDjRwX{WTLK^&&qLS#sG2=kriiyEXdV7qg$=`1^*Hfc;hXfM~w3 z5KDrr&|C&{VMZHcv%d=t{^jEpJMaNsJI|xj;CMtDys131w4tEmJL>qOF>3c-&<_~w z;R(9C!o)jD9b@LMsHgw{FaiPs0Pq12#s66wb^jarcMAt22(Eq3DOZY1liZDvP4I!b zIwz)7lj*r&L)tAn?J6Q3gPev7x}1nOVzz4(ap}@wt#nMlbvnBDZe(1Vxe_{`7cXFa zNZB!2|MoznTe|d5pS(q+>{{UHx2=M$wk34?Sjgej{{D!ofI+X+>RU<6YSB36&vu#D zOmtKX>RC9-@?#XlHuhbT1&cy65|N4%C@LAQzK(_%? zs$}&?zyIs5Gwo9AHKhGK<%bEKLT5ojsszS@F6JC3GZ8lQ2L8Rv8CTz!ZV?D&NY>H> zx^&jZReiPoqlH~epbN_w%AJjAZ(4rVGi4?gP!{T;PVrsK?uW~RMH5e9>)lVR?N8t> zJS3K74Vz83JVa!e#a=$8Hm_PTrT_2Y{of=#VRuHB@*4Z2HVX-@Wg{}^y${4)pOEIg z??tVnDpqnqTPDvmys7t~z1ZKWz)sTS{YhKJAE0sP-%6KO+=l#m+LYes-CqVV=r4^X zE&idRUx8O%KAo}BB5^Rq{%CpNRBsT3s=J5EIv%@pz}W#Uk1ybV=guIG|L-I^xhRC$ z7c;AHTqO0MqlAtifdJbVV8BP#Zkd#OL1O%p*n92=DDAbod_oW>;!lL!+f{Yr37XH@ zi(%_NIo|CViI$8ssUs6b{V_BW1h?|QKKt0)$_JG(SlC`T2k#@6;M9tfKYqTWunyds zq!z#ij6g=P&Ta!uX5qF}U- zmQHH9O&t#qR{QP?1z~rtpW??6`>?Vkbn3Iq24ENmMnl*$2XV7k*k)l|3wyt^^q};mR9%~FM}mT!gX7% zi|QO3d+CnFO^NILh{A`E1=4Tz01;i~B6b1z)1+ArDS{w=x=Mwkz~M_5&ijB#0YNyA zYEpII9t}rW6C;IT!9}|r&gp;i755>OKO0Tzqw(%z)ai@SJbP$K+~X3F*i;D5iX`+g z!dXS29lgqV>N=81;B22`WI{7#Dp@@QRn6IPVn^KqI7Gid1?zUHr(UUiIZ?UUrFEMU zH!Z+6#bl@75M&;FE8q4xM$=NtJF_XZHMv>C{mShglmJpU8qbqGY!3W;R-uNVu zJ_3m%w=(^{ROn5y1DS`N!+zax1pBYLb2K$yixk}cMM-N_mSzjY{(1IDGZn=@UiXt# zIW-2U!!O#}q*BIt?J4`9C9a8$_t1XX%)k0nu)A(2=pJLpxl@eM3JDi5Ihi+L-~5N2 zcj4YUyAO>|hg&loUpez{U&b;%3sb#5M9iyDb-a21iKM+z3cSKEf)b1LYBXW*Iu1`L z$Nzik@s8fQ?*={5ncQ-@3x(X{@zW{YRQ%MM&Aa6tBXFN&YA-DB)2(e~^+^MHl}!u$ zA9rq|ek0vu1DT(`G_p;~|8zJ2&s#LZ-9Hbaxz*RzLUAipGq37nzOX!zP;6qf1+uV9 z`ujjYn(?S8HbLiyewKS~q3*qOm|IwnL!%J?s;EbEh`NP!A5H4GaLt2NC9Nsn*H8$S ztw80;EQqb9v36VAdb%rZd4&Rz|2t~c)XZgnQ5{EoXNq(SM0lbED)Tzi(Z2TS{!y6Y$7dI3| z>(EE}flGtWBN+S!0y`EA1E91GVQ}~aL>;sSLoC4qfvn8*3)nS$1jG6foN)uSXWC9i zX?Fd2>DfaJZiX;@^yS7KZuMlJ$6sSO>NU)YK2;|vD63+~UiIGL{1H|oz$+l)$-FBwk2eEc*DV_6@v`+d+v9|NW=TyWaVcqrvy% zz9^fC{O$M-_0Nx(6c2b^m&0>o>=M0fQcGLo^xb@;GDW)U9M97)yFJ1mSxGfD&43@v z&m286eU{1(eE)re|5-#qp5|j4f2BmEpRZy~_BappT3^N~Lp~^y%(bpev+u*?7l+|H zCXrDGFT$*-q!gu4BGY?54-u*5YTONPEY54 z+h~PKSnuxBu-83sP9L9S^WUU;`r%ZMKDD)VnN=e7xZ>Wir9&dLCtbq|@6EAR=4DTl zFH<4jY|)&6r>IkeP&wa7VWMj@VE@||YLDxenr*mUp5smYi!cq5upmIgK7bj|_!0mFgVZ5?G3G%l6caOsLqR#SgppEvq9@EZyOT3zxc-1^ z5vi2miG(LbFBn*FG@Vto{9(=P#=W=0e`9{fAaGmtg>o%|+T%f4`$iJ-$mOC*YF|Vl zM*WI=2%;7%P)sIw2WiKCQ*gTRMbH)G_^L1{7Mbq2O5A$rSXf*ZN6K?cCz>Gx}v8{1E`1hVI3UkLXUBR zL7uB43~flRs4v$--N()*2f2$ge{rbu3B_^z`i6;>&oB%RkWN;k8Hr-l|V#44LYYfZ%JnKbA@Hx@sz-Pt==M?gneuHy9e1d z-nRJdJWOX@6Xk0@T5kR{@g`yY1W5zd0V59l3<#G0Y&`KRFP^$+nO{zOvrnEn0x{?ts07q_S%2Nw28LL1{C?`;m?{!zTFCu1xTZXTlI(B0?7 zbw3A3xs9ILLhr2?o;mMn5nR&&-mG)0W*^tm7lqm4nmDfFC-9r5F`OP+aMp(K+7BEA z4crE>(Km+B7K;Ec(ObGeUyg}J9GsYla#%b;7onU6?#IQ|?bWm{LdQPHnjXEfTv%?=5@3hZPyIv1 zEA{Dru=n0UQFZOUAcztqDH0?{1xc;s+yoH>1xz3yv>;JHBuZ`(0R;&nL1Ggmhn9?_ zMvh?wzWsnmTi*>XiRjd#}BEvG+>P^9w6QZ#U@T-3w0# zi_X!e?B=(uAXR=3h)2@~00V@4p*}*b=f)e$W=aZ~mxD!TX;U^4XFhErDsz$yCjeXE z6VY{30sjSU`G!X6@#%d(Iy|Ol3y@y$3`=Yt{}oLaq_I2)k4WNMy|ewYtziDC*Ink~ z+HW$yM!e2)8+X5VR{x%T_ke{{t?ZDk40ZwVdb#s;IfguL-|@!fct>ITIhq@xo@M(w z7PKtD0n+5!JnH%;bRV)GBNz)V*BDI#sq>#La|O_cH=Kd*k#b(O2J3h=-QL-j!SNp7 zx#)eCyC#`Vq|ssc=oJ{3N~0q66oC+&mnke?AwRv7lG)NmTDL0Jr2OYTPqCMg$;Ivh z*-c`j%J_%qemUMoT`_dERjc-Ve~RMsM5%zn7bWo0LFJt~?qOR-(!_lRZqa2Ffb97d zcco(*-m9l3sq7K;^r3=y`f?$!Skp_VvV3Od&79Tai7}LIM-zY@ zFx8|3Pr|_M82g!nBoStf1y6Q@%)m7=4Mi7=y~nZnw2q>vT2H@n>8k1_f~;fwudU*X zatpi$A@b*j2hX*Na1#t&CvU#gV{=S@o>7;#a@R{7T`^en^QX=Vrcw8Bo>Xgrd*}YN zXUY9Y3}c))y*9S6g~fFk#b%VowCySa2iwoK+}be$Emn%RHX-{1%V`~~#L3*aEovNW zz2l2sY0`0HR=Cr!$UU*zq&HRifTRdL!!#h?&9uPkD9Msjs#MxHZ;bk23Z@dkX?B@I zJ7j`{L!nBOx=7)gABm7<3Z3BEM!bEbhUpxvaW1`}Xy z>bK>)m?qzJe2YjLWfyYKonB0&)f0ZbKGSc@94ZjJ%C=f)I;+GVhGXH((2#1Ryj?qH zWdF22QPy&UsfZlNmZG?Pw0czA)Vy)B9+U71zN=x|Cy2=O;?V&VvS+2PgF!^TorW;U zS~X^0r!=d-r6qePL+S5aR1o}YF2j<-(Z!zb^p}!W3Qc2om-#wl)M?IzOW>i=KN@Rd zAAn8RE|dmNzoi!a6+G|y`MRl2QZ2?eT2~Xn@i{0sWAaVLiG9}WS6kBIC;OXB?xNR; zXH=`t5my#4{ZJqOiNlXjiQ+9cgnRouVodq9;4V~KKXyk*ytZq|c;?ZgHp`w{-7(;6 zF0@~z93Q){BcY|=R8ZDr-AW3j8j`^g3s5%#bRHZrh)UF(@5}DL4EE zyb|am9lr|#9M|W9LTfkR9rfdlzyeWt8+C$jJ^napUr)Tdava{vB0m9lmFIZx{SP26i9C)z*KzFS)A3SXRFe5y~Rm*nz&()rco4C#B|iFeBmAM`WLN zx8EwyV`w_xqXC=@!^t|!{?9BG=|)@ph{CUi)Sn_}i;CWVc$fO!%1C5@&XpY=rPU6L z({L9O(xYemc+pK-f$lumB8h#&c`$_O;!|W|$_)$ed{@WLMH#x+yOVg5@7789WE0Cp z^ZtITmd(xIbPOSyzIHx6gb@XM@Ja#T_Xf;&g=qxRYcMCAik zY41B92J${JCNAJA4wf(v&P)6*a+&Mw2Xu*4{vB0c^Wf0%u25Yo+J}a+h;X}uaUbY28 z2l?R#Rngh5vByBG8vH24dt?P}&&VTA)qEJ`PQ(P>vMipfv<%8uPO1!AXJLAsX#8m! zPH9;_)Uu|uRaoYZJb+d{pN4EO*dPIoKN6!0zRcd2ZX*wj|qO% zxS@DQ$=A2mIA{FFoBjOATNDsh0m|!f2Ek(YN=DDkoUVCw~6#t<>1ByUA6~8GQKS_eA2cLY@?WHG4RJ)U3ga#sS^Ws zN7PXw6ZLQ9y<-y+=}&6=MKz$i_hZL;@5P2)KGcUX-sd;l+j(~guE=rS3A6q+{tMcr z*7|meG_W`2lUd>grssm6amAZBuXMD9uCMyHPrvy}A*=dYG?Ow^E+c+KiF!(;i0f_U z^{e$UV?y6ZmGDPLq>iNSU{}{`kqmux;WQa~hH#zP;)-`4axZ1-eO~U@c=Q}vb$yRHVLrij94%0kuiEcu$P^GcNbSu&+rHi7@B zlPt9IzaRbI_BECEPjU$Dya=Ij?lMm=YJuAp8HqSrTgAamriqCD&UY39QU1b zs9CpqY&r1>34}CQ(dueEyO$9meP#P~XC!^+`XFXiL?6{CIjp2jA+(-5+Dk@B2l1^C2OWRGe&|>{Nk`z06$fz7{n;L5o>wq-7k!5_x?9(?f@t^~=uof+aV}u#t#Nd*=%{d31RHEw<3NuGU_VUrJx_k)!d`Q71UZ`rM zIXIA@*T+nG^&MYIfkZ( z@o_M|{Q4GVBpn(|BS8K98Qsl!a)!hm+UI%KuWOvu09)js((;`tNaJ5^iMnwiib~<} z4@g1skCw9+&sN`{%-$uVI&H**|8B(p25;iLA9B24yyQzB-@0#1KkiAf{)Nr!<|VF? z-=im_npUNMIA^j8(avFF*z)1gVYjlNI9X4YrjkU#k9?DT%Q$<&luy&GukE`E)u<2f zcHUAjN;nPFD}e-m%^A1|-R8_|HTSf!#=i)Bj60c=b&Rc19eV7``HH`5J;1*G!as!* z4R}-Pn%VmBw8x$!DAD>GvnHFgjIX5WRqi$C$s6<#eJJQ-sSAvouO6^;`~WmTKcEiV zW0T+Z)K>SqK3tKDvXeDeUwZiCT|uR^gZhR_5=okr46h!=hRvD9|4>ZmpPXQqiQSA5 zn9ce4Pt0ut2nN2{zWgMn=%qn!rMEXF{k!z#{{d}$G2Gz}S-;mjf=Bd|-Cm};oIX9S zD=fbJA(A$JQr1Z$N>=}!4?Ryr_E1OP#^y`&)qK%j7qgr>VQ!xAd{Wv%ViYB;wSI(x)hE z*#9>yBria!ioJrTh9^HCEecCCb3r~nJ73<)`3e7H=&F0}ia;rWg)^va35$2V(Q>A8 zi<+LpVd+i#!afu*w!#gpBTif&5CSi8Y*tqgqZnNT1pd~qlxXCBOU>&_fnsTwAF3$gcuDZP!)eEL{CIA~i z>mqgfvm-DkoR#qrOktdWhtH5|oD{x1o`J`7Z8IK6^gXUqh6Zfxc`66zy_2ohFLg(` z+NLCQ%Ne+S2{5}!A;i{xi5Fs>k~4=&_tIJ-%Umz${tM*tu-pj!Zy>ki;eW&6{}m|x z_hP!(rw?g0Z@3*b>wPy6W}zKuefDse^tPosHj}idx5hO=f3mD?=1ZP=c#sS$9or1y zJrfbYk^%1_cF^btL(1=vX1sOP6;qPqTKPjxjHIyEefv4s-VyCa<2&{d9wJT{?oz zodMf_-?LQQY0BfS81>n1Z#O5emnW-tWz;nvHd~K~Eu1}*u&nB;(+WjDv!wePFaHm) zs}FEc@e1FhV`h!2xhxQ5=R`JUz-Qz;vmds%ifW^wekizjT(s-gO8IpAp9)UX0ZXu+ zOMFH*3+|2jG+F%{Iohe&QoN`S%cNkrYq4zSVzSJM6U|_sbF4v)l!z81Y}E zhM?tfBZBqJ^Yc_GW&HW9BB%BKlhr`G$oT>}?-urT@Z7)jFECYER%Ml?|9y}okH=j4 z3b;@RspVMAMAY@9y1<4`@lqQZeaP2|H%51J-W`k}lI;X7LTsvro3kOH_CST5yB`ie zc$LY6mQ_zB9frN}p&JHcc8t{|yatMPzonc27IZr#`!^bk;RR8MNX1P$hzvhzdVRX+NrPl6hFIM{byUAU-cwyjM!7w=_8z`eVl=bc zR3q`?Y&DWGl4M{wV&dEh;BXO96F#$|Mk{BXsfC(B_5nO`+WwVdor}Jy=iW8jE>rtYMg10@bH*!YIhdXxMFGveH=Isj2N?+fq0OreP&b^&K2mbCJDfJk$0jy5k z31Z9g)omSY*I+EeeY$OPnyOA6K#ZyQwaD^?8W>G|QW1^#{7NSX7$T1|Xli~@IJ)Ke z=X>?jQG>>Cn32iQEgnApAd0}H+G$6@Q!EjC?*9b6X1Dk8C_J`1#$=*jx4mesyd25A z&&4fe)>wC^^zpSsf3@RP_dZTbvqa3E++vAI6Ma~d)1->~jYYdMj0J;5Ws|rnuyh|C zHS?XOpg2}LyzIAG4KU->GXr1+=o5#M2XChXWl%_@f$AgiV*rEh8TJ@}Jm^Vkh|?jP zOIiu;!-$*1i9^ich3?;}~anjg|BpNzj%$~(01Y^T^XDwX=zIA_c1 zj$2acQe%IR$Zl@MQ_?>ky2_4ZATjR$oQzf%^^)b3dHImIOO(O`*LEpOg_mLvmdy)VM3HlC>5kLE+^j~6$%8XAb{P(UcAl&@%-)+UV>*a zqs}6&R(t${IVA9=;#V&ZQ+)~{vF$q)Lhd3URxZLe^$0m%VIJtJh)+Ou2-N!ai1J)` zf9n)wZ)xnuC<>2vrv#{bHWED~orzH$iQ4*!@gA5Hjg)&;^*lw&3L%sm&M7uKbej*U zs++%7E|52>B1n%FPt+KHkuz0Fzq~_qTI@?wbZUvMluA}+p=z>aVSIN}&^=$qp(Q}J z>*?DOly-}b=saex_sp-?Z@b%iGJ|`e5v-Uvvzr1hzMtJod?d%m6xEqNoJqbvCA5m^ zICIa{Q(c)4)cl+kl9W`Sq_-j6`&>cnP|LT~aq^<4cc8jy4LPl!Z+}}^0dRP26P8hU z!f!s3V=)#~@56oFp>j*Wb?(N-$~|}ss?l2O>bfH(jb5<(?Wab+#`0%=JbTQ54^OvoDQ@OfvBGw*wzE~J z=S5JlI}WLqUX&)`uU31{E>^r@v9xCb8Pw3Zv<$CtZeIAfIQVF)+jIc_$kZFpy9SmP`^CUlFVnGnSB%OUu9@ zi;}ujgTuXVCsbgv$)$iiUbf{3~sGfg;i4Y`|NUTk%q){RV(e z$6X}*UCDj$WtT{i*nvyi$B>Fo*DC&lTJY_tk>pD>tXf8W&e}Z5SIc9lp@HSi^}?fg zbbfZ6x!8RKH363GVt>uj>;@m~mGcRXhvyqhlLy(Jp>bt1q_bOm$uH)uo#4)k%2<2(TjH>yv9Co3pRhCrS+DsE? z%YC_5S4k?HHib5y2Ku=~E733$*3vPPCr_&P!$2~?w?C+L$PCQ8d3)1#!o?x1vuDOS zd`?}_bF;q!%dEtDu(hucaRZ=|%%7k!^ragGDHs8r1ALCl$nO;#y{TaTV%&B@XiMw* zQ3%;xZPB}=Q0HWC>b{ope3tl`WwkNwZc`bn>KW@?nqC&*k}P1a03?d%I^O%#Wb9Qn zfC6DUY2Bd1uO@#S@X(UhXbl`PnaG_2$R8ddmR%+4Mk2P{dNCWP>ARS0NM* zO2h6YIbbiSWPLh>7o0(dH1sx-HdAZ>hy~02Pg_XIXJnyvq`P}~3jW?B6G3(IQ;sYz zA$kDZzrhF=_wjn@XJ^j;1^=T7C%o6H29IH!e5<+T+vJ-foGTOZEc|Ia4v*fPlU0_y zIN|`}QhvtiaVE~1qsEV_V&q^iK{2OUEQGI+_qT(AvZ|BI=bnBqqYiQ50Hp7gqa&;R}{ln`I+%;n+!&VTPgBQ zjlEk<&1txvm}~m|4Vm&A)yK4Old>r+joevM@K&De>`V3OUH%Nh zTGtGm)KIaV3h0C|r1oT2udh6I6{B!2hVSy*o*d5@tWDyPz{4^O*3Intk$?9!M&F03 znisrYKHaZ%h+U+x#h9R;e^7!7+k30VSAj7CvDQ&%9mP{AG|S7 zc(96fBPoPvDc2-T^ZLRkj;kR_A?PQM64T0ScKoj7|33cinclxKk&`yOX(iMy3Ii?AGDw&>2;DL-__Vf57R90W?QE-xQj!Hv7>QEv)vCAz<80`lBV1p#t60{a@^Y(9X*AM;*R4&si2X_$K* z;|JZ~sL9>t5r7+uGb!lRS@jFhW*xQgE1rs%^|V9>?F3RpR@Gq9H)%<3TwGo&#FI$3 z4wUiW(O)8u-#yNe1AK)`^Eq}LfA2%7f=^T!rOyqAVWbm-_w189> z-f%l8?ikYuSfAB1)BSz8ccozH`)lJXj|Vs4BG)~Rp${6*-mWgcU{28e5gD|nCFp7? zd8T%KRp||b*cENL%%?+FaS`;qXdEpX0+P??LGroaA)LL*`T>?Dbs6NPF^aunV0F7>`~-d^U-grg@$JWVqII}xh&UP`+EW{J73)i*H$^L}9&ZiH<|jyJ>}r~A z97kI}XNg@rszo(F(Ft+>gJ@2ydS@A!oHcLhzNF~cWZxYuhO!t_OJzMI4)NAjn4q>^ zbsr)SlKCn-7j64OAjUxHaK$1TB1whBvi5cQk~dWx0OGDku%pt7%|aVPS&JS1K3V3e zfG)vqehwq$)s8K*GGKXNq?*52J9O-o?<3P)3TSqRPJ3hLE`!;^=h|x#P80CVUY_5E z^EdT-3fZ9LCC$r_WQnPrL)6@UYWFA#-!0`aOXi!mB5tYarudi@X=%Yal=&yvH86zL zF;HD`8s3)Yp`j#hQW^vjtE!BMko>c*t8l9=I7sjNS7JAnxUH!IUj#WLpsXRw{_NW8 zlVhK0f}sbi@67x~kBi0WApNS>>`q1sl}<+rqve+bqU(4j+$y@meS=sW?yVwR4+lBb zD=ewisJo0guj=)i+&u~D*!_*y#SYg)l&9OONNtX6Fag+?J0(qeIwPO`2tch*&#*I&Zy2ke0`)}TOB)0-3*?N#Pas&-al23r?M700|# zeS}7!>XnJCilre#$>MD<6o;{>&*yd2ev_+MgW6uc?I_MaUOM9ra{TR+62|&%pGzmh zZXk1H2v6Q;Ur>@DuwA*U=1{10*$7aA~;c6#F1@XZ9oA_vD=g_nJ!i@o44cwt5& zxa;0nmS<6U1QjK+3uO;oY9t}lOv-{5_qAV5w(`OZNbE&1luwR`$MD2WSN|yNeCwwH z!px#@q0rUFPhT&=OTCTlu5b8saP~wfW9Loa=7@tG_t`1)?%Pl=E7R6Wul{D!Ic=X; zq}_&|W;l>k;n0`jzBM%iVO;a}-MCZ5u)%2Iad%?xE!FK$^B&5JmZ+PwQ^Rb*E0aAR z-urQTljh86k@yONzbmYtP`#YkW{-Gacf6S!oK>5!PQvBb()3+bT)w;g2r-%@iN!O0 zOUx&prUF8`2NY_7haV4qk%+VY-h&;i>D_ffken8(S?mbr=lOMPcD~7Rb-wk!)VL+?~xpvB#xV-%#oWvC;KRc=CbqJTv<;C^yeGLt>fzuvRA4UqdYFCfb|CJqWK z{90AJ9g|dA{SzV88_A^Nia5LKlH9|4VRHKrJ;m{geMXD{;|BZ|a^-iro&U>prInVe zT=3*z4QXA2dLmPSZJ2oRR()35?k`NyHEpE`D4g6uSoHv6 z>hG<1d`!}{*#Iu|J)RvPxGyTH-$zRI&5q*^ItImqU5ATx7$ux|ND8}*uF_LwBIX&S zo4$t*+(fi}sH=7Jx;wCDIWq2?D?$soMooV%4h98N!Qo``t<3BYi zmZ7Hm?>auY?L)Psqp<60;bjfctjOGIQwK_#J(zv$AXyg$kEKE2N?X$rDq&6a{5rf(AMv0pA6;WSy=mXgjyiH4UO8OWD49m!_A3ZAuSC{Y9!vx< z$Vxk0cnSNqrkIo%h{5`q25wUgl7Yl3@X4Fw)2-j1ujGhf%{{2;x3U0`|+QRH(omWh* z^U-)w=DGfUP}xHNgL=W5)`#T&OJ^1V@|ck0X`$L?I?>?&zomfba>R+Mj@rI{*cJil zOB+~oFv1HF27W{0M-V&AigX)gEg<;Jl4`LHcb(X^-_DZN>CZv60BUz1W}*#!=I8Uh zB(N-$8BNz8p;V+0*zEuaeQZEH_;CbEr9y5#uS%!8-WW-F`2}3quWd=z{d~!SiH9T{ z3mJUfmf=38k12jj1V3sJ4-K>21GLsiZR)PshjaTu<{eHjPzNsfgO+| zLmyq!n|rBEM4}BZ`p;~A?XW;8zShzJaT0i=>Cf&14nyM)PoQe>pwVZ-O>5$CA$A?g(9)bkJsUMHsC~s7oS@J^LA?$9S;h^Ag|BUpMw5`sR6sIy`6a zqzdsOMEfGn$P9J)z*s4fSJG+qas3ILzSPQ{m=85ICibeXFK4gPs+d@s)~LLv8qDkV z-Nsf*J(?HrG6ul#?m9=+xS3CjbuL0f06Fd~p0B#|u_~yyjRS%v)et!tV^_rFgo#+g z`Cqh_A%B80U?F>)C~J>c%W_lUkQ*wI;c{tw--%UWoi+Aqw?Vc3tH4+_md5PDRiER4 z47-nwq(vEzrAGHkd6Y>+<@ZEb;N_;PRn;Xq)pv|%yqdbFgYf1seQBhcrSa$hAwr)G zZvXsizFn{~@Pbe}%fvN`ILFE#{8O0dy=V$f^#yw@!%}{+_)=Kw&=^khyUi-N}O_R2T4Z} zW?_jb_bmLuxL0?DTIWfD&rM%Jg44aSq}odu=m1~xw7yd;K@KvEd*(MjKH|tns;2}8 zke@lo&@N>j^L{iQ(BVIG-y6OWvbYerVuihJhy?w8VY@3Z(Qxl=(dEX1W@|08=s|w7 z_`@j_kvYY;B1b$=`;iH8Ayn#_jbh(cthRbOyfjwdZ7d2rb3B5cF;=Dc715Wni@~h* znPOA6J1c$cEJxR}9|Cuo{lj->8q($sEoF}EkMq;SF2<6oTu+p!JpFUn86-cpKZ>4*{%i%H|IWk^0&7 zW&juW(>6k_GJwJ*)i|zeD7wZF{;fZ5>S%;d5@BuL6xt9zZ?auISynGFsh6osHa(;bwQGTDStGep) zwLU)68PhLbVRm-TaCB;qB~FPJiEi1osKPOuT|OwYJq!ubZvG)K_ov%O`3}LBk_M@v ziQG&xKyH5imY8Vb?A-|VsX;%Eb<07@%SQoWc4rztS}qoz`#cyx`*klI$NneJp=Gug z8y=K?#<=@DF1x1)K|Gl$iSv>9n3|<+27&($ zSpXZ^b)JVWtM7~+vYQ}U>Z@5Pynq*la!M4jB#U#(-kzp+X@ z7t)fpZ-(ROZ>d?lEu+4-S-SYa9`z;dAjgZIY0r%%P}^}E<5J=js}iBtP70?g@@aW4 zK_6T4gde9+E9xfWl&h9_%i!q34vkmGgi zLJ}n$a4-zybxxX&Q`;A#5IVe5%s*f`4st?^r^#r_0G60P>_SzPT`goZf7*~IJA5>d zci)a-B#n)v62%b9N^E+?fpMcL#LpmSIuIhv2snLVeiPLl6(6W4vJnn0!V;1sj zK+O|v+Hy$?|L8`6FZOpm7*?v8@z3w7o+WK;|G_=)4DNCGIF>)$D$kt-Xr6~hA5TGo zt~RN8R=RJcV&p#qskX1*^7JE41aND5X&S=@VoRvr*K^ut<(H3sUcnt)xmumc=rCR4= z3TRvUMFs9zswm$(ZxJ@dNJL#Cr7;lX!yGiRBZ63X9v{W1M zAC4hCG!2Y_QL7zt-4@F1EcsHHtM8cU3j6ja>o|TN#ol!5C*u3o5qt_v;JyI2Kg<~# z?l+JcO!C-#k;xOC$ZpxzW}I>+u*zGdH|e-|A_!1D8$B~>vV53C0yEbnYBqjQr2y?m z!KHyGpt$c;eb52r_eVi3#Ms|%+G~?YDGSHw7BM;5{^4skmh!_$V`nhv-O#GP>Vhx$ zmSFc0PRH}A2`;em;9INZN63&f8%{fC7ns9kA1;Wb0UvS8$nj1wxpeZltvPUF8g&KH zfEQiJ@y1d%c;k$lltjBP?g}B|uChLgvg>||#;^>RaP1tyvFU@$LE$tJhCkor?NRIA z?y7>~7%kSZ*#PB_6u6@E5(Sf>q3S~O3bSO=-U7kK;Dd0u2_Z}3d#`QvY+xylyginFLJGOgD*2w?D^ep$8P^ zEU<7|hJa=bEh|dhNt=yJv|t}VX5F?#?;jtoObj(=0Cs+=tAo)_4p!EF+}(j@$%Y?$ zcFDTDWYjBC>|)cx*o6)Wxn*|zc3_Ca1`>zl z$6tdQkzKQS$Kiv6qt0H=g&ol_nJID~$%usQN=D7lQS(X({g!A^P7vzp_ zTl%qtz*bG`k4nJt3cMAnI-%J6@M$|!+YFhbZDwML^;o=P{-v7Z!ko#&ni0AW37>c&`%*si zB~_Wk*Cg-|^`q6@uXM=__j{{iY9>RClklUze1y%*p_D!-Vc~=R`k6A1-(=(4&OU8R z^HsXn(qAcLPE@Q9096|S80GF^kN$iUhnXuOJPO92`v-+Tv84w{y6y5q`$Z*G9lzPx1D5I)8?hnnr7WAbZj zmtooPkuTNIWLyoRXTrAG2l>*+u^beIs)!F~@CvwQhIg{m<{OTY#(Gw0#d`XHM-X4{ z2@sysMG}8&Q@U13?oaMBlEWij$%9+sZzLX&un2BuqV)Gayyo8adtiDSR&FX5StS=@ z!JB_h5kp+6Sc#XFDW2Dsaq#fJ|NJJyaLQ#9QonR}ob*5*I>^%Od>@@vRHOC23<$aA zJ;a(g*NsiXck^wj0=<1M2D%@YV1l$wHJ#i#=Z|~ue8aIo#QmGGzJ*#~LPX3UI1)U_ z7kM5W^?uq8C!6rPw8L!l<6%%ti|z)+v~PCohwe}TT}$B7=RSek5dQR{CT)KYB%;)Q z0XD$~-s9D^MHEFD+jGVzL{FV2@)V#V)DsjH?_^B_7hFH!PYlyd|0pt)jS z3;v`(fFrOg)b5P~v2t;eu^G96n?H^(tY%JHZo1E^zIdhtvm1?OvD67=H)VUvn%q{i z>``UV%jv*MMSm-uSoA88p3FwN00} zixAysX}Q>0La3{7yaNAO|F%%q{mbU}SLCW52iV1Ah%vX+wPbh-{-u^1ytl18`aiUD zg9lI!a{3{kOk7IYm)$Tjb)BZ=Lo}%5Df;*0^Z%Cu_9Q1zJv90+xn0UGZ`A8B2Nk1# zi}P}3T+L1}V|?YW`84nN&g;5(@%>UD1{B zyA*0Ap^B$4AjqK5hW)7vR@=u*v440;PQRlBhR^d+jdfT1_(tE>ySD>JnH1|2L(TsV@*r8ZI6RR6mJ$XwwJ)G!2219Xh4+3)kV z9yhwrrUK?i#BE?OKb0XtHilGPfy-!Q4b6bs#qNkHvULjEd{dio5U~L)Qv!G5D}Yp3 zj)$oRg(OC2`CIk|_+ZQ}tODIcyS?Fn2H5z;6SY!JmpnU@t7jRJU2Gd{$Sf+53hk z9+U<2=kB#7gKg?@uiuI^Nxz9ELc6~g*9?(SpZlZ+o+49zG3LPQv&4a;O%O3m%)Ea+ z<&K0TzL{j3{Qf5*BqLWNRT@DGP(ssoh3O3)g5P9^?M1gW$4^{Kd!oKg`682h?h?#uUk+7Zq(M~(T3?3S_KZK6suyrPk-Vk&qC?=Et)5Zj@mPd!Q;GUi83 zDw*v%-BTbJsm5gFDPxnRHic57HzTs40)Uf>xiTjd^$jc@Fli$nZug4nYvjQ`n4(b--nI%8 zm|le|NZs(8RiDU4B^$qX>%SnC*Julpd*f-7;bY984@m~Os`f(mLoXLsP?0E0u|E2^ z!~E3C!${Hwcy^Z`&%4QPy-m*W(52pg)`pRO0Vp-1|B2FGv_OXqS zbx8s&objm%hJ>xmfw3+89_mw{y4-R(a{ncMM| z1YT85YtS|e{{uOU8?XSo{i`8?(%KvoXCKPj%UC4-Kp5op(6ok}3AHQQv658tm2K*F zL%DZD)NZOh`(2@FpjmXJd<4~^cxaAg;a39ofgQ*y3nw^}Br~=FeDqw-aQu1?JR3E#(xXJ;EeAV5;#gy8{ zJg$0oPKjZhvaMnt-!2*fyEI8^KxPJ<7^XbYpw;b@jC0S2?q0K9rXm$=&=VB$X#W4!g=RDo{c zV-8tPFZ;!UYQ>fCjW0=ByUXs+IQwPR_|I)R#5@B=`e15tS=gS7!*fd~=yzSYoXtU` z=M3iR=hyU4e_P~o|^!EV@W!8v2PJ3?Uz^Dn>t$K zf?|3q7&7gs{|ZJEKs-c6y@DSUg^Do#KbMhWC`^JH?hM^|+qT~Sae`&f6SIvfxf;(F ze1o$01zighNy7@-fLBVHcF%1-qlwh>l#gfoc7yWGiFjX-f=`>R%*(F^c3fYXPW7kf z{-szwN4Sy@k_yR3hZ;x_^g0K_1i+g$f5oYNbb-4|EyjD__H6LohT<0$CGU$!g59)H zT#>Y+dzV7?oEE(UezB@ntn#T4A>o${V zM?rB(WS0GkG&APP^5ASJolV?tXZpAIscN6_D>h*dr0+85V`cR!?Xg}3g>CU3w4Z^^ zw2fGbmfgs~%M{89l`S8g4w*vEqrK0;l-68bUHe%Egisy|`KSE6aOT=X?k<^DD zcts-SOREc5I4svIu`8KYf3=tOY@CN*iSqjOhvLh`UDvck`zm@FbpbLp?(p)sXLGy* zIV8%S@WJTV>o@k;DAcYZpSFJOEA&k4@6RMJ-+u!7ksvxx@}+gbb&{sZ4|I_6qQL}9 zHk_Jti5 z^^ecyazg{KN*C*?M7DNe60>UoU8~o_Sb0jQAiev{jGpx|3s{D{1%?CvZ&awPZZ2bQ zIGn;P7s}Z$8*ToUvwNa^WG7KjZnvV%lNwAu+VAqLeHEc;RjE#`|C{p7vNlhx?wP-O zRmnS~RWcfhG(BnE#1XXXi|5OjY}EB#(4_Lr^q2raeSTLU#{BL-vQ=MV!w^#tpARU1 zjT8c{vuc7}+EJVmb5#GiLeMAh|D{4fR2>Lb_c;$b!JN&ihgz;f;o+%vDy$hdz8y2W z2$)1j4x8D091GpSSgX_OO16Og;wIlbke&j^kV^C8wW`#&R+CiHS^bD}ei}o=8jrXX zpZMqb5>XG3C{zUfyk1DrRrfw6Bzy_J1ndIDQM0Fi4H*%@eE+Twsp}}5+6Ht!8u)Pt zl?i#PHm^=WRx<&4M3J}l#v%A-nX$(0I~G{7kzq57?}N9VgObyvn+5+<$>~S#bix23 zva}eD)x97g1(Gqaw^B9@1uk$<-O%v?Hfto`j*iU!pp=p(vBM+Ob)!%DNx!5=P$wkP zwovT0H(fY$4=G$A_88R&pqDOk=p3Ow9ig^ZQZL*?PkZvHl=ur=i2R)QkJYd)vLb4P zv+x@vn>>#8Su3bJ<-mrJH6GKkJJ$=3^w($EncqV(-ShlwE{weRFTdfC=pv1h!t~_h z-_?%Bs|dlt>=`3^S3x3QMA_eJ%^$JDZ{B`3oIMj8GxjvI7%Z$krqk>+QZfwH$<%Jj z;+VOG(_psv>oHtgBt?1`*ZxJjiJ!OhyShop;|Gx?F#+g2(_DD8dZeG0Y-7|xh)Dfk zlVaCLwuFmUqHcqi)yzVI%P7n9SWS6P%I;R`0bIeXhhfisI9I9edH!`d#uRm91@$;S zftLfSC@C!Ht?x=ysO?##+9i+_&q%D%kM76~GiI;UpV}lhKT6ouiI=$wUOsW4r>y7r znPO%WxB!|qi{g^VnLezAX}QTBhLZ!26yny4&b5RvsB{-MbS4{`sG739D3B@+~WT0$t*c0AFDJm6Ac+Ddh&YFM)@phRkkVIX^wKx<}Ib z9_zC}l!wCy?_T-sq$sa@!Dg%dfz=G$;5R-dRb%+u%dAT_>1@BUm?0H^UVLslpnNVH zUF&|)8T`_w^-eD1Uz@FRI7*B^ zzV>kwd5aIv>)%^VxPE>6R2v3Lq>g#lAJWvx-BdUw#DV@bwJ{4vAmwvA50B*J8)CTb z9dgLtMyp5_V1KRNII(*3TOP~VGqw$N)k<}QgR2~T{Gzb(RTlTZMz^&&bBOgD5X#5h zssH%co?7C@ToRx>A9>51?jp2OmdxoNg{0QW0p`!yvqc~G{Qr?VzWS$v52$wjedHp| z1rdQ?14JSGRe=OqcRh(kMg}RAJR(0?{lERt^g4`?(e;e19!$N&G6*F5rR&@>)PIGJ&TS zA>^J+3Euw_Vy0ypNP!kmPx;(8HEjr5XT{Y!xwAKKmoBk>5RDSrXPndcKiGTExG0`( zT~sAY6hxBbELoDokvxEaD2QYOISP^mMnN)22FW?71j(5(kdd5o7KS|JFf)C6{O|wX z?|Xjxe%be&d+y!${lW*jy1J&iy4I@oJnLD{4l!BiforF5NBl5N)m84ttNg_iS0zoA z2LF<({Qw{kT6%6zz(A9KhheTpp4LPRFCWEUIg&iFgV92O~-Eikxl8J6C^>8#uAg$K&wK0RXhj>?DsM8O>DndOKo|% zC6U$)=qewa=b_0qISGl3gr*-(X#b^b3o! zCLI)t3w4z*5CadYV#^fn8rgzLl5Tw5nUQ4caL9$s!{{ygY%Rb?NkJChwgYmw2kP^I zssmDa85&^2dY>y`PATa0O0MrkZ^H%+DHwP3F2Y;e#&ACVtrkHgZRkdZgYL5_8a6oM zEHnFtHP9*602Kk0!(|p{x2u@x;Mc-EaS<5=5twdxW;Sz6GGKZlLl9%Xsk8U~9f9vh*8K{gtOV&7jT=NEu;9OC&C6*)R>Cd$)9A%K<3`;C$kUPykD8yQ_lgCiN z!C=dbkPTlN_f zY6~CD_coK!RvUW8f?Bd3M{^rjfdlZ=UQ$HI!GqVs`A$LCILimrhLzf8HY()7`ws!x z%RvysMKa%O^)N4d4(50955qcuHhZ8;yRge>P$WfYWdGr(!anfJ0F}UN0jix-o$Z_h z3`FAF${SDSs^FHO&aYknt}2UpRv*%ZIW3$98tFL1#owQaAziiE%71EEVMaBm2=~%* z%|t#H44|CiN@lA0*x=ejo~XeQ za#T{N2?NRK#GrhcLaxe(B4GYT91FUR?D(lU_?9DTs-yq7k72pYeJ5%a#oq^8e;m`k zRpf30vadHu#)&9@ic`UKU^rIyhB}`gRSCsk|Cz zMt>=jZCZfubE2g}m`qcB=X*dZV{)jiSc?lg`by^il)Xfg8Af`98hInMLq^L-Q}(8L z2=_Rk5TLJ)gaAKktA%6ECu{+5`AF^)i+Kpv@LB>Bj2_O<6`QV=(tph^WyPkd(*Tk2 zrvP^6bu_gjSla^=PJW|ley(M7JcsjbhXm8V#S?GB9D>?<1uPj?(0ez96kfoRN+zbt zn32`@!$|bL_Vj-F6q{MbzVY>uwgt}hTaLM4eA1;9{t6v%rnV_G3LX@+N+W?E)u6)5 zFUW`cSm+iNa=jaGI>(&i-ORDm3Zp_uVjLU8LoeMwCj#?Y$gZ$2e6cZeJlX4cXZ_FG zyExZ{dj67o1?f%EV8Mmfc281%WOJt-HL^L`R1B z>rsBoGwa!?<8o>r0;Xu@;UQ_@XyC@a$mzWmp&PV>L@x^OOzTWy#D2`b>jXbqh{`h- zP8L0CkimVCcm1#)u)JI$Ji|SFnn#6wN($`Q;30PObGm(C4i0yt0^&r{RQ@u{Oo^UQ z{RHl@K2!uI=e)5Mm6s_@dzg88b~XoCzHN(+vkN%9I!dPeL6iIgD3EGz`?o+U!*)Vf zURuF504&pTBmGV#l&__;!>k~61ylijWCCibV>JOGJ0mZgi~IuZWS@j>gMz3s0pK^5 z71RQNktWQz$KfeK5ZfMXI7*X)Lv-^jeeY223B#18!n7r@7cjgyxCg%6Dxjto6qOBP zyEI3ra#Buv+BkoCBc!{1@+iiG>Ig0!sO($J9%ur|#7!?3>00xOXM3mHuy8v1TQC0Y zOyFN6+ILffF6lf@Aow zT_u3+KcifT3K|tDX!~z=_Pj4fT!3;EjWijR!>m{+qXJf5H6^ zBB6@fc-UM1re$*9$7l^va>x>OIl6`>dL~zfwXv@Q{8=s zngJwhvEO#dS-!CrwO_8%U^Wl#V37QG7I>hwuXne&JoJ0dNpK}-9eN27NJU3?uwE`y za3%fakNn2wrR*@hn<*OtKY_hyc3;e|1@qhQP-t~gs1?t3r`7O_l-(!J5L0CH`NR2k z6TXL~+Zn6_EK7MtI-<~YuX*{FKO{R35S8~6))SqN{&&eyg!#(DJU)@@?>^hHu`gS_ zqP^K8`qQ|>d?f~%{GZE;T42=gLO;A${7UXR9REcgmbk34YFpo; zFb`H{71TEQNt6k5j2(YPy;TwTOqaWo&geD1l~T37jF@p-qD?Rxn98XFLX}s5-L8#% z#NrvcV8siASO6vav(7>12+Pihow|WD;epJrh-VMCa3939waIYQ_(QtV(B z1Mr;MW`KVZZM{gH=3~2>E6k)F;<5CzKrc9P5UbAeRwv$cooa5$Ux9wwn%z_^btXoFITtkm%g|Hg8$bYe>oMoQ`G9}Nf9bMchIAL z80ayY=x#*toIxcqkm6>Cs{U1R8#PnIe>M8QI|ciI^`7RU9Pj7XTV$7C1Nkcn35y-r z!g)mVgxP7SIqhyz$A<3NKF}N8&}@^P65DIY9#Wna7vx!tTjg$J5%#=k-Lb~YQePp| zBfpI!>hOBOa8t%z+x;}-&0a~z=E8%lz4Sx2TL0%mX+kG4 zOHx&6jMiryr>>q1{dISWS(_gE$QYJ1J%ZVoM42!BTP*cM3F5S@3KE~l>RI_bpJYrZ zyvpOX7gh{#c*OWh>B(-1ba~*S>f`Ze?{TN{r5A%sW)0oV2);)ZmV759s#JIXMrznl zwb@J-z@TLqc!Sa+e)BCurK|OrHzTfOY9&7V|DFLQ$v_w1s)-O1Z(8`JFnXj;iI&aXkoUub5%$H7`|n6Sy%X0f%^l~AWO~hsQuw};l80~FS|AEVWntY zV;l59qv94!`tGy*P^0S4MbAF6eBp6huKBQ8~4P9iRldBWfs?728GP<8rWt zm|9>Ir;sDcc7?nq2r`7UelPz*X<8)rXQCxBd_w*upOnKr+JZ`&`Mv^RC={3u`>y0s>3(j^X1#;o0SvD2NCSIFxmmJXpP>^jhUX zEwU~O?uaVT)@{j7Y9#(`99#yx)S*WOfd=yOQfHTiXl~{v&T*}Wo3O2HHkpDGd96|F6bv=NNjnL^aiLz@nKG(7$JvFYVGR15m zZRjdk61Oc#><*z-C`-MT2t~IX{YUVDdKAAX6keshV2OJpCVYctxR~W5YrvvJ`+bg6 z8|(md|22UBLo=YFuzrIdad>mZONC!M%i8vyo8YB%J zLLyywycU_UxK}w9`^lKVxFvy$~)aYKcEmpMiNI z?`A=J^32CZHCKHmAnqgy7{~PDeR3uR_k!N+QK+`>i`mfWof^g>(RvLMdWy^mBaAV| z_|hJ&(}4>SuD_wORIlCXAsdK4eWpaWKV`Gx%mAA?14m0oh5ELrsu#2(%{YVnb0_9z zN0wbcKK)x>&b8sTwV{F@?h-36Q|};w;$qdHumy!5qJ9H;1E>?B9$a|V;}UV>qs$-k zt1h32pe-w}zp0oJ8$Z;I+R$QR`2N*@dWpN94#y-8D+_ngjh-G^M!nq2Qj zW#kEF$1$4@Ve|2_&Ik1tlz;kiJTI@}^wBwJ?p}#gXF2{baJ6m?-k-GbPq!rj(#E-` z90O^xf+@I<_Rem@)C;bjCEzeY#zvKXp%cFb|VQ0sXMF}kXT@84yq@hUEk8TG?asv!4%^@*r- zG?@Kp+3`l*p1;9$WhOX*bSL}PLS1?ijIry9_NDWV&`Fv0I=hlZ^~uCEa~9MXh$ng9 zuh7FW0C(S0G-@GXEtaeWFPU$_{#Xx77LpH+D93eXdOE~{ayje^{;Ez>uo9L1`hq@K zu~qJcXu|GhNHk-n4+YPMr;nvZ?M}BI6@DF+@N^TbDY6w)aJ895F0uVKq(k(EU8*q z=VNwr(rrt$dKE3DT?EgW^(kw+FR4%4PcL(qW{sYgg}$V4K)z=3^_P+q07}v45<~5! z!1J?Lut3k3k&1O5@(8!w#}HzVeo;E`6JLSJ0PX~g)_=?bC=$y6+hOAI6x7`q@1N+0 zB#?Bg$pEzr%x;f}){UGPEC?k$m%G1az{ckfqniTrrC&X#u*i~J{dChA1V>ZbQTVRn z+8{XkD~~8nMB2U&tVu58o1)JQ*)DTXh%oo@>4l>b4zzxx?)BJ$W7Adq8P?9-R0AK! zY!o#+Q*5Pq9rh(1C{}Ec*wbUL9yh4v0cydz?61EcZGIPmkS8g z78lg*O61RHt*S^>CmjE;H_dr_=Uq)7U%#esS4gmcOb{X+%>{+_7&u4=r7L7_HvhJ? zY+Lu?55HP_uuO7Ie_dQip!N6nbt1Yz+`O(hrPYCY{BIuk?>--<(j+(|H8bC`h(Go( zW!jT;xZ-O~Q7m2VZF@c;TYX|MO+>+QS1;eEdEx8TuNi;3E~tU@DcQpcGOj4FDXDz! zyd-6~GDC;^x!>N*=yK$L% zPUP_Q=4->T6EnsR{yf4JI6kLhFT5~dTmVSG6=UrVH~zOv8{=~wz&J2{#-2eUS9A=~ zP;0oxhZDoeljehccy1H~tm`=4u^@pdTSC^&DlF5pPjhQl8$$PR1X}|Z18?ed?vUuC zhK9WL+#bv;{8)*7nX3`sZV)3SO7Z8CZvp`hrH4>NIm@0kf98i7IwM~O65rhz)_>|j z01yDYg;mp@huyk{@cY(oK;av+jHu7Z!7eAGOC?W{Fs5s^WCY>mEbF&;{&e$~MQfa? zK4iAcH-#lEC}iL(2Hy?8rFYmi;v%DjbwHYKeSljAwAI;6IJKK>b?itt-eRY@pD*I` zw$F@EUpBl8auKM@g^+>b^MTir8eNCOs+-TACwYAxF3YpGMat0GoICG;sXFju$b>yU zK_d8HP!F~iEQJf2suc{zW`!J|I4&?yV`8WV#7Ae&Mmn;vMwpwVlJ>SwN7{FVf~^fB zP!JYt)&_7pv+gOdk*ZlgC=ek1wV9J~PE{oF>$A5abvK{AF43H(*Wlc1zN`?*HOT^0 znW9nq5PwRWbYEmz*8l^;4MVB8B8 zC}&YnDX{xuto30rJ5Pr+R}gB@Ym&*r>PH3&#ctca{~#|OS|3xEWaF9|_(5=g+P+M^ zZq~=%G09|efPX&E^2mHIBi3G2s$$TNUjLW-dV5H0lj%ls8p>;AIUA2xA1~sLi9y5w z!V&yMpu2;869)a%_qzAP3Nm2R=XGezS96^WdIuXg{7f+ijd6g(5y?tTm_c;~2Hxv7 z6Xr`d?ZON*CbDK6;eOM8r*i@)^;ZIA^VxsqQ*rd?P&ln`h=dtz_k*P^wQ6rhaK$m` z0e6#r56M73mQ!)y`aU;@{<%mkkhHW}Z8z}iyU&B=8<$Tnj>}<6o>8;xp6|A+N3?Cz zIvq0#otwk@c_?pW5M0XY&FQTem)C@omL!1=-C=A^H3N3x!H;2fI0b6TB`-70-&ob2 zer#j+SO*0;mv3oC?7dzREwAsKd1-fEL;^K4aV4R**@+$=^#|HSimJ(WTwLZ>c0|BXMaP-{BBza1K6ZS^`@{iE3P)5XBkBAHurDNc(?xx`1jrkJkPK$vkv z2W&pKo4?k2=dA8T2j^WR-tb%3UW(_X?`7xvmG|NU;*AV#uYsEnxSGi4I!{HnI1At@ z-B+$_YZ%#H1CN#9PR87*vrETTlKh|%5HLgCzgQCz%5h~!e7b~)J2rL~60!{2aS6v_ z*14dHa&sfE^jYB$_I_#O4OcQ6s=k<^j-=pkF1ICv#RXael_Sm=jmD5N#?au_vx(Ky z58KTnWVXqs9wR$y&to6Y!1SII(S;89uQgJ>Wiv*7s)po$U4vM^r5v94>oj>8z9sUO z?awyaodpcNpT?dcyRV3cdSG~I66|~T7CbP{>oCSIbD^X>l^MXyIqWzSD2MM}xQz%% z7VOj&oW^b=+j#pR*+etA>P2*yHzxfHZVoQd(6H)}r(`^2jq2olAxfViV=%w)J$mv; zKpf&qamDojiD8(dbV6`(H&O}U@*Hk+Ja2nk#8iT9)uE4Eo^9d^oVAU#)7aq>YA?B{u#&j{`Sq=Ov1@=Loo1~j*{=n<`67z#bs z4;xkAr};Kmr-!Ic{-!_>h;2{`=)N!lR>p^HbsSO7=<+Ct_u_WAHq0fVJz}q@2`Z?= z;8?BTb1{;oD@*Ii$}Nofu+InmJR@TwvRS{~Ptda|z)I@wo0#*cAbry3wnM5KcvRd; z_1oAMr!)`QS=$4C;1OHClJV+@6zh}Ru!G-mZ@7dEo!z^Valxll05a;YcB|{WXtvd= z0X$GOmUXD|6l5LN>fXb_E{{4ce=zn?gf$7aE6y@N_2GcU07TZi@)hQXm}5q)+x~Y^ z3zp*vH|a|4?Tdk3mhPV-MCqxM%U_P4PJPeN;>mL`y1ZojPM6LoAacf8YBG^7HNZgj zWTV)yXJ5X=#_7IIr~>e|ffxp3a!u-waq<@KLVxoa?Y zutXK6WXW=H+T0%YWe@eo1pf)~VS^wgG}Q|Wu6{Q=LWxWOUh}HS_6CW)+AB%t9_XJ2 z-(k5s&hns`$+3;vIecbh1eHTz(S<%zGc1|Q%)AQUG z$vuWK!b~^-phZ1T9?}dRt?@)Tuara9z0(Ke_$O!kAv-A1um$jt>%0PqroZb^(hdh^ z&h|Qeqt`YNpQC{3n3*%MgyuWH34l);a~MS|8_>VVK=ULUjbH>tm1Lg9SU*?P+<2^jxV2Yr44y*3 z*YPP23`7K9W0C+rU`AO2{^t)!HR|qnI;w-7#-s1H#$aYV701hwj$!`RzMJUV>(nff?U&A}_+eeElj_o)Qwd=%yp zt}V?Zomr49tIswIR{i-nv64!?_2N??QNzgR94T%=mL3%0FjjpQZx2hlclBo{d@bvZ znmx=v(gt1Lb446Hl2jwD@2-QEz!l%iWDWEYg0)3jpg+7mo;REx6rZu=m z*R&+&;>qpla?b}8*bas-vVOB>F>P~6B_+~=b3qr?y&DAJ-CL>IN2$X?{l(Q(L z?QH`^5?I6XiI?q;&f(y6mKeS*drr>kQ4Fmx%@0?wPUdx?QnW3T(PexGizA0vLOK&A z&Tqx1WY^aWm$2uZpLgtFm_}cf19P)sdb{o!vUkaw6h(U(LfOaNj~o}~*vgby!*%yq z)GtE&=tK8vBRx_jK4dX(O#ygr1Vrn~R-YAF^?RJOoB$>Ll{WHbrh@j)r=y_KT=1Oj zoq`-Ula(4kP|8T72J7svF$GL&K>0`uR_u17<3wL!5L|pl8b;vq0i#inCc&_|{3wWJ zcCo1F?%u+myRaJ&xU#0ts5%KodhS2x!g*YeX~!jk2P(go2e+v88)?mkmAa9a; zgBSsSb+ulwG+xd)Cg1!qeQ-zCIKU${?CB#D69pU3m$g~Z=~i{Vzy{Nz=~b~~(d^5H zg@Vye8DQTwzs|k-aPOH_*N{K#)z6`Vx^vVifXS6XX3U0|w+4QNO& z=TFsWA9l_gp?(Y^kgA0EMfZ53CkLD4$TH+QNpGZFVanGh$p)dwrKr4!zY)wh;#zuAB~H^yj)5q2qN!y0?|JA(n= zdC77=yAlwk$2>cN7LZUiWllc=VPeArb_v<@cF>g26lCAuDgDjdX8Jk;1dJ<w^3|G$WrS6Z_=nS4~pI^TH^n@|bD`u_kakK6vYH)Mn7H)qNlFCDkXN9tJ;kzp0-Ykq7!US7T2tH9_M*2_G~$JM+dH zaxo}EHX{)`O0TaKs~}lz94Hn*#U4Yv+kz$D{N~SO;UzXY1(5_*Fthk*mxb?%-RFl8 zoF`pRLt9xM>?Mtm-7*tK!fNAZ)BH>=Do09c>1@A!7~uOz+&g5C~3oY3y?9Lu+0~QW^F<5O)W3c zBF76^BJqI&={6uzZB+!K*5*L<35}?*@DK0=*1>FtGdKRdymgWMs6SO)6BVBUyT27L z164dOq`l(#FhG4Jr_}+X$#(?{8}F8EFmlK$4EwclB?%%7Q;?da?$yP;RobXf(z%{0 zuI0mV7MK90#~#M{1?hEaD*&8ZvvDfQ*TxpCT_?H=;@STOR6Fdz*Wfh}`i5eqt_99P zgF%ICgS#N;{IH_w4il^V6yW5H0X zC`)Dd2m9S+LhzPtSBOdP5mc_d{{5?8CT7b}3yI(^bY!emchE=8mrp)b$M<>ngCw#lDQq=>pGA?Yx$PBf1lO<1yeRLcVmAGxSL*P=~5JnV2y6+?vE& z3b??!SD*|q9y+C#qH?XZ=2%UNQtVNAA?H?pX+brelkWF%Y=qJggF=av`g;1|IqcJq59DU<2|W+{-tyN(gW#~PZ-4q!o4`-Q z=YvVHY%mdvU{5zY<_W~)2kXJN`^_Cl@4|3LUxKii2L{|q=AT{h#<1XS;ly|_+I-|3 zjJ9`zn4cS0(V5xGFUAcod{V+0`%<9v99ee^Mw<(CE&*rkLH)NnM7%0{DdXRTZxS*e@So9wi za&6Mr;2T(K5&HDqYAF(afFc8{j`}cxQAOA%`)%v*MpY_m!ZA>v_|6Y;IX>$n@4(14 zx~2s*!w@GzYW2)9#qKA0rL2hruuuAQ^Tcczg-r790~OLM&9J5`0V=aEvXPCL<$ zhNjJJ1;Ey%?P;?+!$kA{=04-6cv%45$s30A;pK+sW(WombdR6P7eV8J}Yq~Q;OPp!o&nA9%VQ~>fc ztI5xkZa%FR=pxOx60(!e!@^GG7-U`bH*6r@erEuvuX*fswV;WRo~du@EGz#L6?6A#bpb;vLa>O{16Hi3|%8`3^P&E~p^lgHl;BgzkcC{*O)6xBP z%tOui!>Sj|cTNp74no0`vtQ-QO*nj(T|%iSZL@7fN4Fx>+fLLi(ce*p@NGeDL*8q| zX`5Ioi z@@&Uh$vU%BcN_)euU{6&ebt&TuNP`vpdno!zh1B(fOp7=d4QR(tXfYs@b)FT<6_Hg zjM{wqSn&xG35J+&KejhlLYJ>${Q}T~nm!xp2X;=$qj4^JA5Va(L6>MXQnqTM1$kG# z9IIT&!oJ$`%3fz_dlkJPdW#+3ol_c4rGudk^98GtwUV4Ip$5UCsE<;CWxWR3=q4Gc zTe1VA^i|^)R-FQ`cs`rCU;l(KZ`NR~C7HR^SSNWCpYb3w3=@suEM3h4;m_{o#0r2a zYC-PIDYaK(>f8Inh2@d&B#galF>&mjlW7M->$r6*SqTNH;}1i9 zH1qo|Deu<$g8k=5=HAaP8#5>xYIr>|S(zX)=Me99 zWdA|ic3O-KK6_@J;ceA;I)52@FUjo9kq8z<%X!qOV>$3lgvKC)rjzn%&)w(l+i(?I z z{|{l?K{L#-_TchRt3h`uA)c$e9bfObXQRV|-u0ws`hc`T0MA=Klb@qkoC$7IZK3b*0mV7Oi*$-;wVL zyht~a+t9PopGoVkPv`|CH(Z; zP-4y{ij(PvBx&DUYO(DVsN;Zw*{w%-6+toc1SYLpZb5lA7^NUZ1_XG?GexPukakjx%<1`Uuapm?!zcUIg>r6d0VaF5B+9N*n zjd$J9IpqF40*!BUQzaw>TGrp6Zs3M-kE)lruXr$;M#K`c4EOZFF}|ewAxZ|aWHo03 zKrbCkk)7UQ)KqO^d7AMV_N-TPBDs4GQUgeCaS;4FH{fruM2FTw0JHp;)kXfP(_zpfUc1RPQ#igoWuH8s(Q{ne4vF_=%LDi z-C8?5VVC8+LvrH=15sz}C;y%aP4kOKY2sCVpO#@CxuCnvTiV^nZx()1aTp`;UsFo~ zjTIJ8`!O#)Ip5=rZayeoe!LK~)6W*K9+T7VDPTi-0+Heo@V5s_fn?+-Ri`VDH%NX3 z-2w9#Qzy@Ly7daz%pVOkDf)Ak%Q{Kp(7Xk&V0}mMTkwYs-MaiqNXJ+>(W^sjryJcN3yZ(VPjAfo(qzjoot(5e_g zl&t>SMix`K*WLl|kEB3lcHxBMSEd!+3Zr-k4Yl}@+ZK(#^kUmeWy`|Xl(7F(jvu*u zw8t`K5wA78+#bPczEukM_nBy#A8X-j8|#anoK=aQd<8(3TDbECKzPMc?_q8P6hGCU z^(UjJpvG2tmD%)*UI7!w_>kTt0ZmUqBW0nGIey3bq2Q(cT!}XL>HM1!_Gr1d+UXa3 zJ_G_S?{AS&B(rz&jGLa$vd23bJGQu6i> zcEzH7Y%c55{{hMk5(k{TM6~In2qn{mxyF#N;F4({H#VE^WfLjeX zlegWDK4E9tF6_U_0~qh+Y`J28&^z9Fg%`N>eH3M}>Ebht3)xqjn(tug8@m-^(IBJA zH-m+Bk@%97;tvf%CBm{^y3M>l@}1-NfOBHoIG2XEv4{;D!@{xRF+6qoz81 zl|WWp?qagi?R+h{w|z4{^Jw*`LlQ$it=bZ!W&+J*F;w=9*(aGH;vU387##dPtHj=| z@$1v}jUBeMjk)EXPneEm0q3y@WHhXK(tq85i@MCm&u*Hsy-Hg1R?x z!Qc?Xq=O`rT8*h5XubTso$&cOy=E^@76d&7CT+sbl;(mh#nhFny0^-jw5Pp`GKQB1 zV66^yOtZ8AidYZ|L3jVCj$~^-WZZ-H+FV;o-}9F=^+X@rifF~`R}OWIj0nm=SQ%Z~ zZrC>M)bi!vHC$A#H`|)639f=vJ8JX<<{mO(&#l=L?IsX~QF!){fDa+&{HD>Pz z(*XFJcsdVa)|ui?=A0KEUQuEFviY?1*1)f_zv(fPg*2Lz8FwVUWTwo?aUnzJq)6$% zPKOsrDw4JR5UpzHKYsP1b03==?qEc)KKtAo9$7e`2n&Q_Em20@~zG4y;;Dh1#7#XrFvDqgG}_+ z;$(WUBef)1}+Nr>0UiR&HSZQ5h?q(yB5 z=!83;><7`1Mcd1wiQ9f|joSur4eJqqxr>cFsc~p1oXqqW9CKW*qvPN6xGj2TzXD5k zIqGxv)8x8xuhmgpXLa>V)arJ+8EQGX>%CeAP@tKVuLHXnLDU*MCsrz50uNFjc&+KG z8ESteT~B|l-MFDfGlV->eYBi>TOt0z;V=%l?EN&|<&}B|sAoa*#h6-A%jvvk`0367 zkJeE-4C9RuNgdp7lA`6hQZtotW(sclTj8d9hq4oJ3t zwM?G#&~(m5IaLp-ri2LSdlRjl7=zXjL3VTgR%wuK_hBTRC{LYG;cS^bNhyhleqd=o zR-`-j6+0L2g0L+FFB#N>815pfQY?#mZ1MRmyTkp3f zZ99StvdkqB+ER2KX5j+11^gRLj2C|VGV|gfC|3Ng;nvIYRHUaoxO*K>M5YitHZjqC zAm92o8|)+}!{V~-)|Zqk=3icn2zV>f#z$y)^ry(B-Qij!ZhS-)Ve}MB21^#`<@8mc zF^6!AA=Mmw#rY_KVa-DssLe#?Np(>{o~`RUZv1}fEr&|}JmOgd!gSByU^X5A-_29?NrO-X2g z<@K=N8)w!&KFd^|IuoXE80Us!h7}0pA~t8`khnkCrpM1|`X+R!M&_iWXD(bSowrJU z(k!|(91WWfHyQS`tPsjcRBHS5m#pW@oy@YA!sqc3r*OE4={-*;qaX3m>Z}ks;8p6Z zl&nEaG)b6{FY*x4!&e^1^%Z?GGql<+k5F&g<9&R^zyxXBNNmNbMIn2KN>#0SgRt?< zO3c?AvI;*uZK0w$7hWsIDZe25?CO`hb)M59wIR%}m%G0Z3)KsQM%1xVAiZ3&1ySw* z#yUn}nDx^Qr;p6gV}_DCvs4vt?;mAN`C5`w_vTy=1#EXWOd22mW(tGv`CsP0j7Ilr zn{m`xXR^-pUbeaK&p~|Gd-j}BEu+ZAK+WRWO1FDj>5NVd0>&@is6JDfhJA8zEpDH% z>L$%ugRCp2K6Ck6u0E4O7K=YZ0Rq1=*`F_2!H0?lp7j&&1wO;iU4tZr;}qU#+`@cy zqcx=>bfm5Wa+0gHYk>wL%K3)Mrz*nwGHpa*RUgW5v!Sg=i3zz}aV+;9^xs?ALL?`nAJHE~Yz!qUk<00w zbYlb95On~_3~(W{DktU)gGG0eEOhP>xU~1aajz%}@F0e0u0I<8) zQO2IHS~xO%LG++dvXytI_L7QI{&uw7fz8E!r+n&ep;}=5*_JtgpIYw~Ua!u%OWP8% zcC{tq_d9}-#;x+?`3LcMI+K>x2MH&h3x1~sI;g|Wk>$%E>EL$-yUAdth#{Y*R7gV z9K>MYsDmhT+q-Y5TuWyL216q3BDrjn@`cb_@InTsdW8pnc3|x|1BQ^(FlNj1$xeB$ z=nV(0_@~a^mq^=@D9Kx7)4HDX9>LZf#p(sw^5liyJS@^hgMl?wm#JB8?+k!P$i&+54(6Wwe`N`Rq|PDpmpiB? z`T;o2ARmsPED%r~iAm*yS9$XnGOw`vsx_1K9fg=(Wb{D>`|jWWt$uVW39vSzz9;l9 zB_||olt`0&kP5@V7dzdGWZSc(>^rWT!X|Om*YEx?f9EEVHDEB;o2mG7SHX&04=TU4 zraX2WHEe#Nwn0M+c`;Hqit18miJ2m%c1=IaA?WB)Q9@yozq4Ff?E$lkTLM?NtNP>m z+88-*2bs^G4@GAtB?+#b2Jvf_`|XI>!c5ZF`@pILAk1>cbAWpl9*BGS)7^LNi@Emc z!W;O5C#V6*mayH{r_p`Sy&a}rBHB({qRsAI6q~qZc`b+a4^Umv98u@4a#ThETXTC! zO-8G)jE!zK1EZ%!m$w$UXXyx-)6GsQlU>O3b1SHjj1<1yxI${pA9rW7PfgF(P=^CL zG-lAMjA}`2#H)Dcw#MXG>Z#S7qxAOIGmSHKemUBiZ!BTPV=2$K}sCbv=$zUK@R9>%8?7^x(|PH zHPQ#LsjA>2?B?z-+lWkl7eK|2ZI#}3eyW(tvE<43V(DyTj-W$6oMek6>_KGL zD&exCHk&`=OYckgv+vQIm|rPtsog)c*f50ffc)0}ii4X03#Q+wsGGf-XlFmKd?87^ z!`VK*@@z!5RXG1^6?p-1g*XK>gfzJh@M^QdZy~|A?CDR$J>D+-UDdgyrGz}^ld#TE z*<)e7Yc6|uDMJBpL(u9MbTkpMF(PT4`Y6mj6(dL@QeW+fNJkOKk}A*_b+F0 z<6&*u51JLe2BLdjs8QI(dsS`Df~WlF1Z;F~OZ%%(ugoz6|*9 zRw0ahh^aS|KN(Tek)n?YM1 zxmq3DB-*w|1t(v<*|-(x_y%HG?l#NtK}j6Z!Qc!96r*We1i_v9@vuudq^u5&Bz9o# zjh=G2F9cho$zTK4(=|O~Q2T0ez{?Nbrqj-FG{-FzVFz*`S4Z4jFC4aT0d3y6vdl4YTt)`3T@rx_o| zd#TJGnd>7uHv}^-5!&fHwQ~|J=Y7t#7~n?F&W<)2WCL>n__8a31e58u)K*3t;Q+BRPq#&K}y__9E8W9;)?@G?3~0>zw?h3djHf zrcsyNkp&Mo74qpH-?#sh{d^wcgM)uLD*~pSPGqCa&R#@!JI5FAVH~c+0!7T1dlTZ;{fBo8&PpCc+gi4l*AW~WIpE)1$aK#o zqBM2ObC7FCpSrudXdF9xcnC6=eD#+GsGsufWoGD{Vo;bI6pUIbDN_gP{jEEXn)6*|1Ms z+k#6G!KrfQ_BWnSNoY z^6XtZrL~Zc?}pTXpZ2ulgegKdZ8L-0|In4R*>OGnFzX=h$p@hELw-l^n$Y`|S2Z(`u%Bn0TxRhv;DZHWQVX0MI}U<~?6P zqIRC!t}xexN%N-X_}oV}c1oqmagF8(8r5M_&E`h`1l6M;O9}ZJa@jtnBJjigYv9fV zu?ne3)N92oZV4s*@|SOUy}G|H2aAe?Tp$xF#71_LJey>~FhXE3JxNtZ*u;=YpF^lJ zF2jRq$b~m|DY0m>bn4gkysA3W^fOcdm1kNsY*kZs?{FR&u@d*p{>ed>i=Xbff8 zXGh8vAoU%t0%me}#`p$;+%MIJnXJ|qKZR_^W)b5c#FBx?+CWp2 zkFX2-D)`R2_*mmRhs`S}QZZP7(N+|7nt;st`kCh-BM!}wwUZEVY>D_zkd&}8z-rTU zR!7iTl&9utG04cl;CP=bs@%Ln%FtJ4(As-J!83-05fFl%_af@x=TW1;cwH+e0yk`& zy~7t(4lb*s25>=qUQ)Y%M0_{(Fm0o~2tb8JYsyaH-rceqPOa6I_&CE1tT9ibjWVxq+M^R`^Z7+ zH5-!82D>Z`p}Q=sy&~m#M3fi#U)!xyjmw%hHBye2X2!^T#;b-)OUU2Q8fxo2DEae$Y+RI(x&ZWhd!qgZ-jmB3?U3&1j>7Se=d< zd;Zmy3mcY>^O$rAIU@5UP|wIL_dVxBOu*5J+r7pck87H?)6H3o)&Tlc7I4dqd3aCSjd55pxi`Q_P4-9_!r(g0<9BlLPhy z&6Jh*Xkg_6(Cu_%e1&kRI}H3m5AsFSn-qJ7!d{)g%@k%xwh8*(ns=QKuOvb8V|2P9 zTSAgGk6rOBc-R(hi|_x<3C4=6??8p`|E?M9hVB0pdx~f6pwoI?+*!j9WM|ygnlqip zoDB%0-%@sBDxd&u&_n2FM9t?t2z3vPRrTy#W3kCt=yTsU+FYZ!-^>MOt9PF-7$grZ z4lqsK%q&TsxAwpu*H3w3K5Ld-<$8>sBbhxWIQq@yWanstB4T$qd$N!-VTfY~%U z@Rj6gWuel50@;clZ3O#61g0DbmWMrhz-{mIRiuz5qQH#`wi=#d$s^Hs(gpLotY@j~rYb}huaKXm^C}tTvq4_(3TqTK)5SPQ zeVzqepx#R7M(2pTBUQ9#1b&X2Y}rR+lH7&7SXn{mTj$wivlX^u14b~Vi-voF7B}%h zaxD*>D{$|nZEq2BMHWGr@c5_1OXj8yJ2uBTD;Xa2VVOnK_9%uX=`@_JZ_>ypHs8|UO zyCE|8{~GT{#w6IHt53|xv#%nc@KVqE~L<|?zDzorkN}14Hs)?f(LcK|IKI8 zciTZkF}6gxP7re!n67LMedEQ{8Ojuvs@*l7s+KY~Adccofahs%1|jE`a=qiYNPhWi z{p2lnB#n`QYugOzc9d5>R+2`>d86L^fI;G@WCGnae#@O&#AAi)sCnxR$`3+GQf z)h^ENb_Y@mM-$Ww|OKZOHx7SvrPghmnEAgM)C2k=7T?*8mU|d;Vp>Kw~rd*8H(fA>@px`#%MeKf7{maXd(-dY}wwF=q!F*dc z3jChORUD5-Cd-97=lCNe+5vQ<`EdB4{#*I7q=oc(%)2tbUl2EN-F9b@u}U1r+?3?* zFkF-)Q4jwD8d)(#2e4C!$H18CY&wg=*#HY#>?x1`7k`lTkGB8Op6k8j>3uFki-x;J zofcL1{Wf|Yb^<$~Yf0Xxdsa6uCl68k{3Z7LZ(O{C;~0ru#REFAY@M{PH)ENX|VVia2lXDk_gC9)T*>n36(I8vv5ZsJkK zNuP?JmhXN|F`Yx2LM}RNiGjJI=fuaw&?0V%!nYeHyl?wU2?9v8<}A zge0>n7ZI9OZ%+YzKbb+Cqr9oD4Ce$b^wNR5_kc0m4EOR~X>ZZb4eh!C`2yCQ_|mryhm({&7mAg6CgB$Y{T-WMf7ye|gI}6$tLF{c zfPvBmU>bNHwND9D!j6K+K_iCp{F2_DGkp6+?SFz*?V{{fc!NfgpCueHJu8yi)5{ENCr?lM9=Ccr>j_K1UB{aptZVNvSuK zi+5_>c5PpzjyiN(~9nIzISB&GcnhB^H+!3bGvb>6SGU@JKKbn%Wm_6ukC@;@Mh|THh(%BT~wy zOu5)JbLH3!S2XDLM=j>fBX2xkjvez?qR}Mc4rFtBoOt8@^n-b+uZ@Xo9UK!w8=s+I z{3a+OJ*wJw=;bQ1{WlD0aXxqu8>9$&id~$LY(nu(6W8aZ7b7rv%qIY);unkGvGPXi z6ZG^Hn%cPN@N#Vw1C3z`JsXf}Z@)ZS0pFXw0%_9?f(XokM`~Xz^zqUqOa8nZ!U`;e z{9rb|dV)2WH(wjeJR=jT6bCe;+!^(!o?^^HMMwv=xH>3*{5qwE z7Cg2YfI7Ez++jO{$B7u4UU0H+Y5v(Ybid}j_&Fj|IOa;rP+Xt2cw_RMwy;D-AX6f> z&+^IDzM}gTGdoQzpXjDCLo4}L&A6ft^1i!o%sD~VijnKa9_!l&_ zx*;IBFDHFDj!x^9t1n1LPg;~iL<_7D?PTF4P+gmw?%2|0ND=csAU&%nfxJbfUBDL)@tIWK{g}1q}5k~%I;?L`=M$OZnNu>tK#Ujj7Ne@ zAq+U4G8!X;bjoIE^4bTkzuq#amMjwuAA#{;HdSQOX#$U)oiiQyA-+tojv3j?i~f?T zIs1H6$O{c`1hS7>tz&b2+8hKKvJdY(W{E2J@lIN#1C*g|wk{Up&c`d(4m{V}y5ZM^ ze*m;CUGCTKHO@Iu*Gr$y9~4FMq-($G89%xsq7EQ6UDPGo`tB^!1(j}zj7UpZ1oZLR z!BxgF7YEwjSY!S+^LC#5EgJ>2>($GW$ehq|PRJpdz67y{fMWLPC35p^cm9KmA4frP zSFxloI8MZYW1IQKS<2po+!|)%7cUmkMIwolsRJqf36GmELs%Al?peC6!Y1$`wx(=B zwnIJAe(CK=-qfva>&+rmsVDQ+BQ+iE#6%$2;Cu#p$q-0#F5T+C{xIF{$JF*yIM??Y zQ@j%z4hL+aC#BAnAg?p}E`ipo|7~Pw|2Jbw{#WJTn6YSlkURO>a$MZ~K^4Uy<((>$ zn{qtfai8$;lwoJ2P$erlW+T={qV!2Bpam>;c5iUf|gu%VFFL>t<3{XH-TMihh_3h-JW=%y562Xz7# z0q==6^~O18i66#Q4tOZ-A{D;oMQX2~Bj`@OfL8fOcQ`>95~Hx7J#rep<@=2#byY$Y ztnb$@33A-U%0O#&Z{GQApD?@mXB+>E;SXsiMSDwLb9>`^MsTvKv=6x2cEC;?D;FR;)~70td~_SVKg_-4O*Aa zcWeOf#rVa(R{_3DcrIVPN5n*iU{GR(Qty@M;sK3-t8`OQWz(YgY*>xN*KyRhZgsne5zp z$kHcsN^1EXn6-|H&o6&q8C&RXm$6#)K>e~i15B@-*z)FhckDj)`RFlM*)+QF2sth^ zGq%7n@MQL_rTE3V2t17?ZJOQSuDtV)UI-#h4Knz{wmNWJc+NS$r7#nm1o$Y~wM3xn zXgFy@dZXnVPfx~x--6_|IQ3l%&VTAE??zWB|C4GP$BlV5*QvE9n!{!_C?=<+2hIFswgrR5+(ENcESAVZLwFjx9`CEKMD}>*m zM`JzXGJ$Ao`!Q;7rq*>9aS+LX9k@ONnnD*tu;$CN9)NuT3~Ur?!JxBCtOuxq`ZtRP zuU77esD6hRRJZJY9O?Wvvj<54(<2H#-){I93r=++48U5Z+HrB`(@h<3dFH+Qj$OCF z&@O4l$f1TQJ4OKZ>ZxCsu1bs4RBOr@HGjbAn7N-~E-oamy{?6L(MyVNi^CT31 z@hg*Ec#m4#h2&||FR4|L(8jIkZI8b=@?C8jvke!Si#o_0JL7WV52^4Ur@ji`RXXAS zVgx|oTXws@4K)4zSmET?^S5Nfg(6B&NMlpX$h$Z=)lr2lZ4%GVkQTv6g!Gj*xJt^YvtB?-!b8l_Ll(r?dE+onn!P6{8PL6)^SZsSL)*n z%m{lf^9v%10=MmkE55AV6<_uWRWJ)e)2B&i&x#pwlp{)%%Fp{}+p!;W;!;k1?*Ze1 zps=eGs0?=1BA-!#N-9T=qu4UTDA+#c2Bik*Web3n;%I7f?++KW{k#m>-G1bfp8u&k zp-vkFFLP2nq^=IRBrvA8rVqLw0z`~R^pd$m+0cu3XXM^lgB!Z9fFilV5lIMB{7O*X zn9B6U^d>IHT)X1?D!VW?;=-}^RY7Z8Kz{ne-RVZBu`UAS zH%A`x2L8}+!lx;aP}Rz-?*ENBQ1yOEm%}e zeyU^`Dgcz?nD#wx%w!J)y33qezul-)f4kSX41ATK23bITVeW!ls#QmMc5KJ3mWu!`i3!fA9C=cM+pxTol&A)4J<85a} z?&tMLKPZeANzZPa_bdN)k19ycw>Hg6)-um;0(`GTR*KJ49eD|90ThG(EJ<5c&Qzv>pUH z%`rZD${<}piu;*BkXPP&W?t)_3_8Ig2({z4Q&n!cLg8B2`diD7c8FosYoKxhOt9Kq ze)>L8$^o*rpH2~AJ*r)b>%RGaw8sD6odK>rV#=W7>$jwy|F}P2#I`AEmH)z8E%|d; z<-=RkLaBcQ!d=={+iR`uJr;><1~vxMoP=BY%{3314Hr8PPvEDV!q4DEU^T92TKQuR zZfQ66w45o$S=xSAb)itP*n4(RP_+XjRx%=5e}8N^ZF*TDW<)25wnH^DmY9PY48?c$SEI#4eB57qCxM$X&LlxUDM zPV1SSI~~g9SNg*`^6E4w{H4IncGNH*72*_fsa-X|u6o5EpM?m?iQ9sc=DEoc%JP!#kZd79)YW~RmDCOT7+hoTHRQZ`z1WlXe3vW z?#1N^D}_b%B-h$#wnpM7sYi>jT@E$0 zKX^p>B`{f5Vxk6$l9w5hew=Z&R{}@&L7X(ziOTCf4#6 zpX7ryZsLD(#C_qn|6RKrrOgqPNe4RDCvykd4#0peZ;3N^-l-rBs8K$NTL2Qse>P%_ zY&DLuSA7$Em=k5UsbM(I1JEq)G5>@OFo*XTyVN^?u$de1Y*ai@%NFr9=g0ed8G7ai zNyooZ*5?qA{|PsGCwiPn{a2E`fGQ}FjC=95rcO9nrf8TPPHnGfL$YeEmh<=}F1!fw~6pMX&1E zSh^At7>PBEc&GA_UszddG9cOs{c;6D2~1D#R10I84wqu59|B|`ClLbe+HpIvDtMt8s+cQ}JU@7$ zS!V#V3nH9b6ee-;y0fsj5Rf{5rL-rKwnXcM#=}v4=$)f@B`$RUKP&v;W-@jq8aHwE zN5R&B;`Uj1WZk!q?}s4wbxKGhm{(9&R+s3xP0wTx?dkg=o#uz4j@DdORkH*Zg%C4h z?5CwpASl&Ad%`YcbyV~)$JwHXVZC%{)Zn~XX-vhFQs^yS6~-r-;@tTaL>IX!SS zUC%f%5~3yle@j|liQue$EVAetYJ9o`a_WZ~=lY)^;@kd`*l+8()U{Y^zMcM6oxQSz z81d!7M}P_lpk|*nTFGAl|IOlGp%j#5FwGZ|4n?OmBNe%9ZqWyP-cDgv%0)o^yM+Aq8M$iro&eXqL3Cg}N8m@-c#Bwa} zMtwZ`58dzF$>yh6GU}gsLvs(fCECImzjDOz$}#Wv55bqn7Py-XKM1HtY;t#wm`GqU zv79N(8-a$CrE>@+w4}T;7x^cod8OEt4{2kYEL()hj`Bq@OSo#TL=WihMzkf;snz5aHk+}JK8R2_Wb$$4tY3r7FU*do z;NtD?JAW3!)mQ|OX$wEHI@%5f1{hUA^YNhVqrgWAfA=>3Cijo-Uk{Yy414zns=xR0 z1r5XV5!Q(z9vsGjkSEm2y4dLfTt-+9To2-h;l0(Hm7DM*8G_qsi7Rp8vhOzFf?f^K zH1YaalcYNKXq0NKY&>t-qx1KE<=2EBM6w~5wAV0Z`!dNvX5BJ^I_pbr0Q)K24N#%& zy(#aDL8VCo^U~9FwTkx6EJ7$iCcezSs3IdkyFVSES zY={n;UC(jOqEfd4!7ZI*GGE4=`5W{(BgoWuDZGfp?EB-BFZ(fm5rrzE*!?bdvCk!; zzV|QvrIIkI=i&0{WnoXY*;8niZ?QG~?N9d{HlwfwErqcalsd2#W?O9$#{|1kz6q8d zfzT8JzW?JFqBAdO;Z|Swk^*aZHgctu^`>;x^=QX2j1L38g@rv>DrLAEQF?$^7k~e? zeuJz*fVE{j{m?x|rhu*+h?^C4>Xsdby2LPwhqnx*`#AXvd=vUkt^GTj0_txrr5OfGDq>B1FtSla77RkmXbiSv&(MsTY>0u& zCQ0a7ZZISbuiRQN#^Cv__Z+ZQQu1+0b|kEfb^HGNaX^t$SBO}LxnX9BAU0{@3;j^y zIG`_8)_C9wAY<@Zgi9tXvE8~j8@EsrzHuMA?JhnzJk#XXTvpVG8y6&1k9NFEic)w- zs4ylRF83vT%+(>8PqQ9Z$?DphCybPeN}VZ2gqoz)?01+vnl0tH3@V%DFJ9V&ZWaVI zGEODXIl+qLOXKh4^~Q?eOp)tN#TBI#x#lse+Na+xR2F`p2jl_2ALRvxm7d)F_f89e zWQ@@{j4<`X_N_5N5`s88JboLjw^x0VL!YCQ4~?jW*DyDu(MdBh?N99=Xy_cv|G6bU zkc@JX9EK8%_b;x&t?r$dY&myADHJ0ysRT@oDj9AeRqKo{Svoz6>$t(Cl^XNx>A!Ek zmOh%!wL$Qyni`t2PV$+Ss(ls|MtL6K>q&<=4MSa8+~^rPu0Nt#yVw%wL*4YB5X&Xmr=yjXHWDd-eZIT3Tq`N1U&mT{ncRpHZDdo$2C3)^E&wDI-xz zd%YtUN|*S8d5uW-!vk!~KKb8@9_GBzO`WUP@!}n~aC{GT5jGKpVu|)TogA`w1tBHS zFKFEGW}OrKgkh-bW-!uo`J`JBs~<=Oq22I+EbER{hNUCR7M`WkW8U-Ag^nYclXiYg z|Cs<$$1F9|nsyo>;Rl@dhYWYS0o=%HJB~rg*=0!{EtNtbmp1vZ$5OW&(lbrV9}@KK zSUY}X*mNCm0|Z9&_}K%#?5k!kO1b4G=8hA7{xyAZd2~da(9{^Q}`unzZ}>B7=dW|g!|tULZ2vXvTodKy=~QJf6F zzUnQ7>bcv$_hI*4;wDG~NH=v$>LVYm@g|&X6%=Y%{XZT3Kbg9hPv1?iUCrwQr8OF+ zc)32}_#bQp!awgoaT)IpQQ}RsibK3JD8n8yt)AW>xzt6`}>+gm8T2PCh}oRfD#!lYc9YhW`%;G1z0`ZsA2R%-RpYi22Y-Xo zBkVtGNjL4eECsO`mGTEQE?ZfVoHq;w8CZ7IU=e| zxp0wQe{xWA+L`&$GxdIizKuiVQ(Sf6g8T&DwokR+{dBVOTF>=8y!5&yW8-t(lf;ro zaZ#Ub9e;Xt6Gt(|2Q2>L(tM_Q&zrQ4>Vcv38&Rh?UNgr}h#)7*f$*JnR<+G~6q!u{@Ta(*xGIj|KC z-OGC1Fyk-~L;G0NPX7@}oG9F1U1H>btzqSB#cIQ&JNr$1akp zU%C>%S*k{!lCr!u)am(YEO0GaU!2B%@r}6)6uQ zViZU;aM)JhR|XHYq*rE_ZbG-2qLM6rj2^|+iRvggKgQ$iO+39C74viS)}?eA6Lwki zD|Ku8YtJ$4NbNM}Kh9=lLrt&SM+@O>_MQpcAaN?uwpNO$(zjdL@UhgBms5L|`c2$U5$f;p9!H3##D(_81eOWnAVH#QFZFny3ahm;J^tr2KulJw420zs%pSU&w6x&^MX)ckii zzw8?sF>~iInqYtk=4_AFXJKZ>cB&~x^hk5;$Dm^}f;kIv6Yon#poM^(+V*J{QPpU2 z5CsydFpKa&YB#mYocX1=QJOv_ zh!C1I>IR=B`2s3j=2#R3KY;=J?MUa6mjv>Vinz%lWK0qD2WaafT(z!_ulK)xQ*zrZ zsa<5^mlraW=+^9BlJg0jYm7>Nvma*c+dCtx1r*cIu)UE zkONTKWQLUCoQnuY&0tb=6GFf=t-eLscjJv|A#o=&dMy`0BHZJ{gXFw^I8kz6RnU@y z1G-uB>{{CyUFEV6Tpx+k7i+7QyVna{&Aqummfz_S$P3i%(UN<}o$>mrim*H1KNv&YThk~d%mgBNJ69LU`MwNE z?r>EZRa>s?p(QvVBRmqtT=`V&mGNtnYqpsqke5T-gZ%yR;}j-}1KROKLYH7EKl4h$ zBWOq2522yIXLvf$NjpSB$vd>?>RV9z(WvYF-TEn|WEJtxH~X~7p*lw7(A<%vLnB&A z?ngg9^z$EM3)K-wq1ac5wmDXKkJ9)t+o8qRSt#|uG3F?z zPE=TieM*}7L5tsv_@`!bfajK+JgcbtSfTfjU5q*>3M}t#*p2JVaq!{<6VjUXq^V#mHHA(jWoMj%2H6?nb`n(bGiLX z{vf=v==+sd2?I^S5n8X9BljZICAk#z{b_H$d8|ZJZ(d|GI}7ZWL?v`tj{n9sz5>^g zK)xxKSx&hlH`2uSh0o9I4I=Gi$X8V&lEyL_NmT+<{Aj)OWZSSF<5hnaAS1cy%{BPh zugG6YdK~v=GOBUR~0*3D1jzEuvqx zy_$w{=Z3l(W|PxANBc^>Y0KDT)6=J8w12HdVEwudG5DM9{M3)_Jaw2ZkZFfaPD<4@ z=iXQ2oC-++Nf348$9AbL9(ojCk&k;!_b=C6j_l+f$!rmftJKAiOokR*7v}?icCa3L z{*g@eyTk8*G=O$L1yi=Iyu=8rqO@hH@j3t40J6(sx=Iu7+`V)=oqN9pyUd?776}^6 zt#VtbGbzjY5s_>(eMjFyXb!lJ+fkjmG`M55rBO*2XDhJ<-z%hSJtwq9I>3@JeFd4c z_$ywR6%Lsdk+gzohNbgI2O(iB!e8)8PmGCzN8-h zLDPZz@2>gF-It0UOBJV3eQOk{-4WMQ;4pB;`S+aZ;C=hN5`m-(z<37cS$HYA4(UE1 z7jrA{2QG^S>DdI6O9d4Sd4R=9hi9!7mqI~?{*t2PM4m@1FjHWMD8lfe-6P8-SfZflOh+U4* z*IYG0`Y zyxMz4KXt*IttjjA0*lDLwM$t&%&oDJDw!jO+qsI`;9J%!#QcZa=gH|&SkEKxoa~+K z$b8EDM8pd5e436s`F#x<_JQf3To@ob7DvhM{k6mATXcAV}nwQN0n_bntTHZmI5A)gaPn0J9 zovZtV(9;$mWg`}WHprG4KsH&JCmpMpKrid3VHRy(o(pZ>-g=tg!ZVitF2m~fH>zcM z(`mn;g$?&2TH9NRd^v8cL?p}(WmI=cZS9AQi}m@~Y3Z-a_j3!IPx9YTJO0gOnxk%T zY#fj*vc^~tT-4}u{e-KMd?$&6<Gtlw9&_?LO@FL^ zQK47%At^QvJKgj(>GyvJ>T%X!`~S=FM8xBa<9~f%!>9j0p8&b15ppDEIaH5*M;~K-;K9dA znzSYr6yqk+|4Lkn{Vj9(s5w`mw(G{bB`chHBCe$jlkXw48|cV@6C4^PV4O@Hh_#So z%?daf%`ECX)rT?~1b+~4jIi#{KZ1_~qh$SOkqWs{GBN_2kK;GoDvAr2R7vU9Nfdl8 z4EBM^JF!~d$F%YqD7MZXry~KwDl*bX)Z=Y zE$64WqAl>wN@yt3jr08yHbcy%c$Gll#l~wtU)q8Od;+G+!g2ANV-Zsx=swU~PjGAR zpQ@L?B;0__=&v@7KAODGQZw0>x811$L?+|r^q!^<+0mnt z(kLLMF80*T>H1Cf44=l&|lC~3?mKGkKZwAw^s8z z>5DTz5Iv&HiHTD-eE$ADRc|l-ij=AyU8zfLpGI+yLUOtN>Hw~yBQC$&pduZj0Xs== z&4B`yOwZs($Jp~2*KIv4)2+;0ld+s%QIXJQ^+UMq@O+$}7I>YFLD>7=*HKgg#Jy>h zZvCZhLeUldcZtQ~;;mV*#oQIN#0;v6;tj|d7;gT#xvg_AdvX7iU>%2o;;O9j)%XVQ zh^^_jr2k`ReD_{wwtyoBorT^q0^)caa;_R4!I#^o;YI_k2bdbgt5Xel%nq(!!c_K{Oe+e@9%UQA+{NJ|eS*A_@#1 zK3_u_y-4V$Pn3Fz8$@pQYrd&z=@P#4>y}DCh zPL`UFhLl-GFFUYfPQ^-n_5I4y9>=M!AmD%iT|atl34 z1J;{RCDY#r3%_$Ttr~pbr*B}xr%bu#=Wroes-J9zxbv2~|4S*$Tgiq%nzbpU`aE`_ zqfI>-Xx- zZRjq75#!l}fKUWi{};8y+rHq{{h&cNm9k3tZ_V<6vPPz*9LdN!*YN`R>{;np#Dhzt z24>WaHIt;bi7cdu$rInCrcHPmcb^E`NFGkWW#6GmX!i&b)58ZU43@!7W>IBa>*nzxumto7^N(l23<%Ium+@E9k1Qc-@pRy8s zs{C!EmtNFqmyHxHOgcP8QbT{!k%x9ZLn~TohX?O*lV`ebMswBJDB67Kmhi+^Cw(4O z3lLI=jiB=$`^%Xk6IP6Z9913c?rfON|kNvAH$@Z$Fs^-*Txc7=9q5i6AdX#)>;%5rB7^A~X7O3G}J*nN8>mauX^v zQ}&lxP$%Z?qR5@kI>gVfaUnu!DuPNguHwIru#&G}5clZW;^z#p?$Gs_QJYaUnia0E zdLy!6@Z>6yRIV+4L+>hXbk@_v4=B^Jx$_?8poHq(fY-9-VokktdxKyOqG*DnazONDMikmb?hkN7;=Is9jIR0l}csL83 zk!G;*U|YsTv)xl8z9pHie;Dnn6eg(c2t`0@SRu*maNSfRo_9giC{(v@`!2yzpuzF;;GBurGDE(_{TPyTxI*HkpXWIXd~Od*jx_iSs-| zz`%}fm;;Xmn1_ChqboP-9aofWx@p#bA55TMT_3@H3h)EyUZe|xjxS61f>m$tW4dYj zm+%z2LVJ!RiXU_whNJ)+Xzp_45z5tK8K&YkSN@#jUw;BGA0(A7%K z9+}A*A>*60N~{^&u|G|Q-Erij)6es{b(Gsg$eb7}H(oa`o*PqY7$fTkah@1D$m z3c5?^KOe76Vucpr9i--fS|Ql;
Z@+8!mP&b@#52}x!oSsch1if&{?6fv)ExyWb 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 diff --git a/modules/functions/images/astream-optional-destination-topics.png b/modules/functions/images/astream-optional-destination-topics.png deleted file mode 100644 index b2bf4b17f645b493e2e43b1054dd54be78afa482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318393 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

wG3?(p?5#nb*@@n#@ae>#JF1xrUHrNe|AsFN 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

Y zPG^4IuwwH4<|X`0QFk=JYEe zfih1q5YFifieXC+>F$IzESpM9J{z{7zL1L!gYK888Joh87Jo=8F{kqC$TlX%&%7B{ z{xPUpDj&h+8Lr6{=ZSkyS$2Rm;`m2rO@0T9997!OY8t-ub~pUF@}adK#nq=o2ov@e z?0j&9%n~5}*tc;de)vQV3tKLx^2oQ(r-AN}V_Qj<+@idce!^5Sc~&^CLCNlgk?j$+ zlCPJ>wkE_K)rsHrg!0vk$f}fMmZa6V!Ec+!jIIsU*#E$1Z|$}tnJm|aMMt&nIaJ#c zF1Rl*Ia$=?eQAWOikgo^mFbKqhtp)J#RZrQg zP7=PjSK+7E7q{;3J!~Rvl`99gg^?r@sh3D8C*dtazD&N3fg^>+VZt3?4+TXhLINkb z6d2NP7nPs4%f@Kk-6s2c~#Gt|=7? zwz-%db1u-!tWnvV9>n{@nup`ZbF{EMc5kkUj7*y{?>J>TYLm5^VpRs8ue<1HWXD9A zews94Tkxn`+d6E_^VMhY*RNOsN!z{M#luPr?1&AcmVNs8K*O&Mb=RLJKkGbnROHx^ zq&I!;q?7iBe6`y@-V-lRv#^w|>;^Rmk+RG?h^jnA}vv=RVwAz$o|SLrq4-re1n&(o}*wEyI3;s-12swzTbYyo#s z0T-RJyThF6EzB!A18&UoC?J-2A%hsO5T~%E*?G-@m}ZTtCo=sOTKjL!XjUH<|5|9M z8M=e$LrVIs`ynVS8!lYpL{&N(VcjeyrQ-+VN8r5&zvwjGF>-iy;zV}V;Kq|d@LQsg zBLiO6q7K-|lLKKBMsKvQc$o$FVY5GE6-;@nrEfCM{gm0RaIjJtKSj3e?zzs@kR?Ak z(0A>xOCq_9Pj}q%_^HvZUtirla@a4bb=nBW=Ugi*vl4YQmO2`pN=&H!IOnR2;p$k8{XCr_-iL)Fs?@SF3nu`oGsYvx$B?k_7K{drPFF0nfB^wCcr zU!6d|9!j6br1Q1+;%vO3zGSC$+X^k$*Sx{Uy6~TD%Xlt$J5&$@Q*JoatHMkcsYA%! z@0TMs)b7DOB~fyF+v~=L_7bFe2%bX~R>C&mh(y72$~94W|5Xl#x)v_I!iap8inx~G zU%+iy0~60ZJyFDdQ89^f0I6J%juyX+`pSBR|3KW{GNDjO7|h_c z1W(ZtDuU!WcU3yxs4t9X1vn4qG##rmPUUN4dCJXw^(v!$6g%pjxGYj3&Wi!mvO@5oD^*;fY1J}8(K{@


@;bkv+XiPJa&}x}lgWF8hBz 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 - Pulsar supports many popular streaming connectors, including: - -
    -
  • xref:streaming-learning:pulsar-io:connectors/sinks/elastic-search.adoc[]
  • -
  • xref:streaming-learning:pulsar-io:connectors/sinks/kafka.adoc[]
  • -
  • xref:streaming-learning:pulsar-io:connectors/sinks/snowflake.adoc[]
  • -
  • xref:streaming-learning:pulsar-io:connectors/index.adoc[And more]
  • -
+ Pulsar supports many popular streaming connectors.

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 diff --git a/modules/functions/images/astream-provide-config-keys.png b/modules/functions/images/astream-provide-config-keys.png deleted file mode 100644 index 564d3f0678e74cfa07593f388e4e4297f144adf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182536 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Ν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 z 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 OFV&|Sir?kULjD^}zg8ds diff --git a/modules/functions/images/astream-transform-functions.png b/modules/functions/images/astream-transform-functions.png deleted file mode 100644 index aac1dd47763fbdbdf55b38667f82efdb3000d0ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157592 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�Ij1V(%OYBO7fe!($Nl?o$!s$ov9= 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 for more information on testing and monitoring your function in Astra Streaming. -* Use the `pulsar-admin` CLI to list functions for a specific tenant and namespace: -+ -[source,bash,subs="+quotes"] ----- -bin/pulsar-admin functions list --tenant **TENANT_NAME** --namespace **NAMESPACE_NAME** ----- - -== Deploy Java functions in a JAR file - -Astra Streaming supports Java-based {pulsar-short} functions which are packaged in a JAR file. -The JAR can be deployed to Astra Streaming or {pulsar-short}. -The same JAR file can be deployed to either environment. - -In this example, you'll create a function JAR file using Maven, then use the `pulsar-admin` CLI to deploy the JAR. -You'll also create a function configuration YAML file that defines the {pulsar-short} function options and parameters. - -. Create a properly-structured JAR with your function's Java code. -For example: -+ -.Example: Function pom.xml -[%collapsible] -==== -[source,xml] ----- - - - 4.0.0 - - java-function - java-function - 1.0-SNAPSHOT - - - - org.apache.pulsar - pulsar-functions-api - 3.0.0 - - - - - - - maven-assembly-plugin - - false - - jar-with-dependencies - - - - org.example.test.ExclamationFunction - - - - - - make-assembly - package - - assembly - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - 17 - - - - - - ----- -==== - -. Package the JAR file with Maven: -+ -[source,bash] ----- -mvn package ----- -+ -.Result -[%collapsible] -==== -[source,console] ----- -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 10.989 s -[INFO] Finished at: 2023-05-16T16:19:05-04:00 -[INFO] ------------------------------------------------------------------------ ----- -==== - -. Create a deployment configuration file named `func-create-config.yaml` with the following contents. -This file is passed to the `pulsar-admin` create function command. -+ -[source,yaml] ----- -jar: /absolute/path/to/java-function.jar -className: com.example.pulsar.ExclamationFunction -parallelism: 1 -inputs: - - persistent://mytenant/n0/t1 -output: persistent://mytenant/ns/t2 -autoAck: true -tenant: mytenant -namespace: ns0 -name: testjarfunction -logTopic: -userConfig: - logging_level: ERROR ----- -+ -[IMPORTANT] -==== -Astra Streaming requires the `inputs` topic to have a message schema defined before deploying the function. -Otherwise, deployment errors may occur. -Use the {astra-ui} to define the message schema for a topic. -==== - -. Use the `pulsar-admin` CLI to deploy your function JAR to Astra Streaming or {pulsar-short}. -+ -The following command assumes you've properly configured the `client.conf` file for `pulsar-admin` commands against your {pulsar-short} cluster. -If you are using Astra Streaming, see xref:astra-streaming:developing:configure-pulsar-env.adoc[] for more information. -+ -[source,bash] ----- -bin/pulsar-admin functions create --function-config-file /absolute/path/to/func-create-config.yml ----- - -. Verify that the function was deployed: -+ -* Go to the {astra-ui} to see your newly deployed function listed under the **Functions** tab for your tenant. -See <> for more information on testing and monitoring your function in Astra Streaming. -* Use the `pulsar-admin` CLI to list functions for a specific tenant and namespace: -+ -[source,bash,subs="+quotes"] ----- -bin/pulsar-admin functions list --tenant **TENANT_NAME** --namespace **NAMESPACE_NAME** ----- - -== Add functions in Astra Streaming dashboard - -Add functions in the **Functions** tab of the Astra Streaming dashboard. - -. Select *Create Function* to get started. - -. Choose your function name and namespace. -+ -image::astream-name-function.png[Function and Namespace] - -. Select the file you want to pull the function from and which function you want to use within that file. -Astra Streaming generates a list of acceptable classes. -+ -image::astream-exclamation-function.png[Exclamation Function] -+ -There are differences depending on the function language: -+ -* Python functions are added by loading a Python file (`.py`) or a zipped Python file (`.zip`). -+ -When adding Python files, the Class Name is specified as the name of the Python file without the extension plus the class you want to execute. -For example, if the Python file is called `testfunction.py` and the class is `ExclamationFunction`, then the class name is `testfunction.ExclamationFunction`. -+ -The file can contain multiple classes, but only one is used. -If there is no class in the Python file (when using a basic function, for example), specify the filename without the extension, such as `testfunction`. -+ -* Java functions are added by loading a Java jar file (`.jar`). -When adding Java files, you must specify the name of the class to execute as the function. - -. Select your input topics. -+ -image:streaming-learning:functions:astream-io-topics.png[IO Topics] - -. Select **Optional Destination Topics** for output and logging. -+ -image:streaming-learning:functions:astream-optional-destination-topics.png[Optional Topics] - -. If applicable, configure the *Advanced Options*. -+ -image:streaming-learning:functions:astream-advanced-config.png[Advanced Configuration] - -. Run at least one sink instance. - -. Select an option for *Processing Guarantee*: -+ -* *ATLEAST_ONCE* (default): Each message sent to the function can be processed more than once. -* *ATMOST_ONCE*: The message sent to the function is processed at most once. Therefore, there is a chance that the message is not processed. -* *EFFECTIVELY_ONCE*: Each message sent to the function will have one output associated with it. - -. Provide an *Option Configuration Key*. -See the https://pulsar.apache.org/functions-rest-api/#operation/registerFunction[{pulsar-short} documentation] for a list of configuration keys. -+ -image:streaming-learning:functions:astream-provide-config-keys.png[Provide Config Key] - -. Click *Create*. - -. To verify that the function was created, review the list of functions on the *Functions* tab. - -== Add function with {pulsar-short} CLI - -You can add functions using the {pulsar-short} CLI. - -The following example creates a Python function that consumes a message from one topic, adds an exclamation point, and then publishes the results to another topic. - -. Add the following Python function code to a file named `testfunction.py`: -+ -.testfunction.py -[source, python] ----- -from pulsar import Function - -class ExclamationFunction(Function): - def __init__(self): - pass - - def process(self, input, context): - return input + '!' ----- - -. Deploy `testfunction.py` to your {pulsar-short} cluster using the {pulsar-short} CLI: -+ -[source,bash,subs="+quotes"] ----- -$ ./pulsar-admin functions create \ - --py /absolute/path/to/testfunction.py \ - --classname testfunction.ExclamationFunction \ - --tenant **TENANT_NAME** \ - --namespace default \ - --name exclamation \ - --auto-ack true \ - --inputs persistent://**TENANT_NAME**/default/in \ - --output persistent://**TENANT_NAME**/default/out \ - --log-topic persistent://**TENANT_NAME**/default/log ----- -+ -Replace **TENANT_NAME** with the name of the tenant where you want to deploy the function. -If you want to use a different namespace, replace `default` with another namespace name. -If you want to use different topics, change `in`, `out`, and `log` accordingly. - -. Verify that the response is `Created Successfully!`. -This indicates that the function was deployed and ready to run when triggered by incoming messages. -+ -If the response is `402 Payment Required` with `Reason: only qualified organizations can create functions`, then you must upgrade to a xref:astra-streaming:operations:astream-pricing.adoc[paid Astra Streaming plan]. -+ -You can also verify that a function was created by checking the **Functions** tab or by running `./pulsar-admin functions list --tenant **TENANT_NAME**`. - -== Testing Your Function - -Triggering a function is a convenient way to test that the function is working. -When you trigger a function, you publish a message on the function's input topic, which triggers the function. - - - - - -. Listen for messages on the output topic: -+ -[source,bash,subs="+quotes"] ----- -$ ./pulsar-client consume persistent://**TENANT_NAME**/default/out \ - --subscription-name my-subscription \ - --num-messages 0 # Listen indefinitely ----- -+ -Replace **TENANT_NAME** with the name of the tenant where you deployed the function. -If your function uses a different namespace and output topic name, replace `default` and `out` accordingly. -+ -If the function has an output topic, and the function returns data to the output topic, then that data is returned by the listener when you run the function. - -. Send a test value with the {pulsar-short} CLI `trigger` command: -+ -[source,bash,subs="+quotes"] ----- -$ ./pulsar-admin functions trigger \ - --name exclamation \ - --tenant **TENANT_NAME** \ - --namespace default \ - --trigger-value "Hello world" ----- -+ -This command sends the string `Hello world` to the exclamation function. -If deployed and configured correctly, the function should output `Hello world!` to the `out` topic. - -[#controlling-your-function] -== Controlling Your Function - -You can start, stop, and restart your function by selecting it in the *Functions* dashboard. - -image:streaming-learning:functions:astream-function-controls.png[Function Controls] - -== Monitoring Your Function - -Functions produce logs to help you in debugging. -To view your function's logs, open your function in the *Functions* dashboard. - -image:streaming-learning:functions:astream-function-log.png[Function Log] - -In the upper right corner of the function log are controls to *Refresh*, *Copy to Clipboard*, and *Save* your function log. - -== Updating Your Function - -A function that is already running can be updated with new configuration. -The following settings can be updated: - -* Function code -* Output topic -* Log topic -* Number of instances -* Configuration keys - -If you need to update any other setting of the function, delete and then re-add the function. - -. To update your function, select the function in the *Functions* dashboard. - -image::astream-function-update.png[Update Function] - -. Click *Change File* to select a local function file, and then click *Open*. - -. Update your function's *Instances* and *Timeout*. - -. Click *Update*. -+ -An *Updates Submitted Successfully* message confirms that the function was updated. - -== Deleting Your Function - -. Select the function to be deleted in the *Functions* dashboard. - -image::astream-delete-function.png[Delete Function] - -. Click *Delete*. - -. To confirm the deletion, enter the function's name, and then click *Delete*. -+ -A *Function-name Deleted Successfully!* message confirms the function was permanently deleted. - -== Next steps - -Learn more about developing functions for Astra Streaming and {pulsar-short} https://pulsar.apache.org/docs/en/functions-develop/[here]. \ No newline at end of file diff --git a/modules/functions/pages/cast.adoc b/modules/functions/pages/cast.adoc deleted file mode 100644 index 0a21815..0000000 --- a/modules/functions/pages/cast.adoc +++ /dev/null @@ -1,51 +0,0 @@ -= Cast -:functionName: cast - -The cast transform function transforms the data to a target compatible schema. - -The `step` name is `cast`, and the `UserConfig` is controlled here: `{"steps": [{"type": "cast", "schema-type": "STRING"}]}`. - -== Parameters: - -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|schema-type -|The target schema type. Only `STRING` is available. - -|part -|when used with KeyValue data, defines if the transform function is done on the `key` or on the `value`. If `null` or absent the transform function applies to both the key and the value. -|=== - -== Example: - -. Produce an AVRO message with the payload: `{field1: value1, field2: value2}`: -+ -[tabs] -==== -AVRO:: -+ --- -[source,json,subs="attributes+"] ----- -{"field1": "value1", "field2": "value2"} ----- --- - -Result:: -+ --- -[source,json,subs="attributes+"] ----- -{"field1": "value1", "field2": "value2"} ----- --- -==== - -. The function casts the values as a string: `{"field1": "value1", "field2": "value2"}`. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. diff --git a/modules/functions/pages/compute.adoc b/modules/functions/pages/compute.adoc deleted file mode 100644 index 1e1518b..0000000 --- a/modules/functions/pages/compute.adoc +++ /dev/null @@ -1,326 +0,0 @@ -= Compute -:functionName: compute - -The `compute` transform function computes field values based on an `expression` evaluated at runtime. + -If the field already exists, it will be overwritten. + -The step name is `compute` and the function's `UserConfig` is controlled in this step: + -[source,json] ----- -{"steps": [{"type": "compute", "fields":[ - {"name": "key.newKeyField", "expression" : "5*3", "type": "INT32"}, - {"name": "value.valueField", "expression" : "fn:concat(value.valueField, '_suffix')", "type": "STRING"}]} -]} ----- - -== Parameters: - -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|fields -|An array of JSON objects describing how to calculate the field values. The JSON object represents a `field`. See <>. - -|=== - -[#field-params] -=== Field parameters - -[cols=2*,options=header] -|=== -| *Name (field)* -| *Description* - -| name -| The name of the field to be computed. Prefix with `key.` or `value.` to compute the fields in the key or value parts of the message. + -You can also compute values on the following message headers: [`destinationTopic`, `messageKey`, `properties.`]. + -Please note that properties is a map of key/value pairs that are referenced by the dot notation, for example `properties.key0`. - -| expression -| Supports the <> syntax. It is evaluated at runtime and the result of the evaluation is assigned to the field. - -| type -| The type of the computed field. this will translate to the schema type of the new field in the transformed message. The following types are currently supported [`STRING`, `INT32`, `INT64`, `FLOAT`, `DOUBLE`, `BOOLEAN`, `DATE`, `TIME`, `DATETIME`]. See <>. - -| optional (default: true) -|If true, it marks the field as optional in the schema of the transformed message. This is useful when `null` is a possible value of the compute expression. - -|=== - -[#type-params] -=== Type parameters - -[cols=3*,options] -|=== -| *Name (field.type)* -| *Description* -| *Expression Examples* - -| `INT32` -| represents 32-bit integer. -| expression1: "2147483647", expression2: "1 + 1" - -| `INT64` -| represents 64-bit integer. -| expression1: "9223372036854775807", expression2: "1 + 1" - -| `FLOAT` -| represents 32-bit floating point. -| expression1: "340282346638528859999999999999999999999.999999", expression2: "1.1 + 1.1" - -| `DOUBLE` -| represents 64-bit floating point. -| expression1: "1.79769313486231570e+308", expression2: "1.1 + 1.1" - -| `BOOLEAN` -| true or false -| expression1: "true", expression2: "1 == 1", expression3: "value.stringField == 'matching string'" - -| `DATE` -| a date without a time-zone in the https://www.rfc-editor.org/rfc/rfc3339[RFC3339 format] -| expression1: "2021-12-03" - -| `TIME` -| a time without a time-zone in the https://www.rfc-editor.org/rfc/rfc3339[RFC3339 format] -| expression1: "20:15:45" - -| `DATETIME` -| a date-time with an offset from UTC in the https://www.rfc-editor.org/rfc/rfc3339[RFC3339 format] -| expression1: "2022-10-02T01:02:03+02:00", expression2: "2019-10-02T01:02:03Z", expression3: "fn:now()" - -|=== - -[#expression-language] -== Expression language - -{pulsar-short} transforms use a simple expression language to evaluate conditional steps and compute steps. + -The expression language uses dot notation to access field properties or map keys, and supports the following operations and functions: + - -=== Operators -The Expression Language supports the following operators: -[cols=2*,options=header] -|=== -| *Category* -| *Suppoerted operators* - -|Arithmetic -| +, - (binary), *, / and div, % and mod, - (unary) - -|Logical -|and, &&, or \|\|, not, ! - -|Relational -|==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. -|=== - -=== Functions - -Utility methods are available under the `fn` namespace. For example, to calculate the current date, use `fn:now()`. + -The expression language supports the following functions: + - -[cols=2*,options=header] -|=== -| *Name (field)* -| *Description* -|uppercase(input) -|Changes the capitalization of a string. If input is not a string, it attempts a string conversion. If the input is null, it returns null. - -|lowercase(input) -|Changes the capitalization of a string. If input is not a string, it attempts a string conversion. If the input is null, it returns null. - -|contains(input, value) -|Returns true if value exists in input. It attempts string conversion on both input and value if either is not a string. If input or value is null, ir returns false. - -|trim(input) -|Returns the input string with all leading and trailing spaces removed. If the input is not a string, it attempts a string conversion. - -|concat(input1, input2) -|Returns a string concatenation of input1 and input2. If either input is null, it is treated as an empty string. - -|coalesce(value, valueIfNull) -|Returns value if it is not null, otherwise returns valueIfNull. - -|now() -|Returns the current epoch millis. - -|dateadd(input, delta, unit) -|Performs date/time arithmetic operations on the input date/time. + -`input` can be either epoch millis or an RFC3339 format like "2022-10-14T10:15:30+01:00" + -`delta` is the amount of unit to add to input. Can be a negative value to perform subtraction. -`unit` is the unit of time to add or subtract. Can be one of `[years, months, days, hours, minutes, seconds, millis]`. -|=== - -=== Conditional Steps -Each `step` accepts an optional `when` configuration that is evaluated at step execution time against current records (the current step in the transform pipeline). + -The `when` condition supports the , which provides access to the record attributes as follows: - -[cols=2*,options=header] -|=== -| *Name (field)* -| *Description* -|key: -|the key portion of the record in a KeyValue schema. - -|value: -|the value portion of the record in a KeyValue schema, or the message payload itself. - -|messageKey: -|the optional key messages are tagged with (aka. Partition Key). - -|topicName: -|the optional name of the topic which the record originated from (aka. Input Topic). - -|destinationTopic: -|the name of the topic on which the transformed record will be sent (aka. Output Topic). - -|eventTime: -|the optional timestamp attached to the record from its source. For example, the original timestamp attached to the pulsar message. - -|properties: -|the optional user-defined properties attached to record. - -|=== - -You can use the `.` operator to access top level or nested properties on a schema-full key or value. + -For example, `key.keyField1` or `value.valueFiled1.nestedValueField`. + - -==== `When` example - -For this KeyValue record: - -[source,json] ----- -{ - "key": { - "compound": { - "uuid": "uuidValue", - "timestamp": 1663616014 - }, - "value" : { - "first" : "f1", - "last" : "l1", - "rank" : 1, - "address" : { - "zipcode" : "abc-def" - } - } - } -} ----- - -These statements would evaluate in a `when` statement: - -[cols=2*,options=header] -|=== -| *`when` statement* -| *Evaluates to:* - -|key.compound.uuid == 'uuidValue' -|True - -|key.compound.timestamp \<= 10 -|False - -|value.first == 'f1' && value.last.toUpperCase() == 'L1' -|True - -|value.rank \<= 1 && value.address.substring(0, 3) == 'abc' -|True - -|=== - -== Multiply and concatenate example - -. Create a `compute` transform function with the {pulsar-short} admin CLI: -+ -[source,shell] ----- -./bin/pulsar-admin functions create \ ---tenant ${TENANT} \ ---namespace ${NAMESPACE} \ ---name transform-function \ ---inputs persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC} \ ---output persistent://${TENANT}/${NAMESPACE}/${OUTPUT_TOPIC} \ ---classname com.datastax.oss.pulsar.functions.transforms.TransformFunction \ ---jar functions/pulsar-transformations-2.0.1.nar \ ---transform-function-config '{"steps": [{"type": "compute", "fields":[ - {"name": "key.newKeyField", "expression" : "5*3", "type": "INT32"}, - {"name": "value.valueField", "expression" : "fn:concat(value.valueField, '_suffix')", "type": "STRING"}]} -]}' ----- - -. Produce an AVRO message with the payload: -+ -[tabs] -==== -AVRO:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key}, value={valueField: value}} (KeyValue) ----- --- - -Result:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key, newKeyField: 15}, value={valueField: value_suffix}} (KeyValue) ----- --- -==== - -. The function applies preprocessing to outgoing messages, in this case performing multiplication and concatenation operations to output `{key={keyField: key, newKeyField: 15}, value={valueField: value_suffix}} (KeyValue)` to your output topic. - -== Message routing example - -. Create a `compute` transform function with the {pulsar-short} admin CLI: -+ -[source,shell] ----- -./bin/pulsar-admin functions create \ ---tenant ${TENANT} \ ---namespace ${NAMESPACE} \ ---name transform-function \ ---inputs persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC} \ ---output persistent://${TENANT}/${NAMESPACE}/${OUTPUT_TOPIC} \ ---classname com.datastax.oss.pulsar.functions.transforms.TransformFunction \ ---jar functions/pulsar-transformations-2.0.1.nar \ ---transform-function-config `{"steps": [{"type": "compute", "fields":[ - {"name": "destinationTopic", "expression" : "'routed'", "type": "STRING"}, - {"name": "properties.k1", "expression" : "'overwritten'", "type": "STRING"}, - {"name": "properties.k2", "expression" : "'new'", "type": "STRING"}]} - ]}` ----- - -. Produce an AVRO message with the following payload: -+ -[tabs] -==== -AVRO:: -+ --- -[source,,subs="attributes+"] ----- -key={keyField: key}, value={valueField: value}} (KeyValue), headers=destinationTopic: out1, properties: {k1:v1} ----- --- - -Result:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key}, value={valueField: value}} (KeyValue), headers=destinationTopic:routed, properties: {k1:overwritten, k2:new} ----- --- -==== - -. The function applies preprocessing to outgoing messages, in this case re-routing the destination topics with the output `{key={keyField: key}, value={valueField: value}} (KeyValue), headers=destinationTopic:routed, properties: {k1:overwritten, k2:new}`. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file diff --git a/modules/functions/pages/deploy-in-sink.adoc b/modules/functions/pages/deploy-in-sink.adoc deleted file mode 100644 index 5e6f718..0000000 --- a/modules/functions/pages/deploy-in-sink.adoc +++ /dev/null @@ -1,58 +0,0 @@ -= Deploy transform function in sink - -With modern Pulsar versions, transform functions can be deployed inside of a sink process. + -Before this update, functions transformed data either after it was written to a topic by a source connector, or before it was read from a topic by a sink connector. + -This required either an intermediate topic, with additional storage, IO, and latency, or a custom connector. + -Now, functions can be deployed at sink creation and apply preprocessing to sink topic writes. + - -== Create sink function in Astra Streaming - -Creating a sink function is similar to creating a sink in the {astra-ui}, but with a few additional steps. - -. xref:pulsar-io:connectors/index.adoc[Create a sink] as described in the Astra Streaming documentation. - -. During sink creation, select the transform function you want to run inside the sink. -+ -image::astream-transform-functions.png[Connect Topics] - -. When the sink is up and running, inspect the sink connector's log. -The function is loaded at sink creation: -+ -[source,console] ----- -2022-11-14T15:01:02.398190413Z 2022-11-14T15:01:02,397+0000 [main] INFO org.apache.pulsar.functions.runtime.thread.ThreadRuntime - ThreadContainer starting function with instanceId 0 functionId f584ae69-2eda-449b-9759-2d19fd7c4da5 namespace astracdc ----- - -. The function then applies preprocessing to outgoing messages, in this case casting an AVRO record to `String` to your selected topic: -+ -[source,json] ----- -{{"field1": "value1", "field2": "value2"}} ----- - -== Create sink function in pulsar-admin - -https://github.com/datastax/pulsar[Luna Streaming 2.10+] is required to deploy custom functions in {pulsar-short}. - -Create a sink connector, and include the path to the transform function and configuration at creation: - -[source,shell] ----- -pulsar-admin sinks create \ ---sink-type elastic-sink \ ---inputs my-input-topic \ ---tenant public \ ---namespace default \ ---name my-sink \ ---transform-function "builtin://transforms" \ ---transform-function-config '{"steps": [{"type": "drop-fields", "fields": "password"}, {"type": "merge-key-value"}, {"type": "unwrap-key-value"}' ----- - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. - - - - - diff --git a/modules/functions/pages/drop-fields.adoc b/modules/functions/pages/drop-fields.adoc deleted file mode 100644 index c9baf3c..0000000 --- a/modules/functions/pages/drop-fields.adoc +++ /dev/null @@ -1,52 +0,0 @@ - -= Drop fields -:functionName: drop-fields - -The {functionName} transform function drops fields of structured data (Currently only AVRO is supported). + -The cast transform function transforms the data to a target compatible schema. - -The `step` name is `drop-field`, and the `UserConfig` is controlled here: `{"steps": [{"type": "drop-fields", "fields": "password,other"}]}`. - -== Parameters: -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|fields -|A comma-separated list of fields to drop. - -|part -|when used with KeyValue data, defines if the transform function is done on the `key` or on the `value`. If `null` or absent the transform function applies to both the key and the value. -|=== - -== Example - -. Produce an AVRO message with the payload: `{name: value1, password: value2}`. -+ -[tabs] -==== -AVRO:: -+ --- -[source,json,subs="attributes+"] ----- -{"name": "value1", "password": "value2"} - ----- --- - -Result:: -+ --- -[source,json,subs="attributes+"] ----- -{"name": "value1"} ----- --- -==== -. The function drops the fields specified in the `fields` parameter, and outputs `{"{name: value1}"}` to the output topic. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file diff --git a/modules/functions/pages/drop.adoc b/modules/functions/pages/drop.adoc deleted file mode 100644 index 9161db8..0000000 --- a/modules/functions/pages/drop.adoc +++ /dev/null @@ -1,27 +0,0 @@ -= Drop -:functionName: drop - -The {functionName} transform function drops a record from further processing. + -Use in conjunction with `when` to selectively drop records. + -The step name is `drop`, and the `UserConfig` is controlled here: `{"steps": [{"type": "drop", "when": "value.firstName == value1"}]}`. - -== Parameters: -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|when -|By default, the record is dropped. Set this parameter to selectively choose when to drop a message. - -|=== - -== Example - -. Produce an AVRO message with the payload: `{firstName: value1, lastName: value2}`. -. The function drops records matching the `when` statement `value.firstName == value1`. + -There is no output. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file diff --git a/modules/functions/pages/flatten.adoc b/modules/functions/pages/flatten.adoc deleted file mode 100644 index 7b23574..0000000 --- a/modules/functions/pages/flatten.adoc +++ /dev/null @@ -1,49 +0,0 @@ -= Flatten -:functionName: flatten - -The {functionName} transform function converts structured, nested data into a new single-hierarchy-level structured data. + -The names of the new fields are built by concatenating the intermediate level field names. + -The step name is `flatten`, and the `UserConfig` is controlled here: `UserConfig: {"steps": [{"type": "flatten"}]}`. - -== Parameters: -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|delimiter -|The delimiter to use when concatenating the field names (default: _) - -|part -|when used with KeyValue data, defines if the transform function is done on the `key` or on the `value`. If `null` or absent the transform function applies to both the key and the value. -|=== - -== Example - -. Produce an AVRO message with the payload: `{field1: {field11: value11, field12: value12}}`. -+ -[tabs] -==== -AVRO:: -+ --- -[source,json,subs="attributes+"] ----- -{"field1": {"field11": "value11", "field12": "value12"}} ----- --- - -Result:: -+ --- -[source,json,subs="attributes+"] ----- -{"field1_field11": "value11", "field1_field12": "value12"} ----- --- -==== -. The function flattens the fields with the default `delimiter` between values, and outputs `{field1_field11: value11, field1_field12: value12}` to the output topic. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file diff --git a/modules/functions/pages/index.adoc b/modules/functions/pages/index.adoc deleted file mode 100644 index 44485b9..0000000 --- a/modules/functions/pages/index.adoc +++ /dev/null @@ -1,210 +0,0 @@ -= Transform Functions -:navtitle: Overview - -A {pulsar-short} *transform function* is a low-code implementation of xref:astra-streaming:developing:astream-functions.adoc[{pulsar-short} functions]. + -Functions receive data from one or more input topics, apply user-supplied processing, and publish the results to another topic. + -Custom functions are a powerful feature, but for common data transformations, we now include *Transform Functions*. -Drop fields, flatten, compute, and more without coding or deep schema knowledge. -{company} has created the following transform functions for common data transforms, but we're always experimenting with new ones. -Check back as the list grows, or let us know some functions you'd find helpful in your deployment. - -[#transform-list] -== Transforms - -* **Cast**: The xref:cast.adoc[cast transform function] modifies the key or value schema to a target compatible schema. -* **Compute**: The xref:compute.adoc[compute transform function] computes new field values based on an expression evaluated at runtime. If the field already exists, it will be overwritten. -* **Drop-fields**: The xref:drop-fields.adoc[drop-fields transform function] drops fields from structured data. -* **Drop**: The xref:drop.adoc[drop transform function] drops a record from further processing. -* **Flatten**: The xref:flatten.adoc[flatten transform function] flattens structured data. -* **Merge KeyValue**: The xref:merge-key-value.adoc[merge KeyValue transform function] merges the fields of KeyValue records where both the key and value are structured data with the same schema type. -* **Unwrap KeyValue**: The xref:unwrap-key-value.adoc[unwrap KeyValue transform function] extracts the KeyValue's key or value, and then makes it the record value if the record is a KeyValue. - -[#transform-config] -== Configuration - -The `TransformFunction` reads its configuration as `JSON` from the Function `userConfig` parameter in the format: - -[source,json] ----- -{ - "steps": [ - { - "type": "drop-fields", "fields": "keyField1,keyField2", "part": "key" - }, - { - "type": "merge-key-value" - }, - { - "type": "unwrap-key-value" - }, - { - "type": "cast", "schema-type": "STRING" - } - ] -} ----- - -Transform functions are performed in the order in which they appear in the `steps` array. -Each step is defined by its `type` and uses its own arguments. -Each step can be dynamically toggled on or off by supplying a `when` condition that evaluates to true or false. - -For example, if the previous configuration is applied to a `KeyValue` input record, the following transformed values are returned after each step: - -[source,avro] ----- -# Original input record -{key={keyField1: key1, keyField2: key2, keyField3: key3}, value={valueField1: value1, valueField2: value2, valueField3: value3}} - -# Transformations -(KeyValue) - | - | "type": "drop-fields", "fields": "keyField1,keyField2", "part": "key" - | -{key={keyField3: key3}, value={valueField1: value1, valueField2: value2, valueField3: value3}} (KeyValue) - | - | "type": "merge-key-value" - | -{key={keyField3: key3}, value={keyField3: key3, valueField1: value1, valueField2: value2, valueField3: value3}} (KeyValue) - | - | "type": "unwrap-key-value" - | -{keyField3: key3, valueField1: value1, valueField2: value2, valueField3: value3} (AVRO) - | - | "type": "cast", "schema-type": "STRING" - | -{"keyField3": "key3", "valueField1": "value1", "valueField2": "value2", "valueField3": "value3"} (STRING) ----- - -[#deploy-cli] -== Deploy with {pulsar-short} CLI - -https://github.com/datastax/pulsar[Luna Streaming 2.10+] is required to deploy custom functions in {pulsar-short}. - -The transform function `.nar` lives in the `/functions` directory of your {pulsar-short} deployment. - -[tabs] -====== -{pulsar-short} standalone:: -+ --- -To deploy the built-in transform function locally in {pulsar-short} standalone, do the following: - -. Start {pulsar-short} standalone: -+ -[source,shell] ----- -./bin/pulsar standalone ----- - -. Create a transform function in `localrun` mode: -+ -[source,shell,subs="attributes+"] ----- -./bin/pulsar-admin functions localrun \ ---jar functions/pulsar-transformations-2.0.1.nar \ ---classname com.datastax.oss.pulsar.functions.transforms.TransformFunction \ ---inputs my-input-topic \ ---output my-output-topic \ ---user-config '{"steps": [{"type": "drop-fields", "fields": "password"}, {"type": "merge-key-value"}, {"type": "unwrap-key-value"}, {"type": "cast", "schema-type": "STRING"}]}' ----- --- - -{pulsar-short} cluster:: -+ --- -To deploy a built-in transform function to a {pulsar-short} cluster, do the following: - -. Create a built-in transform function with the {pulsar-short} CLI: -+ ----- -./bin/pulsar-admin functions create \ ---tenant $TENANT \ ---namespace $NAMESPACE \ ---name transform-function \ ---inputs persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC ---output persistent://$TENANT/$NAMESPACE/$OUTPUT_TOPIC \ ---classname com.datastax.oss.pulsar.functions.transforms.TransformFunction \ ---jar functions/pulsar-transformations-2.0.1.nar ----- -+ -.Result -[%collapsible] -==== -[source,console] ----- -Created successfully ----- -==== - -. Confirm your function has been created: -+ -[source,shell] ----- -./bin/pulsar-admin functions list --tenant $TENANT ----- -+ -.Result -[%collapsible] -==== -[source,console] ----- -cast-function -flatten-function -transform-function -transform-function-2 ----- -==== --- -====== - -[#deploy-as] -== Deploy with Astra Streaming - -Deploy transform functions in the *Functions* tab of the {astra-ui}. - -The process is similar to xref:astra-streaming:developing:astream-functions.adoc[creating a function in the {astra-ui}], but with a few additional steps. - -. After naming your new function, select the *Use {company} transform function* option. - -. Select a transform function from the list of available functions: -+ -image::astream-transform-functions.png[Connect Topics] - -. Select the transform function's namespace and input topic(s). - -. Select the transform function's namespace, output topic, and log topic. -+ -The log topic is a separate output topic for messages containing additional `loglevel`, `fqn`, and `instance` properties. - -. Specify advanced configuration options, if applicable. - -. Pass JSON configuration values with your function, if applicable. -+ -For more, see the transform function <> table. - -. Select *Create*. -The transform function will initialize and begin processing data changes. - -. Confirm your function has been created with the {pulsar-short} CLI: -+ -[source,shell] ----- -./bin/pulsar-admin functions list --tenant $TENANT ----- -+ -.Result -[%collapsible] -==== -[source,console] ----- -cast-function -flatten-function -transform-function -transform-function-2 ----- -==== - -== See also - -* xref:astra-streaming:developing:astream-functions.adoc[] -* https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation] \ No newline at end of file diff --git a/modules/functions/pages/merge-key-value.adoc b/modules/functions/pages/merge-key-value.adoc deleted file mode 100644 index 8c06acb..0000000 --- a/modules/functions/pages/merge-key-value.adoc +++ /dev/null @@ -1,35 +0,0 @@ -= Merge KeyValue -:functionName: merge-key-value - -The {functionName} transform function merges the fields of KeyValue records where both the key and value are structured types of the same schema type. (Currently only AVRO is supported). + -The step name is `merge-key-value` and the `UserConfig` is controlled here: `{"steps": [{"type": "merge-key-value"}]}`. - -== Example - -. Produce an AVRO message with the payload: `{key={keyField: key}, value={valueField: value}}`. -+ -[tabs] -==== -AVRO:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key}, value={valueField: value}} ----- --- - -Result:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key}, value={keyField: key, valueField: value}} ----- --- -==== -. The function merges the KeyValue fields (because both are AVRO type) and outputs `{key={keyField: key}, value={keyField: key, valueField: value}}` to the output topic. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file diff --git a/modules/functions/pages/unwrap-key-value.adoc b/modules/functions/pages/unwrap-key-value.adoc deleted file mode 100644 index 3dc87df..0000000 --- a/modules/functions/pages/unwrap-key-value.adoc +++ /dev/null @@ -1,46 +0,0 @@ -= Unwrap KeyValue -:functionName: unwrap-key-value - -If the record value is a KeyValue, the {functionName} transform function extracts the KeyValue's key or value and makes it the record value. + -The step name is `unwrap-key-value`, and the `UserConfig` is controlled here: `{"steps": [{"type": "unwrap-key-value"}]}`. - -== Parameters: -[cols=2*,options=header] -|=== -|*Parameter* -|*Description* - -|unwrapKey -|By default, the KeyValue's value is unwrapped. Set this parameter to `true` to unwrap the key instead. - -|=== - -== Example - -. Produce an AVRO message with the payload: `{key={keyField: key}, value={valueField: value}}`. -+ -[tabs] -==== -AVRO:: -+ --- -[source,,subs="attributes+"] ----- -{key={keyField: key}, value={valueField: value}} ----- --- - -Result:: -+ --- -[source,json,subs="attributes+"] ----- -{"valueField": "value"} ----- --- -==== -. The function extracts the KeyValue's key and outputs `{valueField: value}` to the output topic. - -== What's next? - -For more, see xref:index.adoc[] or the https://pulsar.apache.org/docs/functions-overview[{pulsar-short} documentation]. \ No newline at end of file From 218a7e254d49afc9b01f088d6b7cb4c5c7c87f84 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:26:39 -0800 Subject: [PATCH 04/31] clean up connector index page --- modules/pulsar-io/pages/connectors/index.adoc | 362 +++++++----------- .../pages/connectors/sinks/astra-db.adoc | 16 +- .../pages/connectors/sinks/cloud-storage.adoc | 2 + .../connectors/sinks/elastic-search.adoc | 33 +- .../connectors/sinks/google-bigquery.adoc | 11 +- .../connectors/sinks/jdbc-clickhouse.adoc | 9 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 9 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 8 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 9 +- .../pages/connectors/sinks/kafka.adoc | 9 +- .../pages/connectors/sinks/kinesis.adoc | 9 +- .../pages/connectors/sinks/snowflake.adoc | 4 +- .../connectors/sources/data-generator.adoc | 4 +- .../connectors/sources/debezium-mongodb.adoc | 4 +- .../connectors/sources/debezium-mysql.adoc | 6 +- .../connectors/sources/debezium-oracle.adoc | 5 +- .../connectors/sources/debezium-postgres.adoc | 6 +- .../sources/debezium-sqlserver.adoc | 6 +- .../pages/connectors/sources/kafka.adoc | 4 +- .../pages/connectors/sources/kinesis.adoc | 4 +- .../partials/connectors/sinks/monitoring.adoc | 2 +- .../connectors/sources/monitoring.adoc | 2 +- 22 files changed, 212 insertions(+), 312 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index dc48efe..1481027 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -1,244 +1,142 @@ -= Connectors -:navtitle: Connector Overview += {pulsar-short} I/O connectors in {product} +:navtitle: Available connectors -Astra Streaming offers fully-managed {pulsar-reg} connectors. +{product} offers fully-managed versions of https://pulsar.apache.org/docs/en/io-overview/[{pulsar-reg} connectors]. -Create, monitor, and manage both source and sink connectors through our simple UI, the `pulsar-admin` CLI, or RESTful API. -Connect popular data sources to {pulsar} topics or sink data from {pulsar-short} topics to popular systems. - -Below is a list of {pulsar} source and sink connectors supported by Astra Streaming. +You can use the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API to create, monitor, and manage sink and source connectors. +For configuration details, see the connector's documentation. [IMPORTANT] ==== -Astra Streaming doesn't support custom sink or source connectors. +{product} doesn't support custom sink or source connectors. ==== -[#sink-connectors] -== Sink Connectors - -[#astradb-sink] -=== AstraDB sink - -The AstraDB sink connector reads messages from {pulsar} topics and writes them to AstraDB systems. - -xref:connectors/sinks/astra-db.adoc[AstraDB sink documentation]. - -[#cloudstorage-sink] -=== Cloud Storage sink - -The Cloud Storage sink connector reads messages from {pulsar} topics and writes them to Cloud Storage systems. - -xref:connectors/sinks/cloud-storage.adoc[Cloud Storage sink documentation]. - -[#elasticsearch-sink] -=== ElasticSearch sink - -The Elasticsearch sink connector reads messages from {pulsar} topics and writes them to Elasticsearch systems. - -xref:connectors/sinks/elastic-search.adoc[Elasticsearch sink documentation]. - -[#bigquery-sink] -=== Google BigQuery sink - -The Google BigQuery sink connector reads messages from {pulsar} topics and writes them to BigQuery systems. - -xref:connectors/sinks/google-bigquery.adoc[Google BigQuery sink documentation]. - -[#jdbc-clickhouse-sink] -=== JDBC-Clickhouse sink - -The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and writes them to JDBC-ClickHouse systems. - -xref:connectors/sinks/jdbc-clickhouse.adoc[JDBC ClickHouse sink documentation]. - -[#jdbc-mariadb-sink] -=== JDBC-MariaDB sink - -The JDBC-MariaDB sink connector reads messages from {pulsar} topics and writes them to JDBC-MariaDB systems. - -xref:connectors/sinks/jdbc-mariadb.adoc[JDBC MariaDB sink documentation]. - -[#jdbc-postgres-sink] -=== JDBC-PostgreSQL sink - -The JDBC-PostgreSQL sink connector reads messages from {pulsar} topics and writes them to JDBC-PostgreSQL systems. - -xref:connectors/sinks/jdbc-postgres.adoc[JDBC PostgreSQL sink documentation]. - -[#jdbc-sqlite-sink] -=== JDBC-SQLite - -The JDBC-SQLite sink connector reads messages from {pulsar} topics and writes them to JDBC-SQLite systems. +//Luna Streaming: Cloud Storage sink, Google BigQuery sink are experimental +//Elasticsearch is lowercase +//Luna Streaming extra Experimental source: Netty -xref:connectors/sinks/jdbc-sqllite.adoc[JDBC SQLite sink documentation]. - -[#kafka-sink] -=== Kafka - -The Kafka sink connector reads messages from {pulsar} topics and writes them to Kafka systems. - -xref:connectors/sinks/kafka.adoc[Kafka sink documentation]. - -[#kinesis-sink] -=== Kinesis - -The Kinesis sink connector reads messages from {pulsar} topics and writes them to Kinesis systems. - -xref:connectors/sinks/kinesis.adoc[Kinesis sink documentation]. - -[#snowflake-sink] -=== Snowflake +[#sink-connectors] +== Sink connectors -The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake systems. +Sink connectors export data from {pulsar-short} topics to external systems. -xref:connectors/sinks/snowflake.adoc[Snowflake sink documentation]. +Supported sink connectors:: +The following sink connectors are included in {product}: ++ +* xref:connectors/sinks/astra-db.adoc[AstraDB sink] +* xref:connectors/sinks/kafka.adoc[Apache Kafka sink] +* xref:connectors/sinks/kinesis.adoc[AWS Kinesis sink] +* xref:connectors/sinks/cloud-storage.adoc[Cloud Storage sink] +* xref:connectors/sinks/elastic-search.adoc[Elasticsearch sink] +* xref:connectors/sinks/google-bigquery.adoc[Google BigQuery sink] +* xref:connectors/sinks/jdbc-clickhouse.adoc[JDBC ClickHouse sink] +* xref:connectors/sinks/jdbc-mariadb.adoc[JDBC MariaDB sink] +* xref:connectors/sinks/jdbc-postgres.adoc[JDBC PostgreSQL sink] +* xref:connectors/sinks/jdbc-sqllite.adoc[JDBC SQLite sink] +* xref:connectors/sinks/snowflake.adoc[Snowflake sink] + +Experimental sink connectors:: +The following source connectors are experimental. +They are in development, and they aren't fully supported or tested with {product}. +To get access to experimental connectors, contact {support-url}[{company} Support]. ++ +* Aerospike +* Apache Geode +* Apache HBase +* Apache Kudu +* Apache Phoenix +* Apache Solr +* Batch Data Generator +* CoAP +* Couchbase +* DataDog +* Diffusion +* Flume +* Hazelcast +* HDFS 2 +* HDFS 3 +* Humio +* InfluxDB +* JMS +* Kinetica +* MarkLogic +* Microsoft Azure Data Explorer (Kusto) +* Microsoft Azure DocumentDB +* MongoDB +* MQTT +* Neo4J +* New Relic +* OrientDB +* PLC4X +* RabbitMQ +* Redis +* SAP HANA +* SingleStore +* Splunk +* XTDB +* Zeebe [#source-connectors] -== Source Connectors - -[#datagenerator-source] -=== Data Generator source - -The Data generator source connector produces messages for testing and persists the messages to {pulsar-short} topics. - -xref:connectors/sources/data-generator.adoc[Data Generator source documentation] +== Source connectors -[#debezium-mongodb-source] -=== Debezium MongoDB source +Source connectors ingest data from external systems into {pulsar-short} topics in your {product} tenants. -The Debezium MongoDB source connector reads data from Debezium MongoDB systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/debezium-mongodb.adoc[Debezium MongoDB source documentation] - -[#debezium-mysql-source] -=== Debezium MySQL source - -The Debezium MySQL source connector reads data from Debezium MySQL systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/debezium-mysql.adoc[Debezium MySQL source documentation] - -[#debezium-oracle-source] -=== Debezium Oracle source - -The Debezium Oracle source connector reads data from Debezium Oracle systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/debezium-oracle.adoc[Debezium Oracle source documentation] - -[#debezium-postgres-source] -=== Debezium Postgres source - -The Debezium PostgreSQL source connector reads data from Debezium PostgreSQL systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/debezium-postgres.adoc[Debezium PostgreSQL source documentation] - -[#debezium-sql-server-source] -=== Debezium SQL Server source - -The Debezium SQL Server source connector reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/debezium-sqlserver.adoc[Debezium SQL Server source documentation] - -[#kafka-source] -=== Kafka source - -The Kafka source connector reads data from Kafka systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/kafka.adoc[Kafka source connector documentation] - -[#kinesis-source] -=== AWS Kinesis source - -The AWS Kinesis source connector reads data from Kinesis systems and produces data to {pulsar-short} topics. - -xref:connectors/sources/kinesis.adoc[Kinesis source connector documentation] - -== Experimental Connectors - -{company} is always experimenting with connectors. Below are the connectors currently in development that have not yet been promoted to official support in *Astra Streaming*. - -To get access to these connectors, contact {support-url}[{company} Support]. - -[#sink-experimental] -=== Sink Connectors (experimental) - -Kinetica + -Aerospike + -Azure DocumentDB + -Azure Data Explorer (Kusto) + -Batch Data Generator + -CoAP + -Couchbase + -DataDog + -Diffusion + -Flume + -Apache Geode + -Hazelcast + -Apache HBase + -HDFS 2 + -HDFS 3 + -Humio + -InfluxDB + -JMS + -Apache Kudu + -MarkLogic + -MongoDB + -MQTT + -Neo4J + -New Relic + -OrientDB + -Apache Phoenix + -PLC4X + -RabbitMQ + -Redis + -SAP HANA + -SingleStore + -Apache Solr + -Splunk + -XTDB + -Zeebe + - -[#source-experimental] -=== Source Connectors (experimental) - -{cass-short} Source + -Kinetica + -Azure DocumentDB + -Batch Data Generator + -Big Query + -canal + -CoAP + -Couchbase + -datadog + -diffusion + -DynamoDB + -file + -flume + -Apache Geode + -Hazelcast + -Humio + -JMS + -Apache Kudu + -MarkLogic + -MongoDB + -MQTT + -Neo4J + -New Relic + -NSQ + -OrientDB + -Apache Phoenix + -PLC4X + -RabbitMQ + -Redis + -SAP HANA + -SingleStore + -Splunk + -Twitter + -XTDB + -Zeebe + - -== Listing Sink Connectors - -To list available sink connectors in your Astra Streaming tenant, you can use the {pulsar-short} Admin CLI or API. +Supported source connectors:: +The following source connectors are included in {product}: ++ +* xref:connectors/sources/kafka.adoc[Apache Kafka source] +* xref:connectors/sources/kinesis.adoc[AWS Kinesis source] +* xref:connectors/sources/data-generator.adoc[Data Generator source] +* xref:connectors/sources/debezium-mongodb.adoc[Debezium MongoDB source] +* xref:connectors/sources/debezium-mysql.adoc[Debezium MySQL source] +* xref:connectors/sources/debezium-oracle.adoc[Debezium Oracle source] +* xref:connectors/sources/debezium-postgres.adoc[Debezium PostgreSQL source] +* xref:connectors/sources/debezium-sqlserver.adoc[Debezium SQL Server source] + +Experimental source connectors:: +The following source connectors are experimental. +They are in development, and they aren't fully supported or tested with {product}. +To get access to experimental connectors, contact {support-url}[{company} Support]. ++ +* {cass} +* Apache Geode +* Apache Kudu +* Apache Phoenix +* Batch Data Generator +* Big Query +* Canal +* CoAP +* Couchbase +* DataDog +* Diffusion +* DynamoDB +* File +* Flume +* Hazelcast +* Humio +* JMS +* Kinetica +* MarkLogic +* Microsoft Azure DocumentDB +* MongoDB +* MQTT +* Neo4J +* New Relic +* NSQ +* OrientDB +* PLC4X +* RabbitMQ +* Redis +* SAP HANA +* SingleStore +* Splunk +* Twitter +* XTDB +* Zeebe + +== List sink connectors +//Combine w/ CLI ref and API ref pages; replace below w/ links. +To list available sink connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. === {pulsar-short} Admin CLI @@ -280,8 +178,8 @@ curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $ASTRA_ST ---- == Listing Source Connectors - -To list available source connectors in your Astra Streaming tenant, you can use the {pulsar-short} Admin CLI or API. +//Combine w/ CLI ref and API ref pages; replace below w/ links. +To list available source connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. === {pulsar-short} Admin CLI @@ -320,8 +218,4 @@ export ASTRA_STREAMING_TOKEN= [source,shell,subs="attributes+"] ---- curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $ASTRA_STREAMING_TOKEN" ----- - -== See also - -For more on {pulsar-short} IO connectors, see the https://pulsar.apache.org/docs/en/io-overview/[{pulsar-short} documentation]. \ No newline at end of file +---- \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 6e4adfd..cd75ee1 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -2,16 +2,18 @@ :connectorName: astra-db-sink :connectorType: astra-db -{company} {astra-db} Sink Connector is based on the open-source xref:pulsar-connector:ROOT:index.adoc[{cass-reg} sink connector for {pulsar-reg}]. Depending on how you deploy the connector, it can be used to sink topic messages with a table in {astra-db} or a table in a {cass-short} cluster outside of DB. +The {astra-db} sink connector reads messages from {pulsar} topics and writes them to {astra-db} databases. -The Astra Streaming portal provides simple way to connect this sink and a table in {astra-db} with simply a token. Using `pulsar-admin` or the REST API, you can configure the sink to connect with a {cass-short} connection manually. +{company} {astra-db} sink connector is based on the open-source xref:pulsar-connector:ROOT:index.adoc[{cass} sink connector for {pulsar-reg}]. +Depending on how you deploy the connector, it can be used to sink topic messages with a table in {astra-db} or a table in a self-managed {cass-short} cluster. +For the complete connector code, see the https://github.com/datastax/pulsar-sink[{company} {pulsar-short} sink connector GitHub repository]. -This reference assumes you are manually connecting to a {cass-short} table. +You can configure this connector with the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API. +The {astra-ui} provides the most simplified and guided configuration, and it is only suitable for connecting to {astra-db} databases. +With the CLI and API, you must provide the complete configuration programmatically, but you can use these tools to connect to either {astra-db} databases or self-managed {cass-short} clusters. +A {pulsar-short} token is required for all configuration methods. -[TIP] -==== -If you would like to see the code, refer to the https://github.com/datastax/pulsar-sink[open source here]. -==== +This reference assumes you are connecting to a {cass-short} table using the {pulsar-short} Admin API or CLI. == Get Started diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 53480c7..2e1649c 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -2,6 +2,8 @@ :connectorName: cloud-storage-sink :connectorType: cloud-storage +The Cloud Storage sink connector reads messages from {pulsar} topics and writes them to Cloud Storage systems. + Each public cloud has different ways of persisting data to their storage systems. Each cloud has their own way of formatting and storing the bytes. The Cloud Storage sink connector is a general interface to a chosen cloud storage, that exports data from a {pulsar-short} topic to the given system following a desired format. The cloud storage system supported are: diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 9a776ab..6e16024 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -3,19 +3,16 @@ :connectorType: elastic-search Elasticsearch is the distributed, RESTful search and analytics engine at the heart of the Elastic Stack. +You can use Elasticsearch to store, search, and manage data for logs, metrics, search backend, application monitoring, and endpoint security. -Use Elasticsearch to store, search, and manage data for logs, metrics, search backend, application monitoring, and endpoint security. +The Elasticsearch sink connector reads messages from {pulsar} topics and writes them to https://www.elastic.co/elasticsearch/[Elasticsearch]. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library] to interact with +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library] to interact with Elasticsearch. -==== -[NOTE] -==== -To understand compatibility between OpenSearch and Elasticsearch, refer to https://opensearch.org/faq/#q1.8[question 1.8] in the FAQs. -==== +To understand compatibility between OpenSearch and Elasticsearch, see https://opensearch.org/faq/#q1.8[question 1.8 in the OpenSearch FAQ]. + +For information about the OSS {pulsar} Elasticsearch sink connector, see the https://pulsar.apache.org/docs/io-elasticsearch-sink/[{pulsar-short} documentation]. == Get Started @@ -29,25 +26,15 @@ include::partial$connectors/sinks/manage.adoc[] include::partial$connectors/sinks/monitoring.adoc[] -== Connector Reference - -There are two sets of parameters that support sink connectors. - -=== Astra Streaming +== Astra Streaming parameters for Elasticsearch sink configuration [%header,format=csv,cols="2,1,1,3"] |=== include::example$connectors/sinks/astra.csv[] |=== -=== Elasticsearch (configs) - -These values are provided in the "configs" area. - -The Astra Streaming Elasticsearch sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[connector properties] for a complete list. - -== What's next? +== Elasticsearch (configs) parameters for Elasticsearch sink configuration -Learn more about Elasticsearch’s features and capabilities on https://www.elastic.co/elasticsearch/[Elasticsearch]. +The {product} Elasticsearch sink connector supports all https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[Elasticsearch sink connector properties] provided in the OSS {pulsar} Elasticsearch sink connector. -Learn more about {pulsar-short}'s Elasticsearch sink in the https://pulsar.apache.org/docs/io-elasticsearch-sink/[{pulsar-short} documentation]. \ No newline at end of file +Set these properties in the `configs` section of the connector configuration. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 9c7952c..26c95ec 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -2,6 +2,8 @@ :connectorName: bigquery-sink :connectorType: bigquery +The Google BigQuery sink connector reads messages from {pulsar} topics and writes them to BigQuery systems. + https://cloud.google.com/bigquery[Google BigQuery] is a fully managed enterprise data warehouse that helps you manage and analyze your data with built-in features like machine learning, geospatial analysis, and business intelligence. BigQuery's serverless architecture lets you use SQL queries to answer your organization's biggest questions with zero infrastructure management. BigQuery's scalable, distributed analysis engine lets you query terabytes in seconds and petabytes in minutes. BigQuery {pulsar-short} Sink is not integrated with BigQuery directly. It uses {pulsar-short}'s built-in https://pulsar.apache.org/docs/adaptors-kafka/[Kafka Connect adapter] library to transform message data into a Kafka compatible format. Then the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink] is used as the actual BigQuery integration. The adaptor provides a flexible and extensible framework for data transformation and processing. It supports various data formats, including JSON, Avro, and Protobuf, and enables users to apply transformations on the data as it is being streamed from {pulsar-short}. @@ -22,7 +24,8 @@ include::partial$connectors/sinks/monitoring.adoc[] == Connector Reference -The BigQuery sink has multiple sets of parameters: the Astra Streaming parameters, the Kafka Connect Adapter parameters, and the Google BigQuery parameters. Each set of parameters provides a way to coordinate how data will be streamed from {pulsar-short} to BigQuery. +The BigQuery sink has three sets of parameters. +Each set of parameters provides a way to coordinate how data is streamed from {pulsar-short} to BigQuery. === Astra Streaming @@ -251,14 +254,16 @@ This presents two issues: | a| Can be either a string representation of the Google credentials file or the path to the Google credentials file itself. -When using the Astra Streaming UI, the string representation must be used. If using pulsar-admin with Astra Streaming, either the representation or file can be used. +When configuring this connector in the {astra-ui}, the string representation must be used. +With the {pulsar-short} Admin CLI or API, you can use either the representation or a file. | keySource | yes | `FILE` a| Determines whether the keyfile configuration is the path to the credentials JSON file or to the JSON itself. Available values are `FILE` and `JSON`. -When using the Astra Streaming UI, JSON will be the only option. If using pulsar-admin with Astra Streaming, either the representation or file can be used. +When configuring this connector in the {astra-ui}, JSON is the only option. +With the {pulsar-short} Admin CLI or API, you can use either the representation or a file. | name | yes diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 061c2c7..a45e1de 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -2,13 +2,12 @@ :connectorName: jdbc-clickhouse :connectorType: jdbc-clickhouse +The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and writes them to JDBC-ClickHouse systems. + ClickHouse is an open-source column-oriented database management system for online analytical processing that allows users to generate analytical reports using SQL queries in real-time. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. -==== +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. == Get Started @@ -37,7 +36,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming JDBC Clickhouse sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector +The {product} JDBC Clickhouse sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index e961ff2..7dbc5be 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -2,14 +2,13 @@ :connectorName: jdbc-mariadb :connectorType: jdbc-mariadb +The JDBC-MariaDB sink connector reads messages from {pulsar} topics and writes them to JDBC-MariaDB systems. + MariaDB is the open source relational database loved by developers all over the world. Created by MySQL’s original developers, MariaDB is compatible with MySQL and guaranteed to stay open source forever. MariaDB powers some of the world’s most popular websites such as Wikipedia and WordPress.com. It is also the core engine behind banking, social media, mobile and e-commerce sites worldwide. MariaDB Connector/J is a Type 4 JDBC driver. It was developed specifically as a lightweight JDBC connector for use with MariaDB and MySQL database servers. It was originally based on the Drizzle JDBC code with numerous additions and bug fixes. Learn more about MariaDB on https://mariadb.org/[their site]. Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. -[NOTE] -==== -Astra Streaming currently supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. -==== +{product} currently supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. == Get Started @@ -38,4 +37,4 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. \ No newline at end of file +The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 66acace..6ff9841 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -1,6 +1,7 @@ = JDBC PostgreSQL :connectorName: jdbc-postgres :connectorType: jdbc-postgres +The JDBC-PostgreSQL sink connector reads messages from {pulsar} topics and writes them to JDBC-PostgreSQL systems. PostgreSQL is a powerful, open source, object-relational database system with over 30 years of active development. @@ -8,10 +9,7 @@ It has earned a strong reputation for reliability, feature robustness, and perfo The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (Type 4) that communicates using the PostgreSQL native network protocol. This allows Java programs to connect to a PostgreSQL database using standard, database-independent Java code. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. -==== +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. == Get Started @@ -40,7 +38,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming JDBC PostgreSQL sink connector supports all configuration properties provided by {pulsar-short}. Refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector +The {product} JDBC PostgreSQL sink connector supports all configuration properties provided by {pulsar-short}. Refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index cec3bd7..8e51ae6 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -2,6 +2,8 @@ :connectorName: jdbc-sqlite :connectorType: jdbc-sqlite +The JDBC-SQLite sink connector reads messages from {pulsar} topics and writes them to JDBC-SQLite systems. + SQLite is the most used database engine in the world. SQLite is built into all mobile phones, most computers, and comes bundled inside countless other everyday applications. @@ -10,10 +12,7 @@ SQLite is a C-language library that implements a small, fast, self-contained, hi SQLite JDBC is a library for accessing and creating SQLite database files in Java. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. -==== +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. == Get Started @@ -42,7 +41,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector +The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index e0d6548..ef944ae 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -2,13 +2,12 @@ :connectorName: kafka-sink :connectorType: kafka +The Kafka sink connector reads messages from {pulsar} topics and writes them to Kafka systems. + Apache Kafka(R) is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with Kafka. -==== == Get Started @@ -37,7 +36,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming Kafka sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kafka-sink#property[connector properties] for a complete list. +The {product} Kafka sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kafka-sink#property[connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index a5cf9e5..85ab218 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -2,16 +2,15 @@ :connectorName: kinesis-sink :connectorType: kinesis +The Kinesis sink connector reads messages from {pulsar} topics and writes them to Kinesis systems. + Amazon Kinesis collects, processes, and analyzes real-time streaming data for timely insights and quick reactions to new information. Amazon Kinesis cost-effectively processes streaming data at any scale, and offers the flexibility to choose the tools that best suit your application's requirements. The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers to easily consume and process data from Amazon Kinesis. -[NOTE] -==== -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. -==== +{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. == Get Started @@ -40,7 +39,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming Kinesis sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kinesis-sink#property[connector properties] for a complete list. +The {product} Kinesis sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kinesis-sink#property[connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 75cb8a7..3890ebe 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -2,6 +2,8 @@ :connectorName: snowflake-sink :connectorType: snowflake +The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake systems. + A Snowflake database is where an organization's uploaded structured and semi-structured data sets are held for processing and analysis. Snowflake automatically manages all parts of the data storage process, including organization, structure, metadata, file size, compression, and statistics. @@ -33,7 +35,7 @@ include::example$connectors/sinks/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming Snowflake sink connector supports all configuration properties provided by {company}. Please refer to the https://github.com/datastax/snowflake-connector#configuration[connector +The {product} Snowflake sink connector supports all configuration properties provided by {company}. Please refer to the https://github.com/datastax/snowflake-connector#configuration[connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 469dc0c..6bf5aa0 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -2,13 +2,15 @@ :connectorName: data-gen-src :connectorType: data-generator +The Data generator source connector produces messages for testing and persists the messages to {pulsar-short} topics. + The Data Generator source connector creates fake data on an {pulsar-reg} topic using the https://github.com/Codearte/jfairy[JFAIRY library] to generate a message containing "person" data. "Person" data includes first and last name, home address, and email address, among other details. The connector will produce data indefinitely while it is running. -Astra Streaming currently supports {pulsar} {pulsar-version}, which uses version 0.5.9 of the jfairy library. +{product} currently supports {pulsar} {pulsar-version}, which uses version 0.5.9 of the jfairy library. For a reference of the full "Person" class, https://github.com/apache/pulsar/blob/branch-{pulsar-version}/pulsar-io/data-generator/src/main/java/org/apache/pulsar/io/datagenerator/Person.java[view the source]. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index b05e385..a0b335b 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -2,11 +2,13 @@ :connectorName: debezium-mongo-src :connectorType: debezium-mongodb +The Debezium MongoDB source connector reads data from Debezium MongoDB systems and produces data to {pulsar-short} topics. + Debezium’s MongoDB connector tracks a MongoDB replica set or a MongoDB sharded cluster for document changes in databases and collections and records those changes as messages in an {pulsar-reg} topic. The connector automatically handles the addition or removal of shards in a sharded cluster, changes in membership of each replica set, elections within each replica set, and the resolution of communications problems. -Astra Streaming currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported MongoDB versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. +{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported MongoDB versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. == Get Started diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 3cf3172..8dc4056 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -2,9 +2,11 @@ :connectorName: debezium-mysql-src :connectorType: debezium-mysql +The Debezium MySQL source connector reads data from Debezium MySQL systems and produces data to {pulsar-short} topics. + The Debezium MySQL connector reads the binlog, produces change events for row-level INSERT, UPDATE, and DELETE operations, and emits these change events as messages in an {pulsar-reg} topic. -Astra Streaming currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. +{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. == Get Started @@ -33,7 +35,7 @@ include::example$connectors/sources/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming MySQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#mysql-connector-properties[Debezium MySQL connector properties] for a complete list. +The {product} MySQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#mysql-connector-properties[Debezium MySQL connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 2634b47..d6c1591 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -1,12 +1,13 @@ = Debezium Oracle :connectorName: debezium-orcl-src :connectorType: debezium-oracle +The Debezium Oracle source connector reads data from Debezium Oracle systems and produces data to {pulsar-short} topics. Debezium’s Oracle connector captures and records row-level changes that occur in databases on Oracle servers, including tables that are added while the connector is running. The connector can be configured to emit change events for specific subsets of schemas and tables, or to ignore, mask, or truncate values in specific columns. -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. +{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. == Get Started @@ -33,7 +34,7 @@ include::example$connectors/sources/astra.csv[] === Debezium Oracle -The Astra Streaming Oracle source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#oracle-connector-properties[Debezium Oracle connector properties] for a complete list. +The {product} Oracle source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#oracle-connector-properties[Debezium Oracle connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index f05326d..e11ac78 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -2,9 +2,11 @@ :connectorName: debezium-pg-src :connectorType: debezium-postgres +The Debezium PostgreSQL source connector reads data from Debezium PostgreSQL systems and produces data to {pulsar-short} topics. + The PostgreSQL connector produces a change event for every row-level insert, update, and delete operation that it captures, and sends change event records for each table in a separate {pulsar-reg} topic. -Astra Streaming currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported PostgreSQL versions, please refer to the +{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported PostgreSQL versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. == Get Started @@ -34,7 +36,7 @@ include::example$connectors/sources/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming PostgreSQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/postgresql.html#postgresql-connector-properties[Debezium PostgreSQL connector properties] for a complete list. +The {product} PostgreSQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/postgresql.html#postgresql-connector-properties[Debezium PostgreSQL connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 1ad9c47..5a731c4 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -2,11 +2,13 @@ :connectorName: debezium-mssql-src :connectorType: debezium-sqlserver +The Debezium SQL Server source connector reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. + The Debezium SQL Server connector is based on the change data capture feature available in SQL Server 2016 Service Pack 1 (SP1) and later editions. The SQL Server capture process monitors designated databases and tables and stores changes into specifically created change tables with stored procedure facades. -Astra Streaming currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported SQL Server versions, please refer to the +{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported SQL Server versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. == Get Started @@ -62,7 +64,7 @@ include::example$connectors/sources/astra.csv[] These values are provided in the "configs" area. -The Astra Streaming SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. +The SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. == What's next? diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index d27fc37..1f13b9e 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -2,6 +2,8 @@ :connectorName: kafka-src :connectorType: kafka +The Kafka source connector reads data from Kafka systems and produces data to {pulsar-short} topics. + The Kafka source connector pulls data from a Kafka topic and persists the data into an {pulsar-reg} topic. For more, see https://pulsar.apache.org/docs/io-kafka-source[{pulsar}'s Kafka source documentation]. @@ -60,5 +62,5 @@ The deserializer is set by a specific implementation of https://github.com/apach |=== -The Astra Streaming Kafka source connector supports all configuration properties provided by {pulsar}. +The {product} Kafka source connector supports all configuration properties provided by {pulsar}. For a complete list, see the https://pulsar.apache.org/docs/io-kafka-source#property[Kafka source connector properties]. diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 9c5bde9..b38aa39 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -2,6 +2,8 @@ :connectorName: kinesis-src :connectorType: kinesis +The AWS Kinesis source connector reads data from Kinesis systems and produces data to {pulsar-short} topics. + The Kinesis source connector pulls data from Amazon Kinesis and persists data into an {pulsar-reg} topic. For more, see https://pulsar.apache.org/docs/io-kinesis-source[{pulsar}'s Kinesis source documentation]. @@ -71,5 +73,5 @@ If `awsCredentialPluginName` set to empty, the Kinesis sink creates a default AW |=== -The Astra Streaming Kinesis source connector supports all configuration properties provided by {pulsar}. +The {product} Kinesis source connector supports all configuration properties provided by {pulsar}. For a complete list, see the https://pulsar.apache.org/docs/io-kinesis-source#configuration[Kinesis source connector properties]. diff --git a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc index 5b56332..ab654b1 100644 --- a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc @@ -242,4 +242,4 @@ Status response for individual connector instance: === Metrics -Astra Streaming exposes Prometheus formatted metrics for every connector. Refer to the xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file +{product} exposes Prometheus formatted metrics for every connector. Refer to the xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc index ffa064c..a8b5a6d 100644 --- a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc @@ -175,4 +175,4 @@ Status response for individual connector instance: === Metrics -Astra Streaming exposes Prometheus formatted metrics for every connector. Refer to xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file +{product} exposes Prometheus formatted metrics for every connector. Refer to xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file From d9091345ffec17bdde2ef727236b864e9e10278e Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:29:39 -0800 Subject: [PATCH 05/31] delete tests --- .../connectors/tests/connector-tests.sh | 204 ------------------ .../tests/functions/install-pulsar.sh | 35 --- .../tests/functions/script-runner.sh | 41 ---- modules/pulsar-io/pages/connectors/index.adoc | 1 + 4 files changed, 1 insertion(+), 280 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/tests/connector-tests.sh delete mode 100644 modules/pulsar-io/examples/connectors/tests/functions/install-pulsar.sh delete mode 100644 modules/pulsar-io/examples/connectors/tests/functions/script-runner.sh diff --git a/modules/pulsar-io/examples/connectors/tests/connector-tests.sh b/modules/pulsar-io/examples/connectors/tests/connector-tests.sh deleted file mode 100644 index d93b7f0..0000000 --- a/modules/pulsar-io/examples/connectors/tests/connector-tests.sh +++ /dev/null @@ -1,204 +0,0 @@ -#!/bin/bash - -set -e -set -o errtrace - -export ROOT_FOLDER="$( pwd )" -export THIS_FOLDER="$( dirname "${BASH_SOURCE[0]}" )" -export EXAMPLES_FOLDER="${ROOT_FOLDER}/.." -export SINKS_FOLDER="${ROOT_FOLDER}/../sinks" -export SOURCES_FOLDER="${ROOT_FOLDER}/../sources" -export PULSAR_ROOT="/home/ddieruf/apache-pulsar-2.10.1" - -while [ $# -ne 0 ]; do - name="$1" - case "$name" in - --tenant) - shift - TENANT="$1" - ;; - --namespace) - shift - NAMESPACE="$1" - ;; - --topic) - shift - TOPIC="$1" - ;; - --webserviceurl) - shift - WEB_SERVICE_URL="$1" - ;; - --pulsartoken) - shift - PULSAR_TOKEN="$1" - ;; - esac - - shift -done - -####################################### -# Validate required -####################################### -[[ -z $TENANT ]] && (echo "TENANT is a required value" && exit 1) -[[ -z $NAMESPACE ]] && (echo "NAMESPACE is a required value" && exit 1) -[[ -z ${TOPIC} ]] && (echo "TOPIC is a required value" && exit 1) -[[ -z $WEB_SERVICE_URL ]] && (echo "WEB_SERVICE_URL is a required value" && exit 1) -[[ -z ${PULSAR_TOKEN} ]] && (echo "PULSAR_TOKEN is a required value" && exit 1) - -####################################### -# Source needed functions -####################################### -source "${THIS_FOLDER}/functions/install-pulsar.sh" --version "2.10.1" -source "${THIS_FOLDER}/functions/script-runner.sh" - -sinks=("elastic-search" "jdbc-clickhouse" "jdbc-mariadb" "jdbc-postgresql" "jdbc-sqlite" "kafka" "kinesis" "snowflake") #"astra-db" -sources=("data-generator" "debezium-mongodb" "debezium-mysql" "debezium-oracle" "debezium-postgres" "debezium-sqlserver" "kafka" "kinesis") -connectorAdminFiles=("pulsar-admin-create.sh" "pulsar-admin-update.sh") -generalAdminFiles=("pulsar-admin-status.sh" "pulsar-admin-stop.sh" "pulsar-admin-start.sh" "pulsar-admin-info.sh" "pulsar-admin-restart.sh" "pulsar-admin-delete.sh") -connectorCurlFiles=("curl-create.sh" "curl-update.sh") -generalCurlFiles=("curl-status.sh" "curl-stop.sh" "curl-start.sh" "curl-info.sh" "curl-restart.sh" "curl-delete.sh") - -####################################### -# Begin task -####################################### -#set -x #echo all commands -echo "--------------------------------------------------------" -echo "Starting sink tests" -echo "--------------------------------------------------------" - -for sink in "${sinks[@]}"; do - sinkFolder="${SINKS_FOLDER}/${sink}" - sinkName="a$(echo $RANDOM | md5sum | head -c 17)" - echo " Testing ${sink} as ${sinkName}" - - for file in "${connectorAdminFiles[@]}"; do - echo " Running test ${sink}:${file}" - - pushd "${PULSAR_ROOT}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sinkName}" \ - "" \ - "" \ - "${sinkFolder}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - popd - echo " SUCCESS" - sleep 2s - done - - for file in "${generalAdminFiles[@]}"; do - echo " Running test ${sink}:${file}" - - pushd "${PULSAR_ROOT}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sinkName}" \ - "" \ - "" \ - "${SINKS_FOLDER}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - popd - echo " SUCCESS" - sleep 2s - done - - for file in "${connectorCurlFiles[@]}"; do - echo " Running test ${sink}:${file}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sinkName}" \ - "$WEB_SERVICE_URL" \ - "${PULSAR_TOKEN}" \ - "${sinkFolder}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - echo " SUCCESS" - sleep 2s - done - - for file in "${generalCurlFiles[@]}"; do - echo " Running test ${sink}:${file}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sinkName}" \ - "$WEB_SERVICE_URL" \ - "${PULSAR_TOKEN}" \ - "${SINKS_FOLDER}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - echo " SUCCESS" - sleep 2s - done -done - -echo "" -echo "--------------------------------------------------------" -echo "Starting source tests" -echo "--------------------------------------------------------" - -for src in "${sources[@]}"; do - sourceFolder="${SOURCES_FOLDER}/${src}" - sourceName="a$(echo $RANDOM | md5sum | head -c 17)" - echo " Testing ${src} as ${sourceName}" - - for file in "${connectorAdminFiles[@]}"; do - echo " Running test ${src}:${file}" - - pushd "${PULSAR_ROOT}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sourceName}" \ - "" \ - "" \ - "${sourceFolder}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - popd - echo " SUCCESS" - sleep 2s - done - - for file in "${generalAdminFiles[@]}"; do - echo " Running test ${src}:${file}" - - pushd "${PULSAR_ROOT}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sourceName}" \ - "" \ - "" \ - "${SOURCES_FOLDER}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - popd - echo " SUCCESS" - sleep 2s - done - - for file in "${connectorCurlFiles[@]}"; do - echo " Running test ${src}:${file}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sourceName}" \ - "$WEB_SERVICE_URL" \ - "${PULSAR_TOKEN}" \ - "${sourceFolder}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - echo " SUCCESS" - sleep 2s - done - - for file in "${generalCurlFiles[@]}"; do - echo " Running test ${src}:${file}" - if ! ret=$(runScript "$TENANT" \ - "$NAMESPACE" \ - "${TOPIC}" \ - "${sourceName}" \ - "$WEB_SERVICE_URL" \ - "${PULSAR_TOKEN}" \ - "${SOURCES_FOLDER}/${file}" 2>&1); then (echo " ERROR: $ret" && exit 1) fi - echo " SUCCESS" - sleep 2s - done -done - -echo "All tests passed" diff --git a/modules/pulsar-io/examples/connectors/tests/functions/install-pulsar.sh b/modules/pulsar-io/examples/connectors/tests/functions/install-pulsar.sh deleted file mode 100644 index e9f7fe8..0000000 --- a/modules/pulsar-io/examples/connectors/tests/functions/install-pulsar.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -###################################### -# Description: -# Install Apache Pulsar -# Returns: -# 0: success -# 1: error -####################################### -function install(){ - wget https://archive.apache.org/dist/pulsar/pulsar-"${version}"/apache-pulsar-"${version}"-bin.tar.gz - tar xvfz apache-pulsar-2.10.1-bin.tar.gz - - return 0 -} - -version="" - -while [ $# -ne 0 ] -do - name="$1" - case "$name" in - -v|--version|-[Vv]ersion) - shift - version="$1" - ;; - esac - - shift -done - -#INSTALL PULSAR - if not installed -#command -v pulsar-admin >/dev/null 2>&1 || install -#export PATH="${pwd}/apache-pulsar-2.10.1/bin:${PATH}" -# export PATH="/home/ddieruf/apache-pulsar-2.10.1/bin:${PATH}" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/tests/functions/script-runner.sh b/modules/pulsar-io/examples/connectors/tests/functions/script-runner.sh deleted file mode 100644 index 8035692..0000000 --- a/modules/pulsar-io/examples/connectors/tests/functions/script-runner.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# Silence pushd and popd -pushd () { - command pushd "$@" > /dev/null -} -popd () { - command popd "$@" > /dev/null -} - -###################################### -# Returns: -# 0: success -# : error -####################################### -function runScript() { - export TENANT="${1}" - export NAMESPACE="${2}" - export INPUT_TOPIC="${3}" - export DESINATION_TOPIC="${3}" - export SINK_NAME="${4}" - export SOURCE_NAME="${4}" - export WEB_SERVICE_URL="${5}" - export ASTRA_STREAMING_TOKEN="${6}" - local scriptPath="${7}" - - [[ ! -f "${scriptPath}" ]] && echo "No script was found at path '${scriptPath}'" && return 1 - - if ! ret=$(exec "${scriptPath}" 2>&1 | head -n 2); - then - echo "${ret}" - return 1 - fi - - if [[ -z ${ret} || ${ret,,} =~ "success" || ${ret,,} =~ "{" ]]; then - return 0 - fi - - echo "$ret" - return 1 -} \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index 1481027..4d6fcc3 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -14,6 +14,7 @@ For configuration details, see the connector's documentation. //Luna Streaming: Cloud Storage sink, Google BigQuery sink are experimental //Elasticsearch is lowercase //Luna Streaming extra Experimental source: Netty +//Luna Streaming -2.x and -1.x have fewer connectors [#sink-connectors] == Sink connectors From 5ae12f4f2d4789ae0b73061189028820cc408ebb Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:46:50 -0800 Subject: [PATCH 06/31] start cleaning partials --- .../examples/connectors/sinks/astra.csv | 29 ---- .../examples/connectors/sources/astra.csv | 19 --- .../pages/connectors/sinks/astra-db.adoc | 5 +- .../pages/connectors/sinks/cloud-storage.adoc | 5 +- .../connectors/sinks/elastic-search.adoc | 5 +- .../connectors/sinks/google-bigquery.adoc | 5 +- .../connectors/sinks/jdbc-clickhouse.adoc | 5 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 5 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 5 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 5 +- .../pages/connectors/sinks/kafka.adoc | 5 +- .../pages/connectors/sinks/kinesis.adoc | 5 +- .../pages/connectors/sinks/snowflake.adoc | 5 +- .../connectors/sources/data-generator.adoc | 5 +- .../connectors/sources/debezium-mongodb.adoc | 5 +- .../connectors/sources/debezium-mysql.adoc | 5 +- .../connectors/sources/debezium-oracle.adoc | 5 +- .../connectors/sources/debezium-postgres.adoc | 5 +- .../sources/debezium-sqlserver.adoc | 5 +- .../pages/connectors/sources/kafka.adoc | 5 +- .../pages/connectors/sources/kinesis.adoc | 5 +- .../connectors/sinks/astra-config-params.adoc | 144 ++++++++++++++++++ .../sources/astra-config-params.adoc | 94 ++++++++++++ 23 files changed, 257 insertions(+), 124 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/astra.csv delete mode 100644 modules/pulsar-io/examples/connectors/sources/astra.csv create mode 100644 modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc create mode 100644 modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/astra.csv b/modules/pulsar-io/examples/connectors/sinks/astra.csv deleted file mode 100644 index eb53981..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/astra.csv +++ /dev/null @@ -1,29 +0,0 @@ -"Name","Required","Default","Description" -"archive","true","","The connector type, like 'builtin://elastic_search'" -"autoAck","true","false","Boolean denotes whether or not the framework will automatically acknowledge messages" -"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" -"cleanupSubscription","false","false","Boolean denotes whether the subscriptions the functions created/used should be deleted when the functions is deleted" -"configs","false","{}","A key/value map of config properties specific to the type of connector. See the reference table below for values." -"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -"deadLetterTopic","false","","Name of the dead topic where the failing messages will be sent" -"inputSpecs","false","","The map of input topics to its consumer configuration, each configuration has schema of {""schemaType"": ""type-x"", ""serdeClassName"": ""name-x"", ""isRegexPattern""": true, ""receiverQueueSize"": 5}" -"inputs","true","[]"," The input topic or topics of the Sink (specified as a JSON array)" -"maxMessageRetries","false","","Maximum number of times that a message will be redelivered before being sent to the dead letter queue" -"name","true","","Give your sink a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens(kebab-case)." -"namespace","true","","The namespace you'd like the sink created under" -"negativeAckRedeliveryDelayMs","false","","The negative ack message redelivery delay in milliseconds" -"parallelism","true","1","The number of sink instances to run" -"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" -"resources","false","","The compute resources that need to be allocated per instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" -"retainKeyOrdering","false","true","Sink consumes and processes messages in key order" -"retainOrdering","false","false","Boolean denotes whether the Pulsar Sink consumes and processes messages in order" -"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" -"sourceSubscriptionName","false","","Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer" -"sourceSubscriptionPosition","false","Earliest","The position to begin reading from the source" -"tenant","true","","The tenant you'd like the sink created under" -"timeoutMs","false","5000","Denotes the message timeout in milliseconds" -"topicToSchemaProperties","false","","" -"topicToSchemaType","false","","The map of input topics to Schema types or class names (specified as a JSON object)" -"topicToSerdeClassName","false","","The map of input topics to SerDe class names (specified as a JSON object)" -"topicsPattern","false","","TopicsPattern to consume from list of topics under a namespace that match the pattern. [input] and [topicsPattern] are mutually exclusive. Add SerDe class name for a pattern in customSerdeInputs (supported for java fun only)" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/astra.csv b/modules/pulsar-io/examples/connectors/sources/astra.csv deleted file mode 100644 index d8a96d0..0000000 --- a/modules/pulsar-io/examples/connectors/sources/astra.csv +++ /dev/null @@ -1,19 +0,0 @@ -"Name","Required","Default","Description" -"archive","true","","The connector type, like 'builtin://debezium-mysql'" -"batchBuilder","false","","BatchBuilder provides two types of batch construction methods, DEFAULT and KEY_BASED. The default value is: DEFAULT" -"batchSourceConfig","false","","Batch source config key/value (as a JSON string)" -"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" -"configs","false","{}","JSON key/value config of source type specific settings. Example: {""property1"":""1234"",""property2"":{""subProperty"":""asdf""}}" -"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -"name","true","","Give your source a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens (kebab-case)." -"namespace","true","","The namespace you'd like the source created under" -"parallelism","true","1","The number of a Pulsar Source instances to run" -"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" -"producerConfig","false","","The custom producer configuration (as a JSON string)" -"resources","false","","The compute resources that need to be allocated per source instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" -"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -"schemaType","false","","The schema type (either a builtin schema like 'avro', 'json', etc.. or custom Schema class name to be used to encode messages emitted from the Pulsar Source" -"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" -"serdeClassName","false","","The SerDe classname for the Pulsar Source" -"tenant","true","","The tenant you'd like the source created under" -"topicName","true","","The name of an existing topic in Astra Streaming, where messages will be published to. Should be in the format of [non-]persistent:////" \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index cd75ee1..5093e8a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -33,10 +33,7 @@ There are two sets of parameters that support sink connectors. === {pulsar-short} sink connector parameters -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === {cass-short} Connection diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 2e1649c..50b2f5e 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -143,10 +143,7 @@ include::partial$connectors/sinks/monitoring.adoc[] == Astra Streaming parameters for Cloud Storage Sink configuration -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] == Cloud storage provider parameters for Cloud Storage Sink configuration diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 6e16024..1abb968 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -28,10 +28,7 @@ include::partial$connectors/sinks/monitoring.adoc[] == Astra Streaming parameters for Elasticsearch sink configuration -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] == Elasticsearch (configs) parameters for Elasticsearch sink configuration diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 26c95ec..e4eedb9 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -29,10 +29,7 @@ Each set of parameters provides a way to coordinate how data is streamed from {p === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === Kafka Connect Adapter Configuration (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index a45e1de..f132c23 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -27,10 +27,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === Clickhouse (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 7dbc5be..310e373 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -28,10 +28,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === MariaSQL (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 6ff9841..fddfb47 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -29,10 +29,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === PostgreSQL (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 8e51ae6..91f4a50 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -32,10 +32,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === SQLite (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index ef944ae..140d8b7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -27,10 +27,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === Kafka (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 85ab218..9585861 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -30,10 +30,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === Kinesis (configs) diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 3890ebe..3657a60 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -26,10 +26,7 @@ There are two sets of parameters that support sink connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sinks/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] === Snowflake (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 6bf5aa0..225e244 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -32,10 +32,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Data Generator (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index a0b335b..88089d6 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -28,10 +28,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Debezium MongoDB (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 8dc4056..e953a66 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -26,10 +26,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Debezium MySQL (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index d6c1591..fb442ba 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -27,10 +27,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Debezium Oracle diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index e11ac78..16ed9b7 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -27,10 +27,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Debezium PostgreSQL (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 5a731c4..2170706 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -55,10 +55,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Debezium SQL Server (configs) diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 1f13b9e..c3caa1b 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -26,10 +26,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Kafka configuration options diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index b38aa39..32b8a14 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -26,10 +26,7 @@ There are two sets of parameters that support source connectors. === Astra Streaming -[%header,format=csv,cols="2,1,1,3"] -|=== -include::example$connectors/sources/astra.csv[] -|=== +include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] === Kinesis configuration options diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc new file mode 100644 index 0000000..69ba6d6 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -0,0 +1,144 @@ +[cols=4] +|=== +|Name |Required |Default |Description + +|"archive","true","","The connector type, like 'builtin://elastic_search'" +| +| +| + +|"autoAck","true","false","Boolean denotes whether or not the framework will automatically acknowledge messages" +| +| +| + +|"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" +| +| +| + +|"cleanupSubscription","false","false","Boolean denotes whether the subscriptions the functions created/used should be deleted when the functions is deleted" +| +| +| + +|"configs","false","{}","A key/value map of config properties specific to the type of connector. See the reference table below for values." +| +| +| + +|"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" +| +| +| + +|"deadLetterTopic","false","","Name of the dead topic where the failing messages will be sent" +| +| +| + +|"inputSpecs","false","","The map of input topics to its consumer configuration, each configuration has schema of {""schemaType"": ""type-x"", ""serdeClassName"": ""name-x"", ""isRegexPattern""": true, ""receiverQueueSize"": 5}" +| +| +| + +|"inputs","true","[]"," The input topic or topics of the Sink (specified as a JSON array)" +| +| +| + +|"maxMessageRetries","false","","Maximum number of times that a message will be redelivered before being sent to the dead letter queue" +| +| +| + +|"name","true","","Give your sink a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens(kebab-case)." +| +| +| + +|"namespace","true","","The namespace you'd like the sink created under" +| +| +| + +|"negativeAckRedeliveryDelayMs","false","","The negative ack message redelivery delay in milliseconds" +| +| +| + +|"parallelism","true","1","The number of sink instances to run" +| +| +| + +|"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" +| +| +| + +|"resources","false","","The compute resources that need to be allocated per instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" +| +| +| + +|"retainKeyOrdering","false","true","Sink consumes and processes messages in key order" +| +| +| + +|"retainOrdering","false","false","Boolean denotes whether the Pulsar Sink consumes and processes messages in order" +| +| +| + +|"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" +| +| +| + +|"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" +| +| +| + +|"sourceSubscriptionName","false","","Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer" +| +| +| + +|"sourceSubscriptionPosition","false","Earliest","The position to begin reading from the source" +| +| +| + +|"tenant","true","","The tenant you'd like the sink created under" +| +| +| + +|"timeoutMs","false","5000","Denotes the message timeout in milliseconds" +| +| +| + +|"topicToSchemaProperties","false","","" +| +| +| + +|"topicToSchemaType","false","","The map of input topics to Schema types or class names (specified as a JSON object)" +| +| +| + +|"topicToSerdeClassName","false","","The map of input topics to SerDe class names (specified as a JSON object)" +| +| +| + +|"topicsPattern","false","","TopicsPattern to consume from list of topics under a namespace that match the pattern. [input] and [topicsPattern] are mutually exclusive. Add SerDe class name for a pattern in customSerdeInputs (supported for java fun only)" +| +| +| +|=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc new file mode 100644 index 0000000..a80e0d9 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -0,0 +1,94 @@ +[cols=4] +|=== +|Name |Required |Default |Description + +|"archive","true","","The connector type, like 'builtin://debezium-mysql'" +| +| +| + +|"batchBuilder","false","","BatchBuilder provides two types of batch construction methods, DEFAULT and KEY_BASED. The default value is: DEFAULT" +| +| +| + +|"batchSourceConfig","false","","Batch source config key/value (as a JSON string)" +| +| +| + +|"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" +| +| +| + +|"configs","false","{}","JSON key/value config of source type specific settings. Example: {""property1"":""1234"",""property2"":{""subProperty"":""asdf""}}" +| +| +| + +|"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" +| +| +| + +|"name","true","","Give your source a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens (kebab-case)." +| +| +| + +|"namespace","true","","The namespace you'd like the source created under" +| +| +| + +|"parallelism","true","1","The number of a Pulsar Source instances to run" +| +| +| + +|"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" +| +| +| + +|"producerConfig","false","","The custom producer configuration (as a JSON string)" +| +| +| + +|"resources","false","","The compute resources that need to be allocated per source instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" +| +| +| + +|"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" +| +| +| + +|"schemaType","false","","The schema type (either a builtin schema like 'avro', 'json', etc.. or custom Schema class name to be used to encode messages emitted from the Pulsar Source" +| +| +| + +|"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" +| +| +| + +|"serdeClassName","false","","The SerDe classname for the Pulsar Source" +| +| +| + +|"tenant","true","","The tenant you'd like the source created under" +| +| +| + +|"topicName","true","","The name of an existing topic in Astra Streaming, where messages will be published to. Should be in the format of [non-]persistent:////" +| +| +| +|=== \ No newline at end of file From f190980a1322b97fb8b1fcddb04d5414913c39ac Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:40:47 -0800 Subject: [PATCH 07/31] finish cleaning astra streaming config tables --- .../pages/connectors/sinks/astra-db.adoc | 3 +- .../pages/connectors/sinks/cloud-storage.adoc | 5 +- .../connectors/sinks/elastic-search.adoc | 5 +- .../connectors/sinks/google-bigquery.adoc | 3 +- .../connectors/sinks/jdbc-clickhouse.adoc | 3 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 3 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 3 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 3 +- .../pages/connectors/sinks/kafka.adoc | 3 +- .../pages/connectors/sinks/kinesis.adoc | 3 +- .../pages/connectors/sinks/snowflake.adoc | 3 +- .../connectors/sources/data-generator.adoc | 3 +- .../connectors/sources/debezium-mongodb.adoc | 3 +- .../connectors/sources/debezium-mysql.adoc | 3 +- .../connectors/sources/debezium-oracle.adoc | 3 +- .../connectors/sources/debezium-postgres.adoc | 3 +- .../sources/debezium-sqlserver.adoc | 3 +- .../pages/connectors/sources/kafka.adoc | 3 +- .../pages/connectors/sources/kinesis.adoc | 3 +- .../connectors/sinks/astra-config-params.adoc | 338 ++++++++++-------- .../sources/astra-config-params.adoc | 216 ++++++----- .../partials/connectors/sources/manage.adoc | 2 +- 22 files changed, 361 insertions(+), 256 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 5093e8a..662c689 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -35,7 +35,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== {cass-short} Connection +[#configs] +=== {cass-short} Connection (`configs`) These values are provided in the `Configs` area: diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 50b2f5e..0743cbc 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -141,11 +141,12 @@ include::partial$connectors/sinks/manage.adoc[] include::partial$connectors/sinks/monitoring.adoc[] -== Astra Streaming parameters for Cloud Storage Sink configuration +== Astra Streaming parameters for the Cloud Storage sink include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -== Cloud storage provider parameters for Cloud Storage Sink configuration +[#configs] +== Cloud storage provider parameters for the Cloud Storage sink (`configs`) Set your cloud storage provider and other required values in the `configs` area. diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 1abb968..a110ce8 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -26,11 +26,12 @@ include::partial$connectors/sinks/manage.adoc[] include::partial$connectors/sinks/monitoring.adoc[] -== Astra Streaming parameters for Elasticsearch sink configuration +== Astra Streaming parameters for the Elasticsearch sink include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -== Elasticsearch (configs) parameters for Elasticsearch sink configuration +[#configs] +== Elasticsearch parameters for the Elasticsearch sink (`configs`) The {product} Elasticsearch sink connector supports all https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[Elasticsearch sink connector properties] provided in the OSS {pulsar} Elasticsearch sink connector. diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index e4eedb9..05cea5f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -31,7 +31,8 @@ Each set of parameters provides a way to coordinate how data is streamed from {p include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== Kafka Connect Adapter Configuration (configs) +[#configs] +=== Kafka Connect Adapter Configuration (`configs`) These values are provided in the `configs` area. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index f132c23..cc7199f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -29,7 +29,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== Clickhouse (configs) +[#configs] +=== Clickhouse (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 310e373..f51e884 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -30,7 +30,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== MariaSQL (configs) +[#configs] +=== MariaSQL (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index fddfb47..f67277a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -31,7 +31,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== PostgreSQL (configs) +[#configs] +=== PostgreSQL (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 91f4a50..359d1f7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -34,7 +34,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== SQLite (configs) +[#configs] +=== SQLite (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 140d8b7..7a1b48b 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -29,7 +29,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== Kafka (configs) +[#configs] +=== Kafka (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 9585861..9b625d4 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -32,7 +32,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== Kinesis (configs) +[#configs] +=== Kinesis (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 3657a60..e12ff1f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -28,7 +28,8 @@ There are two sets of parameters that support sink connectors. include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] -=== Snowflake (configs) +[#configs] +=== Snowflake (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 225e244..47b3b67 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -34,7 +34,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Data Generator (configs) +[#configs] +=== Data Generator (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 88089d6..a41e9ba 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -30,7 +30,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Debezium MongoDB (configs) +[#configs] +=== Debezium MongoDB (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index e953a66..d641f26 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -28,7 +28,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Debezium MySQL (configs) +[#configs] +=== Debezium MySQL (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index fb442ba..ec26aa1 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -29,7 +29,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Debezium Oracle +[#configs] +=== Debezium Oracle (`configs`) The {product} Oracle source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#oracle-connector-properties[Debezium Oracle connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 16ed9b7..2e7b920 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -29,7 +29,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Debezium PostgreSQL (configs) +[#configs] +=== Debezium PostgreSQL (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 2170706..0103451 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -57,7 +57,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Debezium SQL Server (configs) +[#configs] +=== Debezium SQL Server (`configs`) These values are provided in the "configs" area. diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index c3caa1b..12ce448 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -28,7 +28,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Kafka configuration options +[#configs] +=== Kafka configuration options (`configs`) These values are provided in the `configs` area: diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 32b8a14..a972100 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -28,7 +28,8 @@ There are two sets of parameters that support source connectors. include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] -=== Kinesis configuration options +[#configs] +=== Kinesis configuration options (`configs`) These values are provided in the `configs` area: diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index 69ba6d6..aeff78e 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -1,144 +1,198 @@ -[cols=4] +[TIP] +==== +A {pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. +Therefore, some function configuration parameters are also used to configure connectors. + +Additionally, the following table uses the JSON field name for the parameters. +For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference]. +==== + +The following table uses the field name. +Parameter names are different when passed directly on the command line with the {pulsar-short} Admin CLI. + +[cols=3] |=== -|Name |Required |Default |Description - -|"archive","true","","The connector type, like 'builtin://elastic_search'" -| -| -| - -|"autoAck","true","false","Boolean denotes whether or not the framework will automatically acknowledge messages" -| -| -| - -|"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" -| -| -| - -|"cleanupSubscription","false","false","Boolean denotes whether the subscriptions the functions created/used should be deleted when the functions is deleted" -| -| -| - -|"configs","false","{}","A key/value map of config properties specific to the type of connector. See the reference table below for values." -| -| -| - -|"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -| -| -| - -|"deadLetterTopic","false","","Name of the dead topic where the failing messages will be sent" -| -| -| - -|"inputSpecs","false","","The map of input topics to its consumer configuration, each configuration has schema of {""schemaType"": ""type-x"", ""serdeClassName"": ""name-x"", ""isRegexPattern""": true, ""receiverQueueSize"": 5}" -| -| -| - -|"inputs","true","[]"," The input topic or topics of the Sink (specified as a JSON array)" -| -| -| - -|"maxMessageRetries","false","","Maximum number of times that a message will be redelivered before being sent to the dead letter queue" -| -| -| - -|"name","true","","Give your sink a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens(kebab-case)." -| -| -| - -|"namespace","true","","The namespace you'd like the sink created under" -| -| -| - -|"negativeAckRedeliveryDelayMs","false","","The negative ack message redelivery delay in milliseconds" -| -| -| - -|"parallelism","true","1","The number of sink instances to run" -| -| -| - -|"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" -| -| -| - -|"resources","false","","The compute resources that need to be allocated per instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" -| -| -| - -|"retainKeyOrdering","false","true","Sink consumes and processes messages in key order" -| -| -| - -|"retainOrdering","false","false","Boolean denotes whether the Pulsar Sink consumes and processes messages in order" -| -| -| - -|"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -| -| -| - -|"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" -| -| -| - -|"sourceSubscriptionName","false","","Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer" -| -| -| - -|"sourceSubscriptionPosition","false","Earliest","The position to begin reading from the source" -| -| -| - -|"tenant","true","","The tenant you'd like the sink created under" -| -| -| - -|"timeoutMs","false","5000","Denotes the message timeout in milliseconds" -| -| -| - -|"topicToSchemaProperties","false","","" -| -| -| - -|"topicToSchemaType","false","","The map of input topics to Schema types or class names (specified as a JSON object)" -| -| -| - -|"topicToSerdeClassName","false","","The map of input topics to SerDe class names (specified as a JSON object)" -| -| -| - -|"topicsPattern","false","","TopicsPattern to consume from list of topics under a namespace that match the pattern. [input] and [topicsPattern] are mutually exclusive. Add SerDe class name for a pattern in customSerdeInputs (supported for java fun only)" -| -| -| +|Field name |Required |Description + +|`archive` +|Yes +|The built-in {product} {pulsar-short} connector type. +Formatted as `builtin://**CONNECTOR**`, such as `builtin://elastic_search`. + +|`autoAck` +|Yes +|Whether the framework automatically acknowledges messages. + +Default: `false` (automatic acknowledgment disabled) + +|`className` +|Yes +|The connector type's class reference beginning with `org.apache.pulsar`, such as +`org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.kafka.connect.KafkaConnectSink`. + +|`cleanupSubscription` +|No +|Whether to delete subscriptions that are created or used by a sink when the sink is deleted. + +Default: `false` + +|`configs` +|No +|A JSON-formatted key-value map containing configuration properties specific to the connector type, such as provider-specific authentication and integration settings. +For available options, see <>. + +Default: `{}` (Empty map, uses defaults) + +|`customRuntimeOptions` +|No +|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. + +|`deadLetterTopic` +|No +|The name of the topic that receives unacknowledged messages, such as those that exceed the maximum number of retries or fail to be processed completely. + +If `null` or not set, unacknowledged messages are discarded. + +See also `maxMessageRetries` and `negativeAckRedeliveryDelayMs`. + +|`inputSpecs` +|No +a|A map of input topics to https://pulsar.apache.org/docs/3.1.x/functions-cli/#consumerconfig[consumer configuration]. +By default, most values are `null` or empty. +For example: + +[source,json] +---- + "inputSpecs": { + "persistent://$TENANT/$NAMESPACE/$TOPIC": { + "schemaType": null, + "serdeClassName": null, + "schemaProperties": {}, + "consumerProperties": {}, + "receiverQueueSize": null, + "cryptoConfig": null, + "poolMessages": false, + "regexPattern": false + } + }, +---- + +|`inputs` +|Yes +|An array of input topics that the sink consumes messages from, such as `["persistent://$TENANT/$NAMESPACE/$TOPIC"]`. + +To consume all topics matching a naming pattern, use `topicsPattern` instead. +`inputs` and `topicsPattern` are mutually exclusive. + +Default: `[]` + +|`maxMessageRetries` +|No +|Maximum number of times that a message attempts to be delivered before being sent to the dead letter queue as an unacknowledged message. + +See also `negativeAckRedeliveryDelayMs` and `deadLetterTopic`. + +|`name` +|Yes +|The name for the connector. +It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. +{company} recommends memorable, human-readable names that summarize the connector's purpose. +For example: `jdbc-sqllite-sink-prod-us-east-1`. + +|`namespace` +|Yes +|The namespace in your {pulsar-short} tenant where you want to create the connector. + +|`negativeAckRedeliveryDelayMs` +|No +|The amount of time, in milliseconds, to wait before attempting redelivery if message delivery times out or fails. + +See also `maxMessageRetries` and `deadLetterTopic`. + +|`parallelism` +|Yes +|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. + +Default: `1` + +|`processingGuarantees` +|Yes +|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. + +Respect for the processing guarantee depends on the connector implementation. + +For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. + +Default: `ATLEAST_ONCE` + +|`resources` +|No +|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. +For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. + +|`retainKeyOrdering` +|No +|Whether the sink consumes and processes messages in key order. + +Default: `true` + +|`retainOrdering` +|No +|Whether the sink consumes and processes messages in the order they were written to the topic. + +Default: `false` + +|`runtimeFlags` +|No +|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. +Only applicable to process and Kubernetes runtimes. + +|`secrets` +|No +|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. +The `secretName` is used by the connector to reference the secret. +The mapped object contains the required parameters to fetch the secret from the secrets provider. + +To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. + +This is separate from the {pulsar-short} authentication token and security settings passed elsewhere in the connector configuration. + +|`sourceSubscriptionName` +|No +|The name of a specific {pulsar-short} source subscription, if required by your input topic consumer. + +|`sourceSubscriptionPosition` +|No +|The position to begin reading from in the source, if `sourceSubscriptionName` is set. + +Default: `Latest` + +|`tenant` +|Yes +|The {pulsar-short} tenant where you want to create the connector. + +|`timeoutMs` +|No +|The message timeout in milliseconds + +Default: `5000` + +|`topicToSchemaProperties` +|No +|A map of input topics to schema properties specified as a JSON object. + +|`topicToSchemaType` +|No +|A map of input topics to schema types or class names specified as a JSON object. + +|`topicToSerdeClassName` +|No +|A map of input topics to SerDe class names specified as a JSON object. + +|`topicsPattern` +|No +|A topic naming pattern to select topics to consume from all topics in a namespace. + +To consume an exact list of topics, use `inputs` instead. +`inputs` and `topicsPattern` are mutually exclusive. |=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc index a80e0d9..b889587 100644 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -1,94 +1,126 @@ -[cols=4] +[TIP] +==== +A {pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. +Therefore, some function configuration parameters are also used to configure connectors. + +Additionally, the following table uses the JSON field name for the parameters. +For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference]. +==== + +[cols=3] |=== -|Name |Required |Default |Description - -|"archive","true","","The connector type, like 'builtin://debezium-mysql'" -| -| -| - -|"batchBuilder","false","","BatchBuilder provides two types of batch construction methods, DEFAULT and KEY_BASED. The default value is: DEFAULT" -| -| -| - -|"batchSourceConfig","false","","Batch source config key/value (as a JSON string)" -| -| -| - -|"className","true","","The connector type's class reference, like 'org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource'" -| -| -| - -|"configs","false","{}","JSON key/value config of source type specific settings. Example: {""property1"":""1234"",""property2"":{""subProperty"":""asdf""}}" -| -| -| - -|"customRuntimeOptions","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -| -| -| - -|"name","true","","Give your source a good name for later reference. The name must start with a lowercase alphabetic character. It can only contain lowercase alphanumeric characters, and hyphens (kebab-case)." -| -| -| - -|"namespace","true","","The namespace you'd like the source created under" -| -| -| - -|"parallelism","true","1","The number of a Pulsar Source instances to run" -| -| -| - -|"processingGuarantees","true","ATLEAST_ONCE","The delivery semantics applied to the Pulsar Sink. Values are 'ATLEAST_ONCE', 'ATMOST_ONCE', 'EFFECTIVELY_ONCE'" -| -| -| - -|"producerConfig","false","","The custom producer configuration (as a JSON string)" -| -| -| - -|"resources","false","","The compute resources that need to be allocated per source instance (applicable only to the process)(as a JSON string). Example: {""cpu"": 0.25,""disk"":1000000000,""ram"":500000000}" -| -| -| - -|"runtimeFlags","false","","A string that encodes options to customize the runtime, see Apache Pulsar docs for configured runtime for details" -| -| -| - -|"schemaType","false","","The schema type (either a builtin schema like 'avro', 'json', etc.. or custom Schema class name to be used to encode messages emitted from the Pulsar Source" -| -| -| - -|"secrets","false","","This is a map of secretName(that is how the secret is going to be accessed in the function via context) to an object that encapsulates how the secret is fetched by the underlying secrets provider. The type of an value here can be found by the SecretProviderConfigurator.getSecretObjectType() method" -| -| -| - -|"serdeClassName","false","","The SerDe classname for the Pulsar Source" -| -| -| - -|"tenant","true","","The tenant you'd like the source created under" -| -| -| - -|"topicName","true","","The name of an existing topic in Astra Streaming, where messages will be published to. Should be in the format of [non-]persistent:////" -| -| -| +|Field name |Required |Description + +|`archive` +|Yes +|The built-in {product} {pulsar-short} connector that you want to deploy. +Formatted as `builtin://**CONNECTOR**`, such as `builtin://debezium-mysql`. + +|`batchBuilder` +|No +|The batch construction method: `DEFAULT` or `KEY_BASED`. + +Default: `DEFAULT` + +|`batchSourceConfig` +|No +|The batch source configuration key-value as a JSON string. + +|`configs` +|No +|A JSON-formatted key-value map containing configuration properties specific to the connector type, such as provider-specific authentication and integration settings. +For available options, see <>. + +Default: `{}` (Empty map, uses defaults) + +|`customRuntimeOptions` +|No +|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. + +|`name` +|Yes +|The name for the connector. +It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. +{company} recommends memorable, human-readable names that summarize the connector's purpose. +For example: `debezium-mysql-source-prod-us-east-1`. + +|`namespace` +|Yes +|The namespace in your {pulsar-short} tenant where you want to create the connector. + +|`parallelism` +|Yes +|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. + +Default: `1` + +|`processingGuarantees` +|Yes +|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. + +Respect for the processing guarantee depends on the connector implementation. + +For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. + +Default: `ATLEAST_ONCE` + +|`producerConfig` +|No +a|A JSON string containing a https://pulsar.apache.org/docs/3.1.x/functions-cli/#producerconfig[custom producer configuration]. +By default, most values are `null` or empty. +For example: + +[source,json] +---- + "producerConfig": { + "maxPendingMessages": null, + "maxPendingMessagesAcrossPartitions": null, + "useThreadLocalProducers": false, + "cryptoConfig": null, + "batchBuilder": "" + }, +---- + +|`resources` +|No +|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. +For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. + +|`runtimeFlags` +|No +|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. +Only applicable to process and Kubernetes runtimes. + +|`schemaType` +|No +|The schema type used to encode messages emitted from a {pulsar-short} source. +Accepts either a built-in schema like `avro` or `json`, or a custom `Schema` class name. + +|`secrets` +|No +|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. +The `secretName` is used by the connector to reference the secret. +The mapped object contains the required parameters to fetch the secret from the secrets provider. + +To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. + +This is separate from the {pulsar-short} authentication token and security settings passed elsewhere in the connector configuration. + +|`serdeClassName` +|No +|The SerDe classname for the source. + +|`tenant` +|Yes +|The {pulsar-short} tenant where you want to create the connector. + +|`topicName` +|Yes +|An existing topic in {product} where messages are published. +Must be formatted as a full persistent or non-persistent topic name, such as `persistent://$TENANT/$NAMESPACE/$TOPIC`. + +|`typeClassName` +|Yes +|The class reference for the connector type. +Begins with `org.apache.pulsar`, such as `org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource`. |=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index 9b7e529..e038bfb 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -131,7 +131,7 @@ include::example$connectors/sources/{connectorType}/curl-update.sh[] "tenant": "string", "namespace": "string", "name": "string", - "className": "string", + "typeClassName": "string", "topicName": "string", "producerConfig": { "maxPendingMessages": 0, From f62ca1225f2f175201ab93f2be8771f3a3cc2708 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:25:22 -0800 Subject: [PATCH 08/31] resolve prerequisite partials --- .../connectors/sinks/astra-db/curl-create.sh | 2 +- .../connectors/sinks/astra-db/curl-update.sh | 2 +- .../connectors/sinks/bigquery/curl-update.sh | 2 +- .../sinks/cloud-storage/curl-update.sh | 2 +- .../sinks/elastic-search/curl-create.sh | 2 +- .../sinks/elastic-search/curl-update.sh | 2 +- .../sinks/jdbc-clickhouse/curl-create.sh | 2 +- .../sinks/jdbc-clickhouse/curl-update.sh | 2 +- .../sinks/jdbc-mariadb/curl-create.sh | 2 +- .../sinks/jdbc-mariadb/curl-update.sh | 2 +- .../sinks/jdbc-postgres/curl-create.sh | 2 +- .../sinks/jdbc-postgres/curl-update.sh | 2 +- .../sinks/jdbc-sqlite/curl-create.sh | 2 +- .../sinks/jdbc-sqlite/curl-update.sh | 2 +- .../connectors/sinks/kafka/curl-create.sh | 2 +- .../connectors/sinks/kafka/curl-update.sh | 2 +- .../connectors/sinks/kinesis/curl-create.sh | 2 +- .../connectors/sinks/kinesis/curl-update.sh | 2 +- .../connectors/sinks/snowflake/curl-create.sh | 2 +- .../connectors/sinks/snowflake/curl-update.sh | 2 +- .../sources/data-generator/curl-create.sh | 2 +- .../sources/data-generator/curl-update.sh | 2 +- .../sources/debezium-mongodb/curl-create.sh | 2 +- .../sources/debezium-mongodb/curl-update.sh | 2 +- .../sources/debezium-mysql/curl-create.sh | 2 +- .../sources/debezium-mysql/curl-update.sh | 2 +- .../sources/debezium-oracle/curl-create.sh | 2 +- .../sources/debezium-oracle/curl-update.sh | 2 +- .../sources/debezium-postgres/curl-create.sh | 2 +- .../sources/debezium-postgres/curl-update.sh | 2 +- .../sources/debezium-sqlserver/curl-create.sh | 2 +- .../sources/debezium-sqlserver/curl-update.sh | 2 +- .../connectors/sources/kafka/curl-create.sh | 2 +- .../connectors/sources/kafka/curl-update.sh | 2 +- .../connectors/sources/kinesis/curl-create.sh | 2 +- .../connectors/sources/kinesis/curl-update.sh | 2 +- modules/pulsar-io/pages/connectors/index.adoc | 85 +++++-------------- .../connectors/sinks/astra-config-params.adoc | 2 +- .../connectors/sinks/curl-tab-prereq.adoc | 22 ----- .../connectors/sinks/get-started.adoc | 4 - .../partials/connectors/sinks/manage.adoc | 34 ++------ .../partials/connectors/sinks/monitoring.adoc | 14 +-- .../sinks/pulsar-admin-tab-prereq.adoc | 3 - .../sources/astra-config-params.adoc | 2 +- .../connectors/sources/curl-tab-prereq.adoc | 23 ----- .../connectors/sources/get-started.adoc | 4 - .../partials/connectors/sources/manage.adoc | 38 ++------- .../connectors/sources/monitoring.adoc | 56 +----------- .../sources/pulsar-admin-tab-prereq.adoc | 3 - 49 files changed, 83 insertions(+), 279 deletions(-) delete mode 100644 modules/pulsar-io/partials/connectors/sinks/curl-tab-prereq.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/pulsar-admin-tab-prereq.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/curl-tab-prereq.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/pulsar-admin-tab-prereq.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh index f821a38..4f6d548 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh @@ -6,7 +6,7 @@ CREATE TABLE ks1.table1 (name text, PRIMARY KEY (name)); # create topic pulsar-topic-ks1-table1 curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -F 'sinkConfig="{ \"archive\":\"builtin:\/\/cassandra-enhanced\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh index b2dc646..daa1606 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh @@ -1,5 +1,5 @@ curl -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -F 'sinkConfig="{ \"archive\":\"builtin:\/\/cassandra-enhanced\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh index d77e0a6..878d00e 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/bigquery\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh index 5afcdf5..6817cc9 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/cloud-storage\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh index ad1b961..cba0554 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/elastic_search\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh index 6e0ae77..8c1538a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"tenant\":\"'$TENANT'\", \"namespace\":\"'$NAMESPACE'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh index 020c5fd..4025d35 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-clickhouse\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh index c5ad632..5a73e0a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-clickhouse\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh index 23c62ab..3881a49 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-mariadb\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh index aac24b4..0c210a5 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-mariadb\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh index 3d5104d..83e60a5 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-postgres\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh index eaee205..368da13 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-postgres\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh index 8e064a9..f0a2f39 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-sqlite\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh index 3e7bd39..a837661 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-sqlite\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh index 8a130ca..d03d909 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kafka\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh index a78e44a..ea7e5f0 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kafka\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh index 176c052..6ee72b5 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kinesis\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh index 9d39794..6448f4c 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kinesis\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh index a6f8681..891eae5 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh @@ -1,5 +1,5 @@ curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/snowflake\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh index 5b27b26..95c0374 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh @@ -1,5 +1,5 @@ curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/snowflake\", \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh index 5f6ed29..2d97942 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", "archive": "builtin://data-generator", diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh index db6dbaf..36336ba 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh @@ -2,7 +2,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", "configs": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh index 6aa452c..246afe6 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh index f8f4ae8..e33c422 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh index ac7c974..279c6cd 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh index 7726b6e..1f177a1 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh index 94f4e74..d9df0db 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh index 1ea16a0..7b9aa3b 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh index 4f108c4..a058172 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh index 4b7c582..224e296 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh index baf0332..42f44c4 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh index 1445590..8ecec77 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh index 206d60b..a499ed9 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh index eae68ef..e086fcf 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh index f9914ef..d016b0c 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh @@ -1,7 +1,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh index b8a0710..8e5ce92 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh @@ -1,7 +1,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" \ + -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index 4d6fcc3..cbce829 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -3,9 +3,6 @@ {product} offers fully-managed versions of https://pulsar.apache.org/docs/en/io-overview/[{pulsar-reg} connectors]. -You can use the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API to create, monitor, and manage sink and source connectors. -For configuration details, see the connector's documentation. - [IMPORTANT] ==== {product} doesn't support custom sink or source connectors. @@ -135,88 +132,52 @@ To get access to experimental connectors, contact {support-url}[{company} Suppor * XTDB * Zeebe -== List sink connectors -//Combine w/ CLI ref and API ref pages; replace below w/ links. -To list available sink connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. - -=== {pulsar-short} Admin CLI - -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - -[source,shell,subs="attributes+"] ----- -./bin/pulsar-admin sinks available-sinks ----- - -=== {pulsar-short} Admin API +== Create and manage connectors -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. +You can use the {astra-ui}, the `xref:developing:produce-consume-pulsar-client.adoc[pulsar-admin]` CLI, or the xref:apis:api-operations.adoc[{pulsar-short} Admin API] to create, monitor, and manage sink and source connectors. -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. +For configuration details, see the documentation for your preferred <> and <>. -. Click your tenant's name, and then click the *Settings* tab. +//Combine below sections w/ "use the Pulsar CLI" page (separate pulsar-client and pulsar-admin) and Admin API ref pages; then replace below w/ links to specific sections -. Click *Create Token*. +=== Get sink connectors -. Copy the token, store it securely, and then click *Close*. - -. Click the *Connect* tab, and then copy the *Web Service URL*. +To list available sink connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. -. Create environment variables for your tenant's token and web service URL: -+ +.{pulsar-short} Admin CLI [source,shell,subs="attributes+"] ---- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= +./bin/pulsar-admin sinks available-sinks ---- -. Use these values to form curl commands to the REST API: -+ +.{pulsar-short} Admin API [source,shell,subs="attributes+"] ---- -curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $ASTRA_STREAMING_TOKEN" +curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $PULSAR_TOKEN" ---- -== Listing Source Connectors -//Combine w/ CLI ref and API ref pages; replace below w/ links. -To list available source connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. +=== Get source connectors -=== {pulsar-short} Admin CLI - -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] +To list available source connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. +.{pulsar-short} Admin CLI [source,shell,subs="attributes+"] ---- ./bin/pulsar-admin sources available-sources ---- -=== {pulsar-short} Admin API - -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. - -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. +.{pulsar-short} Admin API +[source,shell,subs="attributes+"] +---- +curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $PULSAR_TOKEN" +---- -. Click your tenant's name, and then click the *Settings* tab. +=== Manage sink connectors -. Click *Create Token*. +=== Manage source connectors -. Copy the token, store it securely, and then click *Close*. +=== Monitor sink connectors -. Click the *Connect* tab, and then copy the *Web Service URL*. +=== Monitor source connectors -. Create environment variables for your tenant's token and web service URL: -+ -[source,shell,subs="attributes+"] ----- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= ----- - -. Use the token to authenticate requests: -+ -[source,shell,subs="attributes+"] ----- -curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $ASTRA_STREAMING_TOKEN" ----- \ No newline at end of file +== Connector metrics \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index aeff78e..343c4f5 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -4,7 +4,7 @@ A {pulsar-short} connectors and functions both use https://pulsar.apache.org/doc Therefore, some function configuration parameters are also used to configure connectors. Additionally, the following table uses the JSON field name for the parameters. -For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference]. +For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] and the specification for `https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[pulsar-admin sinks]`. ==== The following table uses the field name. diff --git a/modules/pulsar-io/partials/connectors/sinks/curl-tab-prereq.adoc b/modules/pulsar-io/partials/connectors/sinks/curl-tab-prereq.adoc deleted file mode 100644 index 6a95ce2..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/curl-tab-prereq.adoc +++ /dev/null @@ -1,22 +0,0 @@ -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. - -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. - -. Click your tenant's name, and then click the *Settings* tab. - -. Click *Create Token*. - -. Copy the token, store it securely, and then click *Close*. - -. Click the *Connect* tab, and then copy the *Web Service URL*. - -. Create environment variables for your tenant's token and web service URL: -+ -[source,shell,subs="attributes+"] ----- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= ----- -+ -Refer to the complete https://pulsar.apache.org/sink-rest-api/#tag/sink[{pulsar-short} sinks REST API spec] for all available options. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 721b52b..64177a3 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -12,8 +12,6 @@ export SINK_NAME={connectorName} === {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] @@ -21,8 +19,6 @@ include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] === {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/curl-create.sh[] diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index a7aace9..717ce7f 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -2,8 +2,6 @@ ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Start all instances of a connector @@ -17,25 +15,21 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Start all instances of a connector curl -sS --fail --location --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/start' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" # Start an individual instance of a connector curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/start" \ --H "Authorization: $ASTRA_STREAMING_TOKEN" +-H "Authorization: $PULSAR_TOKEN" ---- === Stop ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Stop all instances of a connector @@ -49,25 +43,21 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Stop all instances of a connector curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/stop' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" # Stop an individual instance of a connector curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/stop" \ - --H "Authorization: $ASTRA_STREAMING_TOKEN" + --H "Authorization: $PULSAR_TOKEN" ---- === Restart ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Restart all instances of a connector @@ -81,25 +71,21 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Restart all instances of a connector curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/restart' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" # Restart an individual instance of a connector curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/restart" \ --H "Authorization: $ASTRA_STREAMING_TOKEN" +-H "Authorization: $PULSAR_TOKEN" ---- === Update ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] @@ -107,8 +93,6 @@ include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/curl-update.sh[] @@ -122,8 +106,6 @@ include::example$connectors/sinks/{connectorType}/sample-data.adoc[] ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Delete all instances of a connector @@ -135,11 +117,9 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Delete all instances of a connector curl -sS --fail --location --request DELETE ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" ---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc index ab654b1..88bd461 100644 --- a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc @@ -2,8 +2,6 @@ ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Get information about a connector @@ -15,13 +13,11 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Get information about a connector curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" ---- .Result @@ -143,8 +139,6 @@ curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESP ==== {pulsar-short} Admin CLI -include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Check connector status @@ -157,18 +151,16 @@ include::partial$connectors/sinks/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sinks/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Get the status of all connector instances curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/status' \ - --header "Authorization: Bearer $ASTRA_STREAMING_TOKEN" + --header "Authorization: Bearer $PULSAR_TOKEN" # Get the status of an individual connector instance curl "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/status" \ -H "accept: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- Status response for all connector instances: diff --git a/modules/pulsar-io/partials/connectors/sinks/pulsar-admin-tab-prereq.adoc b/modules/pulsar-io/partials/connectors/sinks/pulsar-admin-tab-prereq.adoc deleted file mode 100644 index b211cea..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/pulsar-admin-tab-prereq.adoc +++ /dev/null @@ -1,3 +0,0 @@ -Refer to the complete https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[pulsar-admin sinks spec] for all available options. - -Assuming you have downloaded `client.conf` to the `{pulsar-short}` folder: \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc index b889587..a10530c 100644 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -4,7 +4,7 @@ A {pulsar-short} connectors and functions both use https://pulsar.apache.org/doc Therefore, some function configuration parameters are also used to configure connectors. Additionally, the following table uses the JSON field name for the parameters. -For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference]. +For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] and the specification for `https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[pulsar-admin sources]`. ==== [cols=3] diff --git a/modules/pulsar-io/partials/connectors/sources/curl-tab-prereq.adoc b/modules/pulsar-io/partials/connectors/sources/curl-tab-prereq.adoc deleted file mode 100644 index 66e59b5..0000000 --- a/modules/pulsar-io/partials/connectors/sources/curl-tab-prereq.adoc +++ /dev/null @@ -1,23 +0,0 @@ -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. - -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. - -. Click your tenant's name, and then click the *Settings* tab. - -. Click *Create Token*. - -. Copy the token, store it securely, and then click *Close*. - -. Click the *Connect* tab, and then copy the *Web Service URL*. - -. Create environment variables for your tenant's token and web service URL: -+ -[source,shell,subs="attributes+"] ----- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= ----- -+ -Refer to the complete https://pulsar.apache.org/source-rest-api/#tag/sources[{pulsar-short} sources REST API spec], -for all available options. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index df88c70..b252d4d 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -10,8 +10,6 @@ export SOURCE_NAME={connectorName} === {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] @@ -19,8 +17,6 @@ include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] === {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/curl-create.sh[] diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index e038bfb..03939a4 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -1,9 +1,7 @@ -=== Start +=== Start a source connector ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Start all instances of a connector @@ -17,14 +15,12 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - Start all instances of a connector: [source,shell] ---- curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- Start an individual instance of a connector: @@ -32,15 +28,13 @@ Start an individual instance of a connector: [source,shell] ---- curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/start" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- -=== Stop +=== Stop a source connector ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Stop all instances of a connector @@ -54,14 +48,12 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - Stop all instances of a connector: [source,shell] ---- curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- Stop an individual instance of a connector: @@ -69,15 +61,13 @@ Stop an individual instance of a connector: [source,shell] ---- curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/stop" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- === Restart ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- # Restart all instances of a connector @@ -91,25 +81,21 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - [source,shell] ---- # Restart all instances of a connector curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" # Restart an individual instance of a connector curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/restart" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- === Update ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] @@ -117,8 +103,6 @@ include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] ==== {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/curl-update.sh[] @@ -186,8 +170,6 @@ include::example$connectors/sources/{connectorType}/curl-update.sh[] ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Delete all instances of a connector @@ -199,11 +181,9 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -include::partial$connectors/sources/curl-tab-prereq.adoc[] - [source,shell] ---- # Delete all instances of a connector curl -sS --fail -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc index a8b5a6d..e3c7789 100644 --- a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc +++ b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc @@ -2,8 +2,6 @@ ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Get information about connector @@ -15,35 +13,12 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. - -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. - -. Click your tenant's name, and then click the *Settings* tab. - -. Click *Create Token*. - -. Copy the token, store it securely, and then click *Close*. - -. Click the *Connect* tab, and then copy the *Web Service URL*. - -. Create environment variables for your tenant's token and web service URL: -+ -[source,shell,subs="attributes+"] ----- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= ----- - -. Use these values to form curl commands to the REST API, for example: -+ [source,shell,subs="attributes+"] ---- # Get a connector's information curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- ==== Sample Config Data @@ -54,8 +29,6 @@ include::example$connectors/sources/{connectorType}/sample-data.adoc[] ==== {pulsar-short} Admin CLI -include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] - [source,shell] ---- # Check connector status @@ -68,40 +41,17 @@ include::partial$connectors/sources/pulsar-admin-tab-prereq.adoc[] ==== {pulsar-short} Admin API -You need a {pulsar-short} token for REST API authentication. -This is different from your {astra-db} application tokens. - -. In the {astra-ui-link} header, click icon:grip[name="Applications"], and then select *Streaming*. - -. Click your tenant's name, and then click the *Settings* tab. - -. Click *Create Token*. - -. Copy the token, store it securely, and then click *Close*. - -. Click the *Connect* tab, and then copy the *Web Service URL*. - -. Create environment variables for your tenant's token and web service URL: -+ -[source,shell,subs="attributes+"] ----- -export WEB_SERVICE_URL= -export ASTRA_STREAMING_TOKEN= ----- - -. Use these values to form curl commands to the REST API, for example: -+ [source,shell,subs="attributes+"] ---- # Get the status of all connector instances curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ -H "accept: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" # Get the status of an individual connector instance curl "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/status" \ -H "accept: application/json" \ - -H "Authorization: $ASTRA_STREAMING_TOKEN" + -H "Authorization: $PULSAR_TOKEN" ---- Status response for all connector instances: diff --git a/modules/pulsar-io/partials/connectors/sources/pulsar-admin-tab-prereq.adoc b/modules/pulsar-io/partials/connectors/sources/pulsar-admin-tab-prereq.adoc deleted file mode 100644 index 9687e7c..0000000 --- a/modules/pulsar-io/partials/connectors/sources/pulsar-admin-tab-prereq.adoc +++ /dev/null @@ -1,3 +0,0 @@ -Refer to the complete https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[pulsar-admin sources spec] for all available options. - -Assuming you have downloaded `client.conf` to the `{pulsar-short}` folder: \ No newline at end of file From 4f4168b4c89df740193b59cb6a6f3b52c224f250 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 17:28:48 -0800 Subject: [PATCH 09/31] pare down manage and monitoring partials --- .../connectors/sinks/bigquery/curl-create.sh | 2 +- .../connectors/sinks/bigquery/curl-update.sh | 2 +- .../sinks/cloud-storage/curl-create.sh | 2 +- .../sinks/cloud-storage/curl-update.sh | 2 +- .../sinks/elastic-search/curl-create.sh | 2 +- .../sinks/elastic-search/curl-update.sh | 2 +- .../sinks/jdbc-clickhouse/curl-create.sh | 2 +- .../sinks/jdbc-clickhouse/curl-update.sh | 2 +- .../sinks/jdbc-mariadb/curl-create.sh | 2 +- .../sinks/jdbc-mariadb/curl-update.sh | 2 +- .../sinks/jdbc-mariadb/pulsar-admin-update.sh | 2 +- .../sinks/jdbc-postgres/curl-create.sh | 2 +- .../sinks/jdbc-postgres/curl-update.sh | 2 +- .../sinks/jdbc-sqlite/curl-create.sh | 2 +- .../sinks/jdbc-sqlite/curl-update.sh | 2 +- .../connectors/sinks/kafka/curl-create.sh | 2 +- .../connectors/sinks/kafka/curl-update.sh | 2 +- .../connectors/sinks/kinesis/curl-create.sh | 2 +- .../connectors/sinks/kinesis/curl-update.sh | 2 +- .../connectors/sinks/snowflake/curl-create.sh | 2 +- .../connectors/sinks/snowflake/curl-update.sh | 2 +- modules/pulsar-io/pages/connectors/index.adoc | 464 +++++++++++++++++- .../pages/connectors/sinks/astra-db.adoc | 8 +- .../pages/connectors/sinks/cloud-storage.adoc | 12 +- .../connectors/sinks/elastic-search.adoc | 8 +- .../connectors/sinks/google-bigquery.adoc | 8 +- .../connectors/sinks/jdbc-clickhouse.adoc | 8 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 8 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 8 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 8 +- .../pages/connectors/sinks/kafka.adoc | 8 +- .../pages/connectors/sinks/kinesis.adoc | 8 +- .../pages/connectors/sinks/snowflake.adoc | 8 +- .../connectors/sources/data-generator.adoc | 8 +- .../connectors/sources/debezium-mongodb.adoc | 8 +- .../connectors/sources/debezium-mysql.adoc | 8 +- .../connectors/sources/debezium-oracle.adoc | 8 +- .../connectors/sources/debezium-postgres.adoc | 8 +- .../sources/debezium-sqlserver.adoc | 28 +- .../pages/connectors/sources/kafka.adoc | 8 +- .../pages/connectors/sources/kinesis.adoc | 8 +- .../connectors/sinks/get-started.adoc | 2 +- .../partials/connectors/sinks/manage.adoc | 125 +---- .../partials/connectors/sinks/monitoring.adoc | 237 --------- .../connectors/sources/get-started.adoc | 2 +- .../partials/connectors/sources/manage.adoc | 185 +------ .../connectors/sources/monitoring.adoc | 128 ----- 47 files changed, 542 insertions(+), 819 deletions(-) delete mode 100644 modules/pulsar-io/partials/connectors/sinks/monitoring.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/monitoring.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh index 5454ad0..c8b123c 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/bigquery\", diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh index 878d00e..bacd32c 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/bigquery\", diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh index de8f4ab..a745f77 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/cloud-storage\", diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh index 6817cc9..37b8f27 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/cloud-storage\", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh index cba0554..f05190d 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/elastic_search\", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh index 8c1538a..726936e 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"tenant\":\"'$TENANT'\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh index 4025d35..d8fc544 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-clickhouse\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh index 5a73e0a..f110269 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-clickhouse\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh index 3881a49..78e0cb6 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-mariadb\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh index 0c210a5..f296b95 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-mariadb\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh index 905664e..1e0ba62 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh @@ -4,4 +4,4 @@ --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ - --sink-config '' + --sink-config "" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh index 83e60a5..c621665 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-postgres\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh index 368da13..f9c1d2d 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-postgres\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh index f0a2f39..6e5bdd4 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-sqlite\", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh index a837661..b2fb314 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/jdbc-sqlite\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh index d03d909..00792c0 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kafka\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh index ea7e5f0..22783a6 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kafka\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh index 6ee72b5..da776b1 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kinesis\", diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh index 6448f4c..d432d4c 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/kinesis\", diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh index 891eae5..ca79391 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/snowflake\", diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh index 95c0374..7086134 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh @@ -1,4 +1,4 @@ -curl -sS --fail --request PUT ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'?opt=poweruser' \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form 'sinkConfig="{ \"archive\":\"builtin:\/\/snowflake\", diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index cbce829..b497cc2 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -136,13 +136,11 @@ To get access to experimental connectors, contact {support-url}[{company} Suppor You can use the {astra-ui}, the `xref:developing:produce-consume-pulsar-client.adoc[pulsar-admin]` CLI, or the xref:apis:api-operations.adoc[{pulsar-short} Admin API] to create, monitor, and manage sink and source connectors. -For configuration details, see the documentation for your preferred <> and <>. - //Combine below sections w/ "use the Pulsar CLI" page (separate pulsar-client and pulsar-admin) and Admin API ref pages; then replace below w/ links to specific sections -=== Get sink connectors +=== Get available sink connectors -To list available sink connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. +Get a list of sink connectors that are available in your {product} {pulsar-short} tenant: .{pulsar-short} Admin CLI [source,shell,subs="attributes+"] @@ -156,9 +154,9 @@ To list available sink connectors in your {product} {pulsar-short} tenant, you c curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $PULSAR_TOKEN" ---- -=== Get source connectors +=== Get available source connectors -To list available source connectors in your {product} {pulsar-short} tenant, you can use the {pulsar-short} Admin CLI or API. +Get a list of source connectors that are available in your {product} {pulsar-short} tenant: .{pulsar-short} Admin CLI [source,shell,subs="attributes+"] @@ -172,12 +170,456 @@ To list available source connectors in your {product} {pulsar-short} tenant, you curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $PULSAR_TOKEN" ---- -=== Manage sink connectors +=== Create or update a connector + +Although you use the same base commands to create and update all {product} {pulsar-short} connectors, each connector has different configuration options. +For example commands and configuration details, see the documentation for your preferred <> and <>. + +[#get-sink-connector-configuration-data] +=== Get sink connector configuration data + +Get the configuration for an existing sink connector: + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Get information about a connector +./bin/pulsar-admin sinks get \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Get information about a connector +curl -sS --fail --location "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" +---- + +[#get-source-connector-configuration-data] +=== Get source connector configuration data + +Get the configuration for an existing source connector: + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Get information about connector +./bin/pulsar-admin sources get \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Get a connector's information +curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + -H "accept: application/json" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +[#start-a-sink-connector] +=== Start a sink connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Start all instances of a connector +./bin/pulsar-admin sinks start \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only start an individual instance +---- -=== Manage source connectors +.{pulsar-short} Admin API +[source,shell,subs="attributes+"] +---- +# Start all instances of a connector +curl -sS --fail --location --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/start" \ + --header "Authorization: Bearer $PULSAR_TOKEN" -=== Monitor sink connectors +# Start an individual instance of a connector +curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/start" \ +-H "Authorization: $PULSAR_TOKEN" +---- + +[#start-a-source-connector] +=== Start a source connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Start all instances of a connector +./bin/pulsar-admin sources start \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only start an individual instance +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Start all instances of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ + -H "Authorization: $PULSAR_TOKEN" + +# Start an individual instance of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/start" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +[#stop-a-sink-connector] +=== Stop a sink connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Stop all instances of a connector +./bin/pulsar-admin sinks stop \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only stop an individual instance +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Stop all instances of a connector +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/stop" \ + --header "Authorization: Bearer $PULSAR_TOKEN" + +# Stop an individual instance of a connector +curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/stop" \ + --H "Authorization: $PULSAR_TOKEN" +---- + +[#stop-a-source-connector] +=== Stop a source connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Stop all instances of a connector +./bin/pulsar-admin sources stop \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only stop an individual instance +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Stop all instances of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ + -H "Authorization: $PULSAR_TOKEN" + +# Stop an individual instance of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/stop" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +[#restart-a-sink-connector] +=== Restart a sink connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Restart all instances of a connector +./bin/pulsar-admin sinks restart \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only restart an individual instance +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Restart all instances of a connector +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/restart" \ + --header "Authorization: Bearer $PULSAR_TOKEN" + +# Restart an individual instance of a connector +curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/restart" \ +-H "Authorization: $PULSAR_TOKEN" +---- + +[#restart-a-source-connector] +=== Restart a source connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Restart all instances of a connector +./bin/pulsar-admin sources restart \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" + +# optionally add --instance-id to only restart an individual instance +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Restart all instances of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ + -H "Authorization: $PULSAR_TOKEN" + +# Restart an individual instance of a connector +curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/restart" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +[#get-sink-connector-status] +=== Get sink connector status + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Check connector status +./bin/pulsar-admin sinks status \ + --instance-id "$SINK_INSTANCE_ID" \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Get the status of all connector instances +curl -sS --fail --location "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/status" \ + --header "Authorization: Bearer $PULSAR_TOKEN" + +# Get the status of an individual connector instance +curl "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/status" \ + -H "accept: application/json" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +Status response for all connector instances: + +.Result +[source,json] +---- +{ + "numInstances": 0, + "numRunning": 0, + "instances": [ + { + "instanceId": 0, + "status": { + "running": true, + "error": "string", + "numRestarts": 0, + "numReadFromPulsar": 0, + "numSystemExceptions": 0, + "latestSystemExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numSinkExceptions": 0, + "latestSinkExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numWrittenToSink": 0, + "lastReceivedTime": 0, + "workerId": "string" + } + } + ] +} +---- + +Status response for individual connector instance: + +.Result +[source,json] +---- +{ + "running": true, + "error": "string", + "numRestarts": 0, + "numReadFromPulsar": 0, + "numSystemExceptions": 0, + "latestSystemExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numSinkExceptions": 0, + "latestSinkExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numWrittenToSink": 0, + "lastReceivedTime": 0, + "workerId": "string" +} +---- + +[#get-source-connector-status] +=== Get source connector status + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Check connector status +./bin/pulsar-admin sources status \ + --instance-id "$SOURCE_INSTANCE_ID" \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Get the status of all connector instances +curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ + -H "accept: application/json" \ + -H "Authorization: $PULSAR_TOKEN" + +# Get the status of an individual connector instance +curl "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/status" \ + -H "accept: application/json" \ + -H "Authorization: $PULSAR_TOKEN" +---- + +Status response for all connector instances: + +.Result +[source,json] +---- +{ + "numInstances": 0, + "numRunning": 0, + "instances": [ + { + "instanceId": 0, + "status": { + "running": true, + "error": "string", + "numRestarts": 0, + "numReceivedFromSource": 0, + "numSystemExceptions": 0, + "latestSystemExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numSourceExceptions": 0, + "latestSourceExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numWritten": 0, + "lastReceivedTime": 0, + "workerId": "string" + } + } + ] +} +---- + +Status response for individual connector instance: + +.Result +[source,json] +---- +{ + "running": true, + "error": "string", + "numRestarts": 0, + "numReceivedFromSource": 0, + "numSystemExceptions": 0, + "latestSystemExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numSourceExceptions": 0, + "latestSourceExceptions": [ + { + "exceptionString": "string", + "timestampMs": 0 + } + ], + "numWritten": 0, + "lastReceivedTime": 0, + "workerId": "string" +} +---- + +[#delete-a-sink-connector] +=== Delete a sink connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Delete all instances of a connector +./bin/pulsar-admin sinks delete \ + --namespace "$NAMESPACE" \ + --name "$SINK_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Delete all instances of a connector +curl -sS --fail --location --request DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" +---- + +[#delete-a-source-connector] +=== Delete a source connector + +.{pulsar-short} Admin CLI +[source,shell] +---- +# Delete all instances of a connector +./bin/pulsar-admin sources delete \ + --namespace "$NAMESPACE" \ + --name "$SOURCE_NAME" \ + --tenant "$TENANT" +---- + +.{pulsar-short} Admin API +[source,shell] +---- +# Delete all instances of a connector +curl -sS --fail -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + -H "Authorization: $PULSAR_TOKEN" +---- -=== Monitor source connectors +== Connector metrics -== Connector metrics \ No newline at end of file +{product} exposes Prometheus-formatted metrics for every connector. +For more information, see xref:operations:astream-scrape-metrics.adoc[]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 662c689..9985c40 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -15,18 +15,12 @@ A {pulsar-short} token is required for all configuration methods. This reference assumes you are connecting to a {cass-short} table using the {pulsar-short} Admin API or CLI. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 0743cbc..73ad269 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -12,10 +12,12 @@ The cloud storage system supported are: * https://azure.microsoft.com/en-us/products/storage/blobs[Azure Blob Store (Azure)] * https://aws.amazon.com/s3/[Amazon Web Services S3 (AWS)] -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] +include::partial$connectors/sinks/manage.adoc[] + == Data format types The Cloud Storage sink connector provides multiple output format options, including JSON (default), Avro, Bytes, or Parquet. @@ -133,14 +135,6 @@ If a message fails to send to a Cloud Storage sink, the connector can send the m To use a dead-letter topic, set `skipFailedMessages` to `false` in the cloud provider config. Then, using either `pulsar-admin` or curl, set `--max-redeliver-count` and `--dead-letter-topic`. -== Managing the Connector - -include::partial$connectors/sinks/manage.adoc[] - -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Astra Streaming parameters for the Cloud Storage sink include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index a110ce8..4e3e854 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -14,18 +14,12 @@ To understand compatibility between OpenSearch and Elasticsearch, see https://op For information about the OSS {pulsar} Elasticsearch sink connector, see the https://pulsar.apache.org/docs/io-elasticsearch-sink/[{pulsar-short} documentation]. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Astra Streaming parameters for the Elasticsearch sink include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 05cea5f..99acdc7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -10,18 +10,12 @@ BigQuery {pulsar-short} Sink is not integrated with BigQuery directly. It uses { You will notice references to Kafka throughout the configuration. *You don't need a running instance of Kafka to use this connector.* The Kafka references are used as "translation points" by this connector. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference The BigQuery sink has three sets of parameters. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index cc7199f..2cbf82b 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -9,18 +9,12 @@ real-time. {product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index f51e884..ecc763f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -10,18 +10,12 @@ Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/doc {product} currently supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index f67277a..ebd03bf 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -11,18 +11,12 @@ The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (T {product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 359d1f7..2a7927c 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -14,18 +14,12 @@ SQLite JDBC is a library for accessing and creating SQLite database files in Jav {product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 7a1b48b..f991839 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -9,18 +9,12 @@ Apache Kafka(R) is an open-source distributed event streaming platform used by t {product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with Kafka. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 9b625d4..4bb2780 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -12,18 +12,12 @@ The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers {product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index e12ff1f..581b634 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -8,18 +8,12 @@ A Snowflake database is where an organization's uploaded structured and semi-str Snowflake automatically manages all parts of the data storage process, including organization, structure, metadata, file size, compression, and statistics. -== Get Started +== Create the connector include::partial$connectors/sinks/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sinks/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sinks/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support sink connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 47b3b67..54ee797 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -14,18 +14,12 @@ The connector will produce data indefinitely while it is running. For a reference of the full "Person" class, https://github.com/apache/pulsar/blob/branch-{pulsar-version}/pulsar-io/data-generator/src/main/java/org/apache/pulsar/io/datagenerator/Person.java[view the source]. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index a41e9ba..89113a0 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -10,18 +10,12 @@ The connector automatically handles the addition or removal of shards in a shard {product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported MongoDB versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index d641f26..249148b 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -8,18 +8,12 @@ The Debezium MySQL connector reads the binlog, produces change events for row-le {product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index ec26aa1..7b66e7a 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -9,18 +9,12 @@ The connector can be configured to emit change events for specific subsets of sc {product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 2e7b920..3e84614 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -9,18 +9,12 @@ The PostgreSQL connector produces a change event for every row-level insert, upd {product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported PostgreSQL versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 0103451..3e6ab83 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -11,26 +11,29 @@ The SQL Server capture process monitors designated databases and tables and stor {product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported SQL Server versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. -== Get Started +== Create the connector To create a Debezium SQL Server source connector, do the following. Your deployment's values may differ. . Create an Azure SQL Server or compatible SQL Server instance with a database and table you want to capture changes from. -. Choose a connector name. -. For Debezium SQL Server source connectors, you must manually create the required topics in your Pulsar namespace, following Debezium's topic naming conventions: - * `**CONNECTOR_NAME**-debezium-history-topic` - * `**CONNECTOR_NAME**-debezium-offset-topic` - * `**SERVER_NAME**` - * `**SERVER_NAME**.**DB_NAME**.**TABLE_NAME**` +. Choose a connector name. +. For Debezium SQL Server source connectors, you must manually create the required topics in your Pulsar namespace, following Debezium's topic naming conventions: ++ +* `**CONNECTOR_NAME**-debezium-history-topic` +* `**CONNECTOR_NAME**-debezium-offset-topic` +* `**SERVER_NAME**` +* `**SERVER_NAME**.**DB_NAME**.**TABLE_NAME**` ++ You must create these topics manually. -Autocreation is not available. +{product} cannot create them automatically. . In the source connector configuration, set the `topic.prefix` configuration value to match `database.server.name`. -In the example configuration, both are set to `kalash-server-stream672`. +In the following example configuration, both are set to `kalash-server-stream672`. + . In the source connector configuration, ensure `task.id` is passed as a string (`"0"`), not an integer (`0`); otherwise, the connector will throw a `NullPointerException`. . Set your consumers to subscribe to the `events` topic in your Pulsar namespace to receive change data capture (CDC) events. @@ -38,17 +41,10 @@ This topic contains the change data capture (CDC) events emitted by Debezium for For more on Debezium topic naming conventions, see the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium documentation]. - include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 12ce448..9d9863c 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -8,18 +8,12 @@ The Kafka source connector pulls data from a Kafka topic and persists the data i For more, see https://pulsar.apache.org/docs/io-kafka-source[{pulsar}'s Kafka source documentation]. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index a972100..3e30c80 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -8,18 +8,12 @@ The Kinesis source connector pulls data from Amazon Kinesis and persists data in For more, see https://pulsar.apache.org/docs/io-kinesis-source[{pulsar}'s Kinesis source documentation]. -== Get Started +== Create the connector include::partial$connectors/sources/get-started.adoc[] -== Managing the Connector - include::partial$connectors/sources/manage.adoc[] -== Monitoring the Connector - -include::partial$connectors/sources/monitoring.adoc[] - == Connector Reference There are two sets of parameters that support source connectors. diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 64177a3..8c36e52 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -24,6 +24,6 @@ include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] include::example$connectors/sinks/{connectorType}/curl-create.sh[] ---- -=== Sample Config Data +=== Example configuration data structure include::example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index 717ce7f..cfdbaca 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -1,125 +1,36 @@ -=== Start +== Start or stop the connector -==== {pulsar-short} Admin CLI +See the following: -[source,shell,subs="attributes+"] ----- -# Start all instances of a connector -./bin/pulsar-admin sinks start \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only start an individual instance ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Start all instances of a connector -curl -sS --fail --location --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/start' \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Start an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/start" \ --H "Authorization: $PULSAR_TOKEN" ----- - -=== Stop +* xref:pulsar-io:connectors/index.adoc#start-a-sink-connector[Start a sink connector] +* xref:pulsar-io:connectors/index.adoc#stop-a-sink-connector[Stop a sink connector] +* xref:pulsar-io:connectors/index.adoc#restart-a-sink-connector[Restart a sink connector] -==== {pulsar-short} Admin CLI +== Check connector status -[source,shell,subs="attributes+"] ----- -# Stop all instances of a connector -./bin/pulsar-admin sinks stop \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" +See xref:pulsar-io:connectors/index.adoc#get-sink-connector-status[Get sink connector status]. -# optionally add --instance-id to only stop an individual instance ----- +== Edit the connector -==== {pulsar-short} Admin API +To update a connector, pass the new configuration definition to the connector. +You can include the entire configuration or only the parameters that you want to change. -[source,shell,subs="attributes+"] ----- -# Stop all instances of a connector -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/stop' \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Stop an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/stop" \ - --H "Authorization: $PULSAR_TOKEN" ----- +With the {pulsar-short} Admin CLI, you can use `sink-config`, or use specific command line arguments to modify individual configuration parameters. -=== Restart +To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. -==== {pulsar-short} Admin CLI - -[source,shell,subs="attributes+"] ----- -# Restart all instances of a connector -./bin/pulsar-admin sinks restart \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only restart an individual instance ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Restart all instances of a connector -curl -sS --fail --request POST ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/restart' \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Restart an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/restart" \ --H "Authorization: $PULSAR_TOKEN" ----- - -=== Update - -==== {pulsar-short} Admin CLI - -[source,shell,subs="attributes+"] +.{pulsar-short} Admin CLI +[source,shell,subs="+attributes"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] ---- -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] +.{pulsar-short} Admin API +[source,shell,subs="+attributes"] ---- include::example$connectors/sinks/{connectorType}/curl-update.sh[] ---- -==== Sample Config Data +== Delete the connector -include::example$connectors/sinks/{connectorType}/sample-data.adoc[] - -=== Delete - -==== {pulsar-short} Admin CLI - -[source,shell] ----- -# Delete all instances of a connector -./bin/pulsar-admin sinks delete \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Delete all instances of a connector -curl -sS --fail --location --request DELETE ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- \ No newline at end of file +See xref:pulsar-io:connectors/index.adoc#delete-a-sink-connector[Delete a sink connector]. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc b/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc deleted file mode 100644 index 88bd461..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/monitoring.adoc +++ /dev/null @@ -1,237 +0,0 @@ -=== Info - -==== {pulsar-short} Admin CLI - -[source,shell,subs="attributes+"] ----- -# Get information about a connector -./bin/pulsar-admin sinks get \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Get information about a connector -curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'' \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -.Result -[source,json] ----- -{ - "tenant": "string", - "namespace": "string", - "name": "string", - "className": "string", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "string" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicsPattern": "string", - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} - }, - "parallelism": 0, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, - "retainKeyOrdering": true, - "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 - }, - "autoAck": true, - "timeoutMs": 0, - "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- - -=== Health - -==== {pulsar-short} Admin CLI - -[source,shell,subs="attributes+"] ----- -# Check connector status -./bin/pulsar-admin sinks status \ - --instance-id "$SINK_INSTANCEID" \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Get the status of all connector instances -curl -sS --fail --location ''$WEB_SERVICE_URL'/admin/v3/sinks/'$TENANT'/'$NAMESPACE'/'$SINK_NAME'/status' \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Get the status of an individual connector instance -curl "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCEID/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -Status response for all connector instances: - -.Result -[source,json] ----- -{ - "numInstances": 0, - "numRunning": 0, - "instances": [ - { - "instanceId": 0, - "status": { - "running": true, - "error": "string", - "numRestarts": 0, - "numReadFromPulsar": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSinkExceptions": 0, - "latestSinkExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWrittenToSink": 0, - "lastReceivedTime": 0, - "workerId": "string" - } - } - ] -} ----- - -Status response for individual connector instance: - -.Result -[source,json] ----- -{ - "running": true, - "error": "string", - "numRestarts": 0, - "numReadFromPulsar": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSinkExceptions": 0, - "latestSinkExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWrittenToSink": 0, - "lastReceivedTime": 0, - "workerId": "string" -} ----- - -=== Metrics - -{product} exposes Prometheus formatted metrics for every connector. Refer to the xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index b252d4d..a63002f 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -22,6 +22,6 @@ include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] include::example$connectors/sources/{connectorType}/curl-create.sh[] ---- -=== Sample Config Data +=== Example configuration data structure include::example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index 03939a4..fba86bc 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -1,189 +1,36 @@ -=== Start a source connector +== Start or stop the connector -==== {pulsar-short} Admin CLI +See the following: -[source,shell] ----- -# Start all instances of a connector -./bin/pulsar-admin sources start \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only start an individual instance ----- - -==== {pulsar-short} Admin API - -Start all instances of a connector: - -[source,shell] ----- -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -Start an individual instance of a connector: +* xref:pulsar-io:connectors/index.adoc#start-a-source-connector[Start a source connector] +* xref:pulsar-io:connectors/index.adoc#stop-a-source-connector[Stop a source connector] +* xref:pulsar-io:connectors/index.adoc#restart-a-source-connector[Restart a source connector] -[source,shell] ----- -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/start" \ - -H "Authorization: $PULSAR_TOKEN" ----- +== Check connector status -=== Stop a source connector +See xref:pulsar-io:connectors/index.adoc#get-source-connector-status[Get source connector status]. -==== {pulsar-short} Admin CLI +== Edit the connector -[source,shell] ----- -# Stop all instances of a connector -./bin/pulsar-admin sources stop \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only stop an individual instance ----- - -==== {pulsar-short} Admin API - -Stop all instances of a connector: - -[source,shell] ----- -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -Stop an individual instance of a connector: - -[source,shell] ----- -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/stop" \ - -H "Authorization: $PULSAR_TOKEN" ----- +To update a connector, pass the new configuration definition to the connector. +You can include the entire configuration or only the parameters that you want to change. -=== Restart +With the {pulsar-short} Admin CLI, you can use `source-config`, or use specific command line arguments to modify individual configuration parameters. -==== {pulsar-short} Admin CLI - -[source,shell,subs="attributes+"] ----- -# Restart all instances of a connector -./bin/pulsar-admin sources restart \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only restart an individual instance ----- - -==== {pulsar-short} Admin API - -[source,shell] ----- -# Restart all instances of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ - -H "Authorization: $PULSAR_TOKEN" - -# Restart an individual instance of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/restart" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -=== Update - -==== {pulsar-short} Admin CLI +To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. +.{pulsar-short} Admin CLI [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] ---- -==== {pulsar-short} Admin API - +.{pulsar-short} Admin API [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/curl-update.sh[] ---- -.Result -[source,json] ----- - { - "tenant": "string", - "namespace": "string", - "name": "string", - "typeClassName": "string", - "topicName": "string", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} - }, - "parallelism": 0, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 - }, - "archive": "string", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- - -=== Delete - -==== {pulsar-short} Admin CLI +== Delete the connector -[source,shell] ----- -# Delete all instances of a connector -./bin/pulsar-admin sources delete \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell] ----- -# Delete all instances of a connector -curl -sS --fail -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "Authorization: $PULSAR_TOKEN" ----- \ No newline at end of file +See xref:pulsar-io:connectors/index.adoc#delete-a-source-connector[Delete a source connector]. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc b/modules/pulsar-io/partials/connectors/sources/monitoring.adoc deleted file mode 100644 index e3c7789..0000000 --- a/modules/pulsar-io/partials/connectors/sources/monitoring.adoc +++ /dev/null @@ -1,128 +0,0 @@ -=== Info - -==== {pulsar-short} Admin CLI - -[source,shell] ----- -# Get information about connector -./bin/pulsar-admin sources get \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Get a connector's information -curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -==== Sample Config Data - -include::example$connectors/sources/{connectorType}/sample-data.adoc[] - -=== Health - -==== {pulsar-short} Admin CLI - -[source,shell] ----- -# Check connector status -./bin/pulsar-admin sources status \ - --instance-id "$SOURCE_INSTANCEID" \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -==== {pulsar-short} Admin API - -[source,shell,subs="attributes+"] ----- -# Get the status of all connector instances -curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" - -# Get the status of an individual connector instance -curl "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCEID/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" ----- - -Status response for all connector instances: - -.Result -[source,json] ----- -{ - "numInstances": 0, - "numRunning": 0, - "instances": [ - { - "instanceId": 0, - "status": { - "running": true, - "error": "string", - "numRestarts": 0, - "numReceivedFromSource": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSourceExceptions": 0, - "latestSourceExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWritten": 0, - "lastReceivedTime": 0, - "workerId": "string" - } - } - ] -} ----- - -Status response for individual connector instance: - -.Result -[source,json] ----- -{ - "running": true, - "error": "string", - "numRestarts": 0, - "numReceivedFromSource": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSourceExceptions": 0, - "latestSourceExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWritten": 0, - "lastReceivedTime": 0, - "workerId": "string" -} ----- - -=== Metrics - -{product} exposes Prometheus formatted metrics for every connector. Refer to xref:astra-streaming:operations:astream-scrape-metrics.adoc[scrape metrics with Prometheus] page for more detail. \ No newline at end of file From 19d596b615f2eb447d2c47a677cc9328895920b4 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:00:57 -0800 Subject: [PATCH 10/31] cleaning various partials --- .../connectors/sinks/astra-db/curl-create.sh | 20 +--- .../connectors/sinks/astra-db/curl-update.sh | 13 +- .../sinks/astra-db/pulsar-admin-create.sh | 95 +++++++-------- .../sinks/astra-db/pulsar-admin-update.sh | 68 +---------- .../sinks/astra-db/sample-data.adoc | 113 +++++++++++------- .../connectors/sinks/bigquery/curl-create.sh | 27 +---- .../connectors/sinks/bigquery/curl-update.sh | 11 +- .../sinks/bigquery/pulsar-admin-create.sh | 18 +-- .../sinks/bigquery/pulsar-admin-update.sh | 2 +- .../sinks/bigquery/sample-data.adoc | 31 +++-- .../sinks/cloud-storage/curl-create.sh | 12 +- .../sinks/cloud-storage/curl-update.sh | 11 +- .../cloud-storage/pulsar-admin-create.sh | 4 +- .../cloud-storage/pulsar-admin-update.sh | 2 +- .../sinks/cloud-storage/sample-data.adoc | 10 +- .../sinks/elastic-search/curl-create.sh | 17 +-- .../sinks/elastic-search/curl-update.sh | 9 +- .../elastic-search/pulsar-admin-create.sh | 9 +- .../elastic-search/pulsar-admin-update.sh | 2 +- .../sinks/elastic-search/sample-data.adoc | 52 ++------ .../sinks/jdbc-clickhouse/curl-create.sh | 18 +-- .../sinks/jdbc-clickhouse/curl-update.sh | 11 +- .../jdbc-clickhouse/pulsar-admin-create.sh | 9 +- .../jdbc-clickhouse/pulsar-admin-update.sh | 2 +- .../sinks/jdbc-clickhouse/sample-data.adoc | 54 ++------- .../sinks/jdbc-mariadb/curl-create.sh | 18 +-- .../sinks/jdbc-mariadb/curl-update.sh | 11 +- .../sinks/jdbc-mariadb/pulsar-admin-create.sh | 9 +- .../sinks/jdbc-mariadb/pulsar-admin-update.sh | 4 +- .../sinks/jdbc-mariadb/sample-data.adoc | 54 ++------- .../sinks/jdbc-postgres/curl-create.sh | 18 +-- .../sinks/jdbc-postgres/curl-update.sh | 12 +- .../jdbc-postgres/pulsar-admin-create.sh | 9 +- .../jdbc-postgres/pulsar-admin-update.sh | 2 +- .../sinks/jdbc-postgres/sample-data.adoc | 54 ++------- .../sinks/jdbc-sqlite/curl-create.sh | 16 +-- .../sinks/jdbc-sqlite/curl-update.sh | 11 +- .../sinks/jdbc-sqlite/pulsar-admin-create.sh | 7 +- .../sinks/jdbc-sqlite/pulsar-admin-update.sh | 2 +- .../sinks/jdbc-sqlite/sample-data.adoc | 52 ++------ .../connectors/sinks/kafka/curl-create.sh | 26 +--- .../connectors/sinks/kafka/curl-update.sh | 11 +- .../sinks/kafka/pulsar-admin-create.sh | 19 +-- .../sinks/kafka/pulsar-admin-update.sh | 2 +- .../connectors/sinks/kafka/sample-data.adoc | 64 ++++------ .../connectors/sinks/kinesis/curl-create.sh | 19 +-- .../connectors/sinks/kinesis/curl-update.sh | 11 +- .../sinks/kinesis/pulsar-admin-create.sh | 11 +- .../sinks/kinesis/pulsar-admin-update.sh | 4 +- .../connectors/sinks/kinesis/sample-data.adoc | 56 +++------ .../connectors/sinks/snowflake/curl-create.sh | 32 +---- .../connectors/sinks/snowflake/curl-update.sh | 11 +- .../sinks/snowflake/pulsar-admin-create.sh | 6 +- .../sinks/snowflake/pulsar-admin-update.sh | 2 +- .../sinks/snowflake/sample-data.adoc | 68 ++++------- .../sources/data-generator/curl-create.sh | 2 +- .../sources/data-generator/curl-update.sh | 2 +- .../data-generator/pulsar-admin-create.sh | 2 +- .../data-generator/pulsar-admin-update.sh | 2 +- .../sources/debezium-mongodb/curl-create.sh | 2 +- .../sources/debezium-mongodb/curl-update.sh | 2 +- .../debezium-mongodb/pulsar-admin-create.sh | 2 +- .../debezium-mongodb/pulsar-admin-update.sh | 2 +- .../sources/debezium-mysql/curl-create.sh | 2 +- .../sources/debezium-mysql/curl-update.sh | 2 +- .../debezium-mysql/pulsar-admin-create.sh | 2 +- .../debezium-mysql/pulsar-admin-update.sh | 2 +- .../sources/debezium-oracle/curl-create.sh | 2 +- .../sources/debezium-oracle/curl-update.sh | 2 +- .../debezium-oracle/pulsar-admin-create.sh | 2 +- .../debezium-oracle/pulsar-admin-update.sh | 2 +- .../sources/debezium-postgres/curl-create.sh | 2 +- .../sources/debezium-postgres/curl-update.sh | 2 +- .../debezium-postgres/pulsar-admin-create.sh | 2 +- .../debezium-postgres/pulsar-admin-update.sh | 2 +- .../sources/debezium-sqlserver/curl-create.sh | 2 +- .../sources/debezium-sqlserver/curl-update.sh | 2 +- .../debezium-sqlserver/pulsar-admin-create.sh | 2 +- .../debezium-sqlserver/pulsar-admin-update.sh | 2 +- .../connectors/sources/kafka/curl-create.sh | 2 +- .../connectors/sources/kafka/curl-update.sh | 2 +- .../sources/kafka/pulsar-admin-create.sh | 2 +- .../sources/kafka/pulsar-admin-update.sh | 2 +- .../connectors/sources/kinesis/curl-create.sh | 2 +- .../connectors/sources/kinesis/curl-update.sh | 2 +- .../sources/kinesis/pulsar-admin-create.sh | 2 +- .../sources/kinesis/pulsar-admin-update.sh | 2 +- .../pages/connectors/sinks/astra-db.adoc | 28 ++--- .../pages/connectors/sinks/cloud-storage.adoc | 1 - .../connectors/sinks/elastic-search.adoc | 1 - .../connectors/sinks/google-bigquery.adoc | 1 - .../connectors/sinks/jdbc-clickhouse.adoc | 1 - .../pages/connectors/sinks/jdbc-mariadb.adoc | 1 - .../pages/connectors/sinks/jdbc-postgres.adoc | 2 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 1 - .../pages/connectors/sinks/kafka.adoc | 1 - .../pages/connectors/sinks/kinesis.adoc | 1 - .../pages/connectors/sinks/snowflake.adoc | 1 - .../connectors/sources/data-generator.adoc | 1 - .../connectors/sources/debezium-mongodb.adoc | 1 - .../connectors/sources/debezium-mysql.adoc | 1 - .../connectors/sources/debezium-oracle.adoc | 2 +- .../connectors/sources/debezium-postgres.adoc | 1 - .../sources/debezium-sqlserver.adoc | 1 - .../pages/connectors/sources/kafka.adoc | 1 - .../pages/connectors/sources/kinesis.adoc | 1 - .../connectors/sinks/astra-config-params.adoc | 4 +- .../connectors/sinks/get-started.adoc | 32 ++--- .../sources/astra-config-params.adoc | 4 +- .../connectors/sources/get-started.adoc | 30 +++-- 110 files changed, 424 insertions(+), 999 deletions(-) diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh index 4f6d548..97fbb56 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh @@ -1,19 +1,3 @@ -# NOTE: This is not a working example. - -CREATE KEYSPACE ks1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; -CREATE TABLE ks1.table1 (name text, PRIMARY KEY (name)); - -# create topic pulsar-topic-ks1-table1 - -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ -H "Authorization: $PULSAR_TOKEN" \ - -F 'sinkConfig="{ - \"archive\":\"builtin:\/\/cassandra-enhanced\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"inputs\":[ \"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\" ], - \"configs\":{ - ... - } - }"' \ No newline at end of file + -F "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh index daa1606..8d47c34 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh @@ -1,12 +1,3 @@ -curl -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ -H "Authorization: $PULSAR_TOKEN" \ - -F 'sinkConfig="{ - \"archive\":\"builtin:\/\/cassandra-enhanced\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"inputs\":[ \"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\" ], - \"configs\":{ - ... - } - }"' + -F "sinkConfig=@cassandra-enhanced-sink-config.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh index bf80edf..84127eb 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh @@ -1,14 +1,7 @@ -# NOTE: This is not a working example. - -CREATE KEYSPACE ks1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; -CREATE TABLE ks1.table1 (name text, PRIMARY KEY (name)); - -# create topic pulsar-topic-ks1-table1 - ./bin/pulsar-admin sinks create \ --sink-type cassandra-enhanced \ - --name "pulsar-sink-ks1-table1" \ - --inputs "persistent://$TENANT/$NAMESPACE/pulsar-topic-ks1-table1" \ + --name "$SINK_NAME" \ + --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ --tenant "$TENANT" \ --sink-config '{ "contactPoints": "cassandra", @@ -23,53 +16,53 @@ CREATE TABLE ks1.table1 (name text, PRIMARY KEY (name)); "jmx": true, "compression": "None", "auth": { - "provider": "None", - "username": null, - "password": null, - "gssapi": { - "keyTab": null, - "principal": null, - "service": "dse" - } + "provider": "None", + "username": null, + "password": null, + "gssapi": { + "keyTab": null, + "principal": null, + "service": "dse" + } }, "ssl": { - "provider": "None", - "hostnameValidation": true, - "keystore": { - "password": null, - "path": null - }, - "openssl": { - "keyCertChain": null, - "privateKey": null - }, - "truststore": { + "provider": "None", + "hostnameValidation": true, + "keystore": { "password": null, "path": null - }, - "cipherSuites": null + }, + "openssl": { + "keyCertChain": null, + "privateKey": null + }, + "truststore": { + "password": null, + "path": null + }, + "cipherSuites": null }, "topic": { - "pulsar-topic-ks1-table1": { - "ks1": { - "table1": { - "mapping": "name=value.name", - "consistencyLevel": "LOCAL_ONE", - "ttl": -1, - "ttlTimeUnit": "SECONDS", - "timestampTimeUnit": "MICROSECONDS", - "nullToUnset": true, - "deletesEnabled": true - } - }, - "codec": { - "locale": "en_US", - "timeZone": "UTC", - "timestamp": "CQL_TIMESTAMP", - "date": "ISO_LOCAL_DATE", - "time": "ISO_LOCAL_TIME", - "unit": "MILLISECONDS" - } + "${INPUT_TOPIC}": { + "${KEYSPACE_NAME}": { + "${TABLE_NAME}": { + "mapping": "name=value.name", + "consistencyLevel": "LOCAL_ONE", + "ttl": -1, + "ttlTimeUnit": "SECONDS", + "timestampTimeUnit": "MICROSECONDS", + "nullToUnset": true, + "deletesEnabled": true + } + }, + "codec": { + "locale": "en_US", + "timeZone": "UTC", + "timestamp": "CQL_TIMESTAMP", + "date": "ISO_LOCAL_DATE", + "time": "ISO_LOCAL_TIME", + "unit": "MILLISECONDS" } } - }' + } + }' diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh index a510ecf..41b7b1d 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh @@ -2,69 +2,7 @@ ./bin/pulsar-admin sinks update \ --sink-type cassandra-enhanced \ - --name "pulsar-sink-ks1-table1" \ - --inputs "persistent://$TENANT/$NAMESPACE/pulsar-topic-ks1-table1" \ + --name "$SINK_NAME" \ + --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "contactPoints": "cassandra", - "loadBalancing.localDc": "datacenter1", - "port": 9042, - "cloud.secureConnectBundle": null, - "ignoreErrors": "None", - "maxConcurrentRequests": 500, - "maxNumberOfRecordsInBatch": 32, - "queryExecutionTimeout": 30, - "connectionPoolLocalSize": 4, - "jmx": true, - "compression": "None", - "auth": { - "provider": "None", - "username": null, - "password": null, - "gssapi": { - "keyTab": null, - "principal": null, - "service": "dse" - } - }, - "ssl": { - "provider": "None", - "hostnameValidation": true, - "keystore": { - "password": null, - "path": null - }, - "openssl": { - "keyCertChain": null, - "privateKey": null - }, - "truststore": { - "password": null, - "path": null - }, - "cipherSuites": null - }, - "topic": { - "pulsar-topic-ks1-table1": { - "ks1": { - "table1": { - "mapping": "name=value.name", - "consistencyLevel": "LOCAL_ONE", - "ttl": -1, - "ttlTimeUnit": "SECONDS", - "timestampTimeUnit": "MICROSECONDS", - "nullToUnset": true, - "deletesEnabled": true - } - }, - "codec": { - "locale": "en_US", - "timeZone": "UTC", - "timestamp": "CQL_TIMESTAMP", - "date": "ISO_LOCAL_DATE", - "time": "ISO_LOCAL_TIME", - "unit": "MILLISECONDS" - } - } - } - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc index eccc7a5..7e79c4e 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -49,49 +48,78 @@ "consumerCryptoFailureAction": "FAIL" }, "poolMessages": true, - "regexPattern": true - }, - "property2": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true + "regexPattern": false } }, "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "contactPoints": "cassandra", + "loadBalancing.localDc": "datacenter1", + "port": 9042, + "cloud.secureConnectBundle": null, + "ignoreErrors": "None", + "maxConcurrentRequests": 500, + "maxNumberOfRecordsInBatch": 32, + "queryExecutionTimeout": 30, + "connectionPoolLocalSize": 4, + "jmx": true, + "compression": "None", + "auth": { + "provider": "None", + "username": null, + "password": null, + "gssapi": { + "keyTab": null, + "principal": null, + "service": "dse" + } + }, + "ssl": { + "provider": "None", + "hostnameValidation": true, + "keystore": { + "password": null, + "path": null + }, + "openssl": { + "keyCertChain": null, + "privateKey": null + }, + "truststore": { + "password": null, + "path": null + }, + "cipherSuites": null + }, + "topic": { + "${INPUT_TOPIC}": { + "${KEYSPACE_NAME}": { + "${TABLE_NAME}": { + "mapping": "name=value.name", + "consistencyLevel": "LOCAL_ONE", + "ttl": -1, + "ttlTimeUnit": "SECONDS", + "timestampTimeUnit": "MICROSECONDS", + "nullToUnset": true, + "deletesEnabled": true + } + }, + "codec": { + "locale": "en_US", + "timeZone": "UTC", + "timestamp": "CQL_TIMESTAMP", + "date": "ISO_LOCAL_DATE", + "time": "ISO_LOCAL_TIME", + "unit": "MILLISECONDS" + } + } + } }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { "cpu": 0, @@ -101,8 +129,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://cassandra-enhanced", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh index c8b123c..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh @@ -1,26 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/bigquery\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"topic\": \"bq-test01\", - \"kafkaConnectorSinkClass\": \"com.wepay.kafka.connect.bigquery.BigQuerySinkConnector\", - \"offsetStorageTopic\": \"bq-sink-offsets01\", - \"sanitizeTopicName\": \"true\", - \"kafkaConnectorConfigProperties\":{ - \"name\": \"bq-sink1\", - \"topics\": \"bq-test01\", - \"project\": \"my-bigquery-project\", - \"defaultDataset\": \"BQ_CONNECTOR_TEST\", - \"keyfile\": \"{\"type\":\"service_account\",\"project_id\":\"XXXXXX\",\"private_key_id\":\"XXXXXXXXX\",\"private_key\":\"-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w … U=\\n-----END PRIVATE KEY-----\\n\",\"client_email\":\"XXXXXXXXX\",\"client_id\":\"XXXXXX\",\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"token_uri\":\"https://oauth2.googleapis.com/token\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\":\"https://www.googleapis.com/robot/v1/metadata/x509/XXXXXX\"}\", - \"keySource\": \"JSON\", - \"autoCreateTables\": \"true\", - \"sanitizeTopics\": \"false\" - } - } - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh index bacd32c..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/bigquery\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh index f2a9ecc..ce37545 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh @@ -1,21 +1,7 @@ ./bin/pulsar-admin sinks create \ --sink-type bigquery \ --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --processing-guarantees EFFECTIVELY_ONCE \ - --sink-config '{ - "topic": "bq-test01", - "kafkaConnectorSinkClass": "com.wepay.kafka.connect.bigquery.BigQuerySinkConnector", - "offsetStorageTopic": "bq-sink-offsets01", - "sanitizeTopicName": "true", - "kafkaConnectorConfigProperties": - "name": "bq-sink1", - "topics": "bq-test01", - "project": "my-bigquery-project", - "defaultDataset": "BQ_CONNECTOR_TEST", - "keyfile": "/Users/me/my-bigquery-key.json", - "keySource": "FILE", - "autoCreateTables": "true", - "sanitizeTopics": "false" - }' + --sink-config-file configs.json diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh index 6958d4e..1df6cc8 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type bigquery \ --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc index 04569b0..cc71a01 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc @@ -8,23 +8,38 @@ "configs": { "batchSize": "1000", "kafkaConnectorConfigProperties": { + "name": "bq-sink1", + "project": "my-bigquery-project", + "defaultDataset": "BQ_CONNECTOR_TEST", "autoCreateBucket": true, "autoCreateTables": false, "keySource": "JSON", "queueSize": "-1", "sanitizeTopics": false, - "topics": "homelab/default/clue-sensors" + "topics": "bq-test01", + "keyfile": { + "type": "service_account", + "project_id": "XXXXXX", + "private_key_id": "XXXXXXXXX", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w ... U=\n-----END PRIVATE KEY-----\n", + "client_email": "XXXXXXXXX", + "client_id": "XXXXXX", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/XXXXXX" + }, }, "kafkaConnectorSinkClass": "com.wepay.kafka.connect.bigquery.BigQuerySinkConnector", "lingerTimeMs": "1000", - "offsetStorageTopic": "homelab/default/clue-sensors", + "offsetStorageTopic": "bq-sink-offsets01", "sanitizeTopicName": true, - "topic": "homelab/default/clue-sensors" + "topic": "bq-test01" }, "customRuntimeOptions": "internal_data", "deadLetterTopic": null, "inputSpecs": { - "homelab/default/clue-sensors": { + "${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "consumerProperties": {}, "cryptoConfig": null, "poolMessages": false, @@ -36,11 +51,11 @@ } }, "inputs": [ - "homelab/default/clue-sensors" + "${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "maxMessageRetries": null, - "name": "bq-sink", - "namespace": "default", + "name": "${SINK_NAME}", + "namespace": "${NAMESPACE}", "negativeAckRedeliveryDelayMs": null, "parallelism": 1, "processingGuarantees": "EFFECTIVELY_ONCE", @@ -55,7 +70,7 @@ "secrets": null, "sourceSubscriptionName": null, "sourceSubscriptionPosition": "Latest", - "tenant": "homelab", + "tenant": "${TENANT}", "timeoutMs": 2000, "topicToSchemaProperties": null, "topicToSchemaType": null, diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh index a745f77..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh @@ -1,11 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/cloud-storage\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ } - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh index 37b8f27..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/cloud-storage\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh index 0702d1e..c237bad 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sinks create \ --sink-type cloud-storage \ --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --processing-guarantees EFFECTIVELY_ONCE \ - --sink-config '{ }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh index f3b94a5..19de338 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type cloud-storage \ --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc index d293891..e91fc8d 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc @@ -25,7 +25,7 @@ "customRuntimeOptions": "internal_data", "deadLetterTopic": null, "inputSpecs": { - "persistent://homelab/default/clue-sensors": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "consumerProperties": {}, "cryptoConfig": null, "poolMessages": false, @@ -37,11 +37,11 @@ } }, "inputs": [ - "persistent://homelab/default/clue-sensors" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "maxMessageRetries": null, - "name": "cloud-storage-sink", - "namespace": "default", + "name": "${SINK_NAME}", + "namespace": "${NAMESPACE}", "negativeAckRedeliveryDelayMs": null, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", @@ -56,7 +56,7 @@ "secrets": null, "sourceSubscriptionName": null, "sourceSubscriptionPosition": "Latest", - "tenant": "homelab", + "tenant": "${TENANT}", "timeoutMs": 5000, "topicToSchemaProperties": null, "topicToSchemaType": null, diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh index f05190d..739c50a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh @@ -1,16 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/elastic_search\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"elasticSearchUrl\":\"http://localhost:9200\", - \"username\": \"scooby\", - \"password\":\"doobie\", - \"indexName\":\"my_index\" - } - }"' + --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh index 726936e..49f0ff2 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh @@ -1,8 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2 - }"' + --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh index 06da6f0..dea6809 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh @@ -1,11 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type elastic_search \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "elasticSearchUrl": "http://localhost:9200", - "indexName": "my_index", - "username": "scooby", - "password": "doobie" - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh index cd13be8..4cd8a71 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sinks update \ --sink-type elastic_search \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --sink-config '{ "elasticSearchUrl": "http://localhost:9200", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc index eccc7a5..af24532 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", - "className": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", + "className": "built://elastic_search", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,13 +54,12 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "elasticSearchUrl": "http://localhost:9200", + "username": "user", + "password":"${PASSWORD}", + "indexName":"my_index" }, + "secrets": {}, "parallelism": 0, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, @@ -101,7 +72,6 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", "archive": "string", "cleanupSubscription": true, "runtimeFlags": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh index d8fc544..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh @@ -1,17 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-clickhouse\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"userName\": \"clickhouse\", - \"password\": \"password\", - \"jdbcUrl\": \"jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink\", - \"tableName\": \"pulsar_clickhouse_jdbc_sink\" - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh index f110269..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-clickhouse\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh index 21b37df..60e7e41 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh @@ -1,11 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type jdbc-clickhouse \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "userName": "clickhouse", - "password": "password", - "jdbcUrl": "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink", - "tableName": "pulsar_clickhouse_jdbc_sink" - }' + --sink-config-file configs.json diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh index 2b0d574..88b3ce2 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type jdbc-clickhouse \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc index eccc7a5..6666080 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,13 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "userName": "clickhouse", + "password": "${PASSWORD}", + "jdbcUrl": "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink", + "tableName": "pulsar_clickhouse_jdbc_sink" }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +72,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://jdbc-clickhouse", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh index 78e0cb6..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh @@ -1,17 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-mariadb\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"userName\": \"mariadb\", - \"password\": \"password\", - \"jdbcUrl\": \"jdbc:mariadb://localhost:8123/pulsar_mariadb_jdbc_sink\", - \"tableName\": \"pulsar_mariadb_jdbc_sink\" - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh index f296b95..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-mariadb\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh index 68a7340..552ede1 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh @@ -1,11 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type jdbc-mariadb \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "userName": "mariadb", - "password": "password", - "jdbcUrl": "jdbc:mariadb://localhost:8123/pulsar_mariadb_jdbc_sink", - "tableName": "pulsar_mariadb_jdbc_sink" - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh index 1e0ba62..c349bb3 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sinks update \ --sink-type jdbc-mariadb \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ - --sink-config "" \ No newline at end of file + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc index eccc7a5..095f969 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,13 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "userName": "mariadb", + "password": "${PASSWORD}", + "jdbcUrl": "jdbc:mariadb://localhost:8123/pulsar_mariadb_jdbc_sink", + "tableName": "pulsar_mariadb_jdbc_sink" }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +72,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://jdbc-mariadb", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh index c621665..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh @@ -1,17 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-postgres\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"userName\": \"postgres\", - \"password\": \"password\", - \"jdbcUrl\": \"jdbc:postgres://localhost:8123/pulsar_postgres_jdbc_sink\", - \"tableName\": \"pulsar_postgres_jdbc_sink\" - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh index f9c1d2d..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh @@ -1,11 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-postgres\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh index f34528b..3875d3e 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh @@ -1,11 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type jdbc-postgres \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "userName": "postgres", - "password": "password", - "jdbcUrl": "jdbc:postgres://localhost:8123/pulsar_postgres_jdbc_sink", - "tableName": "pulsar_postgres_jdbc_sink" - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh index 8471f7c..d2fbbfd 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type jdbc-postgres \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc index eccc7a5..a47680a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,13 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "userName": "postgres", + "password": "${PASSWORD}", + "jdbcUrl": "jdbc:postgres://localhost:8123/pulsar_postgres_jdbc_sink", + "tableName": "pulsar_postgres_jdbc_sink" }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +72,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://jdbc-postgres", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh index 6e5bdd4..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh @@ -1,15 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-sqlite\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"jdbcUrl\": \"jdbc:sqlite:db.sqlite\", - \"tableName\": \"pulsar_sqlite_jdbc_sink\" - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh index b2fb314..49f0ff2 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/jdbc-sqlite\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' + --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh index 41f0851..ec8592e 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh @@ -1,9 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type jdbc-sqlite \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "jdbcUrl": "jdbc:sqlite:db.sqlite", - "tableName": "pulsar_sqlite_jdbc_sink" - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh index ec0ef9a..3952337 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type jdbc-sqlite \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc index eccc7a5..f3e3e0c 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,11 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "jdbcUrl": "jdbc:sqlite:db.sqlite", + "tableName": "pulsar_sqlite_jdbc_sink" }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +70,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://jdbc-sqlite", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh index 00792c0..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh @@ -1,25 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/kafka\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"bootstrapServers\": \"localhost:6667\", - \"topic\": \"test\", - \"acks\": \"1\", - \"batchSize\": \"16384\", - \"maxRequestSize\": \"1048576\", - \"producerConfigProperties\": { - \"client.id\": \"test-pulsar-producer\", - \"security.protocol\": \"SASL_PLAINTEXT\", - \"sasl.mechanism\": \"GSSAPI\", - \"sasl.kerberos.service.name\": \"kafka\", - \"acks\": \"all\" - } - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh index 22783a6..49f0ff2 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/kafka\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' + --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh index 7cac6c5..e492447 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh @@ -1,21 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type kafka \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "bootstrapServers": "localhost:6667", - "topic": "test", - "acks": "1", - "batchSize": "16384", - "maxRequestSize": "1048576", - "producerConfigProperties": { - "client.id": "test-pulsar-producer", - "security.protocol": "SASL_SSL", - "sasl.mechanism": "PLAIN", - "sasl.kerberos.service.name": "kafka", - "sasl.username": "cccccc", - "sasl.password": "cccccc", - "acks": "all" - } - }' \ No newline at end of file + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh index 0672079..0637ff6 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type kafka \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc index eccc7a5..d12a59a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,23 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "bootstrapServers": "localhost:6667", + "topic": "test", + "acks": "1", + "batchSize": "16384", + "maxRequestSize": "1048576", + "producerConfigProperties": { + "client.id": "test-pulsar-producer", + "security.protocol": "SASL_SSL", + "sasl.mechanism": "PLAIN", + "sasl.kerberos.service.name": "kafka", + "sasl.username": "cccccc", + "sasl.password": "${PASSWORD}", + "acks": "all" + } }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +82,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://kafka", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh index da776b1..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh @@ -1,18 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/kinesis\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"awsEndpoint\": \"some.endpoint.aws\", - \"awsRegion\": \"us-east-1\", - \"awsKinesisStreamName\": \"my-stream\", - \"awsCredentialPluginParam\": \"{\\\"accessKey\\\":\\\"myKey\\\",\\\"secretKey\\\":\\\"my-Secret\\\"}\", - \"messageFormat\": \"ONLY_RAW_PAYLOAD\", - \"retainOrdering\": \"true\" - } - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh index d432d4c..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/kinesis\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' \ No newline at end of file + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh index 4e61033..4167261 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh @@ -1,13 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type kinesis \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "awsEndpoint": "some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "messageFormat": "ONLY_RAW_PAYLOAD", - "retainOrdering": "true" - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh index 79a54a0..ae9d7f9 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type kinesis \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc index eccc7a5..e047111 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,15 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "awsEndpoint": "some.endpoint.aws", + "awsRegion": "us-east-1", + "awsKinesisStreamName": "my-stream", + "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", + "messageFormat": "ONLY_RAW_PAYLOAD", + "retainOrdering": "true" }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +74,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://kinesis", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh index ca79391..667e331 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh @@ -1,31 +1,3 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/snowflake\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 1, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"], - \"configs\":{ - \"topic\": \"snowflake-demo\", - \"offsetStorageTopic\": \"snowflake-sink-offsets-demo\", - \"batchSize\": 100, - \"lingerTimeMs\": 600000, - \"kafkaConnectorConfigProperties\":{ - \"name\": \"snowflakedemo\", - \"topics\": \"snowflake-demo\", - \"buffer.count.records\": 100, - \"buffer.flush.time\": 600, - \"buffer.size.bytes\": 102400, - \"snowflake.url.name\": \"tenant.snowflakecomputing.com:443\", - \"snowflake.user.name\": \"kafka_connector_user\", - \"snowflake.private.key\": \"very_secret_key\", - \"snowflake.database.name\": \"kafka_db\", - \"snowflake.schema.name\": \"kafka_schema\", - \"key.converter\": \"org.apache.kafka.connect.storage.StringConverter\", - \"value.converter\": \"com.snowflake.kafka.connector.records.SnowflakeJsonConverter\" - } - } - }"' - + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh index 7086134..f563d40 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh @@ -1,10 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME?opt=poweruser" \ +curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form 'sinkConfig="{ - \"archive\":\"builtin:\/\/snowflake\", - \"tenant\":\"'$TENANT'\", - \"namespace\":\"'$NAMESPACE'\", - \"name\":\"'$SINK_NAME'\", - \"parallelism\": 2, - \"inputs\":[\"'$TENANT'\/'$NAMESPACE'\/'$INPUT_TOPIC'\"] - }"' + --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh index 7099f53..5a800ef 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh @@ -1,8 +1,6 @@ ./bin/pulsar-admin sinks create \ --sink-type snowflake \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - xxxx - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh index 646d3ee..71ae990 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh @@ -1,6 +1,6 @@ ./bin/pulsar-admin sinks update \ --sink-type snowflake \ --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc index eccc7a5..c82de8f 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc @@ -1,20 +1,19 @@ [source,json] ---- { - "tenant": "string", - "namespace": "string", - "name": "string", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "name": "${SINK_NAME}", "className": "string", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "string" + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" ], "topicToSerdeClassName": { "property1": "string", "property2": "string" }, - "topicsPattern": "string", "topicToSchemaType": { "property1": "string", "property2": "string" @@ -24,34 +23,7 @@ "property2": "string" }, "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - }, - "property2": { + "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { @@ -82,14 +54,27 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "property1": {}, - "property2": {} - }, - "secrets": { - "property1": {}, - "property2": {} + "topic": "snowflake-demo", + "offsetStorageTopic": "snowflake-sink-offsets-demo", + "batchSize": 100, + "lingerTimeMs": 600000, + "kafkaConnectorConfigProperties":{ + "name": "snowflakedemo", + "topics": "snowflake-demo", + "buffer.count.records": 100, + "buffer.flush.time": 600, + "buffer.size.bytes": 102400, + "snowflake.url.name": "tenant.snowflakecomputing.com:443", + "snowflake.user.name": "kafka_connector_user", + "snowflake.private.key": "${PASSWORD}", + "snowflake.database.name": "kafka_db", + "snowflake.schema.name": "kafka_schema", + "key.converter": "org.apache.kafka.connect.storage.StringConverter", + "value.converter": "com.snowflake.kafka.connector.records.SnowflakeJsonConverter" + } }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, "retainKeyOrdering": true, @@ -101,8 +86,7 @@ "autoAck": true, "timeoutMs": 0, "negativeAckRedeliveryDelayMs": 0, - "sinkType": "string", - "archive": "string", + "archive": "builtin://snowflake", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh index 2d97942..00fd36a 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh @@ -3,7 +3,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S -H "Content-Type: application/json" \ -H "Authorization: $PULSAR_TOKEN" \ -d '{ - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "archive": "builtin://data-generator", "configs": { "sleepBetweenMessages": "50" diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh index 36336ba..d837004 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SO -H "Content-Type: application/json" \ -H "Authorization: $PULSAR_TOKEN" \ -d '{ - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "configs": { "sleepBetweenMessages": "100" } diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh index c933892..5bf2fff 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type data-generator \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "sleepBetweenMessages": "50" diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh index 612bb73..1b3cb8e 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type data-generator \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "sleepBetweenMessages": "100" diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh index 246afe6..05122be 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mongodb", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh index e33c422..30d1cdf 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SO -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mongodb", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh index bfee9e4..199f0b5 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type debezium-mongodb \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "database.whitelist": "asdasd", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh index b02e2f6..2797389 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type debezium-mongodb \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh index 279c6cd..70344de 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mysql", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh index 1f177a1..d89369f 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mysql", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh index 7f789f4..c24c4b5 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type debezium-mysql \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "database.dbname": "somedb", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh index fc83775..88f73d4 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type debezium-mysql \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh index d9df0db..4dbcebb 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-oracle", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh index 7b9aa3b..ffa25ca 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-oracle", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh index 170112a..72d22a2 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type debezium-oracle \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "database.hostname": "localhost", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh index 24dcab0..3ec9de3 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type debezium-oracle \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh index a058172..7e95b2a 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-postgres", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh index 224e296..c70ad30 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-postgres", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh index 4322d04..d802ee3 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type debezium-postgres \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "database.dbname": "somedb", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh index 15c97b3..aaa268f 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type debezium-postgres \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh index 42f44c4..27bf39a 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mssql", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh index 8ecec77..13416d7 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://debezium-mssql", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh index 32072ad..06be1f1 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type debezium-mssql \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "database.hostname": "localhost", diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh index 94ece6c..9102662 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type debezium-mssql \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh index a499ed9..cc3a3aa 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://kafka", diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh index e086fcf..0a3d7a3 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://kafka", diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh index 24ec7f3..780a0c1 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type kafka \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "bootstrapServers": "asdasd", diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh index 3292cda..90ac038 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type kafka \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh index d016b0c..1c9bb97 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh @@ -4,7 +4,7 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPA -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://kinesis", diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh index 8e5ce92..6e8f625 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh @@ -4,7 +4,7 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPAC -H "Authorization: $PULSAR_TOKEN" \ -d '{ "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$DESTINATION_TOPIC'", + "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", "name": "'$SOURCE_NAME'", "namespace": "'$NAMESPACE'", "archive": "builtin://kinesis", diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh index 9dd1f47..0aa74da 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources create \ --source-type kinesis \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --source-config '{ "awsEndpoint": "https://some.endpoint.aws", diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh index 959a243..828feae 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh @@ -1,7 +1,7 @@ ./bin/pulsar-admin sources update \ --source-type kinesis \ --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$DESTINATION_TOPIC" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ --parallelism 2 \ --source-config '{}' diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 9985c40..9915177 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -1,5 +1,4 @@ -= {astra-db} ({cass-reg} enhanced) -:connectorName: astra-db-sink += {astra-db} (cassandra-enhanced) :connectorType: astra-db The {astra-db} sink connector reads messages from {pulsar} topics and writes them to {astra-db} databases. @@ -150,15 +149,15 @@ For a more detailed example of this pattern, see the xref:pulsar-connector:ROOT: [source,json,subs="+quotes"] ---- "archive": "builtin://cassandra-enhanced", -"tenant": "**TENANT_NAME**", -"namespace": "**NAMESPACE_NAME**", -"name": "**CONNECTOR_NAME**", -"inputs": ["**TOPIC_NAME**"], +"tenant": "${TENANT}", +"namespace": "${NAMESPACE}", +"name": "${SINK_NAME}", +"inputs": ["${INPUT_TOPIC}"], "configs": { - "topics": "**TOPIC_NAME**", + "topics": "${INPUT_TOPIC}", "cloud.secureConnectBundle": "**SCB**", "topic": { - "**TOPIC_NAME**": { + "${INPUT_TOPIC}": { "**KEYSPACE_NAME**": { "**TABLE_NAME**": { **CONNECTION_PROPERTIES**, @@ -171,14 +170,7 @@ For a more detailed example of this pattern, see the xref:pulsar-connector:ROOT: ---- + Replace the following: - -* **TENANT_NAME**: Your tenant's name. -* **NAMESPACE_NAME**: The tenant's associated namespace name. -* **CONNECTOR_NAME**: The name of the connector. -* **TOPIC_NAME**: In `inputs` and `configs.topics`, specify the names of the topics to connect. -Specify topic names only; don't use the full topic addresses. -You can specify multiple topics. -Define one `configs.topic` object for each topic that you want to connect. ++ * **SCB**: The path to your database's Secure Connect Bundle (SCB) zip or a base64 encoding of the SCB zip. * **KEYSPACE_NAME**: The name of the keyspace in your database that contains the table you want to connect to a topic. * **TABLE_NAME**: The name of the table to connect to a topic. @@ -195,11 +187,11 @@ symbol=value.symbol, ts=value.ts, exchange=value.exchange, industry=value.indust For more mapping examples, see xref:pulsar-connector:ROOT:cfgPulsarMapTopicTable.adoc[Mapping pulsar topics to database tables]. . Use the `pulsar-admin` CLI to create the connector with your JSON file: - ++ [source,shell] ---- ./bin/pulsar-admin sinks create \ - --name dse-sink-kv \ + --name ${SINK_NAME} \ --classname com.datastax.oss.sink.pulsar.StringCassandraSinkTask \ --sink-config-file configs.json \ --sink-type cassandra-enhanced diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 73ad269..424e386 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -1,5 +1,4 @@ = Cloud Storage -:connectorName: cloud-storage-sink :connectorType: cloud-storage The Cloud Storage sink connector reads messages from {pulsar} topics and writes them to Cloud Storage systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 4e3e854..8341e98 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -1,5 +1,4 @@ = Elasticsearch -:connectorName: es-sink :connectorType: elastic-search Elasticsearch is the distributed, RESTful search and analytics engine at the heart of the Elastic Stack. diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 99acdc7..56e11c1 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -1,5 +1,4 @@ = Google BigQuery -:connectorName: bigquery-sink :connectorType: bigquery The Google BigQuery sink connector reads messages from {pulsar} topics and writes them to BigQuery systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 2cbf82b..afb112d 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -1,5 +1,4 @@ = JDBC Clickhouse -:connectorName: jdbc-clickhouse :connectorType: jdbc-clickhouse The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and writes them to JDBC-ClickHouse systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index ecc763f..8b7a908 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -1,5 +1,4 @@ = JDBC MariaDB -:connectorName: jdbc-mariadb :connectorType: jdbc-mariadb The JDBC-MariaDB sink connector reads messages from {pulsar} topics and writes them to JDBC-MariaDB systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index ebd03bf..e001173 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -1,6 +1,6 @@ = JDBC PostgreSQL -:connectorName: jdbc-postgres :connectorType: jdbc-postgres + The JDBC-PostgreSQL sink connector reads messages from {pulsar} topics and writes them to JDBC-PostgreSQL systems. PostgreSQL is a powerful, open source, object-relational database system with over 30 years of active development. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 2a7927c..0479125 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -1,5 +1,4 @@ = JDBC SQLite -:connectorName: jdbc-sqlite :connectorType: jdbc-sqlite The JDBC-SQLite sink connector reads messages from {pulsar} topics and writes them to JDBC-SQLite systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index f991839..41e28a9 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -1,5 +1,4 @@ = Kafka -:connectorName: kafka-sink :connectorType: kafka The Kafka sink connector reads messages from {pulsar} topics and writes them to Kafka systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 4bb2780..478b495 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -1,5 +1,4 @@ = Kinesis -:connectorName: kinesis-sink :connectorType: kinesis The Kinesis sink connector reads messages from {pulsar} topics and writes them to Kinesis systems. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 581b634..a4d43da 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -1,5 +1,4 @@ = Snowflake -:connectorName: snowflake-sink :connectorType: snowflake The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake systems. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 54ee797..2e0aa66 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -1,5 +1,4 @@ = Data Generator -:connectorName: data-gen-src :connectorType: data-generator The Data generator source connector produces messages for testing and persists the messages to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 89113a0..2fae732 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -1,5 +1,4 @@ = Debezium MongoDB -:connectorName: debezium-mongo-src :connectorType: debezium-mongodb The Debezium MongoDB source connector reads data from Debezium MongoDB systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 249148b..2698adc 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -1,5 +1,4 @@ = Debezium MySQL -:connectorName: debezium-mysql-src :connectorType: debezium-mysql The Debezium MySQL source connector reads data from Debezium MySQL systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 7b66e7a..e315d09 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -1,6 +1,6 @@ = Debezium Oracle -:connectorName: debezium-orcl-src :connectorType: debezium-oracle + The Debezium Oracle source connector reads data from Debezium Oracle systems and produces data to {pulsar-short} topics. Debezium’s Oracle connector captures and records row-level changes that occur in databases on Oracle servers, including tables that are added while the connector is running. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 3e84614..8381522 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -1,5 +1,4 @@ = Debezium PostgreSQL -:connectorName: debezium-pg-src :connectorType: debezium-postgres The Debezium PostgreSQL source connector reads data from Debezium PostgreSQL systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 3e6ab83..a84bfb3 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -1,5 +1,4 @@ = Debezium SQL Server -:connectorName: debezium-mssql-src :connectorType: debezium-sqlserver The Debezium SQL Server source connector reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 9d9863c..0499ec9 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -1,5 +1,4 @@ = Kafka -:connectorName: kafka-src :connectorType: kafka The Kafka source connector reads data from Kafka systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 3e30c80..9ae5b79 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -1,5 +1,4 @@ = Kinesis -:connectorName: kinesis-src :connectorType: kinesis The AWS Kinesis source connector reads data from Kinesis systems and produces data to {pulsar-short} topics. diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index 343c4f5..6bdb44a 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -96,8 +96,8 @@ See also `negativeAckRedeliveryDelayMs` and `deadLetterTopic`. |Yes |The name for the connector. It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. -{company} recommends memorable, human-readable names that summarize the connector's purpose. -For example: `jdbc-sqllite-sink-prod-us-east-1`. +{company} recommends a memorable, human-readable name that summarizes the connector's purpose. +For example: `{connectorType}-sink-prod-us-east-1`. |`namespace` |Yes diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 8c36e52..fbe4f6c 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -1,24 +1,28 @@ -// TODO: include details about retrieving a tenant name -// TODO: include details about creating a topic -Set the following environment variables using the `pulsar-admin` CLI or the {pulsar-admin} API: - -[source,shell,subs="+quote,+attributes"] +. Optional: If you are using the `pulsar-admin` CLI or {pulsar-short} Admin API, set the following commonly-used environment variables: ++ +[source,shell,subs="+quotes"] ---- -export TENANT=**TENANT_NAME** -export INPUT_TOPIC=**TOPIC_NAME** -export NAMESPACE=**NAMESPACE_NAME** # or default -export SINK_NAME={connectorName} +export TENANT="**TENANT_NAME**" +export TOPIC="**INPUT_TOPIC_NAME**" +export NAMESPACE="**NAMESPACE_NAME**" # or default +export SINK_NAME="**SINK_CONNECTOR_UNIQUE_NAME**" +export PULSAR_TOKEN="**TENANT_PULSAR_TOKEN**" # API only +export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only ---- ++ +`**SINK_NAME**` is the name for your new sink connector. +{company} recommends a memorable, human-readable name that summarizes the connector's purpose. +For example: `{connectorType}-sink-prod-us-east-1`. -=== {pulsar-short} Admin CLI - +. Create the connector: ++ +.{pulsar-short} Admin CLI [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] ---- - -=== {pulsar-short} Admin API - ++ +.{pulsar-short} Admin API [source,shell,subs="attributes+"] ---- include::example$connectors/sinks/{connectorType}/curl-create.sh[] diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc index a10530c..4d431d7 100644 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -41,8 +41,8 @@ Default: `{}` (Empty map, uses defaults) |Yes |The name for the connector. It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. -{company} recommends memorable, human-readable names that summarize the connector's purpose. -For example: `debezium-mysql-source-prod-us-east-1`. +{company} recommends a memorable, human-readable name that summarizes the connector's purpose. +For example: `{connectorType}-source-prod-us-east-1`. |`namespace` |Yes diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index a63002f..8eb55ea 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -1,22 +1,28 @@ -Set the following environment variables using the `pulsar-admin` CLI or the {pulsar-admin} API: - -[source,shell,subs="+quote,+attributes"] +. Optional: If you are using the `pulsar-admin` CLI or {pulsar-short} Admin API, set the following commonly-used environment variables: ++ +[source,shell,subs="+quotes"] ---- -export TENANT=**TENANT_NAME** -export DESTINATION_TOPIC=**TOPIC_NAME** -export NAMESPACE=**NAMESPACE_NAME** # or default -export SOURCE_NAME={connectorName} +export TENANT="**TENANT_NAME**" +export TOPIC="**OUTPUT_TOPIC_NAME**" +export NAMESPACE="**NAMESPACE_NAME**" # or default +export SOURCE_NAME="**SOURCE_CONNECTOR_UNIQUE_NAME**" +export PULSAR_TOKEN="**TENANT_PULSAR_TOKEN**" # API only +export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only ---- ++ +`**SOURCE_NAME**` is the name for your new source connector. +{company} recommends a memorable, human-readable name that summarizes the connector's purpose. +For example: `{connectorType}-source-prod-us-east-1`. -=== {pulsar-short} Admin CLI - +. Create the connector: ++ +.{pulsar-short} Admin CLI [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] ---- - -=== {pulsar-short} Admin API - ++ +.{pulsar-short} Admin API [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/curl-create.sh[] From 0b26294cbf66f65fd2e03221eade1c1267c347c5 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:16:49 -0800 Subject: [PATCH 11/31] unify sink curl examples --- .../connectors/sinks/astra-db/curl-create.sh | 3 - .../connectors/sinks/astra-db/curl-update.sh | 3 - .../sinks/astra-db/pulsar-admin-create.sh | 64 +---------------- .../sinks/astra-db/pulsar-admin-update.sh | 2 - .../connectors/sinks/bigquery/curl-create.sh | 3 - .../connectors/sinks/bigquery/curl-update.sh | 3 - .../sinks/cloud-storage/curl-create.sh | 3 - .../sinks/elastic-search/curl-create.sh | 3 - .../sinks/elastic-search/curl-update.sh | 3 - .../sinks/jdbc-clickhouse/curl-create.sh | 3 - .../sinks/jdbc-mariadb/curl-create.sh | 3 - .../sinks/jdbc-mariadb/curl-update.sh | 3 - .../sinks/jdbc-postgres/curl-create.sh | 3 - .../sinks/jdbc-postgres/curl-update.sh | 3 - .../sinks/jdbc-sqlite/curl-create.sh | 3 - .../sinks/jdbc-sqlite/curl-update.sh | 3 - .../connectors/sinks/kafka/curl-create.sh | 3 - .../connectors/sinks/kafka/curl-update.sh | 3 - .../connectors/sinks/kinesis/curl-create.sh | 3 - .../connectors/sinks/kinesis/curl-update.sh | 3 - .../connectors/sinks/snowflake/curl-create.sh | 3 - .../connectors/sinks/snowflake/curl-update.sh | 3 - modules/pulsar-io/pages/connectors/index.adoc | 72 +++++++++---------- .../connectors/sinks/curl-create.sh} | 2 +- .../connectors/sinks}/curl-update.sh | 2 +- .../connectors/sinks/get-started.adoc | 6 +- .../partials/connectors/sinks/manage.adoc | 2 +- 27 files changed, 41 insertions(+), 169 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh rename modules/pulsar-io/{examples/connectors/sinks/cloud-storage/curl-update.sh => partials/connectors/sinks/curl-create.sh} (52%) rename modules/pulsar-io/{examples/connectors/sinks/jdbc-clickhouse => partials/connectors/sinks}/curl-update.sh (52%) diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh deleted file mode 100644 index 97fbb56..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - -H "Authorization: $PULSAR_TOKEN" \ - -F "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh deleted file mode 100644 index 8d47c34..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - -H "Authorization: $PULSAR_TOKEN" \ - -F "sinkConfig=@cassandra-enhanced-sink-config.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh index 84127eb..724c919 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh @@ -3,66 +3,4 @@ --name "$SINK_NAME" \ --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ --tenant "$TENANT" \ - --sink-config '{ - "contactPoints": "cassandra", - "loadBalancing.localDc": "datacenter1", - "port": 9042, - "cloud.secureConnectBundle": null, - "ignoreErrors": "None", - "maxConcurrentRequests": 500, - "maxNumberOfRecordsInBatch": 32, - "queryExecutionTimeout": 30, - "connectionPoolLocalSize": 4, - "jmx": true, - "compression": "None", - "auth": { - "provider": "None", - "username": null, - "password": null, - "gssapi": { - "keyTab": null, - "principal": null, - "service": "dse" - } - }, - "ssl": { - "provider": "None", - "hostnameValidation": true, - "keystore": { - "password": null, - "path": null - }, - "openssl": { - "keyCertChain": null, - "privateKey": null - }, - "truststore": { - "password": null, - "path": null - }, - "cipherSuites": null - }, - "topic": { - "${INPUT_TOPIC}": { - "${KEYSPACE_NAME}": { - "${TABLE_NAME}": { - "mapping": "name=value.name", - "consistencyLevel": "LOCAL_ONE", - "ttl": -1, - "ttlTimeUnit": "SECONDS", - "timestampTimeUnit": "MICROSECONDS", - "nullToUnset": true, - "deletesEnabled": true - } - }, - "codec": { - "locale": "en_US", - "timeZone": "UTC", - "timestamp": "CQL_TIMESTAMP", - "date": "ISO_LOCAL_DATE", - "time": "ISO_LOCAL_TIME", - "unit": "MILLISECONDS" - } - } - } - }' + --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh index 41b7b1d..9aab76a 100644 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh @@ -1,5 +1,3 @@ -# NOTE: This is not a working example. - ./bin/pulsar-admin sinks update \ --sink-type cassandra-enhanced \ --name "$SINK_NAME" \ diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh deleted file mode 100644 index f563d40..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh deleted file mode 100644 index 739c50a..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh deleted file mode 100644 index 49f0ff2..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh deleted file mode 100644 index f563d40..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh deleted file mode 100644 index f563d40..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh deleted file mode 100644 index 49f0ff2..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh deleted file mode 100644 index 49f0ff2..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh deleted file mode 100644 index f563d40..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh deleted file mode 100644 index 667e331..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh deleted file mode 100644 index f563d40..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index b497cc2..b03325f 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -194,7 +194,7 @@ Get the configuration for an existing sink connector: [source,shell] ---- # Get information about a connector -curl -sS --fail --location "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" ---- @@ -217,9 +217,8 @@ Get the configuration for an existing source connector: [source,shell] ---- # Get a connector's information -curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#start-a-sink-connector] @@ -241,12 +240,12 @@ curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NA [source,shell,subs="attributes+"] ---- # Start all instances of a connector -curl -sS --fail --location --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/start" \ +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/start" \ --header "Authorization: Bearer $PULSAR_TOKEN" # Start an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/start" \ --H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/start" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#start-a-source-connector] @@ -268,12 +267,12 @@ curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SIN [source,shell] ---- # Start all instances of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ + --header "Authorization: Bearer $PULSAR_TOKEN" # Start an individual instance of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/start" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/start" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#stop-a-sink-connector] @@ -295,12 +294,12 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S [source,shell] ---- # Stop all instances of a connector -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/stop" \ +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/stop" \ --header "Authorization: Bearer $PULSAR_TOKEN" # Stop an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/stop" \ - --H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/stop" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#stop-a-source-connector] @@ -322,12 +321,12 @@ curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SIN [source,shell] ---- # Stop all instances of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ + --header "Authorization: Bearer $PULSAR_TOKEN" # Stop an individual instance of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/stop" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/stop" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#restart-a-sink-connector] @@ -349,12 +348,12 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S [source,shell] ---- # Restart all instances of a connector -curl -sS --fail --request POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/restart" \ +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/restart" \ --header "Authorization: Bearer $PULSAR_TOKEN" # Restart an individual instance of a connector -curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/restart" \ --H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/restart" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#restart-a-source-connector] @@ -376,12 +375,12 @@ curl -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SIN [source,shell] ---- # Restart all instances of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ + --header "Authorization: Bearer $PULSAR_TOKEN" # Restart an individual instance of a connector -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/restart" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/restart" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- [#get-sink-connector-status] @@ -402,13 +401,12 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S [source,shell] ---- # Get the status of all connector instances -curl -sS --fail --location "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/status" \ +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/status" \ --header "Authorization: Bearer $PULSAR_TOKEN" # Get the status of an individual connector instance -curl "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/status" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- Status response for all connector instances: @@ -498,14 +496,12 @@ Status response for individual connector instance: [source,shell] ---- # Get the status of all connector instances -curl -sS --fail "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ + --header "Authorization: Bearer $PULSAR_TOKEN" # Get the status of an individual connector instance -curl "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/status" \ - -H "accept: application/json" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/status" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- Status response for all connector instances: @@ -594,7 +590,7 @@ Status response for individual connector instance: [source,shell] ---- # Delete all instances of a connector -curl -sS --fail --location --request DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ +curl -sS --fail -L -X DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" ---- @@ -615,8 +611,8 @@ curl -sS --fail --location --request DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TE [source,shell] ---- # Delete all instances of a connector -curl -sS --fail -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "Authorization: $PULSAR_TOKEN" +curl -sS --fail -L -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" ---- == Connector metrics diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh b/modules/pulsar-io/partials/connectors/sinks/curl-create.sh similarity index 52% rename from modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh rename to modules/pulsar-io/partials/connectors/sinks/curl-create.sh index f563d40..8669d97 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/curl-update.sh +++ b/modules/pulsar-io/partials/connectors/sinks/curl-create.sh @@ -1,3 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh b/modules/pulsar-io/partials/connectors/sinks/curl-update.sh similarity index 52% rename from modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh rename to modules/pulsar-io/partials/connectors/sinks/curl-update.sh index f563d40..7d28c4b 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/curl-update.sh +++ b/modules/pulsar-io/partials/connectors/sinks/curl-update.sh @@ -1,3 +1,3 @@ -curl -sS --fail --request PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ +curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index fbe4f6c..5d2942a 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -17,15 +17,15 @@ For example: `{connectorType}-sink-prod-us-east-1`. . Create the connector: + .{pulsar-short} Admin CLI -[source,shell,subs="attributes+"] +[source,shell,subs="+attributes"] ---- include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] ---- + .{pulsar-short} Admin API -[source,shell,subs="attributes+"] +[source,shell,subs="+attributes"] ---- -include::example$connectors/sinks/{connectorType}/curl-create.sh[] +include::partial$connectors/sinks/curl-create.sh[] ---- === Example configuration data structure diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index cfdbaca..27974e4 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -28,7 +28,7 @@ include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] .{pulsar-short} Admin API [source,shell,subs="+attributes"] ---- -include::example$connectors/sinks/{connectorType}/curl-update.sh[] +include::partial$connectors/sinks/curl-update.sh[] ---- == Delete the connector From c7ed8a0efb148efddc08688c3fcc93fd1598b5f8 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:27:48 -0800 Subject: [PATCH 12/31] unify sink cli examples --- .../connectors/sinks/astra-db/pulsar-admin-create.sh | 6 ------ .../connectors/sinks/astra-db/pulsar-admin-update.sh | 6 ------ .../connectors/sinks/bigquery/pulsar-admin-create.sh | 7 ------- .../connectors/sinks/bigquery/pulsar-admin-update.sh | 6 ------ .../{astra-db => cassandra-enhanced}/sample-data.adoc | 0 .../sinks/cloud-storage/pulsar-admin-create.sh | 7 ------- .../sinks/cloud-storage/pulsar-admin-update.sh | 6 ------ .../sinks/elastic-search/pulsar-admin-create.sh | 6 ------ .../sinks/elastic-search/pulsar-admin-update.sh | 11 ----------- .../sample-data.adoc | 0 .../sinks/jdbc-clickhouse/pulsar-admin-create.sh | 6 ------ .../sinks/jdbc-clickhouse/pulsar-admin-update.sh | 6 ------ .../sinks/jdbc-mariadb/pulsar-admin-create.sh | 6 ------ .../sinks/jdbc-mariadb/pulsar-admin-update.sh | 7 ------- .../sinks/jdbc-postgres/pulsar-admin-update.sh | 6 ------ .../sinks/jdbc-sqlite/pulsar-admin-create.sh | 6 ------ .../sinks/jdbc-sqlite/pulsar-admin-update.sh | 6 ------ .../connectors/sinks/kafka/pulsar-admin-create.sh | 6 ------ .../connectors/sinks/kinesis/pulsar-admin-create.sh | 6 ------ .../connectors/sinks/kinesis/pulsar-admin-update.sh | 6 ------ .../connectors/sinks/snowflake/pulsar-admin-create.sh | 6 ------ .../connectors/sinks/snowflake/pulsar-admin-update.sh | 6 ------ .../pulsar-io/pages/connectors/sinks/astra-db.adoc | 2 +- .../pages/connectors/sinks/elastic-search.adoc | 2 +- .../connectors/sinks/cli-create.sh} | 2 +- .../connectors/sinks/cli-update.sh} | 2 +- .../partials/connectors/sinks/get-started.adoc | 2 +- .../pulsar-io/partials/connectors/sinks/manage.adoc | 2 +- 28 files changed, 6 insertions(+), 134 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh rename modules/pulsar-io/examples/connectors/sinks/{astra-db => cassandra-enhanced}/sample-data.adoc (100%) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh rename modules/pulsar-io/examples/connectors/sinks/{elastic-search => elastic_search}/sample-data.adoc (100%) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh rename modules/pulsar-io/{examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh => partials/connectors/sinks/cli-create.sh} (84%) rename modules/pulsar-io/{examples/connectors/sinks/kafka/pulsar-admin-update.sh => partials/connectors/sinks/cli-update.sh} (82%) diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh deleted file mode 100644 index 724c919..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type cassandra-enhanced \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh deleted file mode 100644 index 9aab76a..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/astra-db/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type cassandra-enhanced \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh deleted file mode 100644 index ce37545..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-create.sh +++ /dev/null @@ -1,7 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type bigquery \ - --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --processing-guarantees EFFECTIVELY_ONCE \ - --sink-config-file configs.json diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh deleted file mode 100644 index 1df6cc8..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type bigquery \ - --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc similarity index 100% rename from modules/pulsar-io/examples/connectors/sinks/astra-db/sample-data.adoc rename to modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh deleted file mode 100644 index c237bad..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-create.sh +++ /dev/null @@ -1,7 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type cloud-storage \ - --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --processing-guarantees EFFECTIVELY_ONCE \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh deleted file mode 100644 index 19de338..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type cloud-storage \ - --name "$SINK_NAME" \ - --inputs "$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh deleted file mode 100644 index dea6809..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type elastic_search \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh deleted file mode 100644 index 4cd8a71..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/elastic-search/pulsar-admin-update.sh +++ /dev/null @@ -1,11 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type elastic_search \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config '{ - "elasticSearchUrl": "http://localhost:9200", - "indexName": "my_index", - "username": "scooby", - "password": "doobie" - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc similarity index 100% rename from modules/pulsar-io/examples/connectors/sinks/elastic-search/sample-data.adoc rename to modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh deleted file mode 100644 index 60e7e41..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type jdbc-clickhouse \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh deleted file mode 100644 index 88b3ce2..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type jdbc-clickhouse \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh deleted file mode 100644 index 552ede1..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type jdbc-mariadb \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh deleted file mode 100644 index c349bb3..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/pulsar-admin-update.sh +++ /dev/null @@ -1,7 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type jdbc-mariadb \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh deleted file mode 100644 index d2fbbfd..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type jdbc-postgres \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh deleted file mode 100644 index ec8592e..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type jdbc-sqlite \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh deleted file mode 100644 index 3952337..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type jdbc-sqlite \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh deleted file mode 100644 index e492447..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type kafka \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh deleted file mode 100644 index 4167261..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type kinesis \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh deleted file mode 100644 index ae9d7f9..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type kinesis \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh deleted file mode 100644 index 5a800ef..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type snowflake \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh deleted file mode 100644 index 71ae990..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type snowflake \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 9915177..915e3c2 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -1,5 +1,5 @@ = {astra-db} (cassandra-enhanced) -:connectorType: astra-db +:connectorType: cassandra-enhanced The {astra-db} sink connector reads messages from {pulsar} topics and writes them to {astra-db} databases. diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 8341e98..2e130c3 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -1,5 +1,5 @@ = Elasticsearch -:connectorType: elastic-search +:connectorType: elastic_search Elasticsearch is the distributed, RESTful search and analytics engine at the heart of the Elastic Stack. You can use Elasticsearch to store, search, and manage data for logs, metrics, search backend, application monitoring, and endpoint security. diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh b/modules/pulsar-io/partials/connectors/sinks/cli-create.sh similarity index 84% rename from modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh rename to modules/pulsar-io/partials/connectors/sinks/cli-create.sh index 3875d3e..9785463 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/pulsar-admin-create.sh +++ b/modules/pulsar-io/partials/connectors/sinks/cli-create.sh @@ -1,5 +1,5 @@ ./bin/pulsar-admin sinks create \ - --sink-type jdbc-postgres \ + --sink-type {connectorType} \ --name "$SINK_NAME" \ --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh b/modules/pulsar-io/partials/connectors/sinks/cli-update.sh similarity index 82% rename from modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh rename to modules/pulsar-io/partials/connectors/sinks/cli-update.sh index 0637ff6..98d2ffc 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/pulsar-admin-update.sh +++ b/modules/pulsar-io/partials/connectors/sinks/cli-update.sh @@ -1,5 +1,5 @@ ./bin/pulsar-admin sinks update \ - --sink-type kafka \ + --sink-type {connectorType} \ --name "$SINK_NAME" \ --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 5d2942a..86274ae 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -19,7 +19,7 @@ For example: `{connectorType}-sink-prod-us-east-1`. .{pulsar-short} Admin CLI [source,shell,subs="+attributes"] ---- -include::example$connectors/sinks/{connectorType}/pulsar-admin-create.sh[] +include::partial$connectors/sinks/cli-create.sh[] ---- + .{pulsar-short} Admin API diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index 27974e4..e2bbe96 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -22,7 +22,7 @@ To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-s .{pulsar-short} Admin CLI [source,shell,subs="+attributes"] ---- -include::example$connectors/sinks/{connectorType}/pulsar-admin-update.sh[] +include::partial$connectors/sinks/cli-update.sh[] ---- .{pulsar-short} Admin API From 31230ccb87768917f8ac53cc165409482f2825c9 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:45:29 -0800 Subject: [PATCH 13/31] fix variable name and start aligning source examples --- .../sinks/bigquery/sample-data.adoc | 4 +- .../sinks/cassandra-enhanced/sample-data.adoc | 4 +- .../sinks/cloud-storage/sample-data.adoc | 4 +- .../sinks/elastic_search/sample-data.adoc | 4 +- .../sinks/jdbc-clickhouse/sample-data.adoc | 4 +- .../sinks/jdbc-mariadb/sample-data.adoc | 4 +- .../sinks/jdbc-sqlite/sample-data.adoc | 4 +- .../connectors/sinks/kafka/sample-data.adoc | 4 +- .../connectors/sinks/kinesis/sample-data.adoc | 4 +- .../sinks/snowflake/sample-data.adoc | 4 +- .../sources/data-generator/config.csv | 2 - .../sources/data-generator/curl-create.sh | 3 +- .../sources/data-generator/curl-update.sh | 54 +------------------ .../sources/data-generator/sample-data.adoc | 2 +- .../sources/debezium-mongodb/config.csv | 7 --- .../debezium-mongodb/pulsar-admin-update.sh | 3 +- .../debezium-mysql/pulsar-admin-update.sh | 3 +- .../debezium-oracle/pulsar-admin-update.sh | 3 +- .../debezium-postgres/pulsar-admin-update.sh | 3 +- .../debezium-sqlserver/pulsar-admin-update.sh | 3 +- .../sources/kafka/pulsar-admin-update.sh | 3 +- .../sources/kinesis/pulsar-admin-update.sh | 3 +- .../pages/connectors/sinks/astra-db.adoc | 6 +-- .../connectors/sources/data-generator.adoc | 3 +- .../connectors/sources/debezium-mongodb.adoc | 8 ++- 25 files changed, 42 insertions(+), 104 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/config.csv delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/config.csv diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc index cc71a01..f7fc29b 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc @@ -39,7 +39,7 @@ "customRuntimeOptions": "internal_data", "deadLetterTopic": null, "inputSpecs": { - "${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "${TENANT}/${NAMESPACE}/${TOPIC}": { "consumerProperties": {}, "cryptoConfig": null, "poolMessages": false, @@ -51,7 +51,7 @@ } }, "inputs": [ - "${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "${TENANT}/${NAMESPACE}/${TOPIC}" ], "maxMessageRetries": null, "name": "${SINK_NAME}", diff --git a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc index 7e79c4e..e6ff19b 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://$TENANT/$NAMESPACE/$INPUT_TOPIC" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -93,7 +93,7 @@ "cipherSuites": null }, "topic": { - "${INPUT_TOPIC}": { + "${TOPIC}": { "${KEYSPACE_NAME}": { "${TABLE_NAME}": { "mapping": "name=value.name", diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc index e91fc8d..9982429 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc @@ -25,7 +25,7 @@ "customRuntimeOptions": "internal_data", "deadLetterTopic": null, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "consumerProperties": {}, "cryptoConfig": null, "poolMessages": false, @@ -37,7 +37,7 @@ } }, "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "maxMessageRetries": null, "name": "${SINK_NAME}", diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc index af24532..8efbf59 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc index 6666080..7c1f6db 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc index 095f969..22486fa 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc index f3e3e0c..b4295b7 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc index d12a59a..fde6780 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc index e047111..91b2cea 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc index c82de8f..bf450ef 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc @@ -8,7 +8,7 @@ "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}" + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" ], "topicToSerdeClassName": { "property1": "string", @@ -23,7 +23,7 @@ "property2": "string" }, "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${INPUT_TOPIC}": { + "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { "schemaType": "string", "serdeClassName": "string", "schemaProperties": { diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/config.csv b/modules/pulsar-io/examples/connectors/sources/data-generator/config.csv deleted file mode 100644 index 4602317..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/config.csv +++ /dev/null @@ -1,2 +0,0 @@ -"Name","Required","Default","Description" -"sleepBetweenMessages ","false","50","How many seconds to sleep between emitting messages" diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh index 00fd36a..9c7eb5f 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh @@ -8,5 +8,4 @@ curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$S "configs": { "sleepBetweenMessages": "50" } - }' - + }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh index d837004..8e9083f 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh @@ -1,4 +1,3 @@ -# Update all instances of a connector currently running curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ @@ -8,55 +7,4 @@ curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SO "configs": { "sleepBetweenMessages": "100" } - }' - -# REQUEST DATA SAMPLE -# { -# "topicName": "string", -# "producerConfig": { -# "maxPendingMessages": 0, -# "maxPendingMessagesAcrossPartitions": 0, -# "useThreadLocalProducers": true, -# "cryptoConfig": { -# "cryptoKeyReaderClassName": "string", -# "cryptoKeyReaderConfig": { -# "property1": {}, -# "property2": {} -# }, -# "encryptionKeys": [ -# "string" -# ], -# "producerCryptoFailureAction": "FAIL", -# "consumerCryptoFailureAction": "FAIL" -# }, -# "batchBuilder": "string" -# }, -# "serdeClassName": "string", -# "schemaType": "string", -# "configs": { -# "property1": {}, -# "property2": {} -# }, -# "secrets": { -# "property1": {}, -# "property2": {} -# }, -# "parallelism": 0, -# "processingGuarantees": "ATLEAST_ONCE", -# "resources": { -# "cpu": 0, -# "ram": 0, -# "disk": 0 -# }, -# "archive": "string", -# "runtimeFlags": "string", -# "customRuntimeOptions": "string", -# "batchSourceConfig": { -# "discoveryTriggererClassName": "string", -# "discoveryTriggererConfig": { -# "property1": {}, -# "property2": {} -# } -# }, -# "batchBuilder": "string" -# } \ No newline at end of file + }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc index 003483a..59bf683 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc @@ -1,7 +1,7 @@ [source,json] ---- { - "topicName": "string", + "topicName": "${TOPIC}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/config.csv b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/config.csv deleted file mode 100644 index a687de6..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/config.csv +++ /dev/null @@ -1,7 +0,0 @@ -"Name","Required","Default","Description" -"database.whitelist","true","","A list of all databases hosted by this server which is monitored by the connector. This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring." -"mongodb.hosts","true","","The comma-separated list of hostname and port pairs ('host' or 'host:port') of the MongoDB servers in the replica set. If mongodb.members.auto.discover is set to false, prefix with the replica set name (e.g., rs0/localhost:27017)." -"mongodb.name","true","","A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector." -"mongodb.password","true","","Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." -"mongodb.task.id","true","","The taskId of the MongoDB connector that attempts to use a separate task for each replica set." -"mongodb.user","true","","Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh index 2797389..def1143 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh index 88f73d4..ec707c1 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh index 3ec9de3..d42dced 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh index aaa268f..db1970e 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' \ No newline at end of file + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh index 9102662..5d67fa9 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh index 90ac038..b24c817 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh index 828feae..103b032 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh @@ -3,5 +3,4 @@ --name "$SOURCE_NAME" \ --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ --tenant "$TENANT" \ - --parallelism 2 \ - --source-config '{}' + --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 915e3c2..96c4bcd 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -152,12 +152,12 @@ For a more detailed example of this pattern, see the xref:pulsar-connector:ROOT: "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", -"inputs": ["${INPUT_TOPIC}"], +"inputs": ["${TOPIC}"], "configs": { - "topics": "${INPUT_TOPIC}", + "topics": "${TOPIC}", "cloud.secureConnectBundle": "**SCB**", "topic": { - "${INPUT_TOPIC}": { + "${TOPIC}": { "**KEYSPACE_NAME**": { "**TABLE_NAME**": { **CONNECTION_PROPERTIES**, diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 2e0aa66..19b39ee 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -34,5 +34,6 @@ These values are provided in the "configs" area. [%header,format=csv,cols="2,1,1,3"] |=== -include::example$connectors/sources/{connectorType}/config.csv[] +"Name","Required","Default","Description" +"sleepBetweenMessages ","false","50","How many seconds to sleep between emitting messages" |=== diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 2fae732..8a55f71 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -30,7 +30,13 @@ These values are provided in the "configs" area. [%header,format=csv,cols="2,1,1,3"] |=== -include::example$connectors/sources/{connectorType}/config.csv[] +"Name","Required","Default","Description" +"database.whitelist","true","","A list of all databases hosted by this server which is monitored by the connector. This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring." +"mongodb.hosts","true","","The comma-separated list of hostname and port pairs ('host' or 'host:port') of the MongoDB servers in the replica set. If mongodb.members.auto.discover is set to false, prefix with the replica set name (e.g., rs0/localhost:27017)." +"mongodb.name","true","","A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector." +"mongodb.password","true","","Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." +"mongodb.task.id","true","","The taskId of the MongoDB connector that attempts to use a separate task for each replica set." +"mongodb.user","true","","Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." |=== == What's next? From 3913af988370308bb34c2de98482d7c8edfd6e78 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 06:48:22 -0800 Subject: [PATCH 14/31] terminology fixes --- modules/pulsar-io/pages/connectors/index.adoc | 28 +++++++++---------- .../connectors/sinks/google-bigquery.adoc | 4 +-- .../connectors/sinks/astra-config-params.adoc | 2 +- .../connectors/sinks/get-started.adoc | 2 +- .../partials/connectors/sinks/manage.adoc | 27 +++++++----------- .../connectors/sources/get-started.adoc | 2 +- .../partials/connectors/sources/manage.adoc | 27 +++++++----------- 7 files changed, 39 insertions(+), 53 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index b03325f..4c116d1 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -142,7 +142,7 @@ You can use the {astra-ui}, the `xref:developing:produce-consume-pulsar-client.a Get a list of sink connectors that are available in your {product} {pulsar-short} tenant: -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="attributes+"] ---- ./bin/pulsar-admin sinks available-sinks @@ -158,7 +158,7 @@ curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $PULSAR_T Get a list of source connectors that are available in your {product} {pulsar-short} tenant: -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="attributes+"] ---- ./bin/pulsar-admin sources available-sources @@ -180,7 +180,7 @@ For example commands and configuration details, see the documentation for your p Get the configuration for an existing sink connector: -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Get information about a connector @@ -203,7 +203,7 @@ curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$S Get the configuration for an existing source connector: -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Get information about connector @@ -224,7 +224,7 @@ curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/ [#start-a-sink-connector] === Start a sink connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Start all instances of a connector @@ -251,7 +251,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ [#start-a-source-connector] === Start a source connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Start all instances of a connector @@ -278,7 +278,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE [#stop-a-sink-connector] === Stop a sink connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Stop all instances of a connector @@ -305,7 +305,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ [#stop-a-source-connector] === Stop a source connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Stop all instances of a connector @@ -332,7 +332,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE [#restart-a-sink-connector] === Restart a sink connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Restart all instances of a connector @@ -359,7 +359,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ [#restart-a-source-connector] === Restart a source connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Restart all instances of a connector @@ -386,7 +386,7 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE [#get-sink-connector-status] === Get sink connector status -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Check connector status @@ -481,7 +481,7 @@ Status response for individual connector instance: [#get-source-connector-status] === Get source connector status -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Check connector status @@ -576,7 +576,7 @@ Status response for individual connector instance: [#delete-a-sink-connector] === Delete a sink connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Delete all instances of a connector @@ -597,7 +597,7 @@ curl -sS --fail -L -X DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE [#delete-a-source-connector] === Delete a source connector -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell] ---- # Delete all instances of a connector diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 56e11c1..786bdf1 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -246,7 +246,7 @@ This presents two issues: a| Can be either a string representation of the Google credentials file or the path to the Google credentials file itself. When configuring this connector in the {astra-ui}, the string representation must be used. -With the {pulsar-short} Admin CLI or API, you can use either the representation or a file. +With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. | keySource | yes @@ -254,7 +254,7 @@ With the {pulsar-short} Admin CLI or API, you can use either the representation a| Determines whether the keyfile configuration is the path to the credentials JSON file or to the JSON itself. Available values are `FILE` and `JSON`. When configuring this connector in the {astra-ui}, JSON is the only option. -With the {pulsar-short} Admin CLI or API, you can use either the representation or a file. +With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. | name | yes diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index 6bdb44a..8ff2206 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -8,7 +8,7 @@ For the equivalent command line arguments, see the https://pulsar.apache.org/doc ==== The following table uses the field name. -Parameter names are different when passed directly on the command line with the {pulsar-short} Admin CLI. +Parameter names are different when passed directly on the command line with the `pulsar-admin` CLI. [cols=3] |=== diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 86274ae..a201e9c 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -16,7 +16,7 @@ For example: `{connectorType}-sink-prod-us-east-1`. . Create the connector: + -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="+attributes"] ---- include::partial$connectors/sinks/cli-create.sh[] diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index e2bbe96..0fae943 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -1,25 +1,14 @@ -== Start or stop the connector - -See the following: - -* xref:pulsar-io:connectors/index.adoc#start-a-sink-connector[Start a sink connector] -* xref:pulsar-io:connectors/index.adoc#stop-a-sink-connector[Stop a sink connector] -* xref:pulsar-io:connectors/index.adoc#restart-a-sink-connector[Restart a sink connector] - -== Check connector status - -See xref:pulsar-io:connectors/index.adoc#get-sink-connector-status[Get sink connector status]. - == Edit the connector To update a connector, pass the new configuration definition to the connector. -You can include the entire configuration or only the parameters that you want to change. +For example, if you created the connector with a configuration file, you can pass an updated configuration file. -With the {pulsar-short} Admin CLI, you can use `sink-config`, or use specific command line arguments to modify individual configuration parameters. +You can include the entire configuration or only the parameters that you want to change. +Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="+attributes"] ---- include::partial$connectors/sinks/cli-update.sh[] @@ -31,6 +20,10 @@ include::partial$connectors/sinks/cli-update.sh[] include::partial$connectors/sinks/curl-update.sh[] ---- -== Delete the connector +== Manage the connector -See xref:pulsar-io:connectors/index.adoc#delete-a-sink-connector[Delete a sink connector]. \ No newline at end of file +* xref:pulsar-io:connectors/index.adoc#start-a-sink-connector[Start a sink connector] +* xref:pulsar-io:connectors/index.adoc#stop-a-sink-connector[Stop a sink connector] +* xref:pulsar-io:connectors/index.adoc#restart-a-sink-connector[Restart a sink connector] +* xref:pulsar-io:connectors/index.adoc#get-sink-connector-status[Get sink connector status] +* xref:pulsar-io:connectors/index.adoc#delete-a-sink-connector[Delete a sink connector] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index 8eb55ea..91bc59e 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -16,7 +16,7 @@ For example: `{connectorType}-source-prod-us-east-1`. . Create the connector: + -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index fba86bc..74589ca 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -1,25 +1,14 @@ -== Start or stop the connector - -See the following: - -* xref:pulsar-io:connectors/index.adoc#start-a-source-connector[Start a source connector] -* xref:pulsar-io:connectors/index.adoc#stop-a-source-connector[Stop a source connector] -* xref:pulsar-io:connectors/index.adoc#restart-a-source-connector[Restart a source connector] - -== Check connector status - -See xref:pulsar-io:connectors/index.adoc#get-source-connector-status[Get source connector status]. - == Edit the connector To update a connector, pass the new configuration definition to the connector. -You can include the entire configuration or only the parameters that you want to change. +For example, if you created the connector with a configuration file, you can pass an updated configuration file. -With the {pulsar-short} Admin CLI, you can use `source-config`, or use specific command line arguments to modify individual configuration parameters. +You can include the entire configuration or only the parameters that you want to change. +Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. -.{pulsar-short} Admin CLI +.pulsar-admin CLI [source,shell,subs="attributes+"] ---- include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] @@ -31,6 +20,10 @@ include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] include::example$connectors/sources/{connectorType}/curl-update.sh[] ---- -== Delete the connector +== Manage the connector -See xref:pulsar-io:connectors/index.adoc#delete-a-source-connector[Delete a source connector]. \ No newline at end of file +* xref:pulsar-io:connectors/index.adoc#start-a-source-connector[Start a source connector] +* xref:pulsar-io:connectors/index.adoc#stop-a-source-connector[Stop a source connector] +* xref:pulsar-io:connectors/index.adoc#restart-a-source-connector[Restart a source connector] +* xref:pulsar-io:connectors/index.adoc#get-source-connector-status[Get source connector status] +* xref:pulsar-io:connectors/index.adoc#delete-a-source-connector[Delete a source connector] \ No newline at end of file From be7a3fdd824b6da3be6323c6b7e5c961a8c0ef61 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 07:03:08 -0800 Subject: [PATCH 15/31] further reduce partials --- .../partials/connectors/sinks/cli-create.sh | 6 ------ .../partials/connectors/sinks/cli-update.sh | 6 ------ .../partials/connectors/sinks/curl-create.sh | 3 --- .../partials/connectors/sinks/curl-update.sh | 3 --- .../partials/connectors/sinks/get-started.adoc | 13 ++++++++++--- .../pulsar-io/partials/connectors/sinks/manage.adoc | 13 ++++++++++--- 6 files changed, 20 insertions(+), 24 deletions(-) delete mode 100644 modules/pulsar-io/partials/connectors/sinks/cli-create.sh delete mode 100644 modules/pulsar-io/partials/connectors/sinks/cli-update.sh delete mode 100644 modules/pulsar-io/partials/connectors/sinks/curl-create.sh delete mode 100644 modules/pulsar-io/partials/connectors/sinks/curl-update.sh diff --git a/modules/pulsar-io/partials/connectors/sinks/cli-create.sh b/modules/pulsar-io/partials/connectors/sinks/cli-create.sh deleted file mode 100644 index 9785463..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/cli-create.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks create \ - --sink-type {connectorType} \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/cli-update.sh b/modules/pulsar-io/partials/connectors/sinks/cli-update.sh deleted file mode 100644 index 98d2ffc..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/cli-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sinks update \ - --sink-type {connectorType} \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/curl-create.sh b/modules/pulsar-io/partials/connectors/sinks/curl-create.sh deleted file mode 100644 index 8669d97..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/curl-create.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/curl-update.sh b/modules/pulsar-io/partials/connectors/sinks/curl-update.sh deleted file mode 100644 index 7d28c4b..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/curl-update.sh +++ /dev/null @@ -1,3 +0,0 @@ -curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index a201e9c..aea4afe 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -19,13 +19,20 @@ For example: `{connectorType}-sink-prod-us-east-1`. .pulsar-admin CLI [source,shell,subs="+attributes"] ---- -include::partial$connectors/sinks/cli-create.sh[] +./bin/pulsar-admin sinks create \ + --sink-type {connectorType} \ + --name "$SINK_NAME" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ + --tenant "$TENANT" \ + --sink-config-file configs.json ---- + .{pulsar-short} Admin API -[source,shell,subs="+attributes"] +[source,shell] ---- -include::partial$connectors/sinks/curl-create.sh[] +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ + --form "sinkConfig=@configs.json;type=application/json" ---- === Example configuration data structure diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index 0fae943..f43f801 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -11,13 +11,20 @@ To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-s .pulsar-admin CLI [source,shell,subs="+attributes"] ---- -include::partial$connectors/sinks/cli-update.sh[] +./bin/pulsar-admin sinks update \ + --sink-type {connectorType} \ + --name "$SINK_NAME" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ + --tenant "$TENANT" \ + --parallelism 2 ---- .{pulsar-short} Admin API -[source,shell,subs="+attributes"] +[source,shell] ---- -include::partial$connectors/sinks/curl-update.sh[] +curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ + --form "sinkConfig=@configs.json;type=application/json" ---- == Manage the connector From 3bef32bcfb0b9d369af1918c910e311fe48ed78c Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 07:10:45 -0800 Subject: [PATCH 16/31] remove headings from partials --- .../pages/connectors/sinks/astra-db.adoc | 6 ++++ .../pages/connectors/sinks/cloud-storage.adoc | 6 ++++ .../connectors/sinks/elastic-search.adoc | 6 ++++ .../connectors/sinks/google-bigquery.adoc | 6 ++++ .../connectors/sinks/jdbc-clickhouse.adoc | 6 ++++ .../pages/connectors/sinks/jdbc-mariadb.adoc | 6 ++++ .../pages/connectors/sinks/jdbc-postgres.adoc | 6 ++++ .../pages/connectors/sinks/jdbc-sqllite.adoc | 6 ++++ .../pages/connectors/sinks/kafka.adoc | 6 ++++ .../pages/connectors/sinks/kinesis.adoc | 6 ++++ .../pages/connectors/sinks/snowflake.adoc | 6 ++++ .../connectors/sources/data-generator.adoc | 6 ++++ .../connectors/sources/debezium-mongodb.adoc | 6 ++++ .../connectors/sources/debezium-mysql.adoc | 6 ++++ .../connectors/sources/debezium-oracle.adoc | 6 ++++ .../connectors/sources/debezium-postgres.adoc | 6 ++++ .../sources/debezium-sqlserver.adoc | 8 ++++- .../pages/connectors/sources/kafka.adoc | 6 ++++ .../pages/connectors/sources/kinesis.adoc | 6 ++++ .../partials/connectors/sinks/edit.adoc | 26 ++++++++++++++++ .../connectors/sinks/get-started.adoc | 3 +- .../partials/connectors/sinks/manage.adoc | 31 ------------------- .../partials/connectors/sources/edit.adoc | 19 ++++++++++++ .../connectors/sources/get-started.adoc | 3 +- .../partials/connectors/sources/manage.adoc | 24 -------------- 25 files changed, 162 insertions(+), 60 deletions(-) create mode 100644 modules/pulsar-io/partials/connectors/sinks/edit.adoc create mode 100644 modules/pulsar-io/partials/connectors/sources/edit.adoc diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 96c4bcd..4dee600 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -18,6 +18,12 @@ This reference assumes you are connecting to a {cass-short} table using the {pul include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 424e386..6fa1de6 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -15,6 +15,12 @@ The cloud storage system supported are: include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Data format types diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 2e130c3..7df2197 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -17,6 +17,12 @@ For information about the OSS {pulsar} Elasticsearch sink connector, see the htt include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Astra Streaming parameters for the Elasticsearch sink diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 786bdf1..b256e8e 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -13,6 +13,12 @@ You will notice references to Kafka throughout the configuration. *You don't nee include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index afb112d..4594ac0 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -12,6 +12,12 @@ real-time. include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 8b7a908..d1cf194 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -13,6 +13,12 @@ Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/doc include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index e001173..d2401a7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -15,6 +15,12 @@ The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (T include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 0479125..ab459a8 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -17,6 +17,12 @@ SQLite JDBC is a library for accessing and creating SQLite database files in Jav include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 41e28a9..49a0035 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -12,6 +12,12 @@ Kafka. include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 478b495..84f21c9 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -15,6 +15,12 @@ The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index a4d43da..511f04a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -11,6 +11,12 @@ Snowflake automatically manages all parts of the data storage process, including include::partial$connectors/sinks/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sinks/edit.adoc[] + +== Manage the connector + include::partial$connectors/sinks/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 19b39ee..9d97580 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -17,6 +17,12 @@ For a reference of the full "Person" class, https://github.com/apache/pulsar/blo include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 8a55f71..4db1e4b 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -13,6 +13,12 @@ The connector automatically handles the addition or removal of shards in a shard include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 2698adc..23c1b94 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -11,6 +11,12 @@ The Debezium MySQL connector reads the binlog, produces change events for row-le include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index e315d09..0908318 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -13,6 +13,12 @@ The connector can be configured to emit change events for specific subsets of sc include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 8381522..fd7ca12 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -12,6 +12,12 @@ https://debezium.io/releases/{debezium-version}/[Debezium documentation]. include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index a84bfb3..1aa0767 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -37,11 +37,17 @@ In the following example configuration, both are set to `kalash-server-stream672 . Set your consumers to subscribe to the `events` topic in your Pulsar namespace to receive change data capture (CDC) events. This topic contains the change data capture (CDC) events emitted by Debezium for the configured tables. - ++ For more on Debezium topic naming conventions, see the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium documentation]. include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 0499ec9..98f444a 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -11,6 +11,12 @@ For more, see https://pulsar.apache.org/docs/io-kafka-source[{pulsar}'s Kafka so include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 9ae5b79..bb2caec 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -11,6 +11,12 @@ For more, see https://pulsar.apache.org/docs/io-kinesis-source[{pulsar}'s Kinesi include::partial$connectors/sources/get-started.adoc[] +== Edit the connector + +include::partial$connectors/sources/edit.adoc[] + +== Manage the connector + include::partial$connectors/sources/manage.adoc[] == Connector Reference diff --git a/modules/pulsar-io/partials/connectors/sinks/edit.adoc b/modules/pulsar-io/partials/connectors/sinks/edit.adoc new file mode 100644 index 0000000..f54f1ec --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sinks/edit.adoc @@ -0,0 +1,26 @@ +To update a connector, pass the new configuration definition to the connector. +For example, if you created the connector with a configuration file, you can pass an updated configuration file. + +You can include the entire configuration or only the parameters that you want to change. +Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. + +To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. + +.pulsar-admin CLI +[source,shell,subs="+attributes"] +---- +./bin/pulsar-admin sinks update \ + --sink-type {connectorType} \ + --name "$SINK_NAME" \ + --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ + --tenant "$TENANT" \ + --parallelism 2 +---- + +.{pulsar-short} Admin API +[source,shell] +---- +curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ + --form "sinkConfig=@configs.json;type=application/json" +---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index aea4afe..a026ba1 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -35,6 +35,5 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ --form "sinkConfig=@configs.json;type=application/json" ---- -=== Example configuration data structure - +.Example configuration data structure include::example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc index f43f801..dfc7b55 100644 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/manage.adoc @@ -1,34 +1,3 @@ -== Edit the connector - -To update a connector, pass the new configuration definition to the connector. -For example, if you created the connector with a configuration file, you can pass an updated configuration file. - -You can include the entire configuration or only the parameters that you want to change. -Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. - -To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. - -.pulsar-admin CLI -[source,shell,subs="+attributes"] ----- -./bin/pulsar-admin sinks update \ - --sink-type {connectorType} \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 ----- - -.{pulsar-short} Admin API -[source,shell] ----- -curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" ----- - -== Manage the connector - * xref:pulsar-io:connectors/index.adoc#start-a-sink-connector[Start a sink connector] * xref:pulsar-io:connectors/index.adoc#stop-a-sink-connector[Stop a sink connector] * xref:pulsar-io:connectors/index.adoc#restart-a-sink-connector[Restart a sink connector] diff --git a/modules/pulsar-io/partials/connectors/sources/edit.adoc b/modules/pulsar-io/partials/connectors/sources/edit.adoc new file mode 100644 index 0000000..d7e4514 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sources/edit.adoc @@ -0,0 +1,19 @@ +To update a connector, pass the new configuration definition to the connector. +For example, if you created the connector with a configuration file, you can pass an updated configuration file. + +You can include the entire configuration or only the parameters that you want to change. +Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. + +To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. + +.pulsar-admin CLI +[source,shell,subs="attributes+"] +---- +include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] +---- + +.{pulsar-short} Admin API +[source,shell,subs="attributes+"] +---- +include::example$connectors/sources/{connectorType}/curl-update.sh[] +---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index 91bc59e..9cc06eb 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -28,6 +28,5 @@ include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] include::example$connectors/sources/{connectorType}/curl-create.sh[] ---- -=== Example configuration data structure - +.Example configuration data structure include::example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc index 74589ca..3ab6857 100644 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ b/modules/pulsar-io/partials/connectors/sources/manage.adoc @@ -1,27 +1,3 @@ -== Edit the connector - -To update a connector, pass the new configuration definition to the connector. -For example, if you created the connector with a configuration file, you can pass an updated configuration file. - -You can include the entire configuration or only the parameters that you want to change. -Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. - -To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. - -.pulsar-admin CLI -[source,shell,subs="attributes+"] ----- -include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] ----- - -.{pulsar-short} Admin API -[source,shell,subs="attributes+"] ----- -include::example$connectors/sources/{connectorType}/curl-update.sh[] ----- - -== Manage the connector - * xref:pulsar-io:connectors/index.adoc#start-a-source-connector[Start a source connector] * xref:pulsar-io:connectors/index.adoc#stop-a-source-connector[Stop a source connector] * xref:pulsar-io:connectors/index.adoc#restart-a-source-connector[Restart a source connector] From c4a7def7afdb67a5d648e1046f482fdf6b9ee17d Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:04:44 -0800 Subject: [PATCH 17/31] aligning sample data --- .../connectors/sinks/bigquery/sample-data.adoc | 9 ++++----- .../sinks/cassandra-enhanced/sample-data.adoc | 10 +++++----- .../sinks/cloud-storage/sample-data.adoc | 5 ++--- .../sinks/elastic_search/sample-data.adoc | 16 ++++++++-------- .../sinks/jdbc-clickhouse/sample-data.adoc | 12 ++++++------ .../sinks/jdbc-mariadb/sample-data.adoc | 12 ++++++------ .../sinks/jdbc-postgres/sample-data.adoc | 14 +++++++------- .../sinks/jdbc-sqlite/sample-data.adoc | 12 ++++++------ .../connectors/sinks/kafka/sample-data.adoc | 12 ++++++------ .../connectors/sinks/kinesis/sample-data.adoc | 12 ++++++------ .../connectors/sinks/snowflake/sample-data.adoc | 12 ++++++------ .../sources/data-generator/sample-data.adoc | 16 ++++++---------- .../pages/connectors/sinks/jdbc-clickhouse.adoc | 2 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 2 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 2 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 2 +- .../pulsar-io/pages/connectors/sinks/kafka.adoc | 2 +- .../pages/connectors/sinks/kinesis.adoc | 2 +- .../pages/connectors/sinks/snowflake.adoc | 2 +- .../pages/connectors/sources/data-generator.adoc | 2 +- .../connectors/sources/debezium-mongodb.adoc | 2 +- .../pages/connectors/sources/debezium-mysql.adoc | 2 +- .../connectors/sources/debezium-postgres.adoc | 2 +- .../connectors/sources/debezium-sqlserver.adoc | 2 +- 24 files changed, 80 insertions(+), 86 deletions(-) diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc index f7fc29b..5a6e915 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc @@ -64,18 +64,17 @@ "disk": 1000000000, "ram": 1000000000 }, - "retainKeyOrdering": false, - "retainOrdering": true, + "retainOrdering": false, + "retainKeyOrdering": true, "runtimeFlags": null, - "secrets": null, + "secrets": {}, "sourceSubscriptionName": null, "sourceSubscriptionPosition": "Latest", "tenant": "${TENANT}", - "timeoutMs": 2000, + "timeoutMs": 5000, "topicToSchemaProperties": null, "topicToSchemaType": null, "topicToSerdeClassName": null, - "topicsPattern": null, "transformFunction": null, "transformFunctionClassName": null, "transformFunctionConfig": null diff --git a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc index e6ff19b..921c7c8 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.cassandra.sink.CassandraEnhancedSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -122,12 +122,12 @@ "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://cassandra-enhanced", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc index 9982429..e7a2355 100644 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc @@ -50,10 +50,10 @@ "disk": 1000000000, "ram": 1000000000 }, - "retainKeyOrdering": false, "retainOrdering": false, + "retainKeyOrdering": true, "runtimeFlags": null, - "secrets": null, + "secrets": {}, "sourceSubscriptionName": null, "sourceSubscriptionPosition": "Latest", "tenant": "${TENANT}", @@ -61,7 +61,6 @@ "topicToSchemaProperties": null, "topicToSchemaType": null, "topicToSerdeClassName": null, - "topicsPattern": null, "transformFunction": null, "transformFunctionClassName": null, "transformFunctionConfig": null diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc index 8efbf59..14cfbc2 100644 --- a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "built://elastic_search", + "className": "org.apache.pulsar.io.elasticsearch.ElasticSearchSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -60,19 +60,19 @@ "indexName":"my_index" }, "secrets": {}, - "parallelism": 0, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, - "archive": "string", + "archive": "builtin://elastic_search", "cleanupSubscription": true, "runtimeFlags": "string", "customRuntimeOptions": "string", diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc index 7c1f6db..83f13e8 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.jdbc.sink.ClickHouseSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -62,15 +62,15 @@ "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://jdbc-clickhouse", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc index 22486fa..dbc1527 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.jdbc.sink.MariaDBSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -62,15 +62,15 @@ "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://jdbc-mariadb", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc index a47680a..f966be7 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.jdbc.sink.PostgresSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -56,21 +56,21 @@ "configs": { "userName": "postgres", "password": "${PASSWORD}", - "jdbcUrl": "jdbc:postgres://localhost:8123/pulsar_postgres_jdbc_sink", + "jdbcUrl": "jdbc:postgresql://localhost:8123/pulsar_postgres_jdbc_sink", "tableName": "pulsar_postgres_jdbc_sink" }, "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://jdbc-postgres", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc index b4295b7..3428728 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.jdbc.sink.SqliteSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -60,15 +60,15 @@ "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://jdbc-sqlite", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc index fde6780..ee1a6b9 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.kafka.KafkaSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -72,15 +72,15 @@ "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://kafka", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc index 91b2cea..498e608 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.kinesis.KinesisSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -65,14 +65,14 @@ "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "retainOrdering": true, - "retainKeyOrdering": true, + "retainKeyOrdering": false, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://kinesis", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc index bf450ef..cbe6c96 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc @@ -4,7 +4,7 @@ "tenant": "${TENANT}", "namespace": "${NAMESPACE}", "name": "${SINK_NAME}", - "className": "string", + "className": "org.apache.pulsar.io.snowflake.SnowflakeSink", "sourceSubscriptionName": "string", "sourceSubscriptionPosition": "Latest", "inputs": [ @@ -76,15 +76,15 @@ "secrets": {}, "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, + "retainOrdering": false, "retainKeyOrdering": true, "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "autoAck": true, - "timeoutMs": 0, + "timeoutMs": 5000, "negativeAckRedeliveryDelayMs": 0, "archive": "builtin://snowflake", "cleanupSubscription": true, diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc index 59bf683..dea0fff 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc @@ -23,19 +23,15 @@ "serdeClassName": "string", "schemaType": "string", "configs": { - "property1": {}, - "property2": {} + }, - "secrets": { - "property1": {}, - "property2": {} - }, - "parallelism": 0, + "secrets": {}, + "parallelism": 1, "processingGuarantees": "ATLEAST_ONCE", "resources": { - "cpu": 0, - "ram": 0, - "disk": 0 + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 }, "archive": "string", "runtimeFlags": "string", diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 4594ac0..51e86a7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -31,7 +31,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Clickhouse (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} JDBC Clickhouse sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index d1cf194..801e3bb 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -32,6 +32,6 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === MariaSQL (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index d2401a7..8565533 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === PostgreSQL (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} JDBC PostgreSQL sink connector supports all configuration properties provided by {pulsar-short}. Refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index ab459a8..b7eced9 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -36,7 +36,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === SQLite (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 49a0035..5edf5e3 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -31,7 +31,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Kafka (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} Kafka sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kafka-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 84f21c9..ef46f39 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Kinesis (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} Kinesis sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kinesis-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 511f04a..e770c37 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -30,7 +30,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Snowflake (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} Snowflake sink connector supports all configuration properties provided by {company}. Please refer to the https://github.com/datastax/snowflake-connector#configuration[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 9d97580..946c62f 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -36,7 +36,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Data Generator (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. [%header,format=csv,cols="2,1,1,3"] |=== diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 4db1e4b..df1f9b9 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -32,7 +32,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium MongoDB (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. [%header,format=csv,cols="2,1,1,3"] |=== diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 23c1b94..640e728 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -30,7 +30,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium MySQL (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} MySQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#mysql-connector-properties[Debezium MySQL connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index fd7ca12..f84410c 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -31,7 +31,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium PostgreSQL (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The {product} PostgreSQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/postgresql.html#postgresql-connector-properties[Debezium PostgreSQL connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 1aa0767..fec7dc2 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -61,7 +61,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium SQL Server (`configs`) -These values are provided in the "configs" area. +These parameters are set in the `configs` section of the connector configuration. The SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. From 06a16c4edf7f6cf000e54ce52249112578a7d310 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:26:10 -0800 Subject: [PATCH 18/31] full sample data for sources --- .../sources/data-generator/sample-data.adoc | 2 +- .../sources/debezium-mongodb/sample-data.adoc | 52 +++++++++++-- .../sources/debezium-mysql/sample-data.adoc | 46 ++++++++++- .../sources/debezium-oracle/sample-data.adoc | 76 ++++++++++++++----- .../debezium-postgres/sample-data.adoc | 48 +++++++++++- .../debezium-sqlserver/sample-data.adoc | 58 ++++++++++++-- .../connectors/sources/kafka/sample-data.adoc | 58 ++++++++++++-- .../sources/kinesis/sample-data.adoc | 42 ++++++++++ .../sources/debezium-sqlserver.adoc | 4 +- 9 files changed, 340 insertions(+), 46 deletions(-) diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc index dea0fff..bbc8dde 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc @@ -23,7 +23,7 @@ "serdeClassName": "string", "schemaType": "string", "configs": { - + "sleepBetweenMessages": "50" }, "secrets": {}, "parallelism": 1, diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc index a56e75d..217aed0 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc @@ -1,11 +1,53 @@ [source,json] ---- { - "database.whitelist": "asdasd", - "mongodb.hosts": "asd", - "mongodb.name": "asdasd", - "mongodb.password": "asd", + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { + "database.whitelist": "usersdb", + "mongodb.hosts": "host:port", + "mongodb.name": "streaming_prod", + "mongodb.password": "${PASSWORD}", "mongodb.task.id": "123", - "mongodb.user": "asd" + "mongodb.user": "mongodb" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" } ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc index b2c7172..ece7e9f 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc @@ -1,9 +1,31 @@ [source,json] ---- { - "database.dbname": "somedb", + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { + "database.dbname": "dbz-db", "database.hostname": "localhost", - "database.password": "gfgfgf", + "database.password": "${PASSWORD}", "database.port": "3306", "database.server.id": 123, "database.server.name": "dbserver1", @@ -12,5 +34,25 @@ "json-with-envelope": "true", "key.converter": "org.apache.kafka.connect.json.JsonConverter", "value.converter": "org.apache.kafka.connect.json.JsonConverter" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" } ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc index 5946470..18b86fd 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc @@ -1,20 +1,62 @@ [source,json] ---- -"configs": { - "database.hostname": "localhost", - "database.port": "1521", - "database.user": "dbzuser", - "database.password": "dbz", - "database.dbname": "a-db", - "database.server.name": "my-server", - "schema.exclude.list": "system,dbzuser", - "snapshot.mode": "initial", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.oracle.OracleConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - } +{ + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { + "database.hostname": "localhost", + "database.port": "1521", + "database.user": "dbzuser", + "database.password": "${PASSWORD}", + "database.dbname": "a-db", + "database.server.name": "dbz-server", + "schema.exclude.list": "system,dbzuser", + "snapshot.mode": "initial", + "topic.namespace": "${TENANT}/${NAMESPACE}", + "task.class": "io.debezium.connector.oracle.OracleConnectorTask", + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "key.converter": "org.apache.kafka.connect.json.JsonConverter", + "typeClassName": "org.apache.pulsar.common.schema.KeyValue", + "database.tcpKeepAlive": "true", + "decimal.handling.mode": "double" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" +} ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc index 28f19a1..fe7114b 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc @@ -1,10 +1,32 @@ [source,json] ---- { - "database.dbname": "somedb", + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { + "database.dbname": "inventory_db", "database.hostname": "localhost", - "database.password": "sdfg", - "database.port": "3306", + "database.password": "${PASSWORD}", + "database.port": "5432", "database.server.id": 123, "database.server.name": "dbserver1", "database.user": "debezium", @@ -12,5 +34,25 @@ "json-with-envelope": "true", "key.converter": "org.apache.kafka.connect.json.JsonConverter", "value.converter": "org.apache.kafka.connect.json.JsonConverter" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" } ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc index c542a82..864ba6a 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc @@ -1,19 +1,41 @@ [source,json] ---- -"configs": { +{ + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", "database.dbname": "cdc_test", "database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory", "database.history.name": "cdc_test_history", "database.history.pulsar.service.url": "pulsar+ssl://pulsar-azure-westus2.streaming.datastax.com:6651", - "database.history.pulsar.token": "sensitive_data_removed", + "database.history.pulsar.token": "${PULSAR_TOKEN}", "database.history.pulsar.topic": "dbz-stream672-history-topic", - "database.hostname": "kalash-server-stream672.database.windows.net", + "database.hostname": "${SERVER_NAME}.database.windows.net", "database.include.list": "cdc_test", "database.names": "cdc_test", - "database.password": "sensitive_data_removed", + "database.password": "${PASSWORD}", "database.port": 1433, - "database.server.name": "kalash-server-stream672", + "database.server.name": "${SERVER_NAME}", "database.ssl": true, "database.ssl.mode": "required", "database.tcpKeepAlive": true, @@ -24,15 +46,35 @@ "include.schema.changes": true, "key.converter": "org.apache.kafka.connect.json.JsonConverter", "name": "dbz-stream672", - "pulsar.auth.token": "sensitive_data_removed", + "pulsar.auth.token": "${PULSAR_TOKEN}", "pulsar.service.url": "pulsar+ssl://pulsar-azure-westus2.streaming.datastax.com:6651", "snapshot.mode": "always", "table.include.list": "dbo.accounts", "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", "task.id": "0", - "topic.namespace": "kalash-stream672/default", - "topic.prefix": "kalash-server-stream672", + "topic.namespace": "${TENANT}/${NAMESPACE}", + "topic.prefix": "${SERVER_NAME}", "typeClassName": "org.apache.pulsar.common.schema.KeyValue", "value.converter": "org.apache.kafka.connect.json.JsonConverter" }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" +} ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc index 8c66af0..7b12d78 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc @@ -1,15 +1,57 @@ [source,json] ---- { - "bootstrapServers": "asdasd", + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { + "bootstrapServers": "${KAFKA_BOOTSTRAP_SERVERS}", "consumerConfigProperties": { - "sasl.jaas.config": "sensitive_data_removed", - "sasl.mechanism": "PLAIN", - "sasl.password": "sensitive_data_removed", - "sasl.username": "asdasd", - "security.protocol": "SASL_SSL" + "sasl.jaas.config": "${JAAS_CONFIG}", + "sasl.mechanism": "PLAIN", + "sasl.password": "${PASSWORD}", + "sasl.username": "${USERNAME}", + "security.protocol": "SASL_SSL" }, - "groupId": "asd", - "topic": "asdasd" + "groupId": "${KAFKA_GROUP_ID}", + "topic": "${KAFKA_TOPIC}" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" } ---- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc index 355298a..df0fc6f 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc @@ -1,6 +1,28 @@ [source,json] ---- { + "topicName": "${TOPIC}", + "producerConfig": { + "maxPendingMessages": 0, + "maxPendingMessagesAcrossPartitions": 0, + "useThreadLocalProducers": true, + "cryptoConfig": { + "cryptoKeyReaderClassName": "string", + "cryptoKeyReaderConfig": { + "property1": {}, + "property2": {} + }, + "encryptionKeys": [ + "string" + ], + "producerCryptoFailureAction": "FAIL", + "consumerCryptoFailureAction": "FAIL" + }, + "batchBuilder": "string" + }, + "serdeClassName": "string", + "schemaType": "string", + "configs": { "awsEndpoint": "https://some.endpoint.aws", "awsRegion": "us-east-1", "awsKinesisStreamName": "my-stream", @@ -12,5 +34,25 @@ "receiveQueueSize": 2000, "initialPositionInStream": "TRIM_HORIZON", "startAtTime": "2020-08-09T19:28:58.000Z" + }, + "secrets": {}, + "parallelism": 1, + "processingGuarantees": "ATLEAST_ONCE", + "resources": { + "cpu": 0.25, + "disk": 1000000000, + "ram": 1000000000 + }, + "archive": "string", + "runtimeFlags": "string", + "customRuntimeOptions": "string", + "batchSourceConfig": { + "discoveryTriggererClassName": "string", + "discoveryTriggererConfig": { + "property1": {}, + "property2": {} + } + }, + "batchBuilder": "string" } ---- \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index fec7dc2..22ed9f1 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -63,10 +63,10 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] These parameters are set in the `configs` section of the connector configuration. -The SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. +The SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. == What's next? -For more on Debezium's SQL Server connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/sqlserver.html[the Debezium documentation]. +For more on Debezium's SQL Server connector, see the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html[the Debezium documentation]. For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-microsoft-sql[{pulsar} SQL Server documentation]. \ No newline at end of file From ea7e0033346371a3da28ef3d148e76ece6f6ac5c Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:23:31 -0800 Subject: [PATCH 19/31] condense source examples --- .../sources/data-generator/curl-create.sh | 11 ------- .../sources/data-generator/curl-update.sh | 10 ------- .../data-generator/pulsar-admin-create.sh | 8 ----- .../data-generator/pulsar-admin-update.sh | 8 ----- .../sources/data-generator/sample-data.adoc | 7 +++-- .../sources/debezium-mongodb/curl-create.sh | 21 ------------- .../sources/debezium-mongodb/curl-update.sh | 21 ------------- .../debezium-mongodb/pulsar-admin-create.sh | 13 -------- .../debezium-mongodb/pulsar-admin-update.sh | 6 ---- .../sources/debezium-mongodb/sample-data.adoc | 7 +++-- .../sources/debezium-mysql/curl-create.sh | 26 ---------------- .../sources/debezium-mysql/curl-update.sh | 26 ---------------- .../debezium-mysql/pulsar-admin-create.sh | 18 ----------- .../debezium-mysql/pulsar-admin-update.sh | 6 ---- .../sources/debezium-mysql/sample-data.adoc | 7 +++-- .../sources/debezium-oracle/curl-create.sh | 30 ------------------- .../sources/debezium-oracle/curl-update.sh | 30 ------------------- .../debezium-oracle/pulsar-admin-create.sh | 22 -------------- .../debezium-oracle/pulsar-admin-update.sh | 6 ---- .../sources/debezium-oracle/sample-data.adoc | 7 +++-- .../sources/debezium-postgres/curl-create.sh | 26 ---------------- .../sources/debezium-postgres/curl-update.sh | 26 ---------------- .../debezium-postgres/pulsar-admin-create.sh | 21 ------------- .../debezium-postgres/pulsar-admin-update.sh | 6 ---- .../debezium-postgres/sample-data.adoc | 12 ++++++-- .../sources/debezium-sqlserver/curl-create.sh | 29 ------------------ .../sources/debezium-sqlserver/curl-update.sh | 29 ------------------ .../debezium-sqlserver/pulsar-admin-create.sh | 21 ------------- .../debezium-sqlserver/pulsar-admin-update.sh | 6 ---- .../debezium-sqlserver/sample-data.adoc | 13 ++++---- .../connectors/sources/kafka/curl-create.sh | 25 ---------------- .../connectors/sources/kafka/curl-update.sh | 25 ---------------- .../sources/kafka/pulsar-admin-create.sh | 17 ----------- .../sources/kafka/pulsar-admin-update.sh | 6 ---- .../connectors/sources/kafka/sample-data.adoc | 7 +++-- .../connectors/sources/kinesis/curl-create.sh | 26 ---------------- .../connectors/sources/kinesis/curl-update.sh | 26 ---------------- .../sources/kinesis/pulsar-admin-create.sh | 18 ----------- .../sources/kinesis/pulsar-admin-update.sh | 6 ---- .../sources/kinesis/sample-data.adoc | 7 +++-- .../connectors/sinks/get-started.adoc | 3 +- .../partials/connectors/sources/edit.adoc | 15 +++++++--- .../connectors/sources/get-started.adoc | 18 +++++++---- 43 files changed, 73 insertions(+), 605 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh delete mode 100644 modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh deleted file mode 100644 index 9c7eb5f..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-create.sh +++ /dev/null @@ -1,11 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "archive": "builtin://data-generator", - "configs": { - "sleepBetweenMessages": "50" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh deleted file mode 100644 index 8e9083f..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/curl-update.sh +++ /dev/null @@ -1,10 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "configs": { - "sleepBetweenMessages": "100" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh deleted file mode 100644 index 5bf2fff..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-create.sh +++ /dev/null @@ -1,8 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type data-generator \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "sleepBetweenMessages": "50" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh deleted file mode 100644 index 1b3cb8e..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/pulsar-admin-update.sh +++ /dev/null @@ -1,8 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type data-generator \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "sleepBetweenMessages": "100" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc index bbc8dde..aae6936 100644 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -33,7 +36,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://data-generator", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh deleted file mode 100644 index 05122be..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-create.sh +++ /dev/null @@ -1,21 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mongodb", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.whitelist": "asdasd", - "mongodb.hosts": "asd", - "mongodb.name": "asdasd", - "mongodb.password": "asd", - "mongodb.task.id": "123", - "mongodb.user": "asd" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh deleted file mode 100644 index 30d1cdf..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/curl-update.sh +++ /dev/null @@ -1,21 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mongodb", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.whitelist": "asdasd", - "mongodb.hosts": "asd", - "mongodb.name": "asdasd", - "mongodb.password": "asd", - "mongodb.task.id": "123", - "mongodb.user": "asd" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh deleted file mode 100644 index 199f0b5..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-create.sh +++ /dev/null @@ -1,13 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type debezium-mongodb \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "database.whitelist": "asdasd", - "mongodb.hosts": "asd", - "mongodb.name": "asdasd", - "mongodb.password": "asd", - "mongodb.task.id": "123", - "mongodb.user": "asd" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh deleted file mode 100644 index def1143..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type debezium-mongodb \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc index 217aed0..e15aec1 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -38,7 +41,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://debezium-mongodb", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh deleted file mode 100644 index 70344de..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-create.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mysql", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "gfgfgf", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh deleted file mode 100644 index d89369f..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/curl-update.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mysql", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "gfgfgf", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh deleted file mode 100644 index c24c4b5..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-create.sh +++ /dev/null @@ -1,18 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type debezium-mysql \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "sensitive_data_removed", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh deleted file mode 100644 index ec707c1..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type debezium-mysql \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc index ece7e9f..fdab97b 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -43,7 +46,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://debezium-mysql", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh deleted file mode 100644 index 4dbcebb..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-create.sh +++ /dev/null @@ -1,30 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-oracle", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.hostname": "localhost", - "database.port": "1521", - "database.user": "dbzuser", - "database.password": "dbz", - "database.dbname": "a-db", - "database.server.name": "my-server", - "schema.exclude.list": "system,dbzuser", - "snapshot.mode": "initial", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.oracle.OracleConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh deleted file mode 100644 index ffa25ca..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/curl-update.sh +++ /dev/null @@ -1,30 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-oracle", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.hostname": "localhost", - "database.port": "1521", - "database.user": "dbzuser", - "database.password": "dbz", - "database.dbname": "a-db", - "database.server.name": "my-server", - "schema.exclude.list": "system,dbzuser", - "snapshot.mode": "initial", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.oracle.OracleConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh deleted file mode 100644 index 72d22a2..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-create.sh +++ /dev/null @@ -1,22 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type debezium-oracle \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "database.hostname": "localhost", - "database.port": "1521", - "database.user": "dbzuser", - "database.password": "dbz", - "database.dbname": "a-db", - "database.server.name": "my-server", - "schema.exclude.list": "system,dbzuser", - "snapshot.mode": "initial", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.oracle.OracleConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh deleted file mode 100644 index d42dced..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type debezium-oracle \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc index 18b86fd..eb8dec7 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -47,7 +50,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://debezium-oracle", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh deleted file mode 100644 index 7e95b2a..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-create.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-postgres", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "sdfg", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh deleted file mode 100644 index c70ad30..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/curl-update.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-postgres", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "sdfg", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh deleted file mode 100644 index d802ee3..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-create.sh +++ /dev/null @@ -1,21 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type debezium-postgres \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "database.dbname": "somedb", - "database.hostname": "localhost", - "database.password": "sensitive_data_removed", - "database.port": 3306, - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "plugin.name": "pgoutput", - "schema.whitelist": "public", - "table.whitelist": "public.users" - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh deleted file mode 100644 index db1970e..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type debezium-postgres \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc index fe7114b..8268ed2 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -33,7 +36,10 @@ "database.whitelist": "inventory", "json-with-envelope": "true", "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "plugin.name": "pgoutput", + "schema.whitelist": "public", + "table.whitelist": "public.users" }, "secrets": {}, "parallelism": 1, @@ -43,7 +49,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://debezium-postgres", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh deleted file mode 100644 index 27bf39a..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-create.sh +++ /dev/null @@ -1,29 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mssql", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.hostname": "localhost", - "database.port": "1433", - "database.user": "sa", - "database.password": "MyP@ssw0rd!", - "database.dbname": "MyTestDB", - "database.server.name": "mssql", - "snapshot.mode": "schema_only", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh deleted file mode 100644 index 13416d7..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/curl-update.sh +++ /dev/null @@ -1,29 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://debezium-mssql", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "database.hostname": "localhost", - "database.port": "1433", - "database.user": "sa", - "database.password": "MyP@ssw0rd!", - "database.dbname": "MyTestDB", - "database.server.name": "mssql", - "snapshot.mode": "schema_only", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - } - }' \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh deleted file mode 100644 index 06be1f1..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-create.sh +++ /dev/null @@ -1,21 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type debezium-mssql \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "database.hostname": "localhost", - "database.port": "1433", - "database.user": "sa", - "database.password": "MyP@ssw0rd!", - "database.dbname": "MyTestDB", - "database.server.name": "mssql", - "snapshot.mode": "schema_only", - "topic.namespace": "'$TENANT'/'$NAMESPACE'", - "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh deleted file mode 100644 index 5d67fa9..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type debezium-mssql \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc index 864ba6a..fd17a4a 100644 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -30,12 +33,12 @@ "database.history.pulsar.service.url": "pulsar+ssl://pulsar-azure-westus2.streaming.datastax.com:6651", "database.history.pulsar.token": "${PULSAR_TOKEN}", "database.history.pulsar.topic": "dbz-stream672-history-topic", - "database.hostname": "${SERVER_NAME}.database.windows.net", + "database.hostname": "sqlserver.database.windows.net", "database.include.list": "cdc_test", "database.names": "cdc_test", "database.password": "${PASSWORD}", "database.port": 1433, - "database.server.name": "${SERVER_NAME}", + "database.server.name": "sqlserver", "database.ssl": true, "database.ssl.mode": "required", "database.tcpKeepAlive": true, @@ -53,7 +56,7 @@ "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", "task.id": "0", "topic.namespace": "${TENANT}/${NAMESPACE}", - "topic.prefix": "${SERVER_NAME}", + "topic.prefix": "sqlserver", "typeClassName": "org.apache.pulsar.common.schema.KeyValue", "value.converter": "org.apache.kafka.connect.json.JsonConverter" }, @@ -65,7 +68,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://debezium-sqlserver", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh deleted file mode 100644 index cc3a3aa..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-create.sh +++ /dev/null @@ -1,25 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://kafka", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "bootstrapServers": "asdasd", - "consumerConfigProperties": { - "sasl.jaas.config": "sensitive_data_removed", - "sasl.mechanism": "PLAIN", - "sasl.password": "sensitive_data_removed", - "sasl.username": "asdasd", - "security.protocol": "SASL_SSL" - }, - "groupId": "asd", - "topic": "asdasd" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh deleted file mode 100644 index 0a3d7a3..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kafka/curl-update.sh +++ /dev/null @@ -1,25 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://kafka", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "bootstrapServers": "asdasd", - "consumerConfigProperties": { - "sasl.jaas.config": "sensitive_data_removed", - "sasl.mechanism": "PLAIN", - "sasl.password": "sensitive_data_removed", - "sasl.username": "asdasd", - "security.protocol": "SASL_SSL" - }, - "groupId": "asd", - "topic": "asdasd" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh deleted file mode 100644 index 780a0c1..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-create.sh +++ /dev/null @@ -1,17 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type kafka \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "bootstrapServers": "asdasd", - "consumerConfigProperties": { - "sasl.jaas.config": "sensitive_data_removed", - "sasl.mechanism": "PLAIN", - "sasl.password": "sensitive_data_removed", - "sasl.username": "asdasd", - "security.protocol": "SASL_SSL" - }, - "groupId": "asd", - "topic": "asdasd" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh deleted file mode 100644 index b24c817..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kafka/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type kafka \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc index 7b12d78..c53dbab 100644 --- a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -42,7 +45,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://kafka", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh deleted file mode 100644 index 1c9bb97..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-create.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X POST "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://kinesis", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "awsEndpoint": "https://some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "applicationName": "My test application", - "checkpointInterval": "30000", - "backoffTime": "4000", - "numRetries": "3", - "receiveQueueSize": 2000, - "initialPositionInStream": "TRIM_HORIZON", - "startAtTime": "2020-08-09T19:28:58.000Z" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh deleted file mode 100644 index 6e8f625..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/curl-update.sh +++ /dev/null @@ -1,26 +0,0 @@ -curl -sS --fail -X PUT "$WEB_SERVICE_URL/admin/v3/astrasources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - -H "accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: $PULSAR_TOKEN" \ - -d '{ - "tenant": "'$TENANT'", - "topicName": "persistent://'$TENANT'/'$NAMESPACE'/'$TOPIC'", - "name": "'$SOURCE_NAME'", - "namespace": "'$NAMESPACE'", - "archive": "builtin://kinesis", - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "configs": { - "awsEndpoint": "https://some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "applicationName": "My test application", - "checkpointInterval": "30000", - "backoffTime": "4000", - "numRetries": "3", - "receiveQueueSize": 2000, - "initialPositionInStream": "TRIM_HORIZON", - "startAtTime": "2020-08-09T19:28:58.000Z" - } - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh deleted file mode 100644 index 0aa74da..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-create.sh +++ /dev/null @@ -1,18 +0,0 @@ -./bin/pulsar-admin sources create \ - --source-type kinesis \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config '{ - "awsEndpoint": "https://some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "applicationName": "My test application", - "checkpointInterval": "30000", - "backoffTime": "4000", - "numRetries": "3", - "receiveQueueSize": 2000, - "initialPositionInStream": "TRIM_HORIZON", - "startAtTime": "2020-08-09T19:28:58.000Z" - }' diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh b/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh deleted file mode 100644 index 103b032..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/pulsar-admin-update.sh +++ /dev/null @@ -1,6 +0,0 @@ -./bin/pulsar-admin sources update \ - --source-type kinesis \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc index df0fc6f..e0c0727 100644 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc @@ -1,7 +1,10 @@ [source,json] ---- { - "topicName": "${TOPIC}", + "tenant": "${TENANT}", + "namespace": "${NAMESPACE}", + "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", + "name": "${SOURCE_NAME}", "producerConfig": { "maxPendingMessages": 0, "maxPendingMessagesAcrossPartitions": 0, @@ -43,7 +46,7 @@ "disk": 1000000000, "ram": 1000000000 }, - "archive": "string", + "archive": "builtin://kinesis", "runtimeFlags": "string", "customRuntimeOptions": "string", "batchSourceConfig": { diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index a026ba1..f044781 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -14,7 +14,8 @@ export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only {company} recommends a memorable, human-readable name that summarizes the connector's purpose. For example: `{connectorType}-sink-prod-us-east-1`. -. Create the connector: +. Create the connector using JSON-formatted connector configuration data. +You can pass the configuration directly or with a configuration file. + .pulsar-admin CLI [source,shell,subs="+attributes"] diff --git a/modules/pulsar-io/partials/connectors/sources/edit.adoc b/modules/pulsar-io/partials/connectors/sources/edit.adoc index d7e4514..0c80a9a 100644 --- a/modules/pulsar-io/partials/connectors/sources/edit.adoc +++ b/modules/pulsar-io/partials/connectors/sources/edit.adoc @@ -7,13 +7,20 @@ Additionally, some parameters can be modified with specific arguments, such as ` To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. .pulsar-admin CLI -[source,shell,subs="attributes+"] +[source,shell,subs="+attributes"] ---- -include::example$connectors/sources/{connectorType}/pulsar-admin-update.sh[] +./bin/pulsar-admin sources update \ + --source-type {connectorType} \ + --name "$SOURCE_NAME" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ + --tenant "$TENANT" \ + --parallelism 2 ---- .{pulsar-short} Admin API -[source,shell,subs="attributes+"] +[source,shell] ---- -include::example$connectors/sources/{connectorType}/curl-update.sh[] +curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ + --form "sourceConfig=@mynetty-source-config.json;type=application/json" ---- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index 9cc06eb..2aef59a 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -14,18 +14,26 @@ export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only {company} recommends a memorable, human-readable name that summarizes the connector's purpose. For example: `{connectorType}-source-prod-us-east-1`. -. Create the connector: +. Create the connector using JSON-formatted connector configuration data. +You can pass the configuration directly or with a configuration file. + .pulsar-admin CLI -[source,shell,subs="attributes+"] +[source,shell,subs="+attributes"] ---- -include::example$connectors/sources/{connectorType}/pulsar-admin-create.sh[] +./bin/pulsar-admin sources create \ + --source-type {connectorType} \ + --name "$SOURCE_NAME" \ + --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ + --tenant "$TENANT" \ + --source-config-file configs.json ---- + .{pulsar-short} Admin API -[source,shell,subs="attributes+"] +[source,shell] ---- -include::example$connectors/sources/{connectorType}/curl-create.sh[] +curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ + --header "Authorization: Bearer $PULSAR_TOKEN" \ + --form "sourceConfig=@mynetty-source-config.json;type=application/json" ---- .Example configuration data structure From bced64b1d3dc59b779dfa18bad8d70fa2e3789d4 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 15:51:42 -0800 Subject: [PATCH 20/31] align section headings on connector ref pages --- modules/pulsar-io/pages/connectors/index.adoc | 12 +- .../pages/connectors/sinks/astra-db.adoc | 282 +++++++++--------- .../pages/connectors/sinks/cloud-storage.adoc | 45 +-- .../connectors/sinks/elastic-search.adoc | 14 +- .../connectors/sinks/google-bigquery.adoc | 22 +- .../connectors/sinks/jdbc-clickhouse.adoc | 15 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 14 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 14 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 14 +- .../pages/connectors/sinks/kafka.adoc | 14 +- .../pages/connectors/sinks/kinesis.adoc | 14 +- .../pages/connectors/sinks/snowflake.adoc | 14 +- .../connectors/sources/data-generator.adoc | 14 +- .../connectors/sources/debezium-mongodb.adoc | 19 +- .../connectors/sources/debezium-mysql.adoc | 21 +- .../connectors/sources/debezium-oracle.adoc | 21 +- .../connectors/sources/debezium-postgres.adoc | 20 +- .../sources/debezium-sqlserver.adoc | 81 ++--- .../pages/connectors/sources/kafka.adoc | 14 +- .../pages/connectors/sources/kinesis.adoc | 14 +- .../connectors/connector-params-intro.adoc | 3 + .../connectors/function-params-tip.adoc | 5 + .../connectors/sinks/astra-config-params.adoc | 14 +- .../sources/astra-config-params.adoc | 15 +- .../sources/debezium-compatibility.adoc | 3 + 25 files changed, 371 insertions(+), 347 deletions(-) create mode 100644 modules/pulsar-io/partials/connectors/connector-params-intro.adoc create mode 100644 modules/pulsar-io/partials/connectors/function-params-tip.adoc create mode 100644 modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index 4c116d1..5bbd812 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -1,7 +1,7 @@ = {pulsar-short} I/O connectors in {product} :navtitle: Available connectors -{product} offers fully-managed versions of https://pulsar.apache.org/docs/en/io-overview/[{pulsar-reg} connectors]. +{product} offers fully-managed versions of https://pulsar.apache.org/docs/en/io-overview/[{pulsar-reg} sink and source connectors]. [IMPORTANT] ==== @@ -16,12 +16,12 @@ [#sink-connectors] == Sink connectors -Sink connectors export data from {pulsar-short} topics to external systems. +Sink connectors export messages from {pulsar-short} topics to external systems. Supported sink connectors:: The following sink connectors are included in {product}: + -* xref:connectors/sinks/astra-db.adoc[AstraDB sink] +* xref:connectors/sinks/astra-db.adoc[{astra-db} and {cass} sink] * xref:connectors/sinks/kafka.adoc[Apache Kafka sink] * xref:connectors/sinks/kinesis.adoc[AWS Kinesis sink] * xref:connectors/sinks/cloud-storage.adoc[Cloud Storage sink] @@ -34,7 +34,7 @@ The following sink connectors are included in {product}: * xref:connectors/sinks/snowflake.adoc[Snowflake sink] Experimental sink connectors:: -The following source connectors are experimental. +The following sink connectors are experimental. They are in development, and they aren't fully supported or tested with {product}. To get access to experimental connectors, contact {support-url}[{company} Support]. + @@ -77,14 +77,14 @@ To get access to experimental connectors, contact {support-url}[{company} Suppor [#source-connectors] == Source connectors -Source connectors ingest data from external systems into {pulsar-short} topics in your {product} tenants. +Source connectors ingest messages from external systems into {pulsar-short} topics. Supported source connectors:: The following source connectors are included in {product}: + * xref:connectors/sources/kafka.adoc[Apache Kafka source] * xref:connectors/sources/kinesis.adoc[AWS Kinesis source] -* xref:connectors/sources/data-generator.adoc[Data Generator source] +* xref:connectors/sources/data-generator.adoc[Data generator source] * xref:connectors/sources/debezium-mongodb.adoc[Debezium MongoDB source] * xref:connectors/sources/debezium-mysql.adoc[Debezium MySQL source] * xref:connectors/sources/debezium-oracle.adoc[Debezium Oracle source] diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 4dee600..92c6a8a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -1,204 +1,188 @@ -= {astra-db} (cassandra-enhanced) += {astra-db} and {cass} :connectorType: cassandra-enhanced -The {astra-db} sink connector reads messages from {pulsar} topics and writes them to {astra-db} databases. +The open-source https://pulsar.apache.org/docs/3.1.x/io-cassandra-sink/[{pulsar-reg} {cass-short} sink connector] (`cassandra`) reads messages from {pulsar} topics and writes them to {cass} databases. -{company} {astra-db} sink connector is based on the open-source xref:pulsar-connector:ROOT:index.adoc[{cass} sink connector for {pulsar-reg}]. -Depending on how you deploy the connector, it can be used to sink topic messages with a table in {astra-db} or a table in a self-managed {cass-short} cluster. -For the complete connector code, see the https://github.com/datastax/pulsar-sink[{company} {pulsar-short} sink connector GitHub repository]. +The xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector] (`{connectorType}`) extends the open-source connector by adding support for {company} product connections. +This includes {astra-db} connections with a Secure Connect Bundle (SCB) and {astra} application token. -You can configure this connector with the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API. -The {astra-ui} provides the most simplified and guided configuration, and it is only suitable for connecting to {astra-db} databases. -With the CLI and API, you must provide the complete configuration programmatically, but you can use these tools to connect to either {astra-db} databases or self-managed {cass-short} clusters. -A {pulsar-short} token is required for all configuration methods. +This means that you can use this sink connector to write messages to tables in {astra-db} or self-managed {cass-short} clusters. -This reference assumes you are connecting to a {cass-short} table using the {pulsar-short} Admin API or CLI. +//Astra Streaming only +You can configure this connector with the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API. +The {astra-ui} provides a guided configuration process, but it is only suitable for connecting to {astra-db} databases. +With the CLI and API, you can connect to {astra-db} or a self-managed {cass-short} cluster. == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] + +[TIP] +==== +The preceding example connects to a self-managed {cass-short} cluster. + +For an {astra-db} example, see <>. + +For all connection parameters, see <>. +==== == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== {cass-short} Connection (`configs`) +=== {company} {pulsar} sink connector parameters (`configs`) + +These parameters are set in the `configs` section. + +The relevant and required parameters depend on whether you are connecting to {astra-db} or a self-managed {cass-short} cluster, as well as the cluster configuration. -These values are provided in the `Configs` area: +[TIP] +==== +The following table includes commonly used parameters. +For all parameters and more information, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. +==== [cols=4] |=== | Name | Required | Default | Description -| auth -| yes -| `{}` -| Refer to the auth properties reference - -| cloud.secureConnectBundle -| yes -| -|Can either be a path to your database's Secure Connect Bundle (SCB) zip or a base64 encoding of the zip provided it in the format `base64:`. - -| compression -| yes -| None -| - -| connectionPoolLocalSize -| yes -| 4 -| - -| ignoreErrors -| yes -| None -| - -| jmx -| yes -| true -| - -| maxConcurrentRequests -| yes -| 500 -| - -| maxNumberOfRecordsInBatch -| yes -| 32 -| - -| queryExecutionTimeout -| yes -| 30 -| - -| task.max -| yes -| 1 -| - -| tasks.max -| yes -| 1 -| - -| topic -| yes -| `{}` -| Refer to the topic properties reference - -| topics -| yes -| -|The topic name to watch -|=== +|`auth` +|Yes +|`{}` +|Contains the xref:pulsar-connector:ROOT:cfgRefPulsarDseConnection.adoc#authentication-parameters[authentication parameters] to connect to the database. -=== Auth Properties +|`cloud.secureConnectBundle` +|Yes for {astra-db} +|`null` +|The path to your {astra-db} database's SCB zip file, or a base64 encoding of the SCB zip file (`base64:**ENCODED_STRING**`). -These values are provided in the `auth` area of the preceding {cass-short} connection parameters: +Only use this parameter for {astra-db} connections. -[cols=3] -|=== -| Name | Required | Default +For self-managed clusters, use `ssl`. -| gssapi -| yes -| `{ "service": "dse" }` +|`compression` +|yes +|`None` +|The compression algorithm to use. -| password -| yes -| +|`connectionPoolLocalSize` +|Yes +|4 +|Number of connections to each node in the local datacenter. -| provider -| yes -| None +|`contactPoints` +|Yes for self-managed clusters +|`[localhost]` +|Either `[localhost]` or a comma-separated list of hostnames or IP addresses for your self-managed {cass-short} cluster nodes. -| username -| yes -| `token` -|=== +If `contactPoints` is set to a list of hosts, then `loadBalancing.localDc` is required. + +If `cloud.secureConnectBundle` is set, then `contactPoints` is ignored. +The contact points are set by the SCB. -=== Topic Properties +|`ignoreErrors` +|Yes +|`None` +|Sets the xref:pulsar-connector:ROOT:cfgPulsarConfigureErrorHandling.adoc[error handling behavior]. -These values are provided in the `topic` area of the preceding {cass-short} connection parameters. +|`jmx` +|Yes +|`true` +|Whether to collect and report metrics using Java Management Extensions (JMX). -Refer to the official documentation for a xref:pulsar-connector:ROOT:cfgRefPulsarDseConnection.adoc[connection properties reference]. +|`maxConcurrentRequests` +|Yes +|`500` +|The maximum number of concurrent requests that can be sent to each connected node. -=== Mapping topic data to table columns +|`maxNumberOfRecordsInBatch` +|Yes +|`32` +|The maximum number of records to include in a batch write to the database. -An essential part of using this sink connector is mapping message values to table columns. -There are many factors that influence how this done and what is possible. +|`queryExecutionTimeout` +|Yes +|`30` +|CQL statement execution timeout limit in seconds. -While the preceding examples showed how to configure the connector in one large command, it is easier to manage this as a separate file. -The following steps explain how to configure the connector using a JSON configuration file with the minimum required values. +|`ssl` +|Depends on cluster configuration +|`{}` +|Contains xref:pulsar-connector:ROOT:cfgRefPulsarDSEConnection.adoc[SSL-encryption parameters] for self-managed clusters with client-to-node encryption enabled. -For a more detailed example of this pattern, see the xref:pulsar-connector:ROOT:pulsarQuickStart.adoc[{pulsar-short} Connector single instance quickstart]. +For {astra-db}, use `cloud.secureConnectBundle`, which includes the SSL encryption configuration. +If `cloud.secureConnectBundle` is set, then `ssl` is ignored. -. Create a file named `configs.json` with the following content: -+ -[source,json,subs="+quotes"] +|`topic` +|Yes +|`{}` +|Contains the <>. + +|`topics` +|Yes +|`[]` +|The names of topics to subscribe to. + +For each topic in `topics`, there must be a corresponding entry in the `topic` section. +|=== + +[#topic] +=== Topic-to-table mapping parameters (`topic`) + +The `topic` section of the `<>` contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping parameters]. + +The mapping determines which table receives messages from a {pulsar-short} topic, and how the message `value` fields are written to the table columns. + +There are many mapping parameters and values to support different write options, value translations, and data formats. + +The following example shows a simplified `configs` object that maps one topic to a table in an {astra-db} database: + +[source,json] ---- -"archive": "builtin://cassandra-enhanced", -"tenant": "${TENANT}", -"namespace": "${NAMESPACE}", -"name": "${SINK_NAME}", -"inputs": ["${TOPIC}"], "configs": { + "auth": { + "username": "token", + "password": "${ASTRA_APPLICATION_TOKEN}" + }, + "cloud.secureConnectBundle": "path/to/scb.zip", "topics": "${TOPIC}", - "cloud.secureConnectBundle": "**SCB**", + // ... + // Other configs parameters + // ... "topic": { "${TOPIC}": { - "**KEYSPACE_NAME**": { - "**TABLE_NAME**": { - **CONNECTION_PROPERTIES**, - "mapping": "**MAPPING_STRING**" + "${KEYSPACE_NAME}": { + "${TABLE_NAME}": { + "mapping": "column1=value.fieldA,column2=value.fieldC,column3=value.fieldG,column8=value.fieldW" + // ... + // Other mapping parameters, such as codec and nullToUnset + // ... } } } } } ---- -+ -Replace the following: -+ -* **SCB**: The path to your database's Secure Connect Bundle (SCB) zip or a base64 encoding of the SCB zip. -* **KEYSPACE_NAME**: The name of the keyspace in your database that contains the table you want to connect to a topic. -* **TABLE_NAME**: The name of the table to connect to a topic. -* **TABLE_CONNECTION_PROPERTIES**: Additional topic-to-table connection properties, if required. -For more information, see xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[]. -* **MAPPING_STRING**: The mapping string for the table columns as a comma-separated list of column names and message value fields. -For example: -+ -[source,text] ----- -symbol=value.symbol, ts=value.ts, exchange=value.exchange, industry=value.industry, name=key, value=value.value ----- -+ -For more mapping examples, see xref:pulsar-connector:ROOT:cfgPulsarMapTopicTable.adoc[Mapping pulsar topics to database tables]. -. Use the `pulsar-admin` CLI to create the connector with your JSON file: -+ -[source,shell] ----- -./bin/pulsar-admin sinks create \ - --name ${SINK_NAME} \ - --classname com.datastax.oss.sink.pulsar.StringCassandraSinkTask \ - --sink-config-file configs.json \ - --sink-type cassandra-enhanced ----- \ No newline at end of file +The `mapping` string is a comma-separated list of table column names and message `value` fields. + +If your connector subscribes to multiple topics, create an entry for each topic in the `topic` section. + +For a more information and examples, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. + +== See also + +* https://github.com/datastax/pulsar-sink[{company} {pulsar} connector GitHub repository] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 6fa1de6..a12e28e 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -13,18 +13,18 @@ The cloud storage system supported are: == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] == Data format types - +//Not sure where to put The Cloud Storage sink connector provides multiple output format options, including JSON (default), Avro, Bytes, or Parquet. There are some limitations for certain formats, as explained in the following sections. @@ -140,16 +140,21 @@ If a message fails to send to a Cloud Storage sink, the connector can send the m To use a dead-letter topic, set `skipFailedMessages` to `false` in the cloud provider config. Then, using either `pulsar-admin` or curl, set `--max-redeliver-count` and `--dead-letter-topic`. -== Astra Streaming parameters for the Cloud Storage sink +== Connector configuration reference + +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] + +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -== Cloud storage provider parameters for the Cloud Storage sink (`configs`) +== Google Cloud Storage parameters (`configs`) +//See if the 3 sections can be combined into 1 table with columns or lists for each provider. -Set your cloud storage provider and other required values in the `configs` area. +Set the following parameters in the `configs` section if you are using Google Cloud Storage. -=== Google Cloud Storage +For other providers, see <> and <>. [cols="2,1,1,3"] |=== @@ -276,16 +281,10 @@ Set your cloud storage provider and other required values in the `configs` area. |When it is set to true, include the topic partition number to the object path. |=== +[#configs-aws] === AWS S3 Storage -The suggested permission policies for AWS S3 are: - -- `s3:AbortMultipartUpload` -- `s3:GetObject*` -- `s3:PutObject*` -- `s3:List*` - -If you don't want to provide a region in the configuration, then enable the `s3:GetBucketLocation` permission policy as well. +Set the following parameters in the `configs` section if you are using AWS S3 Storage: [cols="2,1,1,3"] |=== @@ -294,7 +293,16 @@ If you don't want to provide a region in the configuration, then enable the `s3: |accessKeyId |yes |null -|The Cloud Storage access key ID. It requires permission to write objects. +a|The Cloud Storage access key ID. It requires permission to write objects. + +The suggested permission policies for AWS S3 are: + +- `s3:AbortMultipartUpload` +- `s3:GetObject*` +- `s3:PutObject*` +- `s3:List*` + +If your connector configuration doesn't specify a region, then you must also enable `s3:GetBucketLocation`. |bucket |yes @@ -427,8 +435,11 @@ If you don't want to provide a region in the configuration, then enable the `s3: |When it is set to true, include the topic partition number to the object path. |=== +[#configs-azure] === Azure Blob Storage +Set the following parameters in the `configs` section if you are using Azure Blob Storage: + [cols="2,1,1,3"] |=== |Name |Required |Default |Description diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 7df2197..9da0714 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -15,22 +15,26 @@ For information about the OSS {pulsar} Elasticsearch sink connector, see the htt == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Astra Streaming parameters for the Elasticsearch sink +== Connector configuration reference + +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] + +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -== Elasticsearch parameters for the Elasticsearch sink (`configs`) +=== Elasticsearch sink connector parameters (`configs`) The {product} Elasticsearch sink connector supports all https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[Elasticsearch sink connector properties] provided in the OSS {pulsar} Elasticsearch sink connector. diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index b256e8e..70636de 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -11,29 +11,28 @@ You will notice references to Kafka throughout the configuration. *You don't nee == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -The BigQuery sink has three sets of parameters. -Each set of parameters provides a way to coordinate how data is streamed from {pulsar-short} to BigQuery. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kafka Connect Adapter Configuration (`configs`) +=== Kafka Connect Adapter parameters (`configs`) -These values are provided in the `configs` area. +The parameters in the `configs` section define how data is streamed from {pulsar-short} to BigQuery. For source code for these configuration, see `https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/PulsarKafkaConnectSinkConfig.java[PulsarKafkaConnectSinkConfig.java]`. @@ -74,7 +73,7 @@ Any other value causes an error. | kafkaConnectorConfigProperties | no | `{}` -| A key/value map of config properties to pass to the Kafka connector. See the reference table below. +| A key/value map of config properties to pass to the Kafka connector. See <>. | lingerTimeMs | no @@ -107,7 +106,8 @@ Any other value causes an error. | Pulsar schema does not contain information whether the Schema is optional, Kafka's does. This provides a way to force all primitive schemas to be optional for Kafka. |=== -=== Google BigQuery Configuration (kafkaConnectorConfigProperties) +[#kafkaConnectorConfigProperties] +=== Google BigQuery Configuration (`kafkaConnectorConfigProperties`) These values are provided in the `kafkaConnectorConfigProperties` area. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 51e86a7..2199592 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -1,6 +1,7 @@ = JDBC Clickhouse :connectorType: jdbc-clickhouse +//capitalization of Clickhouse? The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and writes them to JDBC-ClickHouse systems. ClickHouse is an open-source column-oriented database management system for online analytical processing that allows users to generate analytical reports using SQL queries in @@ -10,26 +11,26 @@ real-time. == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Clickhouse (`configs`) +=== JDBC Clickhouse sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 801e3bb..60d9d59 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -11,26 +11,26 @@ Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/doc == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== MariaSQL (`configs`) +=== JDBC MariaDB sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 8565533..e71806d 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -13,26 +13,26 @@ The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (T == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== PostgreSQL (`configs`) +=== JDBC PostgreSQL sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index b7eced9..bb56245 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -15,26 +15,26 @@ SQLite JDBC is a library for accessing and creating SQLite database files in Jav == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== SQLite (`configs`) +=== JDBC SQLite sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 5edf5e3..365b655 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -10,26 +10,26 @@ Kafka. == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kafka (`configs`) +=== Kafka sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index ef46f39..d11c955 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -13,26 +13,26 @@ The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kinesis (`configs`) +=== Kinesis sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index e770c37..b7b9cd1 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -9,26 +9,26 @@ Snowflake automatically manages all parts of the data storage process, including == Create the connector -include::partial$connectors/sinks/get-started.adoc[] +include::pulsar-io:partial$connectors/sinks/get-started.adoc[] == Edit the connector -include::partial$connectors/sinks/edit.adoc[] +include::pulsar-io:partial$connectors/sinks/edit.adoc[] == Manage the connector -include::partial$connectors/sinks/manage.adoc[] +include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support sink connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} sink connector parameters include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Snowflake (`configs`) +=== Snowflake sink connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 946c62f..64f08a0 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -15,26 +15,26 @@ For a reference of the full "Person" class, https://github.com/apache/pulsar/blo == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Data Generator (`configs`) +=== Data generator source connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index df1f9b9..2ee703d 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -7,30 +7,33 @@ Debezium’s MongoDB connector tracks a MongoDB replica set or a MongoDB sharded The connector automatically handles the addition or removal of shards in a sharded cluster, changes in membership of each replica set, elections within each replica set, and the resolution of communications problems. -{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported MongoDB versions, please refer to the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. +[#compatibility] +== Compatibility + +include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium MongoDB (`configs`) +=== Debezium MongoDB source connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 640e728..6b53d21 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -5,30 +5,33 @@ The Debezium MySQL source connector reads data from Debezium MySQL systems and p The Debezium MySQL connector reads the binlog, produces change events for row-level INSERT, UPDATE, and DELETE operations, and emits these change events as messages in an {pulsar-reg} topic. -{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. +[#compatibility] +== Compatibility + +include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium MySQL (`configs`) +=== Debezium MySQL source connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. @@ -36,8 +39,6 @@ The {product} MySQL source connector supports all configuration properties provi == What's next? -For a list of supported MySQL versions, see the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. - For a detailed explanation of Debezium's MySQL connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html[Debezium documentation]. For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-mysql[{pulsar} MySQL documentation]. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 0908318..17c1d48 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -7,37 +7,38 @@ Debezium’s Oracle connector captures and records row-level changes that occur The connector can be configured to emit change events for specific subsets of schemas and tables, or to ignore, mask, or truncate values in specific columns. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. +[#compatibility] +== Compatibility + +include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium Oracle (`configs`) +=== Debezium Oracle source connector parameters (`configs`) The {product} Oracle source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#oracle-connector-properties[Debezium Oracle connector properties] for a complete list. == What's next? -For a list of supported Oracle versions, see the https://debezium.io/releases/{debezium-version}/[Debezium documentation]. - For more on Debezium's Oracle connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/oracle.html[Debezium documentation]. For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-oracle[{pulsar} Oracle documentation]. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index f84410c..c3f58ca 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -5,31 +5,33 @@ The Debezium PostgreSQL source connector reads data from Debezium PostgreSQL sys The PostgreSQL connector produces a change event for every row-level insert, update, and delete operation that it captures, and sends change event records for each table in a separate {pulsar-reg} topic. -{product} currently supports {pulsar} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported PostgreSQL versions, please refer to the -https://debezium.io/releases/{debezium-version}/[Debezium documentation]. +[#compatibility] +== Compatibility + +include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium PostgreSQL (`configs`) +=== Debezium PostgreSQL source connector parameters (`configs`) These parameters are set in the `configs` section of the connector configuration. diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 22ed9f1..02e4772 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -1,25 +1,24 @@ = Debezium SQL Server :connectorType: debezium-sqlserver -The Debezium SQL Server source connector reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. +The https://debezium.io/documentation/reference/stable/connectors/sqlserver.html[Debezium SQL Server source connector] reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. +It is based on the change data capture (CDC) feature available in SQL Server 2016 Service Pack 1 (SP1) and later editions. -The Debezium SQL Server connector is based on the change data capture feature available in SQL Server 2016 Service Pack 1 (SP1) and later editions. +The SQL Server capture process monitors designated databases and tables, and then stores changes into dedicated change tables with stored procedure facades. -The SQL Server capture process monitors designated databases and tables and stores changes into specifically created change tables with stored procedure facades. +[#compatibility] +== Compatibility -{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. For a list of supported SQL Server versions, please refer to the -https://debezium.io/releases/{debezium-version}/[Debezium documentation]. +include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] +[#create-the-connector] == Create the connector -To create a Debezium SQL Server source connector, do the following. -Your deployment's values may differ. +To create a Debezium SQL Server source connector, you must prepare your SQL Server instance and {pulsar-short} topics before creating the connector: -. Create an Azure SQL Server or compatible SQL Server instance with a database and table you want to capture changes from. +. If you don't already have one, create an Azure SQL Server or other compatible SQL Server instance, and then create a database and table to capture changes from. -. Choose a connector name. - -. For Debezium SQL Server source connectors, you must manually create the required topics in your Pulsar namespace, following Debezium's topic naming conventions: +. In your {pulsar-short} namespace, create the following required topics according to the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium topic naming conventions]: + * `**CONNECTOR_NAME**-debezium-history-topic` * `**CONNECTOR_NAME**-debezium-offset-topic` @@ -27,46 +26,58 @@ Your deployment's values may differ. * `**SERVER_NAME**.**DB_NAME**.**TABLE_NAME**` + -You must create these topics manually. -{product} cannot create them automatically. - -. In the source connector configuration, set the `topic.prefix` configuration value to match `database.server.name`. -In the following example configuration, both are set to `kalash-server-stream672`. - -. In the source connector configuration, ensure `task.id` is passed as a string (`"0"`), not an integer (`0`); otherwise, the connector will throw a `NullPointerException`. - -. Set your consumers to subscribe to the `events` topic in your Pulsar namespace to receive change data capture (CDC) events. -This topic contains the change data capture (CDC) events emitted by Debezium for the configured tables. +Replace the following: +-- +* `**CONNECTOR_NAME**`: The name that you want to use for your Debezium SQL Server source connector. +* `**SERVER_NAME**`: The name of your SQL Server instance. +* `**DB_NAME**`: The name of the database you are capturing changes from. +* `**TABLE_NAME**`: The name of the table you are capturing changes from. + +[IMPORTANT] +==== +You must create these topics manually, and the topic names must conform to the Debezium naming conventions. + +{product} cannot create the topics automatically. +==== +-- + +. When you create the source connector, make sure the following `<>` parameters are set correctly: + -For more on Debezium topic naming conventions, see the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium documentation]. +* The `topic.prefix` and `database.server.name` value must be the same. +* The `task.id` value must be a string (`"task.id": "0"`), not an integer (`"task.id": 0`). +If `task.id` is an integer, the connector throws a `NullPointerException`. + +. Set your consumers to subscribe to the `events` topic in your {pulsar-short} namespace to receive CDC events. +This topic contains the CDC events emitted by Debezium for the configured tables. -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium SQL Server (`configs`) - -These parameters are set in the `configs` section of the connector configuration. +=== Debezium SQL Server source connector parameters (`configs`) -The SQL Server source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] for a complete list. +[IMPORTANT] +==== +Make sure you set `topic.prefix`, `database.server.name`, and `task.id` correctly, as explained in <>. +==== -== What's next? +The {product} Debezium SQL Server source connector supports all https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] that are available in the <>. -For more on Debezium's SQL Server connector, see the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html[the Debezium documentation]. +For the OSS {pulsar-short} connector's properties and more configuration examples, see the https://pulsar.apache.org/docs/io-debezium-source[{pulsar} Debezium source connector documentation]. -For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-microsoft-sql[{pulsar} SQL Server documentation]. \ No newline at end of file +Set these properties in the `configs` section of the connector configuration. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 98f444a..d3aed7e 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -9,26 +9,26 @@ For more, see https://pulsar.apache.org/docs/io-kafka-source[{pulsar}'s Kafka so == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Kafka configuration options (`configs`) +=== Kafka source connector parameters (`configs`) These values are provided in the `configs` area: diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index bb2caec..d35c002 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -9,26 +9,26 @@ For more, see https://pulsar.apache.org/docs/io-kinesis-source[{pulsar}'s Kinesi == Create the connector -include::partial$connectors/sources/get-started.adoc[] +include::pulsar-io:partial$connectors/sources/get-started.adoc[] == Edit the connector -include::partial$connectors/sources/edit.adoc[] +include::pulsar-io:partial$connectors/sources/edit.adoc[] == Manage the connector -include::partial$connectors/sources/manage.adoc[] +include::pulsar-io:partial$connectors/sources/manage.adoc[] -== Connector Reference +== Connector configuration reference -There are two sets of parameters that support source connectors. +include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== Astra Streaming +=== {pulsar-short} source connector parameters include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Kinesis configuration options (`configs`) +=== Kinesis source connector parameters (`configs`) These values are provided in the `configs` area: diff --git a/modules/pulsar-io/partials/connectors/connector-params-intro.adoc b/modules/pulsar-io/partials/connectors/connector-params-intro.adoc new file mode 100644 index 0000000..bf7023f --- /dev/null +++ b/modules/pulsar-io/partials/connectors/connector-params-intro.adoc @@ -0,0 +1,3 @@ +To configure {product} {pulsar-short} connectors, you use a combination of common {pulsar-short} parameters and provider-specific parameters. + +Because {product} and the {product} {pulsar-short} connectors are based on a specific version of the open-source {pulsar} project and connectors, some parameters and values might be unsupported or ignored by {product}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/function-params-tip.adoc b/modules/pulsar-io/partials/connectors/function-params-tip.adoc new file mode 100644 index 0000000..58fcc79 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/function-params-tip.adoc @@ -0,0 +1,5 @@ +[TIP] +==== +{pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. +Therefore, some function configuration parameters are also used to configure connectors. +==== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index 8ff2206..c72aba7 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -1,14 +1,10 @@ -[TIP] -==== -A {pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. -Therefore, some function configuration parameters are also used to configure connectors. +include::pulsar-io:partial$connectors/function-params-tip.adoc[] -Additionally, the following table uses the JSON field name for the parameters. -For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] and the specification for `https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[pulsar-admin sinks]`. -==== +The following table lists the {product} {pulsar-short} sink connector configuration parameters by JSON field name. +For the equivalent command line arguments and more information about these parameters, see the following: -The following table uses the field name. -Parameter names are different when passed directly on the command line with the `pulsar-admin` CLI. +* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] +* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[`pulsar-admin sinks` specification] [cols=3] |=== diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc index 4d431d7..5c14e7a 100644 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -1,11 +1,10 @@ -[TIP] -==== -A {pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. -Therefore, some function configuration parameters are also used to configure connectors. +include::pulsar-io:partial$connectors/function-params-tip.adoc[] -Additionally, the following table uses the JSON field name for the parameters. -For the equivalent command line arguments, see the https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] and the specification for `https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[pulsar-admin sources]`. -==== +The following table lists the {product} {pulsar-short} source connector configuration parameters by JSON field name. +For the equivalent command line arguments and more information about these parameters, see the following: + +* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] +* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[`pulsar-admin sources` specification] [cols=3] |=== @@ -116,7 +115,7 @@ This is separate from the {pulsar-short} authentication token and security setti |`topicName` |Yes -|An existing topic in {product} where messages are published. +|An existing topic in your {product} tenant where messages are published. Must be formatted as a full persistent or non-persistent topic name, such as `persistent://$TENANT/$NAMESPACE/$TOPIC`. |`typeClassName` diff --git a/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc b/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc new file mode 100644 index 0000000..88aedeb --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc @@ -0,0 +1,3 @@ +{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. + +For supported database versions, see https://debezium.io/releases/{debezium-version}/[Debezium {debezium-version} compatibility]. \ No newline at end of file From 3557dfae6ce1d7069083030ec6148242f3b88fe7 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:35:09 -0800 Subject: [PATCH 21/31] more alignment --- .../pages/connectors/sinks/astra-db.adoc | 2 +- .../connectors/sinks/elastic-search.adoc | 2 +- .../connectors/sinks/google-bigquery.adoc | 2 +- .../connectors/sinks/jdbc-clickhouse.adoc | 2 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 2 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 2 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 2 +- .../pages/connectors/sinks/kafka.adoc | 2 +- .../pages/connectors/sinks/kinesis.adoc | 2 +- .../pages/connectors/sinks/snowflake.adoc | 2 +- .../connectors/sources/data-generator.adoc | 2 +- .../connectors/sources/debezium-mongodb.adoc | 58 +++++++++++++------ .../connectors/sources/debezium-mysql.adoc | 15 +---- .../connectors/sources/debezium-oracle.adoc | 17 ++---- .../connectors/sources/debezium-postgres.adoc | 14 +---- .../sources/debezium-sqlserver.adoc | 53 +++++++++-------- .../pages/connectors/sources/kafka.adoc | 2 +- .../pages/connectors/sources/kinesis.adoc | 2 +- .../connectors/sinks/get-started.adoc | 2 +- .../connectors/sources/get-started.adoc | 2 +- 20 files changed, 96 insertions(+), 91 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 92c6a8a..9d2dc70 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -45,7 +45,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === {company} {pulsar} sink connector parameters (`configs`) -These parameters are set in the `configs` section. +Set these parameters in the `configs` section of the connector configuration. The relevant and required parameters depend on whether you are connecting to {astra-db} or a self-managed {cass-short} cluster, as well as the cluster configuration. diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 9da0714..d23d578 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -38,4 +38,4 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] The {product} Elasticsearch sink connector supports all https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[Elasticsearch sink connector properties] provided in the OSS {pulsar} Elasticsearch sink connector. -Set these properties in the `configs` section of the connector configuration. \ No newline at end of file +Set these parameters in the `configs` section of the connector configuration. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 70636de..cf8e242 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -109,7 +109,7 @@ Any other value causes an error. [#kafkaConnectorConfigProperties] === Google BigQuery Configuration (`kafkaConnectorConfigProperties`) -These values are provided in the `kafkaConnectorConfigProperties` area. +Set these parameters in the `kafkaConnectorConfigProperties` section of the connector configuration. For the source code for these configurations, see `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 2199592..5d5edf7 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -32,7 +32,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === JDBC Clickhouse sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} JDBC Clickhouse sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 60d9d59..2dd429f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -32,6 +32,6 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === JDBC MariaDB sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index e71806d..3313b08 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === JDBC PostgreSQL sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} JDBC PostgreSQL sink connector supports all configuration properties provided by {pulsar-short}. Refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index bb56245..4ab5da8 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -36,7 +36,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === JDBC SQLite sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 365b655..acf4de1 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -31,7 +31,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Kafka sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} Kafka sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kafka-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index d11c955..44096eb 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Kinesis sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} Kinesis sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kinesis-sink#property[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index b7b9cd1..4315219 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -30,7 +30,7 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] === Snowflake sink connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. The {product} Snowflake sink connector supports all configuration properties provided by {company}. Please refer to the https://github.com/datastax/snowflake-connector#configuration[connector properties] for a complete list. diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 64f08a0..7a8992e 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -36,7 +36,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Data generator source connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. [%header,format=csv,cols="2,1,1,3"] |=== diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index 2ee703d..ff5f78c 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -1,11 +1,15 @@ = Debezium MongoDB :connectorType: debezium-mongodb -The Debezium MongoDB source connector reads data from Debezium MongoDB systems and produces data to {pulsar-short} topics. +The Debezium MongoDB source connector tracks either a MongoDB replica set or a MongoDB sharded cluster for document changes in databases and collections. +It streams those changes as messages to a {pulsar-short} topic. -Debezium’s MongoDB connector tracks a MongoDB replica set or a MongoDB sharded cluster for document changes in databases and collections and records those changes as messages in an {pulsar-reg} topic. +The connector automatically handles the following: -The connector automatically handles the addition or removal of shards in a sharded cluster, changes in membership of each replica set, elections within each replica set, and the resolution of communications problems. +* Addition and removal of shards in a sharded cluster. +* Changes in membership for each replica set. +* Elections within each replica set. +* Resolution of communications issues with replica set members. [#compatibility] == Compatibility @@ -35,21 +39,41 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium MongoDB source connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. +Set these parameters in the `configs` section of the connector configuration. -[%header,format=csv,cols="2,1,1,3"] +[cols=4] |=== -"Name","Required","Default","Description" -"database.whitelist","true","","A list of all databases hosted by this server which is monitored by the connector. This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring." -"mongodb.hosts","true","","The comma-separated list of hostname and port pairs ('host' or 'host:port') of the MongoDB servers in the replica set. If mongodb.members.auto.discover is set to false, prefix with the replica set name (e.g., rs0/localhost:27017)." -"mongodb.name","true","","A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector." -"mongodb.password","true","","Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." -"mongodb.task.id","true","","The taskId of the MongoDB connector that attempts to use a separate task for each replica set." -"mongodb.user","true","","Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." +|Name |Required |Default |Description + +|"database.whitelist","true","","A list of all databases hosted by this server which is monitored by the connector. This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring." +| +| +| + +|"mongodb.hosts","true","","The comma-separated list of hostname and port pairs ('host' or 'host:port') of the MongoDB servers in the replica set. If mongodb.members.auto.discover is set to false, prefix with the replica set name (e.g., rs0/localhost:27017)." +| +| +| + +|"mongodb.name","true","","A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector." +| +| +| + +|"mongodb.password","true","","Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." +| +| +| + +|"mongodb.task.id","true","","The taskId of the MongoDB connector that attempts to use a separate task for each replica set." +| +| +| + +|"mongodb.user","true","","Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." +| +| +| |=== -== What's next? - -For a detailed explanation of Debezium's MongoDB connector, read https://debezium.io/documentation/reference/{debezium-version}/connectors/mongodb.html[the Debezium documentation]. - -Learn more about Debezium's MongoDB connector in the https://pulsar.apache.org/docs/io-debezium-source/#example-of-mongodb[{pulsar} MongoDB documentation]. +For more information, see the documentation for the https://debezium.io/documentation/reference/stable/connectors/mongodb.html[Debezium connector for MongoDB] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 6b53d21..54b77cd 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -1,9 +1,7 @@ = Debezium MySQL :connectorType: debezium-mysql -The Debezium MySQL source connector reads data from Debezium MySQL systems and produces data to {pulsar-short} topics. - -The Debezium MySQL connector reads the binlog, produces change events for row-level INSERT, UPDATE, and DELETE operations, and emits these change events as messages in an {pulsar-reg} topic. +The Debezium MySQL source connector reads the `binlog` from MySQL database servers, produces change events for row-level `INSERT`, `UPDATE`, and `DELETE` operations, and then sends change event messages to {pulsar-short} topics. [#compatibility] == Compatibility @@ -33,13 +31,6 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium MySQL source connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. - -The {product} MySQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#mysql-connector-properties[Debezium MySQL connector properties] for a complete list. - -== What's next? - -For a detailed explanation of Debezium's MySQL connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html[Debezium documentation]. - -For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-mysql[{pulsar} MySQL documentation]. +Set these parameters in the `configs` section of the connector configuration. +Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-connector-properties[Debezium connector for MySQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 17c1d48..8b72b68 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -1,11 +1,10 @@ = Debezium Oracle :connectorType: debezium-oracle -The Debezium Oracle source connector reads data from Debezium Oracle systems and produces data to {pulsar-short} topics. +The Debezium Oracle source connector captures and records row-level changes that occur in databases on Oracle servers, including tables that are added while the connector is running. -Debezium’s Oracle connector captures and records row-level changes that occur in databases on Oracle servers, including tables that are added while the connector is running. - -The connector can be configured to emit change events for specific subsets of schemas and tables, or to ignore, mask, or truncate values in specific columns. +You can configure the connector according to the events and data that you want to stream. +For example, you can configure it to emit change events for a subset of schemas and tables, or configure it to ignore, mask, or truncate values in specific columns. [#compatibility] == Compatibility @@ -35,12 +34,6 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium Oracle source connector parameters (`configs`) -The {product} Oracle source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/mysql.html#oracle-connector-properties[Debezium Oracle connector properties] for a complete list. - -== What's next? - -For more on Debezium's Oracle connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/oracle.html[Debezium documentation]. - -For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-oracle[{pulsar} Oracle documentation]. - +Set these parameters in the `configs` section of the connector configuration. +Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties[Debezium connector for Oracle] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index c3f58ca..82f6d63 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -1,9 +1,7 @@ = Debezium PostgreSQL :connectorType: debezium-postgres -The Debezium PostgreSQL source connector reads data from Debezium PostgreSQL systems and produces data to {pulsar-short} topics. - -The PostgreSQL connector produces a change event for every row-level insert, update, and delete operation that it captures, and sends change event records for each table in a separate {pulsar-reg} topic. +The Debezium PostgreSQL source connector produces a change event for every row-level `INSERT`, `UPDATE`, and `DELETE` operation that it captures, and then it sends change event records for each table to separate {pulsar-short} topics. [#compatibility] == Compatibility @@ -33,12 +31,6 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium PostgreSQL source connector parameters (`configs`) -These parameters are set in the `configs` section of the connector configuration. - -The {product} PostgreSQL source connector supports all configuration properties provided in Debezium's connector. Please refer to https://debezium.io/documentation/reference/{debezium-version}/connectors/postgresql.html#postgresql-connector-properties[Debezium PostgreSQL connector properties] for a complete list. - -== What's next? - -For more on Debezium's PostgreSQL connector, see the https://debezium.io/documentation/reference/{debezium-version}/connectors/postgresql.html[Debezium documentation]. +Set these parameters in the `configs` section of the connector configuration. -For more examples, see the https://pulsar.apache.org/docs/io-debezium-source/#example-of-postgresql[{pulsar} PostgreSQL documentation]. +Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-connector-properties[Debezium connector for PostgreSQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 02e4772..2141035 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -1,7 +1,8 @@ = Debezium SQL Server :connectorType: debezium-sqlserver -The https://debezium.io/documentation/reference/stable/connectors/sqlserver.html[Debezium SQL Server source connector] reads data from Debezium SQL Server systems and produces data to {pulsar-short} topics. +The Debezium SQL Server source connector reads data from Debezium SQL Server databases and tables, and then emits change data event messages to {pulsar-short} topics. + It is based on the change data capture (CDC) feature available in SQL Server 2016 Service Pack 1 (SP1) and later editions. The SQL Server capture process monitors designated databases and tables, and then stores changes into dedicated change tables with stored procedure facades. @@ -14,11 +15,13 @@ include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] [#create-the-connector] == Create the connector -To create a Debezium SQL Server source connector, you must prepare your SQL Server instance and {pulsar-short} topics before creating the connector: +To create a Debezium SQL Server source connector, you must prepare your SQL Server instance and {pulsar-short} topics before creating the connector. + +. If you don't already have one, create a compatible SQL Server instance, such as Microsoft Azure SQL Server. -. If you don't already have one, create an Azure SQL Server or other compatible SQL Server instance, and then create a database and table to capture changes from. +. In your SQL Server instance, select or create a database and table to use as the source of CDC events that the connector will stream to your {pulsar-short} tenant. -. In your {pulsar-short} namespace, create the following required topics according to the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium topic naming conventions]: +. In your {pulsar-short} namespace, create four topics using the following naming convention: + * `**CONNECTOR_NAME**-debezium-history-topic` * `**CONNECTOR_NAME**-debezium-offset-topic` @@ -26,32 +29,31 @@ To create a Debezium SQL Server source connector, you must prepare your SQL Serv * `**SERVER_NAME**.**DB_NAME**.**TABLE_NAME**` + -Replace the following: -- -* `**CONNECTOR_NAME**`: The name that you want to use for your Debezium SQL Server source connector. -* `**SERVER_NAME**`: The name of your SQL Server instance. -* `**DB_NAME**`: The name of the database you are capturing changes from. -* `**TABLE_NAME**`: The name of the table you are capturing changes from. +`**CONNECTOR_NAME**` is the name that you will use for your Debezium SQL Server source connector. + +`**SERVER_NAME**`, `**DB_NAME**`, and `**TABLE_NAME**` are the names of your SQL Server instance, database, and table. -[IMPORTANT] +[WARNING] ==== -You must create these topics manually, and the topic names must conform to the Debezium naming conventions. +You must use these exact topic names because the connector will fail if it can't find the expected topics. +For more information, see https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium SQL Server connector topic names]. -{product} cannot create the topics automatically. +You must create the required topics before you create the connector because the connector cannot create the topics automatically. ==== -- -. When you create the source connector, make sure the following `<>` parameters are set correctly: +. When you create the source connector in the next steps, make sure the following parameters are set correctly: + -* The `topic.prefix` and `database.server.name` value must be the same. -* The `task.id` value must be a string (`"task.id": "0"`), not an integer (`"task.id": 0`). -If `task.id` is an integer, the connector throws a `NullPointerException`. +* The `name` parameter (or the `$SOURCE_NAME` environment variable) must match the `**CONNECTOR_NAME**` you used in the topic names. +* In `<>`, the `topic.prefix` and `database.server.name` must be set to your SQL Server instance name. +* In `<>`, the `task.id` value must be a string (`"task.id": "0"`). If it is an integer (`"task.id": 0`), then the connector throws a `NullPointerException`. + +include::pulsar-io:partial$connectors/sources/get-started.adoc[] . Set your consumers to subscribe to the `events` topic in your {pulsar-short} namespace to receive CDC events. This topic contains the CDC events emitted by Debezium for the configured tables. -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - == Edit the connector include::pulsar-io:partial$connectors/sources/edit.adoc[] @@ -66,18 +68,21 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector parameters +[WARNING] +==== +The `name` parameter must match the connector name you used in the topic names as explained in <>. +==== + include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Debezium SQL Server source connector parameters (`configs`) -[IMPORTANT] +[WARNING] ==== -Make sure you set `topic.prefix`, `database.server.name`, and `task.id` correctly, as explained in <>. +Make sure you set the `topic.prefix`, `database.server.name`, and `task.id` parameters as explained in <>. ==== -The {product} Debezium SQL Server source connector supports all https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium SQL Server connector properties] that are available in the <>. - -For the OSS {pulsar-short} connector's properties and more configuration examples, see the https://pulsar.apache.org/docs/io-debezium-source[{pulsar} Debezium source connector documentation]. +Set these parameters in the `configs` section of the connector configuration. -Set these properties in the `configs` section of the connector configuration. \ No newline at end of file +Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium connector for SQL Server] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index d3aed7e..37ab57f 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -30,7 +30,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Kafka source connector parameters (`configs`) -These values are provided in the `configs` area: +Set these parameters in the `configs` section of the connector configuration. [cols="1,1,1,1,3",options=header] |=== diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index d35c002..61bfab5 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -30,7 +30,7 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] === Kinesis source connector parameters (`configs`) -These values are provided in the `configs` area: +Set these parameters in the `configs` section of the connector configuration. [cols="2,1,1,1,3",options=header] |=== diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index f044781..18d704b 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -35,6 +35,6 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ --header "Authorization: Bearer $PULSAR_TOKEN" \ --form "sinkConfig=@configs.json;type=application/json" ---- - ++ .Example configuration data structure include::example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index 2aef59a..7d5d673 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -35,6 +35,6 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE --header "Authorization: Bearer $PULSAR_TOKEN" \ --form "sourceConfig=@mynetty-source-config.json;type=application/json" ---- - ++ .Example configuration data structure include::example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file From 7ebfb45edcefcf5ef867bd53b7af64691ecf6613 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 19:38:21 -0800 Subject: [PATCH 22/31] cleaning sink and source pages --- modules/pulsar-io/pages/connectors/index.adoc | 6 +-- .../connectors/sinks/elastic-search.adoc | 2 +- .../connectors/sinks/jdbc-clickhouse.adoc | 2 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 2 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 2 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 2 +- .../pages/connectors/sinks/kafka.adoc | 2 +- .../pages/connectors/sinks/kinesis.adoc | 2 +- .../pages/connectors/sinks/snowflake.adoc | 16 ++----- .../connectors/sources/data-generator.adoc | 27 +++++------ .../connectors/sources/debezium-mysql.adoc | 3 +- .../connectors/sources/debezium-oracle.adoc | 3 +- .../connectors/sources/debezium-postgres.adoc | 3 +- .../sources/debezium-sqlserver.adoc | 3 +- .../pages/connectors/sources/kafka.adoc | 37 ++------------ .../pages/connectors/sources/kinesis.adoc | 48 ++----------------- .../sources/debezium-compatibility.adoc | 2 +- 17 files changed, 42 insertions(+), 120 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc index 5bbd812..4ac291e 100644 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ b/modules/pulsar-io/pages/connectors/index.adoc @@ -16,7 +16,7 @@ [#sink-connectors] == Sink connectors -Sink connectors export messages from {pulsar-short} topics to external systems. +Sink connectors export messages from {pulsar-short} topics to external services. Supported sink connectors:: The following sink connectors are included in {product}: @@ -77,14 +77,14 @@ To get access to experimental connectors, contact {support-url}[{company} Suppor [#source-connectors] == Source connectors -Source connectors ingest messages from external systems into {pulsar-short} topics. +Source connectors ingest messages from external services into {pulsar-short} topics. Supported source connectors:: The following source connectors are included in {product}: + * xref:connectors/sources/kafka.adoc[Apache Kafka source] * xref:connectors/sources/kinesis.adoc[AWS Kinesis source] -* xref:connectors/sources/data-generator.adoc[Data generator source] +* xref:connectors/sources/data-generator.adoc[Data Generator source] * xref:connectors/sources/debezium-mongodb.adoc[Debezium MongoDB source] * xref:connectors/sources/debezium-mysql.adoc[Debezium MySQL source] * xref:connectors/sources/debezium-oracle.adoc[Debezium Oracle source] diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index d23d578..05e3b59 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -6,7 +6,7 @@ You can use Elasticsearch to store, search, and manage data for logs, metrics, s The Elasticsearch sink connector reads messages from {pulsar} topics and writes them to https://www.elastic.co/elasticsearch/[Elasticsearch]. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library] to interact with +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library] to interact with Elasticsearch. To understand compatibility between OpenSearch and Elasticsearch, see https://opensearch.org/faq/#q1.8[question 1.8 in the OpenSearch FAQ]. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 5d5edf7..0439ffe 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -7,7 +7,7 @@ The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and write ClickHouse is an open-source column-oriented database management system for online analytical processing that allows users to generate analytical reports using SQL queries in real-time. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 2dd429f..917ed67 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -7,7 +7,7 @@ MariaDB is the open source relational database loved by developers all over the Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. -{product} currently supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. +{product} supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 3313b08..46c4e54 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -9,7 +9,7 @@ It has earned a strong reputation for reliability, feature robustness, and perfo The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (Type 4) that communicates using the PostgreSQL native network protocol. This allows Java programs to connect to a PostgreSQL database using standard, database-independent Java code. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 4ab5da8..61ec3ec 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -11,7 +11,7 @@ SQLite is a C-language library that implements a small, fast, self-contained, hi SQLite JDBC is a library for accessing and creating SQLite database files in Java. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index acf4de1..859213c 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -5,7 +5,7 @@ The Kafka sink connector reads messages from {pulsar} topics and writes them to Apache Kafka(R) is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with Kafka. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 44096eb..dfe059b 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -9,7 +9,7 @@ Amazon Kinesis cost-effectively processes streaming data at any scale, and offer The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers to easily consume and process data from Amazon Kinesis. -{product} currently supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. == Create the connector diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 4315219..23b68d0 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -1,12 +1,11 @@ = Snowflake :connectorType: snowflake -The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake systems. - -A Snowflake database is where an organization's uploaded structured and semi-structured data sets are held for processing and analysis. - +A https://www.snowflake.com/en/[Snowflake] database ingests structured and semi-structured datasets for processing and analysis. Snowflake automatically manages all parts of the data storage process, including organization, structure, metadata, file size, compression, and statistics. +The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake databases. + == Create the connector include::pulsar-io:partial$connectors/sinks/get-started.adoc[] @@ -32,11 +31,4 @@ include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -The {product} Snowflake sink connector supports all configuration properties provided by {company}. Please refer to the https://github.com/datastax/snowflake-connector#configuration[connector -properties] for a complete list. - -== What's next? - -Learn more about Snowflake’s features and capabilities on https://www.snowflake.com/en/[their site]. - -Learn more about {company} {pulsar} Snowflake sink connector https://github.com/datastax/snowflake-connector[here]. \ No newline at end of file +For all supported parameters, examples, and exceptions, see the https://github.com/datastax/snowflake-connector[{company} Snowflake connector GitHub repository]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 7a8992e..d4d5f98 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -1,17 +1,19 @@ = Data Generator :connectorType: data-generator -The Data generator source connector produces messages for testing and persists the messages to {pulsar-short} topics. +Use the Data Generator source connector for testing purposes. -The Data Generator source connector creates fake data on an {pulsar-reg} topic using the https://github.com/Codearte/jfairy[JFAIRY library] to generate a message containing "person" data. +The Data Generator source connector uses the https://github.com/Codearte/jfairy[jFairy library] to stream sample messages to a {pulsar-short} topic. +The sample messages contain simulated `Person` data with fields like `firstName`, `email`, and `telephoneNumber`. -"Person" data includes first and last name, home address, and email address, among other details. +The connector generates data continuously while it is running. +There is no upper limit on the number of messages it can generate. -The connector will produce data indefinitely while it is running. +== Compatibility -{product} currently supports {pulsar} {pulsar-version}, which uses version 0.5.9 of the jfairy library. +{product} supports {pulsar-reg} {pulsar-version}, which uses version 0.5.9 of the jFairy library. -For a reference of the full "Person" class, https://github.com/apache/pulsar/blob/branch-{pulsar-version}/pulsar-io/data-generator/src/main/java/org/apache/pulsar/io/datagenerator/Person.java[view the source]. +For the `Person()` class specification, see the https://github.com/apache/pulsar/blob/branch-{pulsar-version}/pulsar-io/data-generator/src/main/java/org/apache/pulsar/io/datagenerator/Person.java[{pulsar} GitHub repository]. == Create the connector @@ -34,12 +36,9 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Data generator source connector parameters (`configs`) +=== Data Generator source connector parameters (`configs`) -Set these parameters in the `configs` section of the connector configuration. - -[%header,format=csv,cols="2,1,1,3"] -|=== -"Name","Required","Default","Description" -"sleepBetweenMessages ","false","50","How many seconds to sleep between emitting messages" -|=== +In the `configs` section of the connector configuration, the only available parameter is `sleepBetweenMessages`. +This parameter sets the delay between messages generated by the connector. +The default value is `50` milliseconds. +For an uninterrupted stream of messages, set this parameter to `0`. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 54b77cd..c8fb322 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -33,4 +33,5 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-connector-properties[Debezium connector for MySQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file +Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-connector-properties[Debezium connector for MySQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 8b72b68..891c9d2 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -36,4 +36,5 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties[Debezium connector for Oracle] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file +Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties[Debezium connector for Oracle] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 82f6d63..d2a9667 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -33,4 +33,5 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-connector-properties[Debezium connector for PostgreSQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file +Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-connector-properties[Debezium connector for PostgreSQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 2141035..0cf686f 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -85,4 +85,5 @@ Make sure you set the `topic.prefix`, `database.server.name`, and `task.id` para Set these parameters in the `configs` section of the connector configuration. -Supported parameters include all properties provided in the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium connector for SQL Server] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] with the exception of properties that aren't available in the <>. \ No newline at end of file +Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium connector for SQL Server] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 37ab57f..9ee6823 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -1,11 +1,7 @@ = Kafka :connectorType: kafka -The Kafka source connector reads data from Kafka systems and produces data to {pulsar-short} topics. - -The Kafka source connector pulls data from a Kafka topic and persists the data into an {pulsar-reg} topic. - -For more, see https://pulsar.apache.org/docs/io-kafka-source[{pulsar}'s Kafka source documentation]. +The Kafka source connector pulls data from Kafka topics and persists it to {pulsar-short} topics. == Create the connector @@ -32,32 +28,5 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -[cols="1,1,1,1,3",options=header] -|=== -|*Name* -|*Type* -|*Required* -|*Default* -|*Description* - -| `bootstrapServers` |String| true | " " (empty string) | A comma-separated list of host and port pairs for establishing the initial connection to the Kafka cluster. -| `groupId` |String| true | " " (empty string) | A unique string that identifies the group of consumer processes to which this consumer belongs. -| `fetchMinBytes` | long|false | 1 | The minimum byte expected for each fetch response. -| `autoCommitEnabled` | boolean |false | true | If set to true, the consumer's offset is periodically committed in the background. + -This committed offset is used when the process fails as the position from which a new consumer begins. -| `autoCommitIntervalMs` | long|false | 5000 | The frequency in milliseconds that the consumer offsets are auto-committed to Kafka if `autoCommitEnabled` is set to true. -| `heartbeatIntervalMs` | long| false | 3000 | The interval between heartbeats to the consumer when using Kafka's group management facilities. + -**Note: `heartbeatIntervalMs` must be smaller than `sessionTimeoutMs`**. -| `sessionTimeoutMs` | long|false | 30000 | The timeout used to detect consumer failures when using Kafka's group management facility. -| `topic` | String|true | " " (empty string)| The Kafka topic that sends messages to {pulsar-short}. -| `consumerConfigProperties` | Map| false | " " (empty string) | The consumer configuration properties to be passed to consumers. + -**Note: other properties specified in the connector configuration file take precedence over this configuration**. -| `keyDeserializationClass` | String|false | org.apache.kafka.common.serialization.StringDeserializer | The deserializer class for Kafka consumers to deserialize keys. + -The deserializer is set by a specific implementation of https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java[`KafkaAbstractSource`]. -| `valueDeserializationClass` | String|false | org.apache.kafka.common.serialization.ByteArrayDeserializer | The deserializer class for Kafka consumers to deserialize values. -| `autoOffsetReset` | String | false | earliest | The default offset reset policy. - -|=== - -The {product} Kafka source connector supports all configuration properties provided by {pulsar}. -For a complete list, see the https://pulsar.apache.org/docs/io-kafka-source#property[Kafka source connector properties]. +Generally, all properties provided in the https://pulsar.apache.org/docs/io-kafka-source[OSS {pulsar} Kafka source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 61bfab5..2018325 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -1,11 +1,7 @@ = Kinesis :connectorType: kinesis -The AWS Kinesis source connector reads data from Kinesis systems and produces data to {pulsar-short} topics. - -The Kinesis source connector pulls data from Amazon Kinesis and persists data into an {pulsar-reg} topic. - -For more, see https://pulsar.apache.org/docs/io-kinesis-source[{pulsar}'s Kinesis source documentation]. +The https://pulsar.apache.org/docs/io-kinesis-source[Kinesis source connector] pulls data from Amazon Kinesis and persists it to {pulsar-short} topics. == Create the connector @@ -32,43 +28,5 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these parameters in the `configs` section of the connector configuration. -[cols="2,1,1,1,3",options=header] -|=== -|*Name* -|*Type* -|*Required* -|*Default* -|*Description* - -|`initialPositionInStream`|InitialPositionInStream|false|LATEST|The position where the connector starts from. Below are the available options: + -* `AT_TIMESTAMP`: start from the record at or after the specified timestamp. + -* `LATEST`: start after the most recent data record. + -* `TRIM_HORIZON`: start from the oldest available data record. -|`startAtTime`|Date|false|" " (empty string)|If set to `AT_TIMESTAMP`, it specifies the point in time to start consumption. -|`applicationName`|String|false|{pulsar-short} IO connector|The name of the Amazon Kinesis application. + -By default, the application name is included in the user agent string used to make AWS requests. This can assist with troubleshooting, for example, distinguish requests made by separate connector instances. -|`checkpointInterval`|long|false|60000|The frequency of the Kinesis stream checkpoint in milliseconds. -|`backoffTime`|long|false|3000|The amount of time to delay between requests when the connector encounters a throttling exception from AWS Kinesis in milliseconds. -|`numRetries`|int|false|3|The number of re-attempts when the connector encounters an exception while trying to set a checkpoint. -|`receiveQueueSize`|int|false|1000|The maximum number of AWS records that can be buffered inside the connector. + -Once the `receiveQueueSize` is reached, the connector does not consume any messages from Kinesis until some messages in the queue are successfully consumed. -|`dynamoEndpoint`|String|false|" " (empty string)|The Dynamo end-point URL, which can be found at https://docs.aws.amazon.com/general/latest/gr/rande.html[here]. -|`cloudwatchEndpoint`|String|false|" " (empty string)|The Cloudwatch end-point URL, which can be found at https://docs.aws.amazon.com/general/latest/gr/rande.html[here]. -|`useEnhancedFanOut`|boolean|false|true|If set to true, it uses Kinesis enhanced fan-out. +If set to false, it uses polling. -|`awsEndpoint`|String|false|" " (empty string)|The Kinesis end-point URL, which can be found at https://docs.aws.amazon.com/general/latest/gr/rande.html[here]. -|`awsRegion`|String|false|" " (empty string)|The AWS region. **Example** `us-west-1`, `us-west-2` -|`awsKinesisStreamName`|String|true|" " (empty string)|The Kinesis stream name. -|`awsCredentialPluginParam`|String |false|" " (empty string)|The JSON parameter to initialize `awsCredentialsProviderPlugin`. -|`awsCredentialPluginName`|String|false|" " (empty string)|The fully-qualified class name of implementation of {@inject: github:AwsCredentialProviderPlugin:/pulsar-io/aws/src/main/java/org/apache/pulsar/io/aws/AwsCredentialProviderPlugin.java} + -`awsCredentialProviderPlugin` has the following built-in plugs: + -`org.apache.pulsar.io.kinesis.AwsDefaultProviderChainPlugin`: this plugin uses the default AWS provider chain. For more information, see https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default[using the default credential provider chain]. + -`org.apache.pulsar.io.kinesis.STSAssumeRoleProviderPlugin`: this plugin takes a configuration via the `awsCredentialPluginParam` that describes a role to assume when running the KCL. + -**JSON configuration example** + -`{"roleArn": "arn...", "roleSessionName": "name"}` + -`awsCredentialPluginName` is a factory class which creates an AWSCredentialsProvider that is used by Kinesis sink. + -If `awsCredentialPluginName` set to empty, the Kinesis sink creates a default AWSCredentialsProvider which accepts json-map of credentials in `awsCredentialPluginParam`. - -|=== - -The {product} Kinesis source connector supports all configuration properties provided by {pulsar}. -For a complete list, see the https://pulsar.apache.org/docs/io-kinesis-source#configuration[Kinesis source connector properties]. +Generally, all properties provided in the https://pulsar.apache.org/docs/io-kinesis-source[OSS {pulsar} Kinesis source connector] are supported. +Exceptions include parameters that aren't relevant to {product}, and parameters that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc b/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc index 88aedeb..de79b3b 100644 --- a/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc +++ b/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc @@ -1,3 +1,3 @@ -{product} currently supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. +{product} supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. For supported database versions, see https://debezium.io/releases/{debezium-version}/[Debezium {debezium-version} compatibility]. \ No newline at end of file From 3c4732064c72a27dcfdaf4d36285e7369f443642 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:17:15 -0800 Subject: [PATCH 23/31] clean another batch of pages --- .../sinks/jdbc-clickhouse/sample-data.adoc | 3 +- .../pages/connectors/sinks/astra-db.adoc | 30 +++++++++---------- .../pages/connectors/sinks/cloud-storage.adoc | 12 ++++---- .../connectors/sinks/elastic-search.adoc | 22 +++++++------- .../connectors/sinks/google-bigquery.adoc | 10 +++---- .../connectors/sinks/jdbc-clickhouse.adoc | 27 +++++------------ .../pages/connectors/sinks/jdbc-mariadb.adoc | 17 +++++------ .../pages/connectors/sinks/jdbc-postgres.adoc | 27 ++++++----------- .../pages/connectors/sinks/jdbc-sqllite.adoc | 27 +++++------------ .../pages/connectors/sinks/kafka.adoc | 23 ++++++-------- .../pages/connectors/sinks/kinesis.adoc | 26 +++++++--------- .../pages/connectors/sinks/snowflake.adoc | 10 +++---- .../connectors/sources/data-generator.adoc | 11 +++---- .../connectors/sources/debezium-mongodb.adoc | 6 ++-- .../connectors/sources/debezium-mysql.adoc | 8 ++--- .../connectors/sources/debezium-oracle.adoc | 8 ++--- .../connectors/sources/debezium-postgres.adoc | 8 ++--- .../sources/debezium-sqlserver.adoc | 16 +++++----- .../pages/connectors/sources/kafka.adoc | 10 +++---- .../pages/connectors/sources/kinesis.adoc | 10 +++---- .../connectors/connector-params-intro.adoc | 4 +-- .../connectors/function-params-tip.adoc | 2 +- .../connectors/sinks/astra-config-params.adoc | 6 ++-- .../partials/connectors/sinks/edit.adoc | 4 +-- .../connectors/sinks/jdbc-config-params.adoc | 2 ++ .../sources/astra-config-params.adoc | 6 ++-- .../partials/connectors/sources/edit.adoc | 4 +-- 27 files changed, 147 insertions(+), 192 deletions(-) create mode 100644 modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc index 83f13e8..a6f8059 100644 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc @@ -57,7 +57,8 @@ "userName": "clickhouse", "password": "${PASSWORD}", "jdbcUrl": "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink", - "tableName": "pulsar_clickhouse_jdbc_sink" + "tableName": "pulsar_clickhouse_jdbc_sink", + "useTransactions": "false" }, "secrets": {}, "parallelism": 1, diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 9d2dc70..011c422 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -1,7 +1,7 @@ = {astra-db} and {cass} :connectorType: cassandra-enhanced -The open-source https://pulsar.apache.org/docs/3.1.x/io-cassandra-sink/[{pulsar-reg} {cass-short} sink connector] (`cassandra`) reads messages from {pulsar} topics and writes them to {cass} databases. +The open-source https://pulsar.apache.org/docs/3.1.x/io-cassandra-sink/[{pulsar-reg} {cass-short} sink connector] (`cassandra`) reads messages from {pulsar-short} topics and writes them to {cass} databases. The xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector] (`{connectorType}`) extends the open-source connector by adding support for {company} product connections. This includes {astra-db} connections with a Secure Connect Bundle (SCB) and {astra} application token. @@ -23,7 +23,7 @@ The preceding example connects to a self-managed {cass-short} cluster. For an {astra-db} example, see <>. -For all connection parameters, see <>. +For all connection properties, see <>. ==== == Edit the connector @@ -38,21 +38,21 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== {company} {pulsar} sink connector parameters (`configs`) +=== {company} {pulsar} sink connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. -The relevant and required parameters depend on whether you are connecting to {astra-db} or a self-managed {cass-short} cluster, as well as the cluster configuration. +The relevant and required properties depend on whether you are connecting to {astra-db} or a self-managed {cass-short} cluster, as well as the cluster configuration. [TIP] ==== -The following table includes commonly used parameters. -For all parameters and more information, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. +The following table includes commonly used properties. +For all properties and more information, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. ==== [cols=4] @@ -69,7 +69,7 @@ For all parameters and more information, see the xref:pulsar-connector:ROOT:inde |`null` |The path to your {astra-db} database's SCB zip file, or a base64 encoding of the SCB zip file (`base64:**ENCODED_STRING**`). -Only use this parameter for {astra-db} connections. +Only use this property for {astra-db} connections. For self-managed clusters, use `ssl`. @@ -129,7 +129,7 @@ If `cloud.secureConnectBundle` is set, then `ssl` is ignored. |`topic` |Yes |`{}` -|Contains the <>. +|Contains the <>. |`topics` |Yes @@ -140,13 +140,13 @@ For each topic in `topics`, there must be a corresponding entry in the `topic` s |=== [#topic] -=== Topic-to-table mapping parameters (`topic`) +=== Topic-to-table mapping properties (`topic`) -The `topic` section of the `<>` contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping parameters]. +The `topic` section of the `<>` contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping properties]. The mapping determines which table receives messages from a {pulsar-short} topic, and how the message `value` fields are written to the table columns. -There are many mapping parameters and values to support different write options, value translations, and data formats. +There are many mapping properties and values to support different write options, value translations, and data formats. The following example shows a simplified `configs` object that maps one topic to a table in an {astra-db} database: @@ -160,7 +160,7 @@ The following example shows a simplified `configs` object that maps one topic to "cloud.secureConnectBundle": "path/to/scb.zip", "topics": "${TOPIC}", // ... - // Other configs parameters + // Other configs properties // ... "topic": { "${TOPIC}": { @@ -168,7 +168,7 @@ The following example shows a simplified `configs` object that maps one topic to "${TABLE_NAME}": { "mapping": "column1=value.fieldA,column2=value.fieldC,column3=value.fieldG,column8=value.fieldW" // ... - // Other mapping parameters, such as codec and nullToUnset + // Other topic properties, such as codec and nullToUnset // ... } } diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index a12e28e..0e97dbb 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -1,7 +1,7 @@ = Cloud Storage :connectorType: cloud-storage -The Cloud Storage sink connector reads messages from {pulsar} topics and writes them to Cloud Storage systems. +The Cloud Storage sink connector reads messages from {pulsar-short} topics and writes them to Cloud Storage systems. Each public cloud has different ways of persisting data to their storage systems. Each cloud has their own way of formatting and storing the bytes. The Cloud Storage sink connector is a general interface to a chosen cloud storage, that exports data from a {pulsar-short} topic to the given system following a desired format. @@ -144,15 +144,15 @@ Then, using either `pulsar-admin` or curl, set `--max-redeliver-count` and `--de include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -== Google Cloud Storage parameters (`configs`) +== Google Cloud Storage properties (`configs`) //See if the 3 sections can be combined into 1 table with columns or lists for each provider. -Set the following parameters in the `configs` section if you are using Google Cloud Storage. +Set the following properties in the `configs` section if you are using Google Cloud Storage. For other providers, see <> and <>. @@ -284,7 +284,7 @@ For other providers, see <> and <>. [#configs-aws] === AWS S3 Storage -Set the following parameters in the `configs` section if you are using AWS S3 Storage: +Set the following properties in the `configs` section if you are using AWS S3 Storage: [cols="2,1,1,3"] |=== @@ -438,7 +438,7 @@ If your connector configuration doesn't specify a region, then you must also ena [#configs-azure] === Azure Blob Storage -Set the following parameters in the `configs` section if you are using Azure Blob Storage: +Set the following properties in the `configs` section if you are using Azure Blob Storage: [cols="2,1,1,3"] |=== diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index 05e3b59..a64a4fc 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -1,17 +1,14 @@ = Elasticsearch :connectorType: elastic_search -Elasticsearch is the distributed, RESTful search and analytics engine at the heart of the Elastic Stack. -You can use Elasticsearch to store, search, and manage data for logs, metrics, search backend, application monitoring, and endpoint security. +The Elasticsearch sink connector reads messages from {pulsar-short} topics and writes them to https://www.elastic.co/elasticsearch/[Elasticsearch]. -The Elasticsearch sink connector reads messages from {pulsar} topics and writes them to https://www.elastic.co/elasticsearch/[Elasticsearch]. +[#compatibility] +== Compatibility -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library] to interact with -Elasticsearch. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library]. -To understand compatibility between OpenSearch and Elasticsearch, see https://opensearch.org/faq/#q1.8[question 1.8 in the OpenSearch FAQ]. - -For information about the OSS {pulsar} Elasticsearch sink connector, see the https://pulsar.apache.org/docs/io-elasticsearch-sink/[{pulsar-short} documentation]. +For information about compatibility between OpenSearch and Elasticsearch, see the https://opensearch.org/faq[OpenSearch FAQ]. == Create the connector @@ -29,13 +26,14 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Elasticsearch sink connector parameters (`configs`) +=== Elasticsearch sink connector properties (`configs`) -The {product} Elasticsearch sink connector supports all https://pulsar.apache.org/docs/io-elasticsearch-sink/#property[Elasticsearch sink connector properties] provided in the OSS {pulsar} Elasticsearch sink connector. +Set these properties in the `configs` section of the connector configuration. -Set these parameters in the `configs` section of the connector configuration. \ No newline at end of file +Generally, all properties provided in the https://pulsar.apache.org/docs/io-elasticsearch-sink[OSS {pulsar} Elasticsearch sink connector] are supported. +Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index cf8e242..b02e66c 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -1,7 +1,7 @@ = Google BigQuery :connectorType: bigquery -The Google BigQuery sink connector reads messages from {pulsar} topics and writes them to BigQuery systems. +The Google BigQuery sink connector reads messages from {pulsar-short} topics and writes them to BigQuery systems. https://cloud.google.com/bigquery[Google BigQuery] is a fully managed enterprise data warehouse that helps you manage and analyze your data with built-in features like machine learning, geospatial analysis, and business intelligence. BigQuery's serverless architecture lets you use SQL queries to answer your organization's biggest questions with zero infrastructure management. BigQuery's scalable, distributed analysis engine lets you query terabytes in seconds and petabytes in minutes. @@ -25,14 +25,14 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kafka Connect Adapter parameters (`configs`) +=== Kafka Connect Adapter properties (`configs`) -The parameters in the `configs` section define how data is streamed from {pulsar-short} to BigQuery. +The properties in the `configs` section define how data is streamed from {pulsar-short} to BigQuery. For source code for these configuration, see `https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/PulsarKafkaConnectSinkConfig.java[PulsarKafkaConnectSinkConfig.java]`. @@ -109,7 +109,7 @@ Any other value causes an error. [#kafkaConnectorConfigProperties] === Google BigQuery Configuration (`kafkaConnectorConfigProperties`) -Set these parameters in the `kafkaConnectorConfigProperties` section of the connector configuration. +Set these properties in the `kafkaConnectorConfigProperties` section of the connector configuration. For the source code for these configurations, see `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 0439ffe..98f699a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -1,13 +1,12 @@ -= JDBC Clickhouse += JDBC ClickHouse :connectorType: jdbc-clickhouse -//capitalization of Clickhouse? -The JDBC-ClickHouse sink connector reads messages from {pulsar} topics and writes them to JDBC-ClickHouse systems. +You can use the JDBC ClickHouse sink connector to stream data from {pulsar-short} topics into https://clickhouse.com/[ClickHouse] tables. -ClickHouse is an open-source column-oriented database management system for online analytical processing that allows users to generate analytical reports using SQL queries in -real-time. +[#compatibility] +== Compatibility -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[Clickhouse 0.3.2 library] to interact with Clickhouse. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[ClickHouse 0.3.2 library]. == Create the connector @@ -25,21 +24,11 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== JDBC Clickhouse sink connector parameters (`configs`) +=== JDBC ClickHouse sink connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. - -The {product} JDBC Clickhouse sink connector supports all configuration properties provided by {pulsar}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector -properties] -for a complete list. - -== What's next? - -Learn more about Clickhouse's features and capabilities on https://clickhouse.com/[their site]. - -Learn more about {pulsar-short}'s JDBC sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. \ No newline at end of file +include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 917ed67..1de8952 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -1,13 +1,12 @@ = JDBC MariaDB :connectorType: jdbc-mariadb -The JDBC-MariaDB sink connector reads messages from {pulsar} topics and writes them to JDBC-MariaDB systems. +You can use the JDBC MariaDB sink connector to stream data from {pulsar-short} topics into https://mariadb.org/[MariaDB] tables. -MariaDB is the open source relational database loved by developers all over the world. Created by MySQL’s original developers, MariaDB is compatible with MySQL and guaranteed to stay open source forever. MariaDB powers some of the world’s most popular websites such as Wikipedia and WordPress.com. It is also the core engine behind banking, social media, mobile and e-commerce sites worldwide. MariaDB Connector/J is a Type 4 JDBC driver. It was developed specifically as a lightweight JDBC connector for use with MariaDB and MySQL database servers. It was originally based on the Drizzle JDBC code with numerous additions and bug fixes. Learn more about MariaDB on https://mariadb.org/[their site]. +[#compatibility] +== Compatibility -Read more about {pulsar-reg}'s JDBC sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. - -{product} supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library] to interact with MariaDB. +{product} supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library]. == Create the connector @@ -25,13 +24,11 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== JDBC MariaDB sink connector parameters (`configs`) - -Set these parameters in the `configs` section of the connector configuration. +=== JDBC MariaDB sink connector properties (`configs`) -The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector properties] for a complete list. \ No newline at end of file +include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 46c4e54..785b633 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -1,15 +1,15 @@ = JDBC PostgreSQL :connectorType: jdbc-postgres -The JDBC-PostgreSQL sink connector reads messages from {pulsar} topics and writes them to JDBC-PostgreSQL systems. +You can use the JDBC PostgreSQL sink connector to stream data from {pulsar-short} topics into https://www.postgresql.org/[PostgreSQL] tables. -PostgreSQL is a powerful, open source, object-relational database system with over 30 years of active development. +[#compatibility] +== Compatibility -It has earned a strong reputation for reliability, feature robustness, and performance. +The PostgreSQL JDBC driver is an open-source JDBC driver written in Pure Java (Type 4) that communicates using the PostgreSQL native network protocol. +This allows Java programs to connect to a PostgreSQL database using standard, database-independent Java code. -The PostgreSQL JDBC Driver is an open source JDBC driver written in Pure Java (Type 4) that communicates using the PostgreSQL native network protocol. This allows Java programs to connect to a PostgreSQL database using standard, database-independent Java code. - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library] to interact with PostgreSQL. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library]. == Create the connector @@ -27,20 +27,11 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== JDBC PostgreSQL sink connector parameters (`configs`) - -Set these parameters in the `configs` section of the connector configuration. - -The {product} JDBC PostgreSQL sink connector supports all configuration properties provided by {pulsar-short}. Refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector -properties] for a complete list. - -== What's next? - -Learn more about PostgreSQL on https://www.postgresql.org/[their site]. +=== JDBC PostgreSQL sink connector properties (`configs`) -Read more about {pulsar-short}'s PostgreSQL sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. \ No newline at end of file +include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index 61ec3ec..a9a3f22 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -1,17 +1,14 @@ = JDBC SQLite :connectorType: jdbc-sqlite -The JDBC-SQLite sink connector reads messages from {pulsar} topics and writes them to JDBC-SQLite systems. +You can use the JDBC SQLite sink connector to stream data from {pulsar-short} topics into https://www.sqlite.org/index.html[SQLite] tables. -SQLite is the most used database engine in the world. - -SQLite is built into all mobile phones, most computers, and comes bundled inside countless other everyday applications. - -SQLite is a C-language library that implements a small, fast, self-contained, highly-reliable, fully-featured, SQL database engine. +[#compatibility] +== Compatibility SQLite JDBC is a library for accessing and creating SQLite database files in Java. -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial 3.8.11.2 library] to interact with SQLite. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial SQLite JDBC 3.8.11.2 library]. == Create the connector @@ -29,21 +26,11 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== JDBC SQLite sink connector parameters (`configs`) - -Set these parameters in the `configs` section of the connector configuration. - -The {product} JDBC MariaDB sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-jdbc-sink#property[connector -properties] -for a complete list. - -== What's next? - -Learn more about SQLite on https://www.sqlite.org/index.html[their site]. +=== JDBC SQLite sink connector properties (`configs`) -Learn more about {pulsar-short}'s JDBC sink connector https://pulsar.apache.org/docs/io-jdbc-sink[here]. \ No newline at end of file +include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index 859213c..fefd904 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -1,12 +1,12 @@ = Kafka :connectorType: kafka -The Kafka sink connector reads messages from {pulsar} topics and writes them to Kafka systems. +The Kafka sink connector reads messages from {pulsar-short} topics and writes them to https://kafka.apache.org/[Kafka] topics. -Apache Kafka(R) is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. +[#compatibility] +== Compatibility -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library] to interact with -Kafka. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library]. == Create the connector @@ -24,19 +24,14 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kafka sink connector parameters (`configs`) +=== Kafka sink connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. -The {product} Kafka sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kafka-sink#property[connector properties] for a complete list. - -== What's next? - -Learn more about Kafka’s features and capabilities on https://kafka.apache.org/[their site]. - -Learn more about {pulsar-short}'s Kafka sink connector https://pulsar.apache.org/docs/io-kafka-sink[here]. \ No newline at end of file +Generally, all properties provided in the https://pulsar.apache.org/docs/io-kafka-sink[OSS {pulsar} Kafka sink connector] are supported. +Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index dfe059b..877b642 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -1,15 +1,14 @@ = Kinesis :connectorType: kinesis -The Kinesis sink connector reads messages from {pulsar} topics and writes them to Kinesis systems. +The Kinesis sink connector reads messages from {pulsar-short} topics and writes them to https://aws.amazon.com/kinesis/[Amazon Kinesis]. -Amazon Kinesis collects, processes, and analyzes real-time streaming data for timely insights and quick reactions to new information. +[#compatibility] +== Compatibility -Amazon Kinesis cost-effectively processes streaming data at any scale, and offers the flexibility to choose the tools that best suit your application's requirements. +The Amazon Kinesis Client Library for Java (Amazon KCL) is used to consume and process data from Amazon Kinesis in Java applications. -The Amazon Kinesis Client Library for Java (Amazon KCL) enables Java developers to easily consume and process data from Amazon Kinesis. - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library] to interact with Kinesis. +{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis Client 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library]. == Create the connector @@ -27,19 +26,14 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Kinesis sink connector parameters (`configs`) - -Set these parameters in the `configs` section of the connector configuration. - -The {product} Kinesis sink connector supports all configuration properties provided by {pulsar-short}. Please refer to the https://pulsar.apache.org/docs/io-kinesis-sink#property[connector properties] for a complete list. - -== What's next? +=== Kinesis sink connector properties (`configs`) -Learn more about Kinesis’s features and capabilities on https://aws.amazon.com/kinesis/[their site]. +Set these properties in the `configs` section of the connector configuration. -Learn more about {pulsar-short}'s Kinesis sink connector https://pulsar.apache.org/docs/io-kinesis-sink[here]. \ No newline at end of file +Generally, all properties provided in the https://pulsar.apache.org/docs/io-kinesis-sink[OSS {pulsar} Kinesis sink connector] are supported. +Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 23b68d0..79f1f1b 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -4,7 +4,7 @@ A https://www.snowflake.com/en/[Snowflake] database ingests structured and semi-structured datasets for processing and analysis. Snowflake automatically manages all parts of the data storage process, including organization, structure, metadata, file size, compression, and statistics. -The Snowflake sink connector reads messages from {pulsar} topics and writes them to Snowflake databases. +The Snowflake sink connector reads messages from {pulsar-short} topics and writes them to Snowflake databases. == Create the connector @@ -22,13 +22,13 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} sink connector parameters +=== {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] [#configs] -=== Snowflake sink connector parameters (`configs`) +=== Snowflake sink connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. -For all supported parameters, examples, and exceptions, see the https://github.com/datastax/snowflake-connector[{company} Snowflake connector GitHub repository]. \ No newline at end of file +For all supported properties, examples, and exceptions, see the https://github.com/datastax/snowflake-connector[{company} Snowflake connector GitHub repository]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index d4d5f98..20b98a1 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -9,6 +9,7 @@ The sample messages contain simulated `Person` data with fields like `firstName` The connector generates data continuously while it is running. There is no upper limit on the number of messages it can generate. +[#compatibility] == Compatibility {product} supports {pulsar-reg} {pulsar-version}, which uses version 0.5.9 of the jFairy library. @@ -31,14 +32,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Data Generator source connector parameters (`configs`) +=== Data Generator source connector properties (`configs`) -In the `configs` section of the connector configuration, the only available parameter is `sleepBetweenMessages`. -This parameter sets the delay between messages generated by the connector. +In the `configs` section of the connector configuration, the only available property is `sleepBetweenMessages`. +This property sets the delay between messages generated by the connector. The default value is `50` milliseconds. -For an uninterrupted stream of messages, set this parameter to `0`. \ No newline at end of file +For an uninterrupted stream of messages, set this property to `0`. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index ff5f78c..d75abcf 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -32,14 +32,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium MongoDB source connector parameters (`configs`) +=== Debezium MongoDB source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. [cols=4] |=== diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index c8fb322..6a44265 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -24,14 +24,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium MySQL source connector parameters (`configs`) +=== Debezium MySQL source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-connector-properties[Debezium connector for MySQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index 891c9d2..f9bb8b8 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -27,14 +27,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium Oracle source connector parameters (`configs`) +=== Debezium Oracle source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties[Debezium connector for Oracle] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index d2a9667..96b8342 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -24,14 +24,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium PostgreSQL source connector parameters (`configs`) +=== Debezium PostgreSQL source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-connector-properties[Debezium connector for PostgreSQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 0cf686f..47dda90 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -43,9 +43,9 @@ You must create the required topics before you create the connector because the ==== -- -. When you create the source connector in the next steps, make sure the following parameters are set correctly: +. When you create the source connector in the next steps, make sure the following properties are set correctly: + -* The `name` parameter (or the `$SOURCE_NAME` environment variable) must match the `**CONNECTOR_NAME**` you used in the topic names. +* The `name` property (or the `$SOURCE_NAME` environment variable) must match the `**CONNECTOR_NAME**` you used in the topic names. * In `<>`, the `topic.prefix` and `database.server.name` must be set to your SQL Server instance name. * In `<>`, the `task.id` value must be a string (`"task.id": "0"`). If it is an integer (`"task.id": 0`), then the connector throws a `NullPointerException`. @@ -66,24 +66,24 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties [WARNING] ==== -The `name` parameter must match the connector name you used in the topic names as explained in <>. +The `name` property must match the connector name you used in the topic names as explained in <>. ==== include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Debezium SQL Server source connector parameters (`configs`) +=== Debezium SQL Server source connector properties (`configs`) [WARNING] ==== -Make sure you set the `topic.prefix`, `database.server.name`, and `task.id` parameters as explained in <>. +Make sure you set the `topic.prefix`, `database.server.name`, and `task.id` properties as explained in <>. ==== -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium connector for SQL Server] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that are only present in <>. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 9ee6823..1a0e43c 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -1,7 +1,7 @@ = Kafka :connectorType: kafka -The Kafka source connector pulls data from Kafka topics and persists it to {pulsar-short} topics. +The Kafka source connector pulls data from https://kafka.apache.org/[Kafka] topics and persists it to {pulsar-short} topics. == Create the connector @@ -19,14 +19,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Kafka source connector parameters (`configs`) +=== Kafka source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://pulsar.apache.org/docs/io-kafka-source[OSS {pulsar} Kafka source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 2018325..947a0d9 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -1,7 +1,7 @@ = Kinesis :connectorType: kinesis -The https://pulsar.apache.org/docs/io-kinesis-source[Kinesis source connector] pulls data from Amazon Kinesis and persists it to {pulsar-short} topics. +The Kinesis source connector pulls data from https://aws.amazon.com/kinesis/[Amazon Kinesis] and persists it to {pulsar-short} topics. == Create the connector @@ -19,14 +19,14 @@ include::pulsar-io:partial$connectors/sources/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] -=== {pulsar-short} source connector parameters +=== {pulsar-short} source connector properties include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] [#configs] -=== Kinesis source connector parameters (`configs`) +=== Kinesis source connector properties (`configs`) -Set these parameters in the `configs` section of the connector configuration. +Set these properties in the `configs` section of the connector configuration. Generally, all properties provided in the https://pulsar.apache.org/docs/io-kinesis-source[OSS {pulsar} Kinesis source connector] are supported. -Exceptions include parameters that aren't relevant to {product}, and parameters that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file +Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/connector-params-intro.adoc b/modules/pulsar-io/partials/connectors/connector-params-intro.adoc index bf7023f..271d4f4 100644 --- a/modules/pulsar-io/partials/connectors/connector-params-intro.adoc +++ b/modules/pulsar-io/partials/connectors/connector-params-intro.adoc @@ -1,3 +1,3 @@ -To configure {product} {pulsar-short} connectors, you use a combination of common {pulsar-short} parameters and provider-specific parameters. +To configure {product} {pulsar-short} connectors, you use a combination of common {pulsar-short} properties and provider-specific properties. -Because {product} and the {product} {pulsar-short} connectors are based on a specific version of the open-source {pulsar} project and connectors, some parameters and values might be unsupported or ignored by {product}. \ No newline at end of file +Because {product} and the {product} {pulsar-short} connectors are based on a specific version of the open-source {pulsar} project and connectors, some properties and values might be unsupported or ignored by {product}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/function-params-tip.adoc b/modules/pulsar-io/partials/connectors/function-params-tip.adoc index 58fcc79..3838444 100644 --- a/modules/pulsar-io/partials/connectors/function-params-tip.adoc +++ b/modules/pulsar-io/partials/connectors/function-params-tip.adoc @@ -1,5 +1,5 @@ [TIP] ==== {pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. -Therefore, some function configuration parameters are also used to configure connectors. +Therefore, some function configuration properties are also used to configure connectors. ==== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index c72aba7..ba55c35 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -1,7 +1,7 @@ include::pulsar-io:partial$connectors/function-params-tip.adoc[] -The following table lists the {product} {pulsar-short} sink connector configuration parameters by JSON field name. -For the equivalent command line arguments and more information about these parameters, see the following: +The following table lists the {product} {pulsar-short} sink connector configuration properties by JSON field name. +For the equivalent command line arguments and more information about these properties, see the following: * https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] * https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[`pulsar-admin sinks` specification] @@ -147,7 +147,7 @@ Only applicable to process and Kubernetes runtimes. |No |If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. The `secretName` is used by the connector to reference the secret. -The mapped object contains the required parameters to fetch the secret from the secrets provider. +The mapped object contains the required properties to fetch the secret from the secrets provider. To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. diff --git a/modules/pulsar-io/partials/connectors/sinks/edit.adoc b/modules/pulsar-io/partials/connectors/sinks/edit.adoc index f54f1ec..adec72e 100644 --- a/modules/pulsar-io/partials/connectors/sinks/edit.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/edit.adoc @@ -1,8 +1,8 @@ To update a connector, pass the new configuration definition to the connector. For example, if you created the connector with a configuration file, you can pass an updated configuration file. -You can include the entire configuration or only the parameters that you want to change. -Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. +You can include the entire configuration or only the properties that you want to change. +Additionally, some properties can be modified with specific arguments, such as `--parallelism`. To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. diff --git a/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc new file mode 100644 index 0000000..4f930fa --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc @@ -0,0 +1,2 @@ +In the `configs` section of the connector configuration, set the https://pulsar.apache.org/docs/io-jdbc-sink[{pulsar} JDBC sink connector properties]. +All JDBC sink connectors use the same set of configuration properties, but not all properties apply to all database providers or deployments. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc index 5c14e7a..9469a72 100644 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc @@ -1,7 +1,7 @@ include::pulsar-io:partial$connectors/function-params-tip.adoc[] -The following table lists the {product} {pulsar-short} source connector configuration parameters by JSON field name. -For the equivalent command line arguments and more information about these parameters, see the following: +The following table lists the {product} {pulsar-short} source connector configuration properties by JSON field name. +For the equivalent command line arguments and more information about these properties, see the following: * https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] * https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[`pulsar-admin sources` specification] @@ -99,7 +99,7 @@ Accepts either a built-in schema like `avro` or `json`, or a custom `Schema` cla |No |If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. The `secretName` is used by the connector to reference the secret. -The mapped object contains the required parameters to fetch the secret from the secrets provider. +The mapped object contains the required properties to fetch the secret from the secrets provider. To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. diff --git a/modules/pulsar-io/partials/connectors/sources/edit.adoc b/modules/pulsar-io/partials/connectors/sources/edit.adoc index 0c80a9a..cf60e02 100644 --- a/modules/pulsar-io/partials/connectors/sources/edit.adoc +++ b/modules/pulsar-io/partials/connectors/sources/edit.adoc @@ -1,8 +1,8 @@ To update a connector, pass the new configuration definition to the connector. For example, if you created the connector with a configuration file, you can pass an updated configuration file. -You can include the entire configuration or only the parameters that you want to change. -Additionally, some parameters can be modified with specific arguments, such as `--parallelism`. +You can include the entire configuration or only the properties that you want to change. +Additionally, some properties can be modified with specific arguments, such as `--parallelism`. To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. From d6dee8c726629fda509c156c9eb12c81f5cb9531 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:58:21 -0800 Subject: [PATCH 24/31] few m ore pages --- .../pages/connectors/sinks/cloud-storage.adoc | 251 +++++++++--------- .../connectors/sources/debezium-mongodb.adoc | 69 ++--- .../connectors/sinks/astra-config-params.adoc | 2 +- 3 files changed, 160 insertions(+), 162 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 0e97dbb..04e0c79 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -1,15 +1,13 @@ = Cloud Storage :connectorType: cloud-storage -The Cloud Storage sink connector reads messages from {pulsar-short} topics and writes them to Cloud Storage systems. +The Cloud Storage sink connector reads messages from {pulsar-short} topics and writes them to cloud storage using specified format, such as Avro or Parquet. -Each public cloud has different ways of persisting data to their storage systems. Each cloud has their own way of formatting and storing the bytes. The Cloud Storage sink connector is a general interface to a chosen cloud storage, that exports data from a {pulsar-short} topic to the given system following a desired format. +The following cloud storage providers are supported: -The cloud storage system supported are: - -* https://cloud.google.com/storage[Google's Cloud Storage (GCP)] -* https://azure.microsoft.com/en-us/products/storage/blobs[Azure Blob Store (Azure)] -* https://aws.amazon.com/s3/[Amazon Web Services S3 (AWS)] +* https://aws.amazon.com/s3/[AWS S3] +* https://cloud.google.com/storage[Google's Cloud Storage] +* https://azure.microsoft.com/en-us/products/storage/blobs[Microsoft Azure Blob Storage] == Create the connector @@ -23,127 +21,11 @@ include::pulsar-io:partial$connectors/sinks/edit.adoc[] include::pulsar-io:partial$connectors/sinks/manage.adoc[] -== Data format types -//Not sure where to put -The Cloud Storage sink connector provides multiple output format options, including JSON (default), Avro, Bytes, or Parquet. -There are some limitations for certain formats, as explained in the following sections. - -=== {pulsar-short} Schema types supported by the writers - -[cols=5] -|=== -|Pulsar Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes - -|Primitive -a|❌ -a|✅ - -The JSON writer will try to convert data with a String or Bytes schema to JSON-format data if convertible. - -a|❌ -a|✅ - -|Avro -a|✅ -a|✅ -a|✅ -a|✅ - -|Json -a|✅ -a|✅ -a|✅ -a|✅ - -|Protobuf - -The Protobuf schema is based on the Avro schema. -It uses Avro as an intermediate format, so it may not provide the best effort conversion. - -a|✅ -a|✅ -a|✅ -a|✅ - -|ProtobufNative -a|✅ - -The ProtobufNative record holds the Protobuf descriptor and the message. -When writing to Avro format, the connector uses `avro-protobuf` to do the conversion. - -a|❌ -a|✅ -a|✅ -|=== - -=== Supported withMetadata configurations for writer formats - -[cols=2] -|=== -|Writer Format |withMetadata - -|Avro -a|✅ - -|JSON -a|✅ - -|Parquet -a|✅ - -|Bytes -a|❌ -|=== - -==== Parquet with PROTOBUF_NATIVE format - -When using Parquet with `PROTOBUF_NATIVE` format, the connector writes the messages with the `DynamicMessage` format. -When `withMetadata` is true, the connector adds __message_metadata__ to the messages with `PulsarIOCSCProtobufMessageMetadata` format. - -For example, if a message `User` has the following schema: - -[source,protobuf] ----- -syntax = "proto3"; -message User { - string name = 1; - int32 age = 2; -} ----- - -When `withMetadata` is set to true, the connector writes the message `DynamicMessage` with the following schema: - -[source,protobuf] ----- -syntax = "proto3"; -message PulsarIOCSCProtobufMessageMetadata { - map properties = 1; - string schema_version = 2; - string message_id = 3; -} -message User { - string name = 1; - int32 age = 2; - PulsarIOCSCProtobufMessageMetadata __message_metadata__ = 3; -} ----- - -==== Skip unsupported messages - -By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. -If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. - -== Dead-letter topics - -If a message fails to send to a Cloud Storage sink, the connector can send the message to a https://pulsar.apache.org/docs/en/concepts-messaging/#dead-letter-topic[dead-letter topic] instead, if a dead-letter topic is assigned. - -To use a dead-letter topic, set `skipFailedMessages` to `false` in the cloud provider config. -Then, using either `pulsar-admin` or curl, set `--max-redeliver-count` and `--dead-letter-topic`. - == Connector configuration reference include::pulsar-io:partial$connectors/connector-params-intro.adoc[] +[#pulsar-sink-connector-properties] === {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] @@ -193,7 +75,9 @@ For other providers, see <> and <>. |formatType |no |json -|The data format type. Available options are JSON, Avro, Bytes, or Parquet. By default, it is set to JSON. +|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. + +Default: `JSON` |gcsServiceAccountKeyFileContent |no @@ -245,6 +129,12 @@ For other providers, see <> and <>. |false |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. +By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. +If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. + +Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. +To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. + |sliceTopicPartitionPath |no |false @@ -275,6 +165,8 @@ For other providers, see <> and <>. |false |Save message attributes to metadata. +Not supported for formatType=Bytes. + |withTopicPartitionNumber |no |true @@ -347,7 +239,9 @@ If your connector configuration doesn't specify a region, then you must also ena |formatType |no |json -|The data format type. Available options are JSON, Avro, Bytes, or Parquet. By default, it is set to JSON. +|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. + +Default: `JSON` |jsonAllowNaN |no @@ -399,6 +293,12 @@ If your connector configuration doesn't specify a region, then you must also ena |false |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. +By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. +If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. + +Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. +To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. + |sliceTopicPartitionPath |no |false @@ -429,6 +329,8 @@ If your connector configuration doesn't specify a region, then you must also ena |false |Save message attributes to metadata. +Not supported for formatType=Bytes. + |withTopicPartitionNumber |no |true @@ -502,7 +404,9 @@ Set the following properties in the `configs` section if you are using Azure Blo |formatType |no |json -|The data format type. Available options are JSON, Avro, Bytes, or Parquet. By default, it is set to JSON. +|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. + +Default: `JSON` |jsonAllowNaN |no @@ -544,6 +448,12 @@ Set the following properties in the `configs` section if you are using Azure Blo |false |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. +By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. +If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. + +Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. +To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. + |sliceTopicPartitionPath |no |false @@ -574,8 +484,95 @@ Set the following properties in the `configs` section if you are using Azure Blo |false |Save message attributes to metadata. +Not supported for formatType=Bytes. + |withTopicPartitionNumber |no |true |When it is set to true, include the topic partition number to the object path. +|=== + +[#data-format-types] +== Data format types + +The `formatType` parameter supports JSON, Avro, Bytes, and Parquet formats. + +The following table lists the supported conversions from {pulsar-short} schema types to each writer format, as well as any limitations or additional notes. + +[cols=5] +|=== +|Pulsar Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes + +|Primitive +|Not supported +|Supported + +The JSON writer will try to convert data with a String or Bytes schema to JSON-format data if convertible. + +|Not supported +|Supported + +|Avro +|Supported +|Supported +|Supported +|Supported + +|JSON +|Supported +|Supported +|Supported +|Supported + +|Protobuf + +The Protobuf schema is based on the Avro schema. +It uses Avro as an intermediate format, so it might not provide the best possible conversion. + +|Supported +|Supported +|Supported +|Supported + +|ProtobufNative +|Supported + +The ProtobufNative schema holds the Protobuf descriptor and the message. +When writing to Avro format, the connector uses `avro-protobuf` to do the conversion. + +|Not supported +a|Supported + +When writing to Parquet from the ProtobufNative schema, the connector writes the messages with the `DynamicMessage` format. +If `withMetadata` is true, then the connector adds `+__message_metadata__+` to the messages with `PulsarIOCSCProtobufMessageMetadata` format. + +For example, if a message has the following schema: + +[source,protobuf] +---- +syntax = "proto3"; +message User { + string name = 1; + int32 age = 2; +} +---- + +If `withMetadata` is set to true, then the connector writes the message with the following schema: + +[source,parquet] +---- +syntax = "proto3"; +message PulsarIOCSCProtobufMessageMetadata { + map properties = 1; + string schema_version = 2; + string message_id = 3; +} +message User { + string name = 1; + int32 age = 2; + PulsarIOCSCProtobufMessageMetadata __message_metadata__ = 3; +} +---- + +|Supported |=== \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index d75abcf..b74e121 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -41,39 +41,40 @@ include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] Set these properties in the `configs` section of the connector configuration. -[cols=4] -|=== -|Name |Required |Default |Description - -|"database.whitelist","true","","A list of all databases hosted by this server which is monitored by the connector. This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring." -| -| -| - -|"mongodb.hosts","true","","The comma-separated list of hostname and port pairs ('host' or 'host:port') of the MongoDB servers in the replica set. If mongodb.members.auto.discover is set to false, prefix with the replica set name (e.g., rs0/localhost:27017)." -| -| -| - -|"mongodb.name","true","","A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector." -| -| -| - -|"mongodb.password","true","","Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." -| -| -| - -|"mongodb.task.id","true","","The taskId of the MongoDB connector that attempts to use a separate task for each replica set." -| -| -| - -|"mongodb.user","true","","Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication." -| -| -| +The following table lists some commonly used properties. +For more information and additional properties, see the documentation for the https://debezium.io/documentation/reference/stable/connectors/mongodb.html[Debezium connector for MongoDB] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector]. + +[cols=3] |=== +|Name |Required |Description + +|`database.whitelist` +|No if alternative properties are used +|A list of databases hosted by the server monitored by the connector. + +There are multiple properties you can use to specify (inclusively or exclusively) the databases and tables to monitor. + +|`mongodb.hosts` +|Yes +|A comma-separated list of hosts (either as `host` or `host:port`) for the MongoDB servers in the replica set. + +If `mongodb.members.auto.discover` is `false`, then you must prefix hosts with the replica set name, such as `rs0/localhost:27017`. + +|`mongodb.name` +|Yes +|A unique name that identifies the connector, MongoDB replica set, or shared cluster that the source connector monitors. + +Use only one Debezium MongoDB source connector for each MongoDB server. + +|`mongodb.password` +|Yes if authentication is enabled +|The password to authenticate to the MongoDB server. + +|`mongodb.task.id` +|Yes +|The `taskId` of the MongoDB connector that attempts to use a separate task for each replica set. -For more information, see the documentation for the https://debezium.io/documentation/reference/stable/connectors/mongodb.html[Debezium connector for MongoDB] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector]. \ No newline at end of file +|`mongodb.user` +|Yes if authentication is enabled +|The name of the database user to authenticate to the MongoDB server. +|=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc index ba55c35..5474df3 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc @@ -45,7 +45,7 @@ Default: `{}` (Empty map, uses defaults) |`deadLetterTopic` |No -|The name of the topic that receives unacknowledged messages, such as those that exceed the maximum number of retries or fail to be processed completely. +|The name of the https://pulsar.apache.org/docs/en/concepts-messaging/#dead-letter-topic[topic that receives unacknowledged messages], such as those that exceed the maximum number of retries or fail to be processed completely. If `null` or not set, unacknowledged messages are discarded. From 55667d3c9601b9fddeb9256aaa63510f7656e375 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:40:50 -0800 Subject: [PATCH 25/31] partials for core param tables --- .../pages/connectors/sinks/astra-db.adoc | 54 ++++---- .../pages/connectors/sinks/cloud-storage.adoc | 2 +- .../connectors/sinks/elastic-search.adoc | 2 +- .../connectors/sinks/google-bigquery.adoc | 2 +- .../connectors/sinks/jdbc-clickhouse.adoc | 2 +- .../pages/connectors/sinks/jdbc-mariadb.adoc | 2 +- .../pages/connectors/sinks/jdbc-postgres.adoc | 2 +- .../pages/connectors/sinks/jdbc-sqllite.adoc | 2 +- .../pages/connectors/sinks/kafka.adoc | 2 +- .../pages/connectors/sinks/kinesis.adoc | 2 +- .../pages/connectors/sinks/snowflake.adoc | 2 +- .../connectors/sources/data-generator.adoc | 2 +- .../connectors/sources/debezium-mongodb.adoc | 2 +- .../connectors/sources/debezium-mysql.adoc | 2 +- .../connectors/sources/debezium-oracle.adoc | 2 +- .../connectors/sources/debezium-postgres.adoc | 2 +- .../sources/debezium-sqlserver.adoc | 2 +- .../pages/connectors/sources/kafka.adoc | 2 +- .../pages/connectors/sources/kinesis.adoc | 2 +- .../pulsar-config-params-archive.adoc | 4 + .../pulsar-config-params-configs.adoc | 6 + ...ar-config-params-customruntimeoptions.adoc | 3 + .../connectors/pulsar-config-params-name.adoc | 6 + .../pulsar-config-params-namespace.adoc | 3 + .../pulsar-config-params-parallelism.adoc | 5 + ...ar-config-params-processingguarantees.adoc | 9 ++ .../pulsar-config-params-resources.adoc | 4 + .../pulsar-config-params-runtimeflags.adoc | 4 + .../pulsar-config-params-secrets.adoc | 9 ++ .../pulsar-config-params-tenant.adoc | 3 + ...-params.adoc => pulsar-config-params.adoc} | 84 +++--------- .../sources/astra-config-params.adoc | 125 ------------------ .../sources/pulsar-config-params.adoc | 81 ++++++++++++ 33 files changed, 201 insertions(+), 235 deletions(-) create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc create mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc rename modules/pulsar-io/partials/connectors/sinks/{astra-config-params.adoc => pulsar-config-params.adoc} (54%) delete mode 100644 modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc create mode 100644 modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 011c422..4d573a3 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -40,7 +40,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === {company} {pulsar} sink connector properties (`configs`) @@ -142,46 +142,44 @@ For each topic in `topics`, there must be a corresponding entry in the `topic` s [#topic] === Topic-to-table mapping properties (`topic`) -The `topic` section of the `<>` contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping properties]. +`topic` is a subproperty of `<>` that contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping properties]. -The mapping determines which table receives messages from a {pulsar-short} topic, and how the message `value` fields are written to the table columns. +This mapping determines which table receives messages from a {pulsar-short} topic, and how the message `value` fields are written to the table columns. -There are many mapping properties and values to support different write options, value translations, and data formats. +There are many subproperties and values available in `topic` to support different write options, value translations, and data formats. -The following example shows a simplified `configs` object that maps one topic to a table in an {astra-db} database: +The following example shows a truncated `configs` section that maps one topic to a table in an {astra-db} database: [source,json] ---- -"configs": { - "auth": { - "username": "token", - "password": "${ASTRA_APPLICATION_TOKEN}" - }, - "cloud.secureConnectBundle": "path/to/scb.zip", - "topics": "${TOPIC}", - // ... - // Other configs properties - // ... - "topic": { - "${TOPIC}": { - "${KEYSPACE_NAME}": { - "${TABLE_NAME}": { - "mapping": "column1=value.fieldA,column2=value.fieldC,column3=value.fieldG,column8=value.fieldW" - // ... - // Other topic properties, such as codec and nullToUnset - // ... + "configs": { + "auth": { + "username": "token", + "password": "${ASTRA_APPLICATION_TOKEN}" + }, + "cloud.secureConnectBundle": "path/to/scb.zip", + "topics": "${TOPIC}", + // ... + // Other configs subproperties + // ... + "topic": { + "${TOPIC}": { + "${KEYSPACE_NAME}": { + "${TABLE_NAME}": { + "mapping": "column1=value.fieldA,column2=value.fieldC,column3=value.fieldG,column8=value.fieldW" + // ... + // Other topic subproperties + // ... + } } } } } -} ---- The `mapping` string is a comma-separated list of table column names and message `value` fields. - -If your connector subscribes to multiple topics, create an entry for each topic in the `topic` section. - -For a more information and examples, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. +You can use other subproperties for other write options and mapping configuration, such as `codec` and `nullToUnset`. +For a more information, subproperties, and examples, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. == See also diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 04e0c79..43d7be2 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -28,7 +28,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] [#pulsar-sink-connector-properties] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] == Google Cloud Storage properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc index a64a4fc..85fe43f 100644 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc @@ -28,7 +28,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === Elasticsearch sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index b02e66c..80f8859 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -27,7 +27,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === Kafka Connect Adapter properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc index 98f699a..772e153 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc @@ -26,7 +26,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === JDBC ClickHouse sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc index 1de8952..70c75ba 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc @@ -26,7 +26,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === JDBC MariaDB sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc index 785b633..b05947a 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc @@ -29,7 +29,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === JDBC PostgreSQL sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc index a9a3f22..52d9bf5 100644 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc @@ -28,7 +28,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === JDBC SQLite sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc index fefd904..858e0a0 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc @@ -26,7 +26,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === Kafka sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc index 877b642..4b572df 100644 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc @@ -28,7 +28,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === Kinesis sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc index 79f1f1b..2717622 100644 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc @@ -24,7 +24,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} sink connector properties -include::pulsar-io:partial$connectors/sinks/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] === Snowflake sink connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc index 20b98a1..d3f5848 100644 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Data Generator source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc index b74e121..f8b69c6 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc @@ -34,7 +34,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Debezium MongoDB source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc index 6a44265..31d9d75 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc @@ -26,7 +26,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Debezium MySQL source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc index f9bb8b8..b9d772c 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc @@ -29,7 +29,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Debezium Oracle source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc index 96b8342..74a44cb 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc @@ -26,7 +26,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Debezium PostgreSQL source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc index 47dda90..7e31175 100644 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc @@ -73,7 +73,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] The `name` property must match the connector name you used in the topic names as explained in <>. ==== -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Debezium SQL Server source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc index 1a0e43c..eb857e0 100644 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kafka.adoc @@ -21,7 +21,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Kafka source connector properties (`configs`) diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc index 947a0d9..123bfb4 100644 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc @@ -21,7 +21,7 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] === {pulsar-short} source connector properties -include::pulsar-io:partial$connectors/sources/astra-config-params.adoc[] +include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] [#configs] === Kinesis source connector properties (`configs`) diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc new file mode 100644 index 0000000..4080a24 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc @@ -0,0 +1,4 @@ +|`archive` +|Yes +|The type of built-in {product} {pulsar-short} connector that you want to deploy. +Formatted as `builtin://**CONNECTOR**`, such as `builtin://kafka`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc new file mode 100644 index 0000000..f4531c5 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc @@ -0,0 +1,6 @@ +|`configs` +|Yes +|A JSON-formatted key-value map containing configuration properties specific to the connector type, including provider-specific authentication and integration settings. +For available subproperties, see <>. + +Default: `{}` (Empty map, uses defaults if they exist, fails otherwise) \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc new file mode 100644 index 0000000..2fce029 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc @@ -0,0 +1,3 @@ +|`customRuntimeOptions` +|No +|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc new file mode 100644 index 0000000..7c8d2ea --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc @@ -0,0 +1,6 @@ +|`name` +|Yes +|The name for the connector. +It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. +{company} recommends a memorable, human-readable name that summarizes the connector's purpose. +For example: `{connectorType}-prod-us-east-1`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc new file mode 100644 index 0000000..1a91a08 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc @@ -0,0 +1,3 @@ +|`namespace` +|Yes +|The namespace in your {pulsar-short} tenant where you want to create the connector. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc new file mode 100644 index 0000000..5190814 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc @@ -0,0 +1,5 @@ +|`parallelism` +|Yes +|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. + +Default: `1` \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc new file mode 100644 index 0000000..3a26219 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc @@ -0,0 +1,9 @@ +|`processingGuarantees` +|Yes +|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. + +Respect for the processing guarantee depends on the connector implementation. + +For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. + +Default: `ATLEAST_ONCE` \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc new file mode 100644 index 0000000..976bdec --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc @@ -0,0 +1,4 @@ +|`resources` +|No +|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. +For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc new file mode 100644 index 0000000..2cada19 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc @@ -0,0 +1,4 @@ +|`runtimeFlags` +|No +|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. +Only applicable to process and Kubernetes runtimes. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc new file mode 100644 index 0000000..bdc4930 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc @@ -0,0 +1,9 @@ +|`secrets` +|No +|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. +The `secretName` is used by the connector to reference the secret. +The mapped object contains the required properties to fetch the secret from the secrets provider. + +To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. + +This is separate from connector-specific security settings in `configs` and the {pulsar-short} authentication token used to connect to your {pulsar-short} cluster. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc new file mode 100644 index 0000000..bc56cd4 --- /dev/null +++ b/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc @@ -0,0 +1,3 @@ +|`tenant` +|Yes +|The {pulsar-short} tenant where you want to create the connector. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc similarity index 54% rename from modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc rename to modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc index 5474df3..16b0a69 100644 --- a/modules/pulsar-io/partials/connectors/sinks/astra-config-params.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc @@ -1,19 +1,17 @@ include::pulsar-io:partial$connectors/function-params-tip.adoc[] -The following table lists the {product} {pulsar-short} sink connector configuration properties by JSON field name. +The following table lists {product} {pulsar-short} sink connector configuration properties by JSON field name. For the equivalent command line arguments and more information about these properties, see the following: * https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] * https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[`pulsar-admin sinks` specification] +.{pulsar-short} configuration properties for sink connectors [cols=3] |=== |Field name |Required |Description -|`archive` -|Yes -|The built-in {product} {pulsar-short} connector type. -Formatted as `builtin://**CONNECTOR**`, such as `builtin://elastic_search`. +include::pulsar-io:partial$connectors/pulsar-config-params-archive.adoc[] |`autoAck` |Yes @@ -32,16 +30,9 @@ Default: `false` (automatic acknowledgment disabled) Default: `false` -|`configs` -|No -|A JSON-formatted key-value map containing configuration properties specific to the connector type, such as provider-specific authentication and integration settings. -For available options, see <>. - -Default: `{}` (Empty map, uses defaults) +include::pulsar-io:partial$connectors/pulsar-config-params-configs.adoc[] -|`customRuntimeOptions` -|No -|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. +include::pulsar-io:partial$connectors/pulsar-config-params-customruntimeoptions.adoc[] |`deadLetterTopic` |No @@ -88,16 +79,9 @@ Default: `[]` See also `negativeAckRedeliveryDelayMs` and `deadLetterTopic`. -|`name` -|Yes -|The name for the connector. -It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. -{company} recommends a memorable, human-readable name that summarizes the connector's purpose. -For example: `{connectorType}-sink-prod-us-east-1`. +include::pulsar-io:partial$connectors/pulsar-config-params-name.adoc[] -|`namespace` -|Yes -|The namespace in your {pulsar-short} tenant where you want to create the connector. +include::pulsar-io:partial$connectors/pulsar-config-params-namespace.adoc[] |`negativeAckRedeliveryDelayMs` |No @@ -105,26 +89,11 @@ For example: `{connectorType}-sink-prod-us-east-1`. See also `maxMessageRetries` and `deadLetterTopic`. -|`parallelism` -|Yes -|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. - -Default: `1` +include::pulsar-io:partial$connectors/pulsar-config-params-parallelism.adoc[] -|`processingGuarantees` -|Yes -|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. - -Respect for the processing guarantee depends on the connector implementation. - -For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. - -Default: `ATLEAST_ONCE` +include::pulsar-io:partial$connectors/pulsar-config-params-processingguarantees.adoc[] -|`resources` -|No -|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. -For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. +include::pulsar-io:partial$connectors/pulsar-config-params-resources.adoc[] |`retainKeyOrdering` |No @@ -138,20 +107,9 @@ Default: `true` Default: `false` -|`runtimeFlags` -|No -|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. -Only applicable to process and Kubernetes runtimes. - -|`secrets` -|No -|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. -The `secretName` is used by the connector to reference the secret. -The mapped object contains the required properties to fetch the secret from the secrets provider. - -To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. +include::pulsar-io:partial$connectors/pulsar-config-params-runtimeflags.adoc[] -This is separate from the {pulsar-short} authentication token and security settings passed elsewhere in the connector configuration. +include::pulsar-io:partial$connectors/pulsar-config-params-secrets.adoc[] |`sourceSubscriptionName` |No @@ -163,9 +121,7 @@ This is separate from the {pulsar-short} authentication token and security setti Default: `Latest` -|`tenant` -|Yes -|The {pulsar-short} tenant where you want to create the connector. +include::pulsar-io:partial$connectors/pulsar-config-params-tenant.adoc[] |`timeoutMs` |No @@ -173,6 +129,13 @@ Default: `Latest` Default: `5000` +|`topicsPattern` +|No +|A topic naming pattern to select topics to consume from all topics in a namespace. + +To consume an exact list of topics, use `inputs` instead. +`inputs` and `topicsPattern` are mutually exclusive. + |`topicToSchemaProperties` |No |A map of input topics to schema properties specified as a JSON object. @@ -184,11 +147,4 @@ Default: `5000` |`topicToSerdeClassName` |No |A map of input topics to SerDe class names specified as a JSON object. - -|`topicsPattern` -|No -|A topic naming pattern to select topics to consume from all topics in a namespace. - -To consume an exact list of topics, use `inputs` instead. -`inputs` and `topicsPattern` are mutually exclusive. |=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc deleted file mode 100644 index 9469a72..0000000 --- a/modules/pulsar-io/partials/connectors/sources/astra-config-params.adoc +++ /dev/null @@ -1,125 +0,0 @@ -include::pulsar-io:partial$connectors/function-params-tip.adoc[] - -The following table lists the {product} {pulsar-short} source connector configuration properties by JSON field name. -For the equivalent command line arguments and more information about these properties, see the following: - -* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] -* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[`pulsar-admin sources` specification] - -[cols=3] -|=== -|Field name |Required |Description - -|`archive` -|Yes -|The built-in {product} {pulsar-short} connector that you want to deploy. -Formatted as `builtin://**CONNECTOR**`, such as `builtin://debezium-mysql`. - -|`batchBuilder` -|No -|The batch construction method: `DEFAULT` or `KEY_BASED`. - -Default: `DEFAULT` - -|`batchSourceConfig` -|No -|The batch source configuration key-value as a JSON string. - -|`configs` -|No -|A JSON-formatted key-value map containing configuration properties specific to the connector type, such as provider-specific authentication and integration settings. -For available options, see <>. - -Default: `{}` (Empty map, uses defaults) - -|`customRuntimeOptions` -|No -|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. - -|`name` -|Yes -|The name for the connector. -It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. -{company} recommends a memorable, human-readable name that summarizes the connector's purpose. -For example: `{connectorType}-source-prod-us-east-1`. - -|`namespace` -|Yes -|The namespace in your {pulsar-short} tenant where you want to create the connector. - -|`parallelism` -|Yes -|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. - -Default: `1` - -|`processingGuarantees` -|Yes -|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. - -Respect for the processing guarantee depends on the connector implementation. - -For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. - -Default: `ATLEAST_ONCE` - -|`producerConfig` -|No -a|A JSON string containing a https://pulsar.apache.org/docs/3.1.x/functions-cli/#producerconfig[custom producer configuration]. -By default, most values are `null` or empty. -For example: - -[source,json] ----- - "producerConfig": { - "maxPendingMessages": null, - "maxPendingMessagesAcrossPartitions": null, - "useThreadLocalProducers": false, - "cryptoConfig": null, - "batchBuilder": "" - }, ----- - -|`resources` -|No -|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. -For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. - -|`runtimeFlags` -|No -|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. -Only applicable to process and Kubernetes runtimes. - -|`schemaType` -|No -|The schema type used to encode messages emitted from a {pulsar-short} source. -Accepts either a built-in schema like `avro` or `json`, or a custom `Schema` class name. - -|`secrets` -|No -|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. -The `secretName` is used by the connector to reference the secret. -The mapped object contains the required properties to fetch the secret from the secrets provider. - -To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. - -This is separate from the {pulsar-short} authentication token and security settings passed elsewhere in the connector configuration. - -|`serdeClassName` -|No -|The SerDe classname for the source. - -|`tenant` -|Yes -|The {pulsar-short} tenant where you want to create the connector. - -|`topicName` -|Yes -|An existing topic in your {product} tenant where messages are published. -Must be formatted as a full persistent or non-persistent topic name, such as `persistent://$TENANT/$NAMESPACE/$TOPIC`. - -|`typeClassName` -|Yes -|The class reference for the connector type. -Begins with `org.apache.pulsar`, such as `org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource`. -|=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc new file mode 100644 index 0000000..446f8da --- /dev/null +++ b/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc @@ -0,0 +1,81 @@ +include::pulsar-io:partial$connectors/function-params-tip.adoc[] + +The following table lists {product} {pulsar-short} source connector configuration properties by JSON field name. +For the equivalent command line arguments and more information about these properties, see the following: + +* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] +* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[`pulsar-admin sources` specification] + +.{pulsar-short} configuration properties for source connectors +[cols=3] +|=== +|Field name |Required |Description + +include::pulsar-io:partial$connectors/pulsar-config-params-archive.adoc[] + +|`batchBuilder` +|No +|The batch construction method: `DEFAULT` or `KEY_BASED`. + +Default: `DEFAULT` + +|`batchSourceConfig` +|No +|The batch source configuration key-value as a JSON string. + +include::pulsar-io:partial$connectors/pulsar-config-params-configs.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-customruntimeoptions.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-name.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-namespace.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-parallelism.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-processingguarantees.adoc[] + +|`producerConfig` +|No +a|A JSON string containing a https://pulsar.apache.org/docs/3.1.x/functions-cli/#producerconfig[custom producer configuration]. +By default, most values are `null` or empty. +For example: + +[source,json] +---- + "producerConfig": { + "maxPendingMessages": null, + "maxPendingMessagesAcrossPartitions": null, + "useThreadLocalProducers": false, + "cryptoConfig": null, + "batchBuilder": "" + }, +---- + +include::pulsar-io:partial$connectors/pulsar-config-params-resources.adoc[] + +include::pulsar-io:partial$connectors/pulsar-config-params-runtimeflags.adoc[] + +|`schemaType` +|No +|The schema type used to encode messages emitted from a {pulsar-short} source. +Accepts either a built-in schema like `avro` or `json`, or a custom `Schema` class name. + +include::pulsar-io:partial$connectors/pulsar-config-params-secrets.adoc[] + +|`serdeClassName` +|No +|The SerDe classname for the source. + +include::pulsar-io:partial$connectors/pulsar-config-params-tenant.adoc[] + +|`topicName` +|Yes +|An existing topic in your {product} tenant where messages are published. +Must be formatted as a full persistent or non-persistent topic name, such as `persistent://$TENANT/$NAMESPACE/$TOPIC`. + +|`typeClassName` +|Yes +|The class reference for the connector type. +Begins with `org.apache.pulsar`, such as `org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource`. +|=== \ No newline at end of file From 42b9e170a9da9d4e30769012121a607c7d343717 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:16:06 -0800 Subject: [PATCH 26/31] still working on these ugh --- .../sinks/bigquery/sample-data.adoc | 6 +- .../connectors/sinks/kafka/sample-data.adoc | 4 +- .../sinks/snowflake/sample-data.adoc | 6 +- .../pages/connectors/sinks/astra-db.adoc | 2 +- .../pages/connectors/sinks/cloud-storage.adoc | 218 ++++---- .../connectors/sinks/google-bigquery.adoc | 499 ++++++++++-------- 6 files changed, 388 insertions(+), 347 deletions(-) diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc index 5a6e915..55af636 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc @@ -16,7 +16,7 @@ "keySource": "JSON", "queueSize": "-1", "sanitizeTopics": false, - "topics": "bq-test01", + "topics": "${TOPIC}", "keyfile": { "type": "service_account", "project_id": "XXXXXX", @@ -32,9 +32,9 @@ }, "kafkaConnectorSinkClass": "com.wepay.kafka.connect.bigquery.BigQuerySinkConnector", "lingerTimeMs": "1000", - "offsetStorageTopic": "bq-sink-offsets01", + "offsetStorageTopic": "${TOPIC}-offsets", "sanitizeTopicName": true, - "topic": "bq-test01" + "topic": "${TOPIC}" }, "customRuntimeOptions": "internal_data", "deadLetterTopic": null, diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc index ee1a6b9..ad0cd0f 100644 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc @@ -55,7 +55,7 @@ "deadLetterTopic": "string", "configs": { "bootstrapServers": "localhost:6667", - "topic": "test", + "topic": "${KAFKA_DESTINATION_TOPIC}", "acks": "1", "batchSize": "16384", "maxRequestSize": "1048576", @@ -64,7 +64,7 @@ "security.protocol": "SASL_SSL", "sasl.mechanism": "PLAIN", "sasl.kerberos.service.name": "kafka", - "sasl.username": "cccccc", + "sasl.username": "kafkauser", "sasl.password": "${PASSWORD}", "acks": "all" } diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc index cbe6c96..a6ef862 100644 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc @@ -54,13 +54,13 @@ "maxMessageRetries": 0, "deadLetterTopic": "string", "configs": { - "topic": "snowflake-demo", - "offsetStorageTopic": "snowflake-sink-offsets-demo", + "topic": "${TOPIC}", + "offsetStorageTopic": "${TOPIC}-offsets-demo", "batchSize": 100, "lingerTimeMs": 600000, "kafkaConnectorConfigProperties":{ "name": "snowflakedemo", - "topics": "snowflake-demo", + "topics": "${TOPIC}", "buffer.count.records": 100, "buffer.flush.time": 600, "buffer.size.bytes": 102400, diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc index 4d573a3..a0b7db5 100644 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc @@ -74,7 +74,7 @@ Only use this property for {astra-db} connections. For self-managed clusters, use `ssl`. |`compression` -|yes +|Yes |`None` |The compression algorithm to use. diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 43d7be2..4b84263 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -43,90 +43,90 @@ For other providers, see <> and <>. |Name |Required |Default |Description |bucket -|yes +|Yes |null |The Cloud Storage bucket |provider -|yes +|Yes |null |The Cloud Storage type. Google cloud storage only supports the google-cloud-storage provider. |avroCodec -|no +|No |snappy |Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. |batchSize -|no +|No |10 |The number of records submitted in batch. |batchTimeMs -|no +|No |1000 |The interval for batch submission. |bytesFormatTypeSeparator -|no +|No |0x10 |It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. |formatType -|no +|No |json |The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. Default: `JSON` |gcsServiceAccountKeyFileContent -|no +|No |empty |The contents of the JSON service key file. If empty, credentials are read from gcsServiceAccountKeyFilePath file. |gcsServiceAccountKeyFilePath -|no +|No |empty |Path to the GCS credentials file. If empty, the credentials file are read from the GOOGLE_APPLICATION_CREDENTIALS environment variable. |jsonAllowNaN -|no -|false +|No +|`false` |Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. |maxBatchBytes -|no +|No |10000000 |The maximum number of bytes in a batch. |parquetCodec -|no +|No |gzip |Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. |partitionerType -|no +|No |partition |The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. |partitionerUseIndexAsOffset -|no -|false -|Whether to use the Pulsar's message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. +|No +|`false` +|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. |pathPrefix -|no -|false +|No +|`false` |If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. |pendingQueueSize -|no +|No |10 |The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. |skipFailedMessages -|no -|false +|No +|`false` |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. @@ -136,40 +136,40 @@ Alternatively, if a message fails to send to a Cloud Storage sink, the connector To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. |sliceTopicPartitionPath -|no -|false +|No +|`false` |When it is set to true, split the partitioned topic name into separate folders in the bucket path. |timePartitionDuration -|no +|No |86400000 |The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. |timePartitionPattern -|no +|No |yyyy-MM-dd |The format pattern of the time-based partitioning. For details, refer to the Java date and time format. |useHumanReadableMessageId -|no -|false +|No +|`false` |Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. |useHumanReadableSchemaVersion -|no -|false +|No +|`false` |Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. |withMetadata -|no -|false +|No +|`false` |Save message attributes to metadata. Not supported for formatType=Bytes. |withTopicPartitionNumber -|no -|true +|No +|`true` |When it is set to true, include the topic partition number to the object path. |=== @@ -183,7 +183,7 @@ Set the following properties in the `configs` section if you are using AWS S3 St |Name |Required |Default |Description |accessKeyId -|yes +|Yes |null a|The Cloud Storage access key ID. It requires permission to write objects. @@ -197,100 +197,100 @@ The suggested permission policies for AWS S3 are: If your connector configuration doesn't specify a region, then you must also enable `s3:GetBucketLocation`. |bucket -|yes +|Yes |null |The Cloud Storage bucket. |endpoint -|yes +|Yes |null |The Cloud Storage endpoint. |provider -|yes +|Yes |null |The Cloud Storage type, such as aws-s3, s3v2 (s3v2 uses the AWS client but not the JCloud client). |secretAccessKey -|yes +|Yes |null |The Cloud Storage secret access key. |avroCodec -|no +|No |snappy |Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. |batchSize -|no +|No |10 |The number of records submitted in batch. |batchTimeMs -|no +|No |1000 |The interval for batch submission. |bytesFormatTypeSeparator -|no +|No |0x10 |It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. |formatType -|no +|No |json |The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. Default: `JSON` |jsonAllowNaN -|no -|false +|No +|`false` |Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. |maxBatchBytes -|no +|No |10000000 |The maximum number of bytes in a batch. |parquetCodec -|no +|No |gzip |Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. |partitionerType -|no +|No |partition |The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. |partitionerUseIndexAsOffset -|no -|false -|Whether to use the Pulsar's message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. +|No +|`false` +|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. |pathPrefix -|no -|false +|No +|`false` |If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. |pendingQueueSize -|no +|No |10 |The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. |role -|no +|No |null |The Cloud Storage role. |roleSessionName -|no +|No |null |The Cloud Storage role session name. |skipFailedMessages -|no -|false +|No +|`false` |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. @@ -300,40 +300,40 @@ Alternatively, if a message fails to send to a Cloud Storage sink, the connector To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. |sliceTopicPartitionPath -|no -|false +|No +|`false` |When it is set to true, split the partitioned topic name into separate folders in the bucket path. |timePartitionDuration -|no +|No |86400000 |The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. |timePartitionPattern -|no +|No |yyyy-MM-dd |The format pattern of the time-based partitioning. For details, refer to the Java date and time format. |useHumanReadableMessageId -|no -|false +|No +|`false` |Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. |useHumanReadableSchemaVersion -|no -|false +|No +|`false` |Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. |withMetadata -|no -|false +|No +|`false` |Save message attributes to metadata. Not supported for formatType=Bytes. |withTopicPartitionNumber -|no -|true +|No +|`true` |When it is set to true, include the topic partition number to the object path. |=== @@ -347,105 +347,105 @@ Set the following properties in the `configs` section if you are using Azure Blo |Name |Required |Default |Description |azureStorageAccountConnectionString -|yes +|Yes | |The Azure Blob Storage connection string. Required when authenticating via connection string. |azureStorageAccountKey -|yes +|Yes | |The Azure Blob Storage account key. Required when authenticating via account name and account key. |azureStorageAccountName -|yes +|Yes | |The Azure Blob Storage account name. Required when authenticating via account name and account key. |azureStorageAccountSASToken -|yes +|Yes | |The Azure Blob Storage account SAS token. Required when authenticating via SAS token. |bucket -|yes +|Yes |null |The Cloud Storage bucket. |endpoint -|yes +|Yes |null |The Azure Blob Storage endpoint. |provider -|yes +|Yes |null |The Cloud Storage type. Azure Blob Storage only supports the azure-blob-storage provider. |avroCodec -|no +|No |snappy |Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. |batchSize -|no +|No |10 |The number of records submitted in batch. |batchTimeMs -|no +|No |1000 |The interval for batch submission. |bytesFormatTypeSeparator -|no +|No |0x10 |It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. |formatType -|no +|No |json |The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. Default: `JSON` |jsonAllowNaN -|no -|false +|No +|`false` |Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. |maxBatchBytes -|no +|No |10000000 |The maximum number of bytes in a batch. |parquetCodec -|no +|No |gzip |Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. |partitionerType -|no +|No |partition |The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. |partitionerUseIndexAsOffset -|no -|false -|Whether to use the Pulsar's message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. +|No +|`false` +|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. |pathPrefix -|no -|false +|No +|`false` |If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. |pendingQueueSize -|no +|No |10 |The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. |skipFailedMessages -|no -|false +|No +|`false` |Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. @@ -455,40 +455,40 @@ Alternatively, if a message fails to send to a Cloud Storage sink, the connector To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. |sliceTopicPartitionPath -|no -|false +|No +|`false` |When it is set to true, split the partitioned topic name into separate folders in the bucket path. |timePartitionDuration -|no +|No |86400000 |The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. |timePartitionPattern -|no +|No |yyyy-MM-dd |The format pattern of the time-based partitioning. For details, refer to the Java date and time format. |useHumanReadableMessageId -|no -|false +|No +|`false` |Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. |useHumanReadableSchemaVersion -|no -|false +|No +|`false` |Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. |withMetadata -|no -|false +|No +|`false` |Save message attributes to metadata. Not supported for formatType=Bytes. |withTopicPartitionNumber -|no -|true +|No +|`true` |When it is set to true, include the topic partition number to the object path. |=== @@ -501,7 +501,7 @@ The following table lists the supported conversions from {pulsar-short} schema t [cols=5] |=== -|Pulsar Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes +|{pulsar-short} Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes |Primitive |Not supported diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index 80f8859..bdb8fda 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -1,13 +1,21 @@ = Google BigQuery :connectorType: bigquery -The Google BigQuery sink connector reads messages from {pulsar-short} topics and writes them to BigQuery systems. +The {pulsar-short} BigQuery sink connector reads messages from {pulsar-short} topics and writes them to https://cloud.google.com/bigquery[Google BigQuery]. -https://cloud.google.com/bigquery[Google BigQuery] is a fully managed enterprise data warehouse that helps you manage and analyze your data with built-in features like machine learning, geospatial analysis, and business intelligence. BigQuery's serverless architecture lets you use SQL queries to answer your organization's biggest questions with zero infrastructure management. BigQuery's scalable, distributed analysis engine lets you query terabytes in seconds and petabytes in minutes. +This connector doesn't integrate directly with BigQuery. +Instead, it uses the https://pulsar.apache.org/docs/adaptors-kafka/[{pulsar} Kafka Connect adaptor] to transform {pulsar-short} message data into a Kafka-compatible format, and then it uses the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink] for the BigQuery integration. -BigQuery {pulsar-short} Sink is not integrated with BigQuery directly. It uses {pulsar-short}'s built-in https://pulsar.apache.org/docs/adaptors-kafka/[Kafka Connect adapter] library to transform message data into a Kafka compatible format. Then the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink] is used as the actual BigQuery integration. The adaptor provides a flexible and extensible framework for data transformation and processing. It supports various data formats, including JSON, Avro, and Protobuf, and enables users to apply transformations on the data as it is being streamed from {pulsar-short}. +The adaptor provides a flexible and extensible framework for data transformation and processing, including support for common data formats and in-transit data transformations. -You will notice references to Kafka throughout the configuration. *You don't need a running instance of Kafka to use this connector.* The Kafka references are used as "translation points" by this connector. +[TIP] +==== +This connector _doesn't_ require a Kafka instance. + +Although the connector uses Kafka-related libraries, it operates entirely within {pulsar-short}. + +Classes, properties, and configuration options that reference Kafka are translation points that map {pulsar-short} concepts to Kafka concepts in the connector. +==== == Create the connector @@ -30,113 +38,146 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] -=== Kafka Connect Adapter properties (`configs`) +=== Kafka Connect adaptor properties (`configs`) -The properties in the `configs` section define how data is streamed from {pulsar-short} to BigQuery. +The properties in the `configs` section define how data is streamed from {pulsar-short} to BigQuery using the Kafka Connect adaptor. -For source code for these configuration, see `https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/PulsarKafkaConnectSinkConfig.java[PulsarKafkaConnectSinkConfig.java]`. +For more information, see `https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/PulsarKafkaConnectSinkConfig.java[PulsarKafkaConnectSinkConfig.java]`. -[%header,cols="1,1,1,4"] +[cols=4] |=== -| Name | Required | Default | Description +|Name |Required |Default |Description + +|`kafkaConnectorSinkClass` +|Yes +|`""` +|The Kafka connector sink class to use. +For {product}, use `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector` unless you have your own custom class. + +|`offsetStorageTopic` +|Yes +|`""` +|The {pulsar-short} topic where you want to store https://pulsar.apache.org/docs/4.1.x/tutorials-topic/[message offsets (UUIDs)]. +This is an additional topic that helps track the connector's progress as messages are written to BigQuery. + +|`sanitizeTopicName` +|Yes +|`false` +a|Whether to replace unprocessable characters in topic names with underscores. +For example, a {pulsar-short} topic named `persistent://a/b/topic` becomes `+persistent___a_b_topic+` when this property is `true`. + +[IMPORTANT] +==== +For BigQuery, you _must_ set `sanitizeTopicName` to `true` to prevent errors from invalid characters in topic names. +BigQuery table names can include only letters, numbers, and underscores, and the Kafka Connect BigQuery Sink doesn't sanitize topic names before creating BigQuery tables. + +Be aware that this can cause naming collisions if two topics resolve to the same sanitized name. +For example, `topic_a` and `topic.a` are both sanitized as `topic_a`. +==== + +|`batchSize` +|No +|`16384` +|The maximum size, in bytes, of messages that the sink attempts to batch before flush. + +|`collapsePartitionedTopics` +|No +|`false` +a|Whether to omit the `-partition-` suffix from the names of partitioned topics. +This determines how many BigQuery tables are created from partitioned topics: + +* **`true`**: Collapse partitioned topics by removing the `-partition-` suffix from topic names. +All partitions of a partitioned topic are written to the same BigQuery table. +* **`false` (default)**: Maintain partitions by preserving the `-partition-` suffix when creating BigQuery tables from topic names. +Each partition of a partitioned topic is written to its own BigQuery table. + +|`kafkaConnectorConfigProperties` +|No +|`{}` (empty map) +|A key-value map of <>. + +|`lingerTimeMs` +|No +|`2147483647L` +|The duration, in milliseconds, that the sink attempts to batch messages before flush. + +|`maxBatchBitsForOffset` +|No +|`12` +|Number of bits to use for the index of messages in a batch, which is translated into offsets (UUIDs). +Must be an integer between `0` and `20`. + +If `0`, the behavior is disabled, and all messages in a batch have the same offset. + +|`topic` +|Yes +|`""` +|The name of the {pulsar-short} topic that you want the sink to read from. +Only provide the topic name, not the whole address. -| kafkaConnectorSinkClass -| yes -| -a| A Kafka-connector sink class to use. Unless you've developed your own, use the value `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector`. +|`unwrapKeyValueIfAvailable` +|No +|`true` +a|Whether to unwrap `KeyValue<>` data if the message `value` is of type `Record>`: -| offsetStorageTopic -| yes -| -| Pulsar topic to store offsets at. This is an additional topic to your topic with the actual data going to BigQuery. +* **`true` (default)**: For `Record>` data, extract `KeyValue<>` from the `Record` when writing to BigQuery. +* **`false`**: For `Record>` data, use the `Record` key (the entire `KeyValue<>` object) for writing to BigQuery. -| sanitizeTopicName -| yes -| -a| Some connectors cannot handle Pulsar topic names like `persistent://a/b/topic`, and they won't sanitize the topic name themselves. -If enabled, all non alpha-digital characters in topic name are replaced with underscores. -In some cases this may result in topic name collisions (`topic_a` and `topic.a` both resolve to `topic_a`). - -This value _must_ be `true`. -Any other value causes an error. - -| batchSize -| no -| 16384 -| Size of messages in bytes the sink will attempt to batch messages together before flush. - -| collapsePartitionedTopics -| no -| false -| Supply Kafka record with topic name without -partition- suffix for partitioned topics. - -| kafkaConnectorConfigProperties -| no -| `{}` -| A key/value map of config properties to pass to the Kafka connector. See <>. - -| lingerTimeMs -| no -| 2147483647L -| Time interval in milliseconds the sink will attempt to batch messages together before flush. - -| maxBatchBitsForOffset -| no -| 12 -| Number of bits (0 to 20) to use for index of message in the batch for translation into an offset. 0 to disable this behavior (Messages from the same batch will have the same offset which can affect some connectors.) - -| topic -| yes -| -| The Kafka topic name that is passed to the Kafka sink. - -| unwrapKeyValueIfAvailable -| no -| true -| In case of Record> data use key from KeyValue<> instead of one from Record. - -| useIndexAsOffset -| no -| true -| Allows use of message index instead of message sequenceId as offset, if available. Requires AppendIndexMetadataInterceptor and exposingBrokerEntryMetadataToClientEnabled=true on brokers. - -| useOptionalPrimitives -| no -| false -| Pulsar schema does not contain information whether the Schema is optional, Kafka's does. This provides a way to force all primitive schemas to be optional for Kafka. +|`useIndexAsOffset` +|No +|`true` +a|Whether to use the message index as the offset, instead of the message `sequenceId`: + +* **`true` (default)**: Use the message index as the offset, if an index is available. +Otherwise, use the message `sequenceId`. +* **`false`**: Use the message `sequenceId` as the offset. + +Requires `AppendIndexMetadataInterceptor` and `exposingBrokerEntryMetadataToClientEnabled=true` on https://pulsar.apache.org/docs/next/developing-binary-protocol/#broker-entry-metadata[brokers]. + +|`useOptionalPrimitives` +|No +|`false` +|{pulsar-short} schemas don't contain information about optional schemas, but Kafka schemas can include this information. +Set this property to `true` to force all primitive schemas to be optional when converting the {pulsar-short} schema to a Kafka schema. |=== [#kafkaConnectorConfigProperties] -=== Google BigQuery Configuration (`kafkaConnectorConfigProperties`) +=== Kafka Connect BigQuery Sink properties (`kafkaConnectorConfigProperties`) + +`kafkaConnectorConfigProperties` is a subproperty of `configs` that contains a map of configuration properties for the Kafka Connect BigQuery Sink. + +After the Kafka Connect adaptor transforms the {pulsar-short} data into a Kafka-compatible format, the Kafka Connect BigQuery Sink writes the data to BigQuery according to the properties in `kafkaConnectorConfigProperties`. -Set these properties in the `kafkaConnectorConfigProperties` section of the connector configuration. +Some of the Kafka Connect BigQuery Sink properties are the same as the Kafka Connect adaptor properties. +In some cases, the duplicate properties require matching values. +In other cases, you can use duplicate properties to perform additional data transformation or schema modification before writing to BigQuery. -For the source code for these configurations, see `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. +For more information, see `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. -[%header,cols="1,1,1,4"] +[cols=4] |=== -| Name | Required | Default | Description +|Name |Required |Default |Description -| allBQFieldsNullable -| no -| false -| If true, no fields in any produced BigQuery schemas are `REQUIRED`. +|allBQFieldsNullable +|No +|`false` +|If true, no fields in any produced BigQuery schemas are `REQUIRED`. All non-nullable Avro fields are translated as `NULLABLE` (or `REPEATED`, if arrays). -| allowBigQueryRequiredFieldRelaxation -| no -| false -| If true, fields in BigQuery Schema can be changed from `REQUIRED` to `NULLABLE`. +|allowBigQueryRequiredFieldRelaxation +|No +|`false` +|If true, fields in BigQuery Schema can be changed from `REQUIRED` to `NULLABLE`. -| allowNewBigQueryFields -| no -| false -| If true, new fields can be added to BigQuery tables during subsequent schema updates. +|allowNewBigQueryFields +|No +|`false` +|If true, new fields can be added to BigQuery tables during subsequent schema updates. -| allowSchemaUnionization -| no -| false -a| If true, the existing table schema (if one is present) is unionized with new record schemas during schema updates. +|allowSchemaUnionization +|No +|`false` +a|If true, the existing table schema (if one is present) is unionized with new record schemas during schema updates. If false, the record of the last schema in a batch is used for any necessary table creation and schema update attempts. @@ -156,181 +197,181 @@ This presents two issues: * Since BigQuery doesn't allow columns to be dropped from tables, they add unnecessary noise to the schema. * Since BigQuery doesn't allow column types to be modified, they can break downstream pipelines where well-behaved records have schemas whose field names overlap with the accidentally-added columns in the table, but the types don't match. -| autoCreateBucket -| no -| true -| Whether to automatically create the given bucket if it does not exist. - -| autoCreateTables -| no -| false -| Automatically create BigQuery tables if they don't already exist - -| avroDataCacheSize -| no -| 100 -| The size of the cache to use when converting schemas from Avro to Kafka Connect. - -| batchLoadIntervalSec -| no -| 120 -| The interval, in seconds, in which to attempt to run GCS to BigQuery load jobs. Only relevant if `enableBatchLoad` is configured. - -| bigQueryMessageTimePartitioning -| no -| false -| Whether or not to use the message time when inserting records. Default uses the connector processing time. - -| bigQueryPartitionDecorator -| no -| true -| Whether or not to append partition decorator to BigQuery table name when inserting records. Default is true. Setting this to true appends partition decorator to table name (e.g. table$yyyyMMdd depending on the configuration set for bigQueryPartitionDecorator). Setting this to false bypasses the logic to append the partition decorator and uses raw table name for inserts. - -| bigQueryRetry -| no -| 0 -| The number of retry attempts made for a BigQuery request that fails with a backend error or a quota exceeded error. - -| bigQueryRetryWait -| no -| 1000 -| The minimum amount of time, in milliseconds, to wait between retry attempts for a BigQuery backend or quota exceeded error. - -| clusteringPartitionFieldNames -| no +|autoCreateBucket +|No +|`true` +|Whether to automatically create the given bucket if it does not exist. + +|autoCreateTables +|No +|`false` +|Automatically create BigQuery tables if they don't already exist + +|avroDataCacheSize +|No +|100 +|The size of the cache to use when converting schemas from Avro to Kafka Connect. + +|batchLoadIntervalSec +|No +|120 +|The interval, in seconds, in which to attempt to run GCS to BigQuery load jobs. Only relevant if `enableBatchLoad` is configured. + +|bigQueryMessageTimePartitioning +|No +|`false` +|Whether or not to use the message time when inserting records. Default uses the connector processing time. + +|bigQueryPartitionDecorator +|No +|`true` +|Whether or not to append partition decorator to BigQuery table name when inserting records. Default is true. Setting this to true appends partition decorator to table name (e.g. table$yyyyMMdd depending on the configuration set for bigQueryPartitionDecorator). Setting this to false bypasses the logic to append the partition decorator and uses raw table name for inserts. + +|bigQueryRetry +|No +|0 +|The number of retry attempts made for a BigQuery request that fails with a backend error or a quota exceeded error. + +|bigQueryRetryWait +|No +|1000 +|The minimum amount of time, in milliseconds, to wait between retry attempts for a BigQuery backend or quota exceeded error. + +|clusteringPartitionFieldNames +|No | -| Comma-separated list of fields where data is clustered in BigQuery. +|Comma-separated list of fields where data is clustered in BigQuery. -| convertDoubleSpecialValues -| no -| false -| Designates whether +Infinity is converted to Double.MAX_VALUE and whether -Infinity and NaN are converted to Double.MIN_VALUE to ensure successful delivery to BigQuery. +|convertDoubleSpecialValues +|No +|`false` +|Designates whether +Infinity is converted to Double.MAX_VALUE and whether -Infinity and NaN are converted to Double.MIN_VALUE to ensure successful delivery to BigQuery. -| defaultDataset -| yes +|defaultDataset +|Yes | -| The default dataset to be used - -| deleteEnabled -| no -| false -| Enable delete functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. A delete will be performed when a record with a null value (that is–a tombstone record) is read. This feature will not work with SMTs that change the name of the topic. - -| enableBatchLoad -| no -| empty -| Beta Feature. Use with caution. The sublist of topics to be batch loaded through GCS. - -| gcsBucketName -| no -| empty -| The name of the bucket where Google Cloud Storage (GCS) blobs are located. These blobs are used to batch-load to BigQuery. This is applicable only if `enableBatchLoad` is configured. - -| includeKafkaData -| no -| false -| Whether to include an extra block containing the Kafka source topic, offset, and partition information in the resulting BigQuery rows. - -| intermediateTableSuffix -| no -| `.tmp` -| A suffix that will be appended to the names of destination tables to create the names for the corresponding intermediate tables. Multiple intermediate tables may be created for a single destination table, but their names will always start with the name of the destination table, followed by this suffix, and possibly followed by an additional suffix. - -| kafkaDataFieldName -| no +|The default dataset to be used + +|deleteEnabled +|No +|`false` +|Enable delete functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. A delete will be performed when a record with a null value (that is–a tombstone record) is read. This feature will not work with SMTs that change the name of the topic. + +|enableBatchLoad +|No +|empty +|Beta Feature. Use with caution. The sublist of topics to be batch loaded through GCS. + +|gcsBucketName +|No +|empty +|The name of the bucket where Google Cloud Storage (GCS) blobs are located. These blobs are used to batch-load to BigQuery. This is applicable only if `enableBatchLoad` is configured. + +|includeKafkaData +|No +|`false` +|Whether to include an extra block containing the Kafka source topic, offset, and partition information in the resulting BigQuery rows. + +|intermediateTableSuffix +|No +|`.tmp` +|A suffix that will be appended to the names of destination tables to create the names for the corresponding intermediate tables. Multiple intermediate tables may be created for a single destination table, but their names will always start with the name of the destination table, followed by this suffix, and possibly followed by an additional suffix. + +|kafkaDataFieldName +|No | -| The Kafka data field name. The default value is null, which means the Kafka Data field will not be included. +|The Kafka data field name. The default value is null, which means the Kafka Data field will not be included. -| kafkaKeyFieldName -| no +|kafkaKeyFieldName +|No | -| The Kafka key field name. The default value is null, which means the Kafka Key field will not be included. +|The Kafka key field name. The default value is null, which means the Kafka Key field will not be included. -| keyfile -| yes +|keyfile +|Yes | -a| Can be either a string representation of the Google credentials file or the path to the Google credentials file itself. +|Can be either a string representation of the Google credentials file or the path to the Google credentials file itself. When configuring this connector in the {astra-ui}, the string representation must be used. With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. -| keySource -| yes -| `FILE` -a| Determines whether the keyfile configuration is the path to the credentials JSON file or to the JSON itself. Available values are `FILE` and `JSON`. +|keySource +|Yes +|`FILE` +|Determines whether the keyfile configuration is the path to the credentials JSON file or to the JSON itself. Available values are `FILE` and `JSON`. When configuring this connector in the {astra-ui}, JSON is the only option. With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. -| name -| yes +|name +|Yes | -| The name of the connector. Use the same value as Pulsar sink name. +|The name of the connector. Use the same value as {pulsar-short} sink name. -| mergeIntervalMs -| no -| `60_000L` -| How often (in milliseconds) to perform a merge flush, if upsert/delete is enabled. Can be set to -1 to disable periodic flushing. +|mergeIntervalMs +|No +|`60_000L` +|How often (in milliseconds) to perform a merge flush, if upsert/delete is enabled. Can be set to -1 to disable periodic flushing. -| mergeRecordsThreshold -| no -| `-1` -| How many records to write to an intermediate table before performing a merge flush, if upsert/delete is enabled. If set to `-1`, then record count-based flushing is disabled. +|mergeRecordsThreshold +|No +|`-1` +|How many records to write to an intermediate table before performing a merge flush, if upsert/delete is enabled. If set to `-1`, then record count-based flushing is disabled. -| project -| yes +|project +|Yes | -| The BigQuery project to write to +|The BigQuery project to write to -| queueSize -| no -| `-1` -| The maximum size (or `-1` for no maximum size) of the worker queue for BigQuery write requests before all topics are paused. This is a soft limit; the size of the queue can go over this before topics are paused. All topics resume once a flush is triggered or the size of the queue drops under half of the maximum size. +|queueSize +|No +|`-1` +|The maximum size (or `-1` for no maximum size) of the worker queue for BigQuery write requests before all topics are paused. This is a soft limit; the size of the queue can go over this before topics are paused. All topics resume once a flush is triggered or the size of the queue drops under half of the maximum size. -| sanitizeTopics -| yes -| false -a| Designates whether to automatically sanitize topic names before using them as table names. If not enabled, topic names are used as table names. +|sanitizeTopics +|Yes +|`false` +|Designates whether to automatically sanitize topic names before using them as table names. If not enabled, topic names are used as table names. The only accepted value is `false`. Providing any other value will result in an error. -| schemaRetriever -| no -| `com.wepay.kafka.connect.bigquery.retrieve.IdentitySchemaRetriever` -| A class that can be used for automatically creating tables and/or updating schemas. +|schemaRetriever +|No +|`com.wepay.kafka.connect.bigquery.retrieve.IdentitySchemaRetriever` +|A class that can be used for automatically creating tables and/or updating schemas. -| threadPoolSize -| no -| 10 -| The size of the BigQuery write thread pool. This establishes the maximum number of concurrent writes to BigQuery. +|threadPoolSize +|No +|10 +|The size of the BigQuery write thread pool. This establishes the maximum number of concurrent writes to BigQuery. -| timePartitioningType -| no -| `DAY` -| The time partitioning type to use when creating tables. Existing tables will not be altered to use this partitioning type. Valid Values: (case insensitive) [MONTH, YEAR, HOUR, DAY] +|timePartitioningType +|No +|`DAY` +|The time partitioning type to use when creating tables. Existing tables will not be altered to use this partitioning type. Valid Values: (case insensitive) [MONTH, YEAR, HOUR, DAY] -| timestampPartitionFieldName -| no +|timestampPartitionFieldName +|No | -| The name of the field in the value that contains the timestamp to partition by in BigQuery and enable timestamp partitioning for each table. Leave this configuration blank, to enable ingestion time partitioning for each table. +|The name of the field in the value that contains the timestamp to partition by in BigQuery and enable timestamp partitioning for each table. Leave this configuration blank, to enable ingestion time partitioning for each table. -| topic2TableMap -| no +|topic2TableMap +|No | -a| Optional map of topics to tables in the format of comma-separated tuples, such as `:,:,...` +|Optional map of topics to tables in the format of comma-separated tuples, such as `:,:,...` Because `sanitizeTopicName` must be `true`, any alphanumeric character in topic names are replaced with underscores. Keep this in mind when creating the mapping to avoid overlapping names. -For example, if the topic name is provided as `persistent://a/b/c-d`, then the mapping topic name would be `persistent___a_b_c_d`. +For example, if the topic name is provided as `persistent://a/b/c-d`, then the mapping topic name would be `+persistent___a_b_c_d+`. -| topics -| yes +|topics +|Yes | -| A list of Kafka topics to read from. Use the same name as the Pulsar topic. +|A list of Kafka topics to read from. Use the same name as the {pulsar-short} topic. Only provide the topic name, not the whole address. -| upsertEnabled -| no -| false -| Enable upsert functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. Row-matching will be performed based on the contents of record keys. This feature won't work with SMTs that change the name of the topic. +|upsertEnabled +|No +|`false` +|Enable upsert functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. Row-matching will be performed based on the contents of record keys. This feature won't work with SMTs that change the name of the topic. |=== \ No newline at end of file From e347f1dd0d4f608eab24d957ec47d2daa2c5017f Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Fri, 30 Jan 2026 16:47:05 -0800 Subject: [PATCH 27/31] finish bigquery --- .../sinks/bigquery/sample-data.adoc | 2 +- .../connectors/sinks/google-bigquery.adoc | 292 +++++++++--------- 2 files changed, 154 insertions(+), 140 deletions(-) diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc index 55af636..ccc3ee4 100644 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc @@ -8,7 +8,7 @@ "configs": { "batchSize": "1000", "kafkaConnectorConfigProperties": { - "name": "bq-sink1", + "name": "${SINK_NAME}", "project": "my-bigquery-project", "defaultDataset": "BQ_CONNECTOR_TEST", "autoCreateBucket": true, diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index bdb8fda..bcaa495 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -33,6 +33,7 @@ include::pulsar-io:partial$connectors/sinks/manage.adoc[] include::pulsar-io:partial$connectors/connector-params-intro.adoc[] +[#pulsar-sink-connector-properties] === {pulsar-short} sink connector properties include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] @@ -48,33 +49,6 @@ For more information, see `https://github.com/apache/pulsar/blob/master/pulsar-i |=== |Name |Required |Default |Description -|`kafkaConnectorSinkClass` -|Yes -|`""` -|The Kafka connector sink class to use. -For {product}, use `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector` unless you have your own custom class. - -|`offsetStorageTopic` -|Yes -|`""` -|The {pulsar-short} topic where you want to store https://pulsar.apache.org/docs/4.1.x/tutorials-topic/[message offsets (UUIDs)]. -This is an additional topic that helps track the connector's progress as messages are written to BigQuery. - -|`sanitizeTopicName` -|Yes -|`false` -a|Whether to replace unprocessable characters in topic names with underscores. -For example, a {pulsar-short} topic named `persistent://a/b/topic` becomes `+persistent___a_b_topic+` when this property is `true`. - -[IMPORTANT] -==== -For BigQuery, you _must_ set `sanitizeTopicName` to `true` to prevent errors from invalid characters in topic names. -BigQuery table names can include only letters, numbers, and underscores, and the Kafka Connect BigQuery Sink doesn't sanitize topic names before creating BigQuery tables. - -Be aware that this can cause naming collisions if two topics resolve to the same sanitized name. -For example, `topic_a` and `topic.a` are both sanitized as `topic_a`. -==== - |`batchSize` |No |`16384` @@ -96,6 +70,12 @@ Each partition of a partitioned topic is written to its own BigQuery table. |`{}` (empty map) |A key-value map of <>. +|`kafkaConnectorSinkClass` +|Yes +|`""` +|The Kafka connector sink class to use. +For {product}, use `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector` unless you have your own custom class. + |`lingerTimeMs` |No |`2147483647L` @@ -109,6 +89,27 @@ Must be an integer between `0` and `20`. If `0`, the behavior is disabled, and all messages in a batch have the same offset. +|`offsetStorageTopic` +|Yes +|`""` +|The {pulsar-short} topic where you want to store https://pulsar.apache.org/docs/4.1.x/tutorials-topic/[message offsets (UUIDs)]. +This is an additional topic that helps track the connector's progress as messages are written to BigQuery. + +|`sanitizeTopicName` +|Yes +|`false` +a|Whether to replace unprocessable characters in topic names with underscores. +For example, a {pulsar-short} topic named `persistent://a/b/topic` becomes `+persistent___a_b_topic+` when this property is `true`. + +[IMPORTANT] +==== +For BigQuery, you _must_ set `sanitizeTopicName` to `true` to prevent errors from invalid characters in topic names. +BigQuery table names can include only letters, numbers, and underscores, and the Kafka Connect BigQuery Sink doesn't sanitize topic names before creating BigQuery tables. + +Be aware that this can cause naming collisions if two topics resolve to the same sanitized name. +For example, `topic_a` and `topic.a` are both sanitized as `topic_a`. +==== + |`topic` |Yes |`""` @@ -152,226 +153,239 @@ Some of the Kafka Connect BigQuery Sink properties are the same as the Kafka Con In some cases, the duplicate properties require matching values. In other cases, you can use duplicate properties to perform additional data transformation or schema modification before writing to BigQuery. -For more information, see `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. +For more information, see the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink configuration reference] and `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. [cols=4] |=== |Name |Required |Default |Description -|allBQFieldsNullable +|`allBQFieldsNullable` |No |`false` -|If true, no fields in any produced BigQuery schemas are `REQUIRED`. -All non-nullable Avro fields are translated as `NULLABLE` (or `REPEATED`, if arrays). +|Whether the BigQuery schemas generated by the connector allow `null` values in all fields. -|allowBigQueryRequiredFieldRelaxation -|No -|`false` -|If true, fields in BigQuery Schema can be changed from `REQUIRED` to `NULLABLE`. +* **`false` (default)**: All fields in the BigQuery schemas are `REQUIRED`. +* **`true`**: No fields in the BigQuery schemas are `REQUIRED`. +All non-nullable Avro fields are translated as `NULLABLE` (or `REPEATED`, if arrays). -|allowNewBigQueryFields +|`allowBigQueryRequiredFieldRelaxation` |No |`false` -|If true, new fields can be added to BigQuery tables during subsequent schema updates. +|If `allBQFieldsNullable` is `false`, you can set this property to `true` to allow BigQuery schema updates to change `REQUIRED` fields to `NULLABLE`. +This only applies to schema updates that happen after initial table creation. -|allowSchemaUnionization +|`allowNewBigQueryFields` |No |`false` -a|If true, the existing table schema (if one is present) is unionized with new record schemas during schema updates. - -If false, the record of the last schema in a batch is used for any necessary table creation and schema update attempts. - -Setting `allowSchemaUnionization` to false _and_ `allowNewBigQueryFields` and `allowBigQueryRequiredFieldRelaxation` to true is equivalent to setting `autoUpdateSchemas` to true in older (pre-2.0.0) versions of this connector. -In this case, if BigQuery raises a schema validation exception or a table doesn't exist when a writing a batch, the connector tries to remediate by required field relaxation and/or adding new fields. +a|Whether BigQuery schema updates can add fields: -If `allowSchemaUnionization`, `allowNewBigQueryFields`, and `allowBigQueryRequiredFieldRelaxation` are all true, then the connector creates or updates tables with a schema whose fields are a union of the existing table schema fields and the fields present in all of the records of the current batch. +* **`false` (default)**: Schema updates _cannot_ add fields to BigQuery tables. +* **`true`**: Schema updates _can_ add new fields to BigQuery tables. -The key difference is that with unionization disabled, new record schemas have to be a superset of the table schema in BigQuery. +This only applies to schema updates that happen after initial table creation. -`allowSchemaUnionization` is a useful tool for parsing. -For example, if you'd like to remove fields from data upstream, the updated schemas still work in the connector. It is similarly useful when different tasks see records whose schemas contain different fields that are not in the table. +|`allowSchemaUnionization` +|No +|`false` +a|Whether to enable schema unionization during schema updates: -However, be aware that if `allowSchemaUnionization` is set to true, and some bad records are in the topic, then the BigQuery schema can be permanently changed. -This presents two issues: +* **`false` (default)**: The record of the last schema in a batch is used for any necessary table creation and schema update attempts. +* **`true`**: The existing table schema, if present, is unionized with new record schemas during schema updates. -* Since BigQuery doesn't allow columns to be dropped from tables, they add unnecessary noise to the schema. -* Since BigQuery doesn't allow column types to be modified, they can break downstream pipelines where well-behaved records have schemas whose field names overlap with the accidentally-added columns in the table, but the types don't match. +For more information about this parameter, how it interacts with other parameters, and important considerations, see `allowSchemaUnionization` in the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink configuration reference]. -|autoCreateBucket +|`autoCreateBucket` |No |`true` -|Whether to automatically create the given bucket if it does not exist. +|Whether to automatically create the bucket if it doesn't exist. -|autoCreateTables +|`autoCreateTables` |No |`false` -|Automatically create BigQuery tables if they don't already exist +|Automatically create BigQuery tables if they don't already exist. -|avroDataCacheSize -|No -|100 -|The size of the cache to use when converting schemas from Avro to Kafka Connect. +Tables are named after the sanitized {pulsar-short} topic names unless overridden by `topic2TableMap`. -|batchLoadIntervalSec +|`avroDataCacheSize` |No -|120 -|The interval, in seconds, in which to attempt to run GCS to BigQuery load jobs. Only relevant if `enableBatchLoad` is configured. +|`100` +|The size of the cache to use when converting schemas from Avro to Kafka Connect. -|bigQueryMessageTimePartitioning +|`bigQueryMessageTimePartitioning` |No |`false` |Whether or not to use the message time when inserting records. Default uses the connector processing time. -|bigQueryPartitionDecorator +|`bigQueryPartitionDecorator` |No |`true` |Whether or not to append partition decorator to BigQuery table name when inserting records. Default is true. Setting this to true appends partition decorator to table name (e.g. table$yyyyMMdd depending on the configuration set for bigQueryPartitionDecorator). Setting this to false bypasses the logic to append the partition decorator and uses raw table name for inserts. -|bigQueryRetry +|`bigQueryRetry` |No |0 |The number of retry attempts made for a BigQuery request that fails with a backend error or a quota exceeded error. -|bigQueryRetryWait +|`bigQueryRetryWait` |No |1000 |The minimum amount of time, in milliseconds, to wait between retry attempts for a BigQuery backend or quota exceeded error. -|clusteringPartitionFieldNames +|`clusteringPartitionFieldNames` |No | |Comma-separated list of fields where data is clustered in BigQuery. -|convertDoubleSpecialValues +|`convertDoubleSpecialValues` |No |`false` |Designates whether +Infinity is converted to Double.MAX_VALUE and whether -Infinity and NaN are converted to Double.MIN_VALUE to ensure successful delivery to BigQuery. -|defaultDataset +|`defaultDataset` |Yes | |The default dataset to be used -|deleteEnabled +|`deleteEnabled` |No |`false` -|Enable delete functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. A delete will be performed when a record with a null value (that is–a tombstone record) is read. This feature will not work with SMTs that change the name of the topic. +|Enable delete functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. A delete will be performed when a record with a null value (a tombstone) is read. This feature will not work with SMTs that change the name of the topic. -|enableBatchLoad +|`enableBatchLoad` (Beta) |No -|empty -|Beta Feature. Use with caution. The sublist of topics to be batch loaded through GCS. +|Not set +a|A subset of `topics` to be batch loaded through GCS to BigQuery. +If set, you can also set the following properties: -|gcsBucketName -|No -|empty -|The name of the bucket where Google Cloud Storage (GCS) blobs are located. These blobs are used to batch-load to BigQuery. This is applicable only if `enableBatchLoad` is configured. +* `batchLoadIntervalSec`: The frequency, in seconds, that the connector attempts to run GCS to BigQuery load jobs. +* `gcsBucketName`: The name of the GCS bucket where blobs are staged for batch loading to BigQuery. + +[IMPORTANT] +==== +This is a beta feature that might have unexpected results or suboptimal performance. +==== -|includeKafkaData +|`includeKafkaData` |No |`false` -|Whether to include an extra block containing the Kafka source topic, offset, and partition information in the resulting BigQuery rows. +|Whether to include an extra block containing the original topic, offset, and partition information in the resulting BigQuery rows. + +If `true`, you can use `kafkaDataFieldName` to specify the field name for this block. -|intermediateTableSuffix +|`intermediateTableSuffix` |No |`.tmp` -|A suffix that will be appended to the names of destination tables to create the names for the corresponding intermediate tables. Multiple intermediate tables may be created for a single destination table, but their names will always start with the name of the destination table, followed by this suffix, and possibly followed by an additional suffix. +|A suffix that is used when creating intermediate tables from BigQuery destination tables. -|kafkaDataFieldName -|No -| -|The Kafka data field name. The default value is null, which means the Kafka Data field will not be included. +The names of intermediate tables are constructed from the destination table name, the `intermediateTableSuffix`, and an additional suffix if needed for uniqueness. +For example, using the default suffix, a destination table named `bqTable` would have intermediate tables named `bqTable.tmp`, `bqTable.tmp_1`, `bqTable.tmp_2`, and so on. -|kafkaKeyFieldName -|No -| -|The Kafka key field name. The default value is null, which means the Kafka Key field will not be included. - -|keyfile +|`keyfile` |Yes -| -|Can be either a string representation of the Google credentials file or the path to the Google credentials file itself. +|Not set +|A string representation of Google credentials JSON, or the path to a Google credentials JSON file. -When configuring this connector in the {astra-ui}, the string representation must be used. -With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. +String format is required when creating this connector in the {astra-ui}. -|keySource +|`keySource` |Yes |`FILE` -|Determines whether the keyfile configuration is the path to the credentials JSON file or to the JSON itself. Available values are `FILE` and `JSON`. +|If `keyfile` is a file path, set `keySource` to `FILE`. -When configuring this connector in the {astra-ui}, JSON is the only option. -With the `pulsar-admin` CLI or {pulsar-short} Admin API, you can use either the representation or a file. +If `keyfile` is a string, set `keySource` to `JSON`. -|name -|Yes -| -|The name of the connector. Use the same value as {pulsar-short} sink name. +`JSON` is required when creating this connector in the {astra-ui}. -|mergeIntervalMs +|`mergeIntervalMs` |No |`60_000L` -|How often (in milliseconds) to perform a merge flush, if upsert/delete is enabled. Can be set to -1 to disable periodic flushing. +|The merge flush interval in milliseconds, if upsert/delete is enabled. + +Set to `-1` to disable periodic flushing. + +See also `mergeRecordsThreshold`. -|mergeRecordsThreshold +|`mergeRecordsThreshold` |No |`-1` -|How many records to write to an intermediate table before performing a merge flush, if upsert/delete is enabled. If set to `-1`, then record count-based flushing is disabled. +|The number of records to write to an intermediate table before performing a merge flush, if upsert/delete is enabled. -|project +The default is `-1`, which disables merge flushing based on record count. + +See also `mergeIntervalMs`. + +|`name` |Yes -| -|The BigQuery project to write to +|`""` +|Must be the same as the `name` in the <>. + +|`project` +|Yes +|`""` +|The BigQuery project to write to. -|queueSize +|`queueSize` |No |`-1` -|The maximum size (or `-1` for no maximum size) of the worker queue for BigQuery write requests before all topics are paused. This is a soft limit; the size of the queue can go over this before topics are paused. All topics resume once a flush is triggered or the size of the queue drops under half of the maximum size. +|The maximum size of the worker queue for BigQuery write requests before all topics are paused. + +This is a soft limit; the queue size can exceed the maximum before topics are paused. +All topics resume after a flush, or when the queue size is less than half of the maximum. + +The default is `-1`, which means the queue size is unlimited. -|sanitizeTopics +|`sanitizeTopics` |Yes |`false` -|Designates whether to automatically sanitize topic names before using them as table names. If not enabled, topic names are used as table names. +|In `kafkaConnectorConfigProperties`, you must set this property to `false`. -The only accepted value is `false`. Providing any other value will result in an error. +Topic names are sanitized by the Kafka Connect adaptor with `sanitizeTopicName` in `<>`. -|schemaRetriever +|`schemaRetriever` |No |`com.wepay.kafka.connect.bigquery.retrieve.IdentitySchemaRetriever` -|A class that can be used for automatically creating tables and/or updating schemas. +|A class that can be used to create tables and update schemas automatically. -|threadPoolSize +|`threadPoolSize` |No -|10 -|The size of the BigQuery write thread pool. This establishes the maximum number of concurrent writes to BigQuery. +|`10` +|The size of the BigQuery write thread pool. +This determines the maximum number of concurrent writes to BigQuery. -|timePartitioningType +|`timePartitioningType` |No |`DAY` -|The time partitioning type to use when creating tables. Existing tables will not be altered to use this partitioning type. Valid Values: (case insensitive) [MONTH, YEAR, HOUR, DAY] +|The time partitioning type to use when creating tables: `DAY`, `HOUR`, `MONTH`, or `YEAR`. +This applies to new tables only; existing tables aren't altered to this partitioning type. -|timestampPartitionFieldName +|`timestampPartitionFieldName` |No -| -|The name of the field in the value that contains the timestamp to partition by in BigQuery and enable timestamp partitioning for each table. Leave this configuration blank, to enable ingestion time partitioning for each table. +|Not set +|The name of the field in the message `value` that contains a timestamp to use for partitioning in BigQuery, and to enable timestamp partitioning on each table. + +If empty, tables use ingestion-time partitioning. -|topic2TableMap +|`topic2TableMap` |No -| -|Optional map of topics to tables in the format of comma-separated tuples, such as `:,:,...` +|Not set +a|Optional map of topic names to table names formatted as comma-separated tuples, such as `topic1:table1,topic2:table2,topic3:table3`. -Because `sanitizeTopicName` must be `true`, any alphanumeric character in topic names are replaced with underscores. -Keep this in mind when creating the mapping to avoid overlapping names. -For example, if the topic name is provided as `persistent://a/b/c-d`, then the mapping topic name would be `+persistent___a_b_c_d+`. +[IMPORTANT] +==== +If you use this property, you must use the sanitized topic names, not the original {pulsar-short} topic names. +Because `sanitizeTopicName` is `true` in `<>`, the Kafka Connect BigQuery Sink receives sanitized topic names from the Kafka Connect adaptor. +For example, a {pulsar-short} topic named `persistent://a/b/c-d` must be mapped with the sanitized name `+persistent___a_b_c_d+`. +==== -|topics +|`topics` |Yes -| -|A list of Kafka topics to read from. Use the same name as the {pulsar-short} topic. -Only provide the topic name, not the whole address. +|`""` +|Must be the same as the `topic` in the <>. -|upsertEnabled +|`upsertEnabled` |No |`false` -|Enable upsert functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. Row-matching will be performed based on the contents of record keys. This feature won't work with SMTs that change the name of the topic. +|Whether to enable upsert functionality on the connector by using record keys, intermediate tables, and periodic merge flushes. +Row-matching is performed based on the contents of record keys. +This feature doesn't work with SMTs that change the name of the topic. |=== \ No newline at end of file From 46c98565322fe1a0af0dbbd32e87df5f745dcf79 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Fri, 30 Jan 2026 19:53:52 -0800 Subject: [PATCH 28/31] finally finish bigquery and cloud storage --- .../pages/connectors/sinks/cloud-storage.adoc | 607 ++++++------------ .../connectors/sinks/google-bigquery.adoc | 2 +- 2 files changed, 200 insertions(+), 409 deletions(-) diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc index 4b84263..4a7e308 100644 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc @@ -6,7 +6,7 @@ The Cloud Storage sink connector reads messages from {pulsar-short} topics and w The following cloud storage providers are supported: * https://aws.amazon.com/s3/[AWS S3] -* https://cloud.google.com/storage[Google's Cloud Storage] +* https://cloud.google.com/storage[Google Cloud Storage] * https://azure.microsoft.com/en-us/products/storage/blobs[Microsoft Azure Blob Storage] == Create the connector @@ -31,465 +31,289 @@ include::pulsar-io:partial$connectors/connector-params-intro.adoc[] include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] [#configs] -== Google Cloud Storage properties (`configs`) -//See if the 3 sections can be combined into 1 table with columns or lists for each provider. +== Cloud Storage sink connector properties (`configs`) -Set the following properties in the `configs` section if you are using Google Cloud Storage. +In the `configs` section of the connector configuration, set the following data transformation and cloud storage connection properties. -For other providers, see <> and <>. - -[cols="2,1,1,3"] +[cols=4] |=== |Name |Required |Default |Description -|bucket -|Yes -|null -|The Cloud Storage bucket - -|provider -|Yes -|null -|The Cloud Storage type. Google cloud storage only supports the google-cloud-storage provider. - -|avroCodec -|No -|snappy -|Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. - -|batchSize -|No -|10 -|The number of records submitted in batch. - -|batchTimeMs -|No -|1000 -|The interval for batch submission. - -|bytesFormatTypeSeparator -|No -|0x10 -|It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. +|`azureStorageAccountConnectionString` +|Yes for Azure -|formatType -|No -|json -|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. +Not used for GCS or AWS +|Empty +|The Azure Blob Storage connection string to authenticate with the storage account. -Default: `JSON` +If not set, you must set either `azureStorageAccountSASToken` _or_ both `azureStorageAccountKey` and `azureStorageAccountName`. -|gcsServiceAccountKeyFileContent -|No -|empty -|The contents of the JSON service key file. If empty, credentials are read from gcsServiceAccountKeyFilePath file. +|`azureStorageAccountKey` and `azureStorageAccountName` +|Yes for Azure -|gcsServiceAccountKeyFilePath -|No -|empty -|Path to the GCS credentials file. If empty, the credentials file are read from the GOOGLE_APPLICATION_CREDENTIALS environment variable. +Not used for GCS or AWS +|Empty +|The Azure Blob Storage account key and account name to authenticate with the storage account. +You must provide both properties when using this authentication method. -|jsonAllowNaN -|No -|`false` -|Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. +If not set, you must set either `azureStorageAccountSASToken` _or_ `azureStorageAccountConnectionString`. -|maxBatchBytes -|No -|10000000 -|The maximum number of bytes in a batch. +|`azureStorageAccountSASToken` +|Yes for Azure -|parquetCodec -|No -|gzip -|Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. +Not used for GCS or AWS +|Empty +|The Azure Blob Storage account SAS token to authenticate with the storage account. -|partitionerType -|No -|partition -|The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. +If not set, you must set either `azureStorageAccountConnectionString` _or_ both `azureStorageAccountKey` and `azureStorageAccountName`. -|partitionerUseIndexAsOffset +|`avroCodec` |No -|`false` -|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. +|`snappy` +|If `formatType` is `avro`, set the codec compression type: `bzip2`, `deflate`, `snappy`, `xz`, `zstandard`, or `null` (no compression). -|pathPrefix +|`batchSize` |No -|`false` -|If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. +|`10` +|The number of records submitted in a batch. -|pendingQueueSize -|No -|10 -|The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. +By default, `batchSize` and `pendingQueueSize` are equal. -|skipFailedMessages +|`batchTimeMs` |No -|`false` -|Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. - -By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. -If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. - -Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. -To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. - -|sliceTopicPartitionPath -|No -|`false` -|When it is set to true, split the partitioned topic name into separate folders in the bucket path. - -|timePartitionDuration -|No -|86400000 -|The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. - -|timePartitionPattern -|No -|yyyy-MM-dd -|The format pattern of the time-based partitioning. For details, refer to the Java date and time format. - -|useHumanReadableMessageId -|No -|`false` -|Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. - -|useHumanReadableSchemaVersion -|No -|`false` -|Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. - -|withMetadata -|No -|`false` -|Save message attributes to metadata. - -Not supported for formatType=Bytes. - -|withTopicPartitionNumber -|No -|`true` -|When it is set to true, include the topic partition number to the object path. -|=== - -[#configs-aws] -=== AWS S3 Storage - -Set the following properties in the `configs` section if you are using AWS S3 Storage: - -[cols="2,1,1,3"] -|=== -|Name |Required |Default |Description +|`1000` +|The interval for batch submission. -|accessKeyId +|`bucket` |Yes -|null -a|The Cloud Storage access key ID. It requires permission to write objects. +|`null` +|The name of the cloud storage bucket or container to write to. -The suggested permission policies for AWS S3 are: - -- `s3:AbortMultipartUpload` -- `s3:GetObject*` -- `s3:PutObject*` -- `s3:List*` - -If your connector configuration doesn't specify a region, then you must also enable `s3:GetBucketLocation`. - -|bucket -|Yes -|null -|The Cloud Storage bucket. +|`bytesFormatTypeSeparator` +|No +|`0x10` +|This separator is inserted between records for the `formatType` of bytes. +An input record that contains the line separator will look like multiple records in the output object. -|endpoint -|Yes -|null -|The Cloud Storage endpoint. +|`endpoint` +|Yes for AWS and Azure -|provider -|Yes -|null -|The Cloud Storage type, such as aws-s3, s3v2 (s3v2 uses the AWS client but not the JCloud client). +Not used for GCS +|`null` +|The endpoint for your AWS S3 or Azure Blob Storage service. -|secretAccessKey +|`formatType` |Yes -|null -|The Cloud Storage secret access key. +|`json` +|The desired format type for the output to cloud storage: `json`, `avro`, `bytes`, or `parquet`. -|avroCodec -|No -|snappy -|Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. +For supported schema conversions and limitations, see <>. -|batchSize -|No -|10 -|The number of records submitted in batch. +See also `avroCodec`, `bytesFormatTypeSeparator`, `jsonAllowNaN`, `parquetCodec`, and `withMetadata`. -|batchTimeMs -|No -|1000 -|The interval for batch submission. +|`gcsServiceAccountKeyFileContent` +|Yes for GCS -|bytesFormatTypeSeparator -|No -|0x10 -|It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. +Not used for AWS or Azure +|Empty +|The contents of a JSON GCS service account key file. +If empty or not set, the connector attempts to read credentials from `gcsServiceAccountKeyFilePath`. -|formatType -|No -|json -|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. +|`gcsServiceAccountKeyFilePath` +|Yes for GCS -Default: `JSON` +Not used for AWS or Azure +|Empty +|The path to a JSON GCS service account key file. +If empty or not set, the connector attempts to read credentials from the system's `GOOGLE_APPLICATION_CREDENTIALS` environment variable. -|jsonAllowNaN +|`jsonAllowNaN` |No |`false` -|Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. - -|maxBatchBytes -|No -|10000000 -|The maximum number of bytes in a batch. +|If `formatType` is `json`, set this property to `true` if you want the connector to treat 'NaN', 'INF', '-INF' as valid floating number values. -|parquetCodec -|No -|gzip -|Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. +This is disabled (`false`) by default because these values aren't compliant with the JSON specification. -|partitionerType +|`maxBatchBytes` |No -|partition -|The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. - -|partitionerUseIndexAsOffset -|No -|`false` -|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. - -|pathPrefix -|No -|`false` -|If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. +|`10000000` +|The maximum number of bytes in a batch. -|pendingQueueSize +|`parquetCodec` |No -|10 -|The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. +|`gzip` +|If `formatType` is `parquet`, set the codec compression type: `brotli`, `gzip`, `lzo`, `lz4`, `snappy`, `zstd`, or `null` (no compression). -|role +|`partitionerType` |No -|null -|The Cloud Storage role. +|`partition` +a|The partitioning type: -|roleSessionName -|No -|null -|The Cloud Storage role session name. +* **`partition` (default)**: Partitions are based on topic partitions. +* **`time`**: Partitions are based on message publish time. +If using time-based partitioning, you can also set `timePartitionDuration` and `timePartitionPattern`. -|skipFailedMessages +|`partitionerUseIndexAsOffset` |No |`false` -|Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. +|Whether to use the the {pulsar-short} message index as the offset (message UUID) instead of the record sequence. -By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. -If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. +* **`false` (default)**: Use the record sequence as the offset. -Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. -To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. +* **`true`**: Use the message index as the offset, if available. +This is recommended when using batching. -|sliceTopicPartitionPath -|No -|`false` -|When it is set to true, split the partitioned topic name into separate folders in the bucket path. - -|timePartitionDuration -|No -|86400000 -|The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. +If the broker doesn't expose index metadata, or the record doesn't have index metadata, then the sequence is used. -|timePartitionPattern +|`pathPrefix` |No -|yyyy-MM-dd -|The format pattern of the time-based partitioning. For details, refer to the Java date and time format. +|`null` +|If empty or not set, the output files are stored at the root of the specified `bucket`. -|useHumanReadableMessageId -|No -|`false` -|Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. +If set, output files are stored in a folder at the path within the bucket. +Format the path as `**DIRECTORY**/**SUBDIRECTORY**/` with a trailing slash but no leading slash. -|useHumanReadableSchemaVersion +|`pendingQueueSize` |No -|`false` -|Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. - -|withMetadata -|No -|`false` -|Save message attributes to metadata. - -Not supported for formatType=Bytes. - -|withTopicPartitionNumber -|No -|`true` -|When it is set to true, include the topic partition number to the object path. -|=== - -[#configs-azure] -=== Azure Blob Storage - -Set the following properties in the `configs` section if you are using Azure Blob Storage: - -[cols="2,1,1,3"] -|=== -|Name |Required |Default |Description +|`10` +|The number of records buffered in queue. -|azureStorageAccountConnectionString -|Yes -| -|The Azure Blob Storage connection string. Required when authenticating via connection string. +By default, `batchSize` and `pendingQueueSize` are equal. -|azureStorageAccountKey +|`provider` |Yes -| -|The Azure Blob Storage account key. Required when authenticating via account name and account key. +|`null` +a|Specify the provider type for your cloud storage service: -|azureStorageAccountName -|Yes -| -|The Azure Blob Storage account name. Required when authenticating via account name and account key. +* **Azure**: Only supports `azure-blob-storage`. +* **AWS S3**: Supports `aws-s3` or `s3v2`. +`s3v2` uses the AWS client, not the JCloud client. +* **GCS**: Only supports `google-cloud-storage`. -|azureStorageAccountSASToken -|Yes -| -|The Azure Blob Storage account SAS token. Required when authenticating via SAS token. - -|bucket -|Yes -|null -|The Cloud Storage bucket. +|`role` and `roleSessionName` +|Yes for AWS if using IAM roles -|endpoint -|Yes -|null -|The Azure Blob Storage endpoint. +Not used for GCS or Azure +|`null` +|If using https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html[AWS IAM roles] for authentication to AWS S3, then set `role` to the IAM role name, and set `roleSessionName` to the IAM role instance identifier. +You must also set `secretAccessKey` and `accessKeyId`. -|provider -|Yes -|null -|The Cloud Storage type. Azure Blob Storage only supports the azure-blob-storage provider. +|`secretAccessKey` and `accessKeyId` +|Yes for AWS -|avroCodec -|No -|snappy -|Compression codec used when formatType=avro. Available compression types are: null (no compression), deflate, bzip2, xz, zstandard, snappy. +Not used for GCS or Azure +|`null` +a|An AWS secret access key and access key ID that grant access to the specified `bucket`. +If using AWS IAM roles, you must also set `role` and `roleSessionName`. -|batchSize -|No -|10 -|The number of records submitted in batch. +Permission to write objects to the specified `bucket` are required. +The following https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html[policies] are recommended: -|batchTimeMs -|No -|1000 -|The interval for batch submission. +- `s3:AbortMultipartUpload` +- `s3:GetObject*` +- `s3:PutObject*` +- `s3:List*` +- `s3:GetBucketLocation` (only if `endpoint` doesn't include the region) -|bytesFormatTypeSeparator +|`skipFailedMessages` |No -|0x10 -|It is inserted between records for the formatType of bytes. By default, it is set to '0x10'. An input record that contains the line separator looks like multiple records in the output object. +|`false` +a|Whether to skip messages that the connector fails to process for any reason, such as unsupported schema types: -|formatType -|No -|json -|The <>: `JSON`, `Avro`, `Bytes`, or `Parquet`. +* **`true`**: The connector skips failed messages by acknowledging them as though they were successfully processed. +* **`false` (default)**: The connector fails the message, and the message remains unacknowledged. -Default: `JSON` +[TIP] +==== +If you want the connector to send failed messages to a dead-letter topic, set `skipFailedMessages` to `false`, and set `maxMessageRetries` and `deadLetterTopic` in the <>. +==== -|jsonAllowNaN +|`sliceTopicPartitionPath` |No |`false` -|Recognize 'NaN', 'INF', '-INF' as legal floating number values when formatType=json. Since JSON specification does not allow such values this is a non-standard feature and disabled by default. +a|Whether to expand partitioned topic names into multiple directories in the bucket: -|maxBatchBytes -|No -|10000000 -|The maximum number of bytes in a batch. +* **`true`**: Split the partitioned topic name into multiple directories in the bucket. +For example, `demo-partition-0` expands to `demo/partition-0/`. +* **`false` (default)**: Use the partitioned topic name as one directory name in the bucket path, such as `demo-partition-0/`. -|parquetCodec -|No -|gzip -|Compression codec used when formatType=parquet. Available compression types are: null (no compression), snappy, gzip, lzo, brotli, lz4, zstd. +See also `withTopicPartitionNumber`. -|partitionerType +|`timePartitionDuration` |No -|partition -|The partitioning type. It can be configured by topic partitions or by time. By default, the partition type is configured by topic partitions. +|`86400000` (24 hours) +|If `partitionerType` is `time`, set the time interval for each partition. +Accepts either a string (`30d`, `24h`, or `30m`) or a number of milliseconds (`86400000`). -|partitionerUseIndexAsOffset +|`timePartitionPattern` |No -|`false` -|Whether to use the {pulsar-short}'s message index as offset or the record sequence. It's recommended if the incoming messages may be batched. The brokers may or not expose the index metadata and, if it's not present on the record, the sequence will be used. See PIP-70 for more details. +|`yyyy-MM-dd` +|If `partitionerType` is `time`, set the datetime format using Java date and time format. -|pathPrefix +|`useHumanReadableMessageId` |No |`false` -|If it is set, the output files are stored in a folder under the given bucket path. The pathPrefix must be in the format of xx/xxx/. +a|Whether to use a human-readable string for `messageId` in message metadata: -|pendingQueueSize -|No -|10 -|The number of records buffered in queue. By default, it is equal to batchSize. You can set it manually. +* **`true`**: The `messageId` is a plain, human-readable string, such as `ledgerId:entryId:partitionIndex:batchIndex`. +* **`false` (default)**: The `messageId` is a Hex-encoded string. -|skipFailedMessages +|`useHumanReadableSchemaVersion` |No |`false` -|Configure whether to skip a message which it fails to be processed. If it is set to true, the connector will skip the failed messages by ack it. Otherwise, the connector will fail the message. +a|Whether to use a human-readable string for the schema version in message metadata: -By default, when the connector receives a message with a non-supported schema type, the connector will fail the message. -If you want to skip the non-supported messages, you can set `skipFailedMessages` to true. +* **`true`**: The schema version is a plain, human-readable string. +* **`false` (default)**: The schema version is a Hex-encoded string. -Alternatively, if a message fails to send to a Cloud Storage sink, the connector can send the message to a dead-letter topic instead, if a dead-letter topic is assigned. -To use a dead-letter topic, set `skipFailedMessages` to `false` in `configs`, and then set `maxMessageRetries` and `deadLetterTopic` in the <>. - -|sliceTopicPartitionPath +|`withMetadata` |No |`false` -|When it is set to true, split the partitioned topic name into separate folders in the bucket path. +a|Whether to save message attributes as additional message metadata. -|timePartitionDuration -|No -|86400000 -|The time interval for time-based partitioning. Support formatted interval string, such as 30d, 24h, 30m, 10s, and also support number in milliseconds precision, such as 86400000 refers to 24h or 1d. +Ignored if `formatType` is `bytes`. -|timePartitionPattern -|No -|yyyy-MM-dd -|The format pattern of the time-based partitioning. For details, refer to the Java date and time format. +For example, when writing to Parquet (`formatType: "parquet"`) from the ProtobufNative schema, the connector writes messages with the `DynamicMessage` format. +If `withMetadata` is true, then the connector adds `+__message_metadata__+` to the messages with `PulsarIOCSCProtobufMessageMetadata`. -|useHumanReadableMessageId -|No -|`false` -|Use a human-readable format string for messageId in message metadata. The messageId is in a format like ledgerId:entryId:partitionIndex:batchIndex. Otherwise, the messageId is a Hex-encoded string. +Therefore, given the following message: -|useHumanReadableSchemaVersion -|No -|`false` -|Use a human-readable format string for the schema version in the message metadata. If it is set to true, the schema version is in plain string format. Otherwise, the schema version is in hex-encoded string format. +[source,protobuf] +---- +syntax = "proto3"; +message User { + string name = 1; + int32 age = 2; +} +---- -|withMetadata -|No -|`false` -|Save message attributes to metadata. +The connector writes the following output with metadata: -Not supported for formatType=Bytes. +[source,parquet] +---- +syntax = "proto3"; +message PulsarIOCSCProtobufMessageMetadata { + map properties = 1; + string schema_version = 2; + string message_id = 3; +} +message User { + string name = 1; + int32 age = 2; + PulsarIOCSCProtobufMessageMetadata __message_metadata__ = 3; +} +---- -|withTopicPartitionNumber +|`withTopicPartitionNumber` |No |`true` -|When it is set to true, include the topic partition number to the object path. +|Whether to include the topic partition number in the object path: + +* **`true` (default)**: Include the partition number in the object path, such as `topic-name/partition-0/`. +* **`false`**: Do not include the partition number in the object path, such as `topic-name/`. +This can be used to collapse partitions. + +See also `sliceTopicPartitionPath`. |=== [#data-format-types] @@ -497,82 +321,49 @@ Not supported for formatType=Bytes. The `formatType` parameter supports JSON, Avro, Bytes, and Parquet formats. -The following table lists the supported conversions from {pulsar-short} schema types to each writer format, as well as any limitations or additional notes. +The following table lists the supported conversions from {pulsar-short} schema types to each writer format, as well as any limitations or comments. -[cols=5] +[cols=6] |=== -|{pulsar-short} Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes +|{pulsar-short} Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes |Notes |Primitive |Not supported |Supported - -The JSON writer will try to convert data with a String or Bytes schema to JSON-format data if convertible. - |Not supported |Supported +|The JSON writer attempts to convert data with a `String` or `Bytes` schema to valid JSON, if possible. |Avro |Supported |Supported |Supported |Supported +| |JSON |Supported |Supported |Supported |Supported +| |Protobuf - -The Protobuf schema is based on the Avro schema. -It uses Avro as an intermediate format, so it might not provide the best possible conversion. - |Supported |Supported |Supported |Supported +|The Protobuf schema is based on the Avro schema. +It uses Avro as an intermediate format, so it might not provide the best possible conversion. |ProtobufNative |Supported - -The ProtobufNative schema holds the Protobuf descriptor and the message. -When writing to Avro format, the connector uses `avro-protobuf` to do the conversion. - |Not supported -a|Supported - -When writing to Parquet from the ProtobufNative schema, the connector writes the messages with the `DynamicMessage` format. -If `withMetadata` is true, then the connector adds `+__message_metadata__+` to the messages with `PulsarIOCSCProtobufMessageMetadata` format. - -For example, if a message has the following schema: - -[source,protobuf] ----- -syntax = "proto3"; -message User { - string name = 1; - int32 age = 2; -} ----- - -If `withMetadata` is set to true, then the connector writes the message with the following schema: +|Supported +|Supported +|The ProtobufNative schema holds the Protobuf descriptor and the message. -[source,parquet] ----- -syntax = "proto3"; -message PulsarIOCSCProtobufMessageMetadata { - map properties = 1; - string schema_version = 2; - string message_id = 3; -} -message User { - string name = 1; - int32 age = 2; - PulsarIOCSCProtobufMessageMetadata __message_metadata__ = 3; -} ----- +When writing to Avro format, the connector uses `avro-protobuf` to do the conversion. -|Supported +For information about Protobuf to Parquet, see `withMetadata` in <>. |=== \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc index bcaa495..e3c834b 100644 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc @@ -84,7 +84,7 @@ For {product}, use `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector` unle |`maxBatchBitsForOffset` |No |`12` -|Number of bits to use for the index of messages in a batch, which is translated into offsets (UUIDs). +|Number of bits to use for the index of messages in a batch, which are translated into offsets (UUIDs). Must be an integer between `0` and `20`. If `0`, the behavior is disabled, and all messages in a batch have the same offset. From 421f77d0179d12a724b16ded7b4e5885319a3c12 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Mon, 2 Feb 2026 08:13:30 -0800 Subject: [PATCH 29/31] fix include --- modules/pulsar-io/partials/connectors/sinks/get-started.adoc | 2 +- modules/pulsar-io/partials/connectors/sources/get-started.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc index 18d704b..becd67e 100644 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc @@ -37,4 +37,4 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$ ---- + .Example configuration data structure -include::example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file +include::pulsar-io:example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc index 7d5d673..fc6ac3d 100644 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ b/modules/pulsar-io/partials/connectors/sources/get-started.adoc @@ -37,4 +37,4 @@ curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE ---- + .Example configuration data structure -include::example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file +include::pulsar-io:example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file From 8d21b094e6013ae68cc9bfdb516b8a77e5b63120 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Mon, 2 Feb 2026 09:41:45 -0800 Subject: [PATCH 30/31] delete io pages --- .../sinks/bigquery/sample-data.adoc | 82 --- .../sinks/cassandra-enhanced/sample-data.adoc | 140 ---- .../sinks/cloud-storage/sample-data.adoc | 68 -- .../sinks/elastic_search/sample-data.adoc | 83 --- .../sinks/jdbc-clickhouse/sample-data.adoc | 84 --- .../sinks/jdbc-mariadb/sample-data.adoc | 83 --- .../sinks/jdbc-postgres/sample-data.adoc | 83 --- .../sinks/jdbc-sqlite/sample-data.adoc | 81 --- .../connectors/sinks/kafka/sample-data.adoc | 93 --- .../connectors/sinks/kinesis/sample-data.adoc | 85 --- .../sinks/snowflake/sample-data.adoc | 97 --- .../sources/data-generator/sample-data.adoc | 51 -- .../sources/debezium-mongodb/sample-data.adoc | 56 -- .../sources/debezium-mysql/sample-data.adoc | 61 -- .../sources/debezium-oracle/sample-data.adoc | 65 -- .../debezium-postgres/sample-data.adoc | 64 -- .../debezium-sqlserver/sample-data.adoc | 83 --- .../connectors/sources/kafka/sample-data.adoc | 60 -- .../sources/kinesis/sample-data.adoc | 61 -- modules/pulsar-io/pages/connectors/index.adoc | 621 ------------------ .../pages/connectors/sinks/astra-db.adoc | 186 ------ .../pages/connectors/sinks/cloud-storage.adoc | 369 ----------- .../connectors/sinks/elastic-search.adoc | 39 -- .../connectors/sinks/google-bigquery.adoc | 391 ----------- .../connectors/sinks/jdbc-clickhouse.adoc | 34 - .../pages/connectors/sinks/jdbc-mariadb.adoc | 34 - .../pages/connectors/sinks/jdbc-postgres.adoc | 37 -- .../pages/connectors/sinks/jdbc-sqllite.adoc | 36 - .../pages/connectors/sinks/kafka.adoc | 37 -- .../pages/connectors/sinks/kinesis.adoc | 39 -- .../pages/connectors/sinks/snowflake.adoc | 34 - .../connectors/sources/data-generator.adoc | 45 -- .../connectors/sources/debezium-mongodb.adoc | 80 --- .../connectors/sources/debezium-mysql.adoc | 37 -- .../connectors/sources/debezium-oracle.adoc | 40 -- .../connectors/sources/debezium-postgres.adoc | 37 -- .../sources/debezium-sqlserver.adoc | 89 --- .../pages/connectors/sources/kafka.adoc | 32 - .../pages/connectors/sources/kinesis.adoc | 32 - .../connectors/connector-params-intro.adoc | 3 - .../connectors/function-params-tip.adoc | 5 - .../pulsar-config-params-archive.adoc | 4 - .../pulsar-config-params-configs.adoc | 6 - ...ar-config-params-customruntimeoptions.adoc | 3 - .../connectors/pulsar-config-params-name.adoc | 6 - .../pulsar-config-params-namespace.adoc | 3 - .../pulsar-config-params-parallelism.adoc | 5 - ...ar-config-params-processingguarantees.adoc | 9 - .../pulsar-config-params-resources.adoc | 4 - .../pulsar-config-params-runtimeflags.adoc | 4 - .../pulsar-config-params-secrets.adoc | 9 - .../pulsar-config-params-tenant.adoc | 3 - .../partials/connectors/sinks/edit.adoc | 26 - .../connectors/sinks/get-started.adoc | 40 -- .../connectors/sinks/jdbc-config-params.adoc | 2 - .../partials/connectors/sinks/manage.adoc | 5 - .../sinks/pulsar-config-params.adoc | 150 ----- .../sources/debezium-compatibility.adoc | 3 - .../partials/connectors/sources/edit.adoc | 26 - .../connectors/sources/get-started.adoc | 40 -- .../partials/connectors/sources/manage.adoc | 5 - .../sources/pulsar-config-params.adoc | 81 --- 62 files changed, 4171 deletions(-) delete mode 100644 modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc delete mode 100644 modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc delete mode 100644 modules/pulsar-io/pages/connectors/index.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/astra-db.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/kafka.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/kinesis.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sinks/snowflake.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/data-generator.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/kafka.adoc delete mode 100644 modules/pulsar-io/pages/connectors/sources/kinesis.adoc delete mode 100644 modules/pulsar-io/partials/connectors/connector-params-intro.adoc delete mode 100644 modules/pulsar-io/partials/connectors/function-params-tip.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc delete mode 100644 modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/edit.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/get-started.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/manage.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/edit.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/get-started.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/manage.adoc delete mode 100644 modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc diff --git a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc deleted file mode 100644 index ccc3ee4..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/bigquery/sample-data.adoc +++ /dev/null @@ -1,82 +0,0 @@ -[source,json] ----- -{ - "archive": "builtin://bigquery", - "autoAck": true, - "className": "org.apache.pulsar.io.kafka.connect.KafkaConnectSink", - "cleanupSubscription": false, - "configs": { - "batchSize": "1000", - "kafkaConnectorConfigProperties": { - "name": "${SINK_NAME}", - "project": "my-bigquery-project", - "defaultDataset": "BQ_CONNECTOR_TEST", - "autoCreateBucket": true, - "autoCreateTables": false, - "keySource": "JSON", - "queueSize": "-1", - "sanitizeTopics": false, - "topics": "${TOPIC}", - "keyfile": { - "type": "service_account", - "project_id": "XXXXXX", - "private_key_id": "XXXXXXXXX", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w ... U=\n-----END PRIVATE KEY-----\n", - "client_email": "XXXXXXXXX", - "client_id": "XXXXXX", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/XXXXXX" - }, - }, - "kafkaConnectorSinkClass": "com.wepay.kafka.connect.bigquery.BigQuerySinkConnector", - "lingerTimeMs": "1000", - "offsetStorageTopic": "${TOPIC}-offsets", - "sanitizeTopicName": true, - "topic": "${TOPIC}" - }, - "customRuntimeOptions": "internal_data", - "deadLetterTopic": null, - "inputSpecs": { - "${TENANT}/${NAMESPACE}/${TOPIC}": { - "consumerProperties": {}, - "cryptoConfig": null, - "poolMessages": false, - "receiverQueueSize": null, - "regexPattern": false, - "schemaProperties": {}, - "schemaType": null, - "serdeClassName": null - } - }, - "inputs": [ - "${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "maxMessageRetries": null, - "name": "${SINK_NAME}", - "namespace": "${NAMESPACE}", - "negativeAckRedeliveryDelayMs": null, - "parallelism": 1, - "processingGuarantees": "EFFECTIVELY_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "retainOrdering": false, - "retainKeyOrdering": true, - "runtimeFlags": null, - "secrets": {}, - "sourceSubscriptionName": null, - "sourceSubscriptionPosition": "Latest", - "tenant": "${TENANT}", - "timeoutMs": 5000, - "topicToSchemaProperties": null, - "topicToSchemaType": null, - "topicToSerdeClassName": null, - "transformFunction": null, - "transformFunctionClassName": null, - "transformFunctionConfig": null -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc deleted file mode 100644 index 921c7c8..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/cassandra-enhanced/sample-data.adoc +++ /dev/null @@ -1,140 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.cassandra.sink.CassandraEnhancedSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "property1": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": false - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "contactPoints": "cassandra", - "loadBalancing.localDc": "datacenter1", - "port": 9042, - "cloud.secureConnectBundle": null, - "ignoreErrors": "None", - "maxConcurrentRequests": 500, - "maxNumberOfRecordsInBatch": 32, - "queryExecutionTimeout": 30, - "connectionPoolLocalSize": 4, - "jmx": true, - "compression": "None", - "auth": { - "provider": "None", - "username": null, - "password": null, - "gssapi": { - "keyTab": null, - "principal": null, - "service": "dse" - } - }, - "ssl": { - "provider": "None", - "hostnameValidation": true, - "keystore": { - "password": null, - "path": null - }, - "openssl": { - "keyCertChain": null, - "privateKey": null - }, - "truststore": { - "password": null, - "path": null - }, - "cipherSuites": null - }, - "topic": { - "${TOPIC}": { - "${KEYSPACE_NAME}": { - "${TABLE_NAME}": { - "mapping": "name=value.name", - "consistencyLevel": "LOCAL_ONE", - "ttl": -1, - "ttlTimeUnit": "SECONDS", - "timestampTimeUnit": "MICROSECONDS", - "nullToUnset": true, - "deletesEnabled": true - } - }, - "codec": { - "locale": "en_US", - "timeZone": "UTC", - "timestamp": "CQL_TIMESTAMP", - "date": "ISO_LOCAL_DATE", - "time": "ISO_LOCAL_TIME", - "unit": "MILLISECONDS" - } - } - } - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://cassandra-enhanced", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc deleted file mode 100644 index e7a2355..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/cloud-storage/sample-data.adoc +++ /dev/null @@ -1,68 +0,0 @@ -[source,json] ----- -{ - "archive": "builtin://cloud-storage", - "autoAck": true, - "className": "org.apache.pulsar.io.jcloud.sink.CloudStorageGenericRecordSink", - "cleanupSubscription": false, - "configs": { - "batchSize": "10", - "batchTimeMs": "1000", - "bucket": "S3", - "formatType": "json", - "maxBatchBytes": "10000000", - "partitionerType": "partition", - "partitionerUseIndexAsOffset": false, - "pendingQueueSize": "10", - "provider": "AWS", - "skipFailedMessages": false, - "sliceTopicPartitionPath": false, - "useHumanReadableMessageId": false, - "useHumanReadableSchemaVersion": false, - "withMetadata": false, - "withTopicPartitionNumber": true - }, - "customRuntimeOptions": "internal_data", - "deadLetterTopic": null, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "consumerProperties": {}, - "cryptoConfig": null, - "poolMessages": false, - "receiverQueueSize": null, - "regexPattern": false, - "schemaProperties": {}, - "schemaType": null, - "serdeClassName": null - } - }, - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "maxMessageRetries": null, - "name": "${SINK_NAME}", - "namespace": "${NAMESPACE}", - "negativeAckRedeliveryDelayMs": null, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "retainOrdering": false, - "retainKeyOrdering": true, - "runtimeFlags": null, - "secrets": {}, - "sourceSubscriptionName": null, - "sourceSubscriptionPosition": "Latest", - "tenant": "${TENANT}", - "timeoutMs": 5000, - "topicToSchemaProperties": null, - "topicToSchemaType": null, - "topicToSerdeClassName": null, - "transformFunction": null, - "transformFunctionClassName": null, - "transformFunctionConfig": null -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc deleted file mode 100644 index 14cfbc2..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/elastic_search/sample-data.adoc +++ /dev/null @@ -1,83 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.elasticsearch.ElasticSearchSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "elasticSearchUrl": "http://localhost:9200", - "username": "user", - "password":"${PASSWORD}", - "indexName":"my_index" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://elastic_search", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc deleted file mode 100644 index a6f8059..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-clickhouse/sample-data.adoc +++ /dev/null @@ -1,84 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.jdbc.sink.ClickHouseSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "userName": "clickhouse", - "password": "${PASSWORD}", - "jdbcUrl": "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink", - "tableName": "pulsar_clickhouse_jdbc_sink", - "useTransactions": "false" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://jdbc-clickhouse", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc deleted file mode 100644 index dbc1527..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-mariadb/sample-data.adoc +++ /dev/null @@ -1,83 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.jdbc.sink.MariaDBSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "userName": "mariadb", - "password": "${PASSWORD}", - "jdbcUrl": "jdbc:mariadb://localhost:8123/pulsar_mariadb_jdbc_sink", - "tableName": "pulsar_mariadb_jdbc_sink" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://jdbc-mariadb", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc deleted file mode 100644 index f966be7..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-postgres/sample-data.adoc +++ /dev/null @@ -1,83 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.jdbc.sink.PostgresSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "userName": "postgres", - "password": "${PASSWORD}", - "jdbcUrl": "jdbc:postgresql://localhost:8123/pulsar_postgres_jdbc_sink", - "tableName": "pulsar_postgres_jdbc_sink" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://jdbc-postgres", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc deleted file mode 100644 index 3428728..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/jdbc-sqlite/sample-data.adoc +++ /dev/null @@ -1,81 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.jdbc.sink.SqliteSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "jdbcUrl": "jdbc:sqlite:db.sqlite", - "tableName": "pulsar_sqlite_jdbc_sink" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://jdbc-sqlite", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc deleted file mode 100644 index ad0cd0f..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kafka/sample-data.adoc +++ /dev/null @@ -1,93 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.kafka.KafkaSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "bootstrapServers": "localhost:6667", - "topic": "${KAFKA_DESTINATION_TOPIC}", - "acks": "1", - "batchSize": "16384", - "maxRequestSize": "1048576", - "producerConfigProperties": { - "client.id": "test-pulsar-producer", - "security.protocol": "SASL_SSL", - "sasl.mechanism": "PLAIN", - "sasl.kerberos.service.name": "kafka", - "sasl.username": "kafkauser", - "sasl.password": "${PASSWORD}", - "acks": "all" - } - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://kafka", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc deleted file mode 100644 index 498e608..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/kinesis/sample-data.adoc +++ /dev/null @@ -1,85 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.kinesis.KinesisSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "awsEndpoint": "some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "messageFormat": "ONLY_RAW_PAYLOAD", - "retainOrdering": "true" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": true, - "retainKeyOrdering": false, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://kinesis", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc b/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc deleted file mode 100644 index a6ef862..0000000 --- a/modules/pulsar-io/examples/connectors/sinks/snowflake/sample-data.adoc +++ /dev/null @@ -1,97 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "name": "${SINK_NAME}", - "className": "org.apache.pulsar.io.snowflake.SnowflakeSink", - "sourceSubscriptionName": "string", - "sourceSubscriptionPosition": "Latest", - "inputs": [ - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}" - ], - "topicToSerdeClassName": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaType": { - "property1": "string", - "property2": "string" - }, - "topicToSchemaProperties": { - "property1": "string", - "property2": "string" - }, - "inputSpecs": { - "persistent://${TENANT}/${NAMESPACE}/${TOPIC}": { - "schemaType": "string", - "serdeClassName": "string", - "schemaProperties": { - "property1": "string", - "property2": "string" - }, - "consumerProperties": { - "property1": "string", - "property2": "string" - }, - "receiverQueueSize": 0, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "poolMessages": true, - "regexPattern": true - } - }, - "maxMessageRetries": 0, - "deadLetterTopic": "string", - "configs": { - "topic": "${TOPIC}", - "offsetStorageTopic": "${TOPIC}-offsets-demo", - "batchSize": 100, - "lingerTimeMs": 600000, - "kafkaConnectorConfigProperties":{ - "name": "snowflakedemo", - "topics": "${TOPIC}", - "buffer.count.records": 100, - "buffer.flush.time": 600, - "buffer.size.bytes": 102400, - "snowflake.url.name": "tenant.snowflakecomputing.com:443", - "snowflake.user.name": "kafka_connector_user", - "snowflake.private.key": "${PASSWORD}", - "snowflake.database.name": "kafka_db", - "snowflake.schema.name": "kafka_schema", - "key.converter": "org.apache.kafka.connect.storage.StringConverter", - "value.converter": "com.snowflake.kafka.connector.records.SnowflakeJsonConverter" - } - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "retainOrdering": false, - "retainKeyOrdering": true, - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "autoAck": true, - "timeoutMs": 5000, - "negativeAckRedeliveryDelayMs": 0, - "archive": "builtin://snowflake", - "cleanupSubscription": true, - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "transformFunction": "string", - "transformFunctionClassName": "string", - "transformFunctionConfig": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc deleted file mode 100644 index aae6936..0000000 --- a/modules/pulsar-io/examples/connectors/sources/data-generator/sample-data.adoc +++ /dev/null @@ -1,51 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "sleepBetweenMessages": "50" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://data-generator", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc deleted file mode 100644 index e15aec1..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mongodb/sample-data.adoc +++ /dev/null @@ -1,56 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "database.whitelist": "usersdb", - "mongodb.hosts": "host:port", - "mongodb.name": "streaming_prod", - "mongodb.password": "${PASSWORD}", - "mongodb.task.id": "123", - "mongodb.user": "mongodb" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://debezium-mongodb", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc deleted file mode 100644 index fdab97b..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-mysql/sample-data.adoc +++ /dev/null @@ -1,61 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "database.dbname": "dbz-db", - "database.hostname": "localhost", - "database.password": "${PASSWORD}", - "database.port": "3306", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://debezium-mysql", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc deleted file mode 100644 index eb8dec7..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-oracle/sample-data.adoc +++ /dev/null @@ -1,65 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "database.hostname": "localhost", - "database.port": "1521", - "database.user": "dbzuser", - "database.password": "${PASSWORD}", - "database.dbname": "a-db", - "database.server.name": "dbz-server", - "schema.exclude.list": "system,dbzuser", - "snapshot.mode": "initial", - "topic.namespace": "${TENANT}/${NAMESPACE}", - "task.class": "io.debezium.connector.oracle.OracleConnectorTask", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "database.tcpKeepAlive": "true", - "decimal.handling.mode": "double" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://debezium-oracle", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc deleted file mode 100644 index 8268ed2..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-postgres/sample-data.adoc +++ /dev/null @@ -1,64 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "database.dbname": "inventory_db", - "database.hostname": "localhost", - "database.password": "${PASSWORD}", - "database.port": "5432", - "database.server.id": 123, - "database.server.name": "dbserver1", - "database.user": "debezium", - "database.whitelist": "inventory", - "json-with-envelope": "true", - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "plugin.name": "pgoutput", - "schema.whitelist": "public", - "table.whitelist": "public.users" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://debezium-postgres", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc deleted file mode 100644 index fd17a4a..0000000 --- a/modules/pulsar-io/examples/connectors/sources/debezium-sqlserver/sample-data.adoc +++ /dev/null @@ -1,83 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", - "database.dbname": "cdc_test", - "database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory", - "database.history.name": "cdc_test_history", - "database.history.pulsar.service.url": "pulsar+ssl://pulsar-azure-westus2.streaming.datastax.com:6651", - "database.history.pulsar.token": "${PULSAR_TOKEN}", - "database.history.pulsar.topic": "dbz-stream672-history-topic", - "database.hostname": "sqlserver.database.windows.net", - "database.include.list": "cdc_test", - "database.names": "cdc_test", - "database.password": "${PASSWORD}", - "database.port": 1433, - "database.server.name": "sqlserver", - "database.ssl": true, - "database.ssl.mode": "required", - "database.tcpKeepAlive": true, - "database.user": "debezium_user", - "decimal.handling.mode": "double", - "driver.encrypt": true, - "driver.trustServerCertificate": true, - "include.schema.changes": true, - "key.converter": "org.apache.kafka.connect.json.JsonConverter", - "name": "dbz-stream672", - "pulsar.auth.token": "${PULSAR_TOKEN}", - "pulsar.service.url": "pulsar+ssl://pulsar-azure-westus2.streaming.datastax.com:6651", - "snapshot.mode": "always", - "table.include.list": "dbo.accounts", - "task.class": "io.debezium.connector.sqlserver.SqlServerConnectorTask", - "task.id": "0", - "topic.namespace": "${TENANT}/${NAMESPACE}", - "topic.prefix": "sqlserver", - "typeClassName": "org.apache.pulsar.common.schema.KeyValue", - "value.converter": "org.apache.kafka.connect.json.JsonConverter" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://debezium-sqlserver", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc deleted file mode 100644 index c53dbab..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kafka/sample-data.adoc +++ /dev/null @@ -1,60 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "bootstrapServers": "${KAFKA_BOOTSTRAP_SERVERS}", - "consumerConfigProperties": { - "sasl.jaas.config": "${JAAS_CONFIG}", - "sasl.mechanism": "PLAIN", - "sasl.password": "${PASSWORD}", - "sasl.username": "${USERNAME}", - "security.protocol": "SASL_SSL" - }, - "groupId": "${KAFKA_GROUP_ID}", - "topic": "${KAFKA_TOPIC}" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://kafka", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc b/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc deleted file mode 100644 index e0c0727..0000000 --- a/modules/pulsar-io/examples/connectors/sources/kinesis/sample-data.adoc +++ /dev/null @@ -1,61 +0,0 @@ -[source,json] ----- -{ - "tenant": "${TENANT}", - "namespace": "${NAMESPACE}", - "topicName": "persistent://${TENANT}/${NAMESPACE}/${TOPIC}", - "name": "${SOURCE_NAME}", - "producerConfig": { - "maxPendingMessages": 0, - "maxPendingMessagesAcrossPartitions": 0, - "useThreadLocalProducers": true, - "cryptoConfig": { - "cryptoKeyReaderClassName": "string", - "cryptoKeyReaderConfig": { - "property1": {}, - "property2": {} - }, - "encryptionKeys": [ - "string" - ], - "producerCryptoFailureAction": "FAIL", - "consumerCryptoFailureAction": "FAIL" - }, - "batchBuilder": "string" - }, - "serdeClassName": "string", - "schemaType": "string", - "configs": { - "awsEndpoint": "https://some.endpoint.aws", - "awsRegion": "us-east-1", - "awsKinesisStreamName": "my-stream", - "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}", - "applicationName": "My test application", - "checkpointInterval": "30000", - "backoffTime": "4000", - "numRetries": "3", - "receiveQueueSize": 2000, - "initialPositionInStream": "TRIM_HORIZON", - "startAtTime": "2020-08-09T19:28:58.000Z" - }, - "secrets": {}, - "parallelism": 1, - "processingGuarantees": "ATLEAST_ONCE", - "resources": { - "cpu": 0.25, - "disk": 1000000000, - "ram": 1000000000 - }, - "archive": "builtin://kinesis", - "runtimeFlags": "string", - "customRuntimeOptions": "string", - "batchSourceConfig": { - "discoveryTriggererClassName": "string", - "discoveryTriggererConfig": { - "property1": {}, - "property2": {} - } - }, - "batchBuilder": "string" -} ----- \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/index.adoc b/modules/pulsar-io/pages/connectors/index.adoc deleted file mode 100644 index 4ac291e..0000000 --- a/modules/pulsar-io/pages/connectors/index.adoc +++ /dev/null @@ -1,621 +0,0 @@ -= {pulsar-short} I/O connectors in {product} -:navtitle: Available connectors - -{product} offers fully-managed versions of https://pulsar.apache.org/docs/en/io-overview/[{pulsar-reg} sink and source connectors]. - -[IMPORTANT] -==== -{product} doesn't support custom sink or source connectors. -==== - -//Luna Streaming: Cloud Storage sink, Google BigQuery sink are experimental -//Elasticsearch is lowercase -//Luna Streaming extra Experimental source: Netty -//Luna Streaming -2.x and -1.x have fewer connectors - -[#sink-connectors] -== Sink connectors - -Sink connectors export messages from {pulsar-short} topics to external services. - -Supported sink connectors:: -The following sink connectors are included in {product}: -+ -* xref:connectors/sinks/astra-db.adoc[{astra-db} and {cass} sink] -* xref:connectors/sinks/kafka.adoc[Apache Kafka sink] -* xref:connectors/sinks/kinesis.adoc[AWS Kinesis sink] -* xref:connectors/sinks/cloud-storage.adoc[Cloud Storage sink] -* xref:connectors/sinks/elastic-search.adoc[Elasticsearch sink] -* xref:connectors/sinks/google-bigquery.adoc[Google BigQuery sink] -* xref:connectors/sinks/jdbc-clickhouse.adoc[JDBC ClickHouse sink] -* xref:connectors/sinks/jdbc-mariadb.adoc[JDBC MariaDB sink] -* xref:connectors/sinks/jdbc-postgres.adoc[JDBC PostgreSQL sink] -* xref:connectors/sinks/jdbc-sqllite.adoc[JDBC SQLite sink] -* xref:connectors/sinks/snowflake.adoc[Snowflake sink] - -Experimental sink connectors:: -The following sink connectors are experimental. -They are in development, and they aren't fully supported or tested with {product}. -To get access to experimental connectors, contact {support-url}[{company} Support]. -+ -* Aerospike -* Apache Geode -* Apache HBase -* Apache Kudu -* Apache Phoenix -* Apache Solr -* Batch Data Generator -* CoAP -* Couchbase -* DataDog -* Diffusion -* Flume -* Hazelcast -* HDFS 2 -* HDFS 3 -* Humio -* InfluxDB -* JMS -* Kinetica -* MarkLogic -* Microsoft Azure Data Explorer (Kusto) -* Microsoft Azure DocumentDB -* MongoDB -* MQTT -* Neo4J -* New Relic -* OrientDB -* PLC4X -* RabbitMQ -* Redis -* SAP HANA -* SingleStore -* Splunk -* XTDB -* Zeebe - -[#source-connectors] -== Source connectors - -Source connectors ingest messages from external services into {pulsar-short} topics. - -Supported source connectors:: -The following source connectors are included in {product}: -+ -* xref:connectors/sources/kafka.adoc[Apache Kafka source] -* xref:connectors/sources/kinesis.adoc[AWS Kinesis source] -* xref:connectors/sources/data-generator.adoc[Data Generator source] -* xref:connectors/sources/debezium-mongodb.adoc[Debezium MongoDB source] -* xref:connectors/sources/debezium-mysql.adoc[Debezium MySQL source] -* xref:connectors/sources/debezium-oracle.adoc[Debezium Oracle source] -* xref:connectors/sources/debezium-postgres.adoc[Debezium PostgreSQL source] -* xref:connectors/sources/debezium-sqlserver.adoc[Debezium SQL Server source] - -Experimental source connectors:: -The following source connectors are experimental. -They are in development, and they aren't fully supported or tested with {product}. -To get access to experimental connectors, contact {support-url}[{company} Support]. -+ -* {cass} -* Apache Geode -* Apache Kudu -* Apache Phoenix -* Batch Data Generator -* Big Query -* Canal -* CoAP -* Couchbase -* DataDog -* Diffusion -* DynamoDB -* File -* Flume -* Hazelcast -* Humio -* JMS -* Kinetica -* MarkLogic -* Microsoft Azure DocumentDB -* MongoDB -* MQTT -* Neo4J -* New Relic -* NSQ -* OrientDB -* PLC4X -* RabbitMQ -* Redis -* SAP HANA -* SingleStore -* Splunk -* Twitter -* XTDB -* Zeebe - -== Create and manage connectors - -You can use the {astra-ui}, the `xref:developing:produce-consume-pulsar-client.adoc[pulsar-admin]` CLI, or the xref:apis:api-operations.adoc[{pulsar-short} Admin API] to create, monitor, and manage sink and source connectors. - -//Combine below sections w/ "use the Pulsar CLI" page (separate pulsar-client and pulsar-admin) and Admin API ref pages; then replace below w/ links to specific sections - -=== Get available sink connectors - -Get a list of sink connectors that are available in your {product} {pulsar-short} tenant: - -.pulsar-admin CLI -[source,shell,subs="attributes+"] ----- -./bin/pulsar-admin sinks available-sinks ----- - -.{pulsar-short} Admin API -[source,shell,subs="attributes+"] ----- -curl "$WEB_SERVICE_URL/admin/v3/sinks/builtinsinks" -H "Authorization: $PULSAR_TOKEN" ----- - -=== Get available source connectors - -Get a list of source connectors that are available in your {product} {pulsar-short} tenant: - -.pulsar-admin CLI -[source,shell,subs="attributes+"] ----- -./bin/pulsar-admin sources available-sources ----- - -.{pulsar-short} Admin API -[source,shell,subs="attributes+"] ----- -curl "$WEB_SERVICE_URL/admin/v3/sources/builtinsources" -H "Authorization: $PULSAR_TOKEN" ----- - -=== Create or update a connector - -Although you use the same base commands to create and update all {product} {pulsar-short} connectors, each connector has different configuration options. -For example commands and configuration details, see the documentation for your preferred <> and <>. - -[#get-sink-connector-configuration-data] -=== Get sink connector configuration data - -Get the configuration for an existing sink connector: - -.pulsar-admin CLI -[source,shell] ----- -# Get information about a connector -./bin/pulsar-admin sinks get \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Get information about a connector -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#get-source-connector-configuration-data] -=== Get source connector configuration data - -Get the configuration for an existing source connector: - -.pulsar-admin CLI -[source,shell] ----- -# Get information about connector -./bin/pulsar-admin sources get \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Get a connector's information -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#start-a-sink-connector] -=== Start a sink connector - -.pulsar-admin CLI -[source,shell] ----- -# Start all instances of a connector -./bin/pulsar-admin sinks start \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only start an individual instance ----- - -.{pulsar-short} Admin API -[source,shell,subs="attributes+"] ----- -# Start all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/start" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Start an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/start" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#start-a-source-connector] -=== Start a source connector - -.pulsar-admin CLI -[source,shell] ----- -# Start all instances of a connector -./bin/pulsar-admin sources start \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only start an individual instance ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Start all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/start" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Start an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/start" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#stop-a-sink-connector] -=== Stop a sink connector - -.pulsar-admin CLI -[source,shell] ----- -# Stop all instances of a connector -./bin/pulsar-admin sinks stop \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only stop an individual instance ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Stop all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/stop" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Stop an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/stop" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#stop-a-source-connector] -=== Stop a source connector - -.pulsar-admin CLI -[source,shell] ----- -# Stop all instances of a connector -./bin/pulsar-admin sources stop \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only stop an individual instance ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Stop all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/stop" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Stop an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/stop" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#restart-a-sink-connector] -=== Restart a sink connector - -.pulsar-admin CLI -[source,shell] ----- -# Restart all instances of a connector -./bin/pulsar-admin sinks restart \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only restart an individual instance ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Restart all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/restart" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Restart an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/restart" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#restart-a-source-connector] -=== Restart a source connector - -.pulsar-admin CLI -[source,shell] ----- -# Restart all instances of a connector -./bin/pulsar-admin sources restart \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" - -# optionally add --instance-id to only restart an individual instance ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Restart all instances of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/restart" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Restart an individual instance of a connector -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/restart" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#get-sink-connector-status] -=== Get sink connector status - -.pulsar-admin CLI -[source,shell] ----- -# Check connector status -./bin/pulsar-admin sinks status \ - --instance-id "$SINK_INSTANCE_ID" \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Get the status of all connector instances -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/status" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Get the status of an individual connector instance -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME/$SINK_INSTANCE_ID/status" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -Status response for all connector instances: - -.Result -[source,json] ----- -{ - "numInstances": 0, - "numRunning": 0, - "instances": [ - { - "instanceId": 0, - "status": { - "running": true, - "error": "string", - "numRestarts": 0, - "numReadFromPulsar": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSinkExceptions": 0, - "latestSinkExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWrittenToSink": 0, - "lastReceivedTime": 0, - "workerId": "string" - } - } - ] -} ----- - -Status response for individual connector instance: - -.Result -[source,json] ----- -{ - "running": true, - "error": "string", - "numRestarts": 0, - "numReadFromPulsar": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSinkExceptions": 0, - "latestSinkExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWrittenToSink": 0, - "lastReceivedTime": 0, - "workerId": "string" -} ----- - -[#get-source-connector-status] -=== Get source connector status - -.pulsar-admin CLI -[source,shell] ----- -# Check connector status -./bin/pulsar-admin sources status \ - --instance-id "$SOURCE_INSTANCE_ID" \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Get the status of all connector instances -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/status" \ - --header "Authorization: Bearer $PULSAR_TOKEN" - -# Get the status of an individual connector instance -curl -sS --fail -L -X GET "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME/$SOURCE_INSTANCE_ID/status" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -Status response for all connector instances: - -.Result -[source,json] ----- -{ - "numInstances": 0, - "numRunning": 0, - "instances": [ - { - "instanceId": 0, - "status": { - "running": true, - "error": "string", - "numRestarts": 0, - "numReceivedFromSource": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSourceExceptions": 0, - "latestSourceExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWritten": 0, - "lastReceivedTime": 0, - "workerId": "string" - } - } - ] -} ----- - -Status response for individual connector instance: - -.Result -[source,json] ----- -{ - "running": true, - "error": "string", - "numRestarts": 0, - "numReceivedFromSource": 0, - "numSystemExceptions": 0, - "latestSystemExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numSourceExceptions": 0, - "latestSourceExceptions": [ - { - "exceptionString": "string", - "timestampMs": 0 - } - ], - "numWritten": 0, - "lastReceivedTime": 0, - "workerId": "string" -} ----- - -[#delete-a-sink-connector] -=== Delete a sink connector - -.pulsar-admin CLI -[source,shell] ----- -# Delete all instances of a connector -./bin/pulsar-admin sinks delete \ - --namespace "$NAMESPACE" \ - --name "$SINK_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Delete all instances of a connector -curl -sS --fail -L -X DELETE "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -[#delete-a-source-connector] -=== Delete a source connector - -.pulsar-admin CLI -[source,shell] ----- -# Delete all instances of a connector -./bin/pulsar-admin sources delete \ - --namespace "$NAMESPACE" \ - --name "$SOURCE_NAME" \ - --tenant "$TENANT" ----- - -.{pulsar-short} Admin API -[source,shell] ----- -# Delete all instances of a connector -curl -sS --fail -L -X DELETE "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" ----- - -== Connector metrics - -{product} exposes Prometheus-formatted metrics for every connector. -For more information, see xref:operations:astream-scrape-metrics.adoc[]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc b/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc deleted file mode 100644 index a0b7db5..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/astra-db.adoc +++ /dev/null @@ -1,186 +0,0 @@ -= {astra-db} and {cass} -:connectorType: cassandra-enhanced - -The open-source https://pulsar.apache.org/docs/3.1.x/io-cassandra-sink/[{pulsar-reg} {cass-short} sink connector] (`cassandra`) reads messages from {pulsar-short} topics and writes them to {cass} databases. - -The xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector] (`{connectorType}`) extends the open-source connector by adding support for {company} product connections. -This includes {astra-db} connections with a Secure Connect Bundle (SCB) and {astra} application token. - -This means that you can use this sink connector to write messages to tables in {astra-db} or self-managed {cass-short} clusters. - -//Astra Streaming only -You can configure this connector with the {astra-ui}, the `pulsar-admin` CLI, or the {pulsar-short} Admin API. -The {astra-ui} provides a guided configuration process, but it is only suitable for connecting to {astra-db} databases. -With the CLI and API, you can connect to {astra-db} or a self-managed {cass-short} cluster. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -[TIP] -==== -The preceding example connects to a self-managed {cass-short} cluster. - -For an {astra-db} example, see <>. - -For all connection properties, see <>. -==== - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== {company} {pulsar} sink connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -The relevant and required properties depend on whether you are connecting to {astra-db} or a self-managed {cass-short} cluster, as well as the cluster configuration. - -[TIP] -==== -The following table includes commonly used properties. -For all properties and more information, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. -==== - -[cols=4] -|=== -| Name | Required | Default | Description - -|`auth` -|Yes -|`{}` -|Contains the xref:pulsar-connector:ROOT:cfgRefPulsarDseConnection.adoc#authentication-parameters[authentication parameters] to connect to the database. - -|`cloud.secureConnectBundle` -|Yes for {astra-db} -|`null` -|The path to your {astra-db} database's SCB zip file, or a base64 encoding of the SCB zip file (`base64:**ENCODED_STRING**`). - -Only use this property for {astra-db} connections. - -For self-managed clusters, use `ssl`. - -|`compression` -|Yes -|`None` -|The compression algorithm to use. - -|`connectionPoolLocalSize` -|Yes -|4 -|Number of connections to each node in the local datacenter. - -|`contactPoints` -|Yes for self-managed clusters -|`[localhost]` -|Either `[localhost]` or a comma-separated list of hostnames or IP addresses for your self-managed {cass-short} cluster nodes. - -If `contactPoints` is set to a list of hosts, then `loadBalancing.localDc` is required. - -If `cloud.secureConnectBundle` is set, then `contactPoints` is ignored. -The contact points are set by the SCB. - -|`ignoreErrors` -|Yes -|`None` -|Sets the xref:pulsar-connector:ROOT:cfgPulsarConfigureErrorHandling.adoc[error handling behavior]. - -|`jmx` -|Yes -|`true` -|Whether to collect and report metrics using Java Management Extensions (JMX). - -|`maxConcurrentRequests` -|Yes -|`500` -|The maximum number of concurrent requests that can be sent to each connected node. - -|`maxNumberOfRecordsInBatch` -|Yes -|`32` -|The maximum number of records to include in a batch write to the database. - -|`queryExecutionTimeout` -|Yes -|`30` -|CQL statement execution timeout limit in seconds. - -|`ssl` -|Depends on cluster configuration -|`{}` -|Contains xref:pulsar-connector:ROOT:cfgRefPulsarDSEConnection.adoc[SSL-encryption parameters] for self-managed clusters with client-to-node encryption enabled. - -For {astra-db}, use `cloud.secureConnectBundle`, which includes the SSL encryption configuration. -If `cloud.secureConnectBundle` is set, then `ssl` is ignored. - -|`topic` -|Yes -|`{}` -|Contains the <>. - -|`topics` -|Yes -|`[]` -|The names of topics to subscribe to. - -For each topic in `topics`, there must be a corresponding entry in the `topic` section. -|=== - -[#topic] -=== Topic-to-table mapping properties (`topic`) - -`topic` is a subproperty of `<>` that contains xref:pulsar-connector:ROOT:cfgRefPulsarDseTable.adoc[topic-to-table mapping properties]. - -This mapping determines which table receives messages from a {pulsar-short} topic, and how the message `value` fields are written to the table columns. - -There are many subproperties and values available in `topic` to support different write options, value translations, and data formats. - -The following example shows a truncated `configs` section that maps one topic to a table in an {astra-db} database: - -[source,json] ----- - "configs": { - "auth": { - "username": "token", - "password": "${ASTRA_APPLICATION_TOKEN}" - }, - "cloud.secureConnectBundle": "path/to/scb.zip", - "topics": "${TOPIC}", - // ... - // Other configs subproperties - // ... - "topic": { - "${TOPIC}": { - "${KEYSPACE_NAME}": { - "${TABLE_NAME}": { - "mapping": "column1=value.fieldA,column2=value.fieldC,column3=value.fieldG,column8=value.fieldW" - // ... - // Other topic subproperties - // ... - } - } - } - } - } ----- - -The `mapping` string is a comma-separated list of table column names and message `value` fields. -You can use other subproperties for other write options and mapping configuration, such as `codec` and `nullToUnset`. -For a more information, subproperties, and examples, see the xref:pulsar-connector:ROOT:index.adoc[{company} {pulsar} sink connector documentation]. - -== See also - -* https://github.com/datastax/pulsar-sink[{company} {pulsar} connector GitHub repository] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc b/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc deleted file mode 100644 index 4a7e308..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/cloud-storage.adoc +++ /dev/null @@ -1,369 +0,0 @@ -= Cloud Storage -:connectorType: cloud-storage - -The Cloud Storage sink connector reads messages from {pulsar-short} topics and writes them to cloud storage using specified format, such as Avro or Parquet. - -The following cloud storage providers are supported: - -* https://aws.amazon.com/s3/[AWS S3] -* https://cloud.google.com/storage[Google Cloud Storage] -* https://azure.microsoft.com/en-us/products/storage/blobs[Microsoft Azure Blob Storage] - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -[#pulsar-sink-connector-properties] -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -== Cloud Storage sink connector properties (`configs`) - -In the `configs` section of the connector configuration, set the following data transformation and cloud storage connection properties. - -[cols=4] -|=== -|Name |Required |Default |Description - -|`azureStorageAccountConnectionString` -|Yes for Azure - -Not used for GCS or AWS -|Empty -|The Azure Blob Storage connection string to authenticate with the storage account. - -If not set, you must set either `azureStorageAccountSASToken` _or_ both `azureStorageAccountKey` and `azureStorageAccountName`. - -|`azureStorageAccountKey` and `azureStorageAccountName` -|Yes for Azure - -Not used for GCS or AWS -|Empty -|The Azure Blob Storage account key and account name to authenticate with the storage account. -You must provide both properties when using this authentication method. - -If not set, you must set either `azureStorageAccountSASToken` _or_ `azureStorageAccountConnectionString`. - -|`azureStorageAccountSASToken` -|Yes for Azure - -Not used for GCS or AWS -|Empty -|The Azure Blob Storage account SAS token to authenticate with the storage account. - -If not set, you must set either `azureStorageAccountConnectionString` _or_ both `azureStorageAccountKey` and `azureStorageAccountName`. - -|`avroCodec` -|No -|`snappy` -|If `formatType` is `avro`, set the codec compression type: `bzip2`, `deflate`, `snappy`, `xz`, `zstandard`, or `null` (no compression). - -|`batchSize` -|No -|`10` -|The number of records submitted in a batch. - -By default, `batchSize` and `pendingQueueSize` are equal. - -|`batchTimeMs` -|No -|`1000` -|The interval for batch submission. - -|`bucket` -|Yes -|`null` -|The name of the cloud storage bucket or container to write to. - -|`bytesFormatTypeSeparator` -|No -|`0x10` -|This separator is inserted between records for the `formatType` of bytes. -An input record that contains the line separator will look like multiple records in the output object. - -|`endpoint` -|Yes for AWS and Azure - -Not used for GCS -|`null` -|The endpoint for your AWS S3 or Azure Blob Storage service. - -|`formatType` -|Yes -|`json` -|The desired format type for the output to cloud storage: `json`, `avro`, `bytes`, or `parquet`. - -For supported schema conversions and limitations, see <>. - -See also `avroCodec`, `bytesFormatTypeSeparator`, `jsonAllowNaN`, `parquetCodec`, and `withMetadata`. - -|`gcsServiceAccountKeyFileContent` -|Yes for GCS - -Not used for AWS or Azure -|Empty -|The contents of a JSON GCS service account key file. -If empty or not set, the connector attempts to read credentials from `gcsServiceAccountKeyFilePath`. - -|`gcsServiceAccountKeyFilePath` -|Yes for GCS - -Not used for AWS or Azure -|Empty -|The path to a JSON GCS service account key file. -If empty or not set, the connector attempts to read credentials from the system's `GOOGLE_APPLICATION_CREDENTIALS` environment variable. - -|`jsonAllowNaN` -|No -|`false` -|If `formatType` is `json`, set this property to `true` if you want the connector to treat 'NaN', 'INF', '-INF' as valid floating number values. - -This is disabled (`false`) by default because these values aren't compliant with the JSON specification. - -|`maxBatchBytes` -|No -|`10000000` -|The maximum number of bytes in a batch. - -|`parquetCodec` -|No -|`gzip` -|If `formatType` is `parquet`, set the codec compression type: `brotli`, `gzip`, `lzo`, `lz4`, `snappy`, `zstd`, or `null` (no compression). - -|`partitionerType` -|No -|`partition` -a|The partitioning type: - -* **`partition` (default)**: Partitions are based on topic partitions. -* **`time`**: Partitions are based on message publish time. -If using time-based partitioning, you can also set `timePartitionDuration` and `timePartitionPattern`. - -|`partitionerUseIndexAsOffset` -|No -|`false` -|Whether to use the the {pulsar-short} message index as the offset (message UUID) instead of the record sequence. - -* **`false` (default)**: Use the record sequence as the offset. - -* **`true`**: Use the message index as the offset, if available. -This is recommended when using batching. - -If the broker doesn't expose index metadata, or the record doesn't have index metadata, then the sequence is used. - -|`pathPrefix` -|No -|`null` -|If empty or not set, the output files are stored at the root of the specified `bucket`. - -If set, output files are stored in a folder at the path within the bucket. -Format the path as `**DIRECTORY**/**SUBDIRECTORY**/` with a trailing slash but no leading slash. - -|`pendingQueueSize` -|No -|`10` -|The number of records buffered in queue. - -By default, `batchSize` and `pendingQueueSize` are equal. - -|`provider` -|Yes -|`null` -a|Specify the provider type for your cloud storage service: - -* **Azure**: Only supports `azure-blob-storage`. -* **AWS S3**: Supports `aws-s3` or `s3v2`. -`s3v2` uses the AWS client, not the JCloud client. -* **GCS**: Only supports `google-cloud-storage`. - -|`role` and `roleSessionName` -|Yes for AWS if using IAM roles - -Not used for GCS or Azure -|`null` -|If using https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html[AWS IAM roles] for authentication to AWS S3, then set `role` to the IAM role name, and set `roleSessionName` to the IAM role instance identifier. -You must also set `secretAccessKey` and `accessKeyId`. - -|`secretAccessKey` and `accessKeyId` -|Yes for AWS - -Not used for GCS or Azure -|`null` -a|An AWS secret access key and access key ID that grant access to the specified `bucket`. -If using AWS IAM roles, you must also set `role` and `roleSessionName`. - -Permission to write objects to the specified `bucket` are required. -The following https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html[policies] are recommended: - -- `s3:AbortMultipartUpload` -- `s3:GetObject*` -- `s3:PutObject*` -- `s3:List*` -- `s3:GetBucketLocation` (only if `endpoint` doesn't include the region) - -|`skipFailedMessages` -|No -|`false` -a|Whether to skip messages that the connector fails to process for any reason, such as unsupported schema types: - -* **`true`**: The connector skips failed messages by acknowledging them as though they were successfully processed. -* **`false` (default)**: The connector fails the message, and the message remains unacknowledged. - -[TIP] -==== -If you want the connector to send failed messages to a dead-letter topic, set `skipFailedMessages` to `false`, and set `maxMessageRetries` and `deadLetterTopic` in the <>. -==== - -|`sliceTopicPartitionPath` -|No -|`false` -a|Whether to expand partitioned topic names into multiple directories in the bucket: - -* **`true`**: Split the partitioned topic name into multiple directories in the bucket. -For example, `demo-partition-0` expands to `demo/partition-0/`. -* **`false` (default)**: Use the partitioned topic name as one directory name in the bucket path, such as `demo-partition-0/`. - -See also `withTopicPartitionNumber`. - -|`timePartitionDuration` -|No -|`86400000` (24 hours) -|If `partitionerType` is `time`, set the time interval for each partition. -Accepts either a string (`30d`, `24h`, or `30m`) or a number of milliseconds (`86400000`). - -|`timePartitionPattern` -|No -|`yyyy-MM-dd` -|If `partitionerType` is `time`, set the datetime format using Java date and time format. - -|`useHumanReadableMessageId` -|No -|`false` -a|Whether to use a human-readable string for `messageId` in message metadata: - -* **`true`**: The `messageId` is a plain, human-readable string, such as `ledgerId:entryId:partitionIndex:batchIndex`. -* **`false` (default)**: The `messageId` is a Hex-encoded string. - -|`useHumanReadableSchemaVersion` -|No -|`false` -a|Whether to use a human-readable string for the schema version in message metadata: - -* **`true`**: The schema version is a plain, human-readable string. -* **`false` (default)**: The schema version is a Hex-encoded string. - -|`withMetadata` -|No -|`false` -a|Whether to save message attributes as additional message metadata. - -Ignored if `formatType` is `bytes`. - -For example, when writing to Parquet (`formatType: "parquet"`) from the ProtobufNative schema, the connector writes messages with the `DynamicMessage` format. -If `withMetadata` is true, then the connector adds `+__message_metadata__+` to the messages with `PulsarIOCSCProtobufMessageMetadata`. - -Therefore, given the following message: - -[source,protobuf] ----- -syntax = "proto3"; -message User { - string name = 1; - int32 age = 2; -} ----- - -The connector writes the following output with metadata: - -[source,parquet] ----- -syntax = "proto3"; -message PulsarIOCSCProtobufMessageMetadata { - map properties = 1; - string schema_version = 2; - string message_id = 3; -} -message User { - string name = 1; - int32 age = 2; - PulsarIOCSCProtobufMessageMetadata __message_metadata__ = 3; -} ----- - -|`withTopicPartitionNumber` -|No -|`true` -|Whether to include the topic partition number in the object path: - -* **`true` (default)**: Include the partition number in the object path, such as `topic-name/partition-0/`. -* **`false`**: Do not include the partition number in the object path, such as `topic-name/`. -This can be used to collapse partitions. - -See also `sliceTopicPartitionPath`. -|=== - -[#data-format-types] -== Data format types - -The `formatType` parameter supports JSON, Avro, Bytes, and Parquet formats. - -The following table lists the supported conversions from {pulsar-short} schema types to each writer format, as well as any limitations or comments. - -[cols=6] -|=== -|{pulsar-short} Schema |Writer: Avro |Writer: JSON |Writer: Parquet |Writer: Bytes |Notes - -|Primitive -|Not supported -|Supported -|Not supported -|Supported -|The JSON writer attempts to convert data with a `String` or `Bytes` schema to valid JSON, if possible. - -|Avro -|Supported -|Supported -|Supported -|Supported -| - -|JSON -|Supported -|Supported -|Supported -|Supported -| - -|Protobuf -|Supported -|Supported -|Supported -|Supported -|The Protobuf schema is based on the Avro schema. -It uses Avro as an intermediate format, so it might not provide the best possible conversion. - -|ProtobufNative -|Supported -|Not supported -|Supported -|Supported -|The ProtobufNative schema holds the Protobuf descriptor and the message. - -When writing to Avro format, the connector uses `avro-protobuf` to do the conversion. - -For information about Protobuf to Parquet, see `withMetadata` in <>. -|=== \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc b/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc deleted file mode 100644 index 85fe43f..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/elastic-search.adoc +++ /dev/null @@ -1,39 +0,0 @@ -= Elasticsearch -:connectorType: elastic_search - -The Elasticsearch sink connector reads messages from {pulsar-short} topics and writes them to https://www.elastic.co/elasticsearch/[Elasticsearch]. - -[#compatibility] -== Compatibility - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://opensearch.org/docs/1.2/clients/java-rest-high-level/[OpenSearch 1.2.4 library]. - -For information about compatibility between OpenSearch and Elasticsearch, see the https://opensearch.org/faq[OpenSearch FAQ]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== Elasticsearch sink connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://pulsar.apache.org/docs/io-elasticsearch-sink[OSS {pulsar} Elasticsearch sink connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc b/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc deleted file mode 100644 index e3c834b..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/google-bigquery.adoc +++ /dev/null @@ -1,391 +0,0 @@ -= Google BigQuery -:connectorType: bigquery - -The {pulsar-short} BigQuery sink connector reads messages from {pulsar-short} topics and writes them to https://cloud.google.com/bigquery[Google BigQuery]. - -This connector doesn't integrate directly with BigQuery. -Instead, it uses the https://pulsar.apache.org/docs/adaptors-kafka/[{pulsar} Kafka Connect adaptor] to transform {pulsar-short} message data into a Kafka-compatible format, and then it uses the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink] for the BigQuery integration. - -The adaptor provides a flexible and extensible framework for data transformation and processing, including support for common data formats and in-transit data transformations. - -[TIP] -==== -This connector _doesn't_ require a Kafka instance. - -Although the connector uses Kafka-related libraries, it operates entirely within {pulsar-short}. - -Classes, properties, and configuration options that reference Kafka are translation points that map {pulsar-short} concepts to Kafka concepts in the connector. -==== - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -[#pulsar-sink-connector-properties] -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== Kafka Connect adaptor properties (`configs`) - -The properties in the `configs` section define how data is streamed from {pulsar-short} to BigQuery using the Kafka Connect adaptor. - -For more information, see `https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/PulsarKafkaConnectSinkConfig.java[PulsarKafkaConnectSinkConfig.java]`. - -[cols=4] -|=== -|Name |Required |Default |Description - -|`batchSize` -|No -|`16384` -|The maximum size, in bytes, of messages that the sink attempts to batch before flush. - -|`collapsePartitionedTopics` -|No -|`false` -a|Whether to omit the `-partition-` suffix from the names of partitioned topics. -This determines how many BigQuery tables are created from partitioned topics: - -* **`true`**: Collapse partitioned topics by removing the `-partition-` suffix from topic names. -All partitions of a partitioned topic are written to the same BigQuery table. -* **`false` (default)**: Maintain partitions by preserving the `-partition-` suffix when creating BigQuery tables from topic names. -Each partition of a partitioned topic is written to its own BigQuery table. - -|`kafkaConnectorConfigProperties` -|No -|`{}` (empty map) -|A key-value map of <>. - -|`kafkaConnectorSinkClass` -|Yes -|`""` -|The Kafka connector sink class to use. -For {product}, use `com.wepay.kafka.connect.bigquery.BigQuerySinkConnector` unless you have your own custom class. - -|`lingerTimeMs` -|No -|`2147483647L` -|The duration, in milliseconds, that the sink attempts to batch messages before flush. - -|`maxBatchBitsForOffset` -|No -|`12` -|Number of bits to use for the index of messages in a batch, which are translated into offsets (UUIDs). -Must be an integer between `0` and `20`. - -If `0`, the behavior is disabled, and all messages in a batch have the same offset. - -|`offsetStorageTopic` -|Yes -|`""` -|The {pulsar-short} topic where you want to store https://pulsar.apache.org/docs/4.1.x/tutorials-topic/[message offsets (UUIDs)]. -This is an additional topic that helps track the connector's progress as messages are written to BigQuery. - -|`sanitizeTopicName` -|Yes -|`false` -a|Whether to replace unprocessable characters in topic names with underscores. -For example, a {pulsar-short} topic named `persistent://a/b/topic` becomes `+persistent___a_b_topic+` when this property is `true`. - -[IMPORTANT] -==== -For BigQuery, you _must_ set `sanitizeTopicName` to `true` to prevent errors from invalid characters in topic names. -BigQuery table names can include only letters, numbers, and underscores, and the Kafka Connect BigQuery Sink doesn't sanitize topic names before creating BigQuery tables. - -Be aware that this can cause naming collisions if two topics resolve to the same sanitized name. -For example, `topic_a` and `topic.a` are both sanitized as `topic_a`. -==== - -|`topic` -|Yes -|`""` -|The name of the {pulsar-short} topic that you want the sink to read from. -Only provide the topic name, not the whole address. - -|`unwrapKeyValueIfAvailable` -|No -|`true` -a|Whether to unwrap `KeyValue<>` data if the message `value` is of type `Record>`: - -* **`true` (default)**: For `Record>` data, extract `KeyValue<>` from the `Record` when writing to BigQuery. -* **`false`**: For `Record>` data, use the `Record` key (the entire `KeyValue<>` object) for writing to BigQuery. - -|`useIndexAsOffset` -|No -|`true` -a|Whether to use the message index as the offset, instead of the message `sequenceId`: - -* **`true` (default)**: Use the message index as the offset, if an index is available. -Otherwise, use the message `sequenceId`. -* **`false`**: Use the message `sequenceId` as the offset. - -Requires `AppendIndexMetadataInterceptor` and `exposingBrokerEntryMetadataToClientEnabled=true` on https://pulsar.apache.org/docs/next/developing-binary-protocol/#broker-entry-metadata[brokers]. - -|`useOptionalPrimitives` -|No -|`false` -|{pulsar-short} schemas don't contain information about optional schemas, but Kafka schemas can include this information. -Set this property to `true` to force all primitive schemas to be optional when converting the {pulsar-short} schema to a Kafka schema. -|=== - -[#kafkaConnectorConfigProperties] -=== Kafka Connect BigQuery Sink properties (`kafkaConnectorConfigProperties`) - -`kafkaConnectorConfigProperties` is a subproperty of `configs` that contains a map of configuration properties for the Kafka Connect BigQuery Sink. - -After the Kafka Connect adaptor transforms the {pulsar-short} data into a Kafka-compatible format, the Kafka Connect BigQuery Sink writes the data to BigQuery according to the properties in `kafkaConnectorConfigProperties`. - -Some of the Kafka Connect BigQuery Sink properties are the same as the Kafka Connect adaptor properties. -In some cases, the duplicate properties require matching values. -In other cases, you can use duplicate properties to perform additional data transformation or schema modification before writing to BigQuery. - -For more information, see the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink configuration reference] and `https://github.com/confluentinc/kafka-connect-bigquery/blob/master/kcbq-connector/src/main/java/com/wepay/kafka/connect/bigquery/config/BigQuerySinkConfig.java[BigQuerySinkConfig.java]`. - -[cols=4] -|=== -|Name |Required |Default |Description - -|`allBQFieldsNullable` -|No -|`false` -|Whether the BigQuery schemas generated by the connector allow `null` values in all fields. - -* **`false` (default)**: All fields in the BigQuery schemas are `REQUIRED`. -* **`true`**: No fields in the BigQuery schemas are `REQUIRED`. -All non-nullable Avro fields are translated as `NULLABLE` (or `REPEATED`, if arrays). - -|`allowBigQueryRequiredFieldRelaxation` -|No -|`false` -|If `allBQFieldsNullable` is `false`, you can set this property to `true` to allow BigQuery schema updates to change `REQUIRED` fields to `NULLABLE`. -This only applies to schema updates that happen after initial table creation. - -|`allowNewBigQueryFields` -|No -|`false` -a|Whether BigQuery schema updates can add fields: - -* **`false` (default)**: Schema updates _cannot_ add fields to BigQuery tables. -* **`true`**: Schema updates _can_ add new fields to BigQuery tables. - -This only applies to schema updates that happen after initial table creation. - -|`allowSchemaUnionization` -|No -|`false` -a|Whether to enable schema unionization during schema updates: - -* **`false` (default)**: The record of the last schema in a batch is used for any necessary table creation and schema update attempts. -* **`true`**: The existing table schema, if present, is unionized with new record schemas during schema updates. - -For more information about this parameter, how it interacts with other parameters, and important considerations, see `allowSchemaUnionization` in the https://docs.confluent.io/kafka-connectors/bigquery/current/kafka_connect_bigquery_config.html[Kafka Connect BigQuery Sink configuration reference]. - -|`autoCreateBucket` -|No -|`true` -|Whether to automatically create the bucket if it doesn't exist. - -|`autoCreateTables` -|No -|`false` -|Automatically create BigQuery tables if they don't already exist. - -Tables are named after the sanitized {pulsar-short} topic names unless overridden by `topic2TableMap`. - -|`avroDataCacheSize` -|No -|`100` -|The size of the cache to use when converting schemas from Avro to Kafka Connect. - -|`bigQueryMessageTimePartitioning` -|No -|`false` -|Whether or not to use the message time when inserting records. Default uses the connector processing time. - -|`bigQueryPartitionDecorator` -|No -|`true` -|Whether or not to append partition decorator to BigQuery table name when inserting records. Default is true. Setting this to true appends partition decorator to table name (e.g. table$yyyyMMdd depending on the configuration set for bigQueryPartitionDecorator). Setting this to false bypasses the logic to append the partition decorator and uses raw table name for inserts. - -|`bigQueryRetry` -|No -|0 -|The number of retry attempts made for a BigQuery request that fails with a backend error or a quota exceeded error. - -|`bigQueryRetryWait` -|No -|1000 -|The minimum amount of time, in milliseconds, to wait between retry attempts for a BigQuery backend or quota exceeded error. - -|`clusteringPartitionFieldNames` -|No -| -|Comma-separated list of fields where data is clustered in BigQuery. - -|`convertDoubleSpecialValues` -|No -|`false` -|Designates whether +Infinity is converted to Double.MAX_VALUE and whether -Infinity and NaN are converted to Double.MIN_VALUE to ensure successful delivery to BigQuery. - -|`defaultDataset` -|Yes -| -|The default dataset to be used - -|`deleteEnabled` -|No -|`false` -|Enable delete functionality on the connector through the use of record keys, intermediate tables, and periodic merge flushes. A delete will be performed when a record with a null value (a tombstone) is read. This feature will not work with SMTs that change the name of the topic. - -|`enableBatchLoad` (Beta) -|No -|Not set -a|A subset of `topics` to be batch loaded through GCS to BigQuery. -If set, you can also set the following properties: - -* `batchLoadIntervalSec`: The frequency, in seconds, that the connector attempts to run GCS to BigQuery load jobs. -* `gcsBucketName`: The name of the GCS bucket where blobs are staged for batch loading to BigQuery. - -[IMPORTANT] -==== -This is a beta feature that might have unexpected results or suboptimal performance. -==== - -|`includeKafkaData` -|No -|`false` -|Whether to include an extra block containing the original topic, offset, and partition information in the resulting BigQuery rows. - -If `true`, you can use `kafkaDataFieldName` to specify the field name for this block. - -|`intermediateTableSuffix` -|No -|`.tmp` -|A suffix that is used when creating intermediate tables from BigQuery destination tables. - -The names of intermediate tables are constructed from the destination table name, the `intermediateTableSuffix`, and an additional suffix if needed for uniqueness. -For example, using the default suffix, a destination table named `bqTable` would have intermediate tables named `bqTable.tmp`, `bqTable.tmp_1`, `bqTable.tmp_2`, and so on. - -|`keyfile` -|Yes -|Not set -|A string representation of Google credentials JSON, or the path to a Google credentials JSON file. - -String format is required when creating this connector in the {astra-ui}. - -|`keySource` -|Yes -|`FILE` -|If `keyfile` is a file path, set `keySource` to `FILE`. - -If `keyfile` is a string, set `keySource` to `JSON`. - -`JSON` is required when creating this connector in the {astra-ui}. - -|`mergeIntervalMs` -|No -|`60_000L` -|The merge flush interval in milliseconds, if upsert/delete is enabled. - -Set to `-1` to disable periodic flushing. - -See also `mergeRecordsThreshold`. - -|`mergeRecordsThreshold` -|No -|`-1` -|The number of records to write to an intermediate table before performing a merge flush, if upsert/delete is enabled. - -The default is `-1`, which disables merge flushing based on record count. - -See also `mergeIntervalMs`. - -|`name` -|Yes -|`""` -|Must be the same as the `name` in the <>. - -|`project` -|Yes -|`""` -|The BigQuery project to write to. - -|`queueSize` -|No -|`-1` -|The maximum size of the worker queue for BigQuery write requests before all topics are paused. - -This is a soft limit; the queue size can exceed the maximum before topics are paused. -All topics resume after a flush, or when the queue size is less than half of the maximum. - -The default is `-1`, which means the queue size is unlimited. - -|`sanitizeTopics` -|Yes -|`false` -|In `kafkaConnectorConfigProperties`, you must set this property to `false`. - -Topic names are sanitized by the Kafka Connect adaptor with `sanitizeTopicName` in `<>`. - -|`schemaRetriever` -|No -|`com.wepay.kafka.connect.bigquery.retrieve.IdentitySchemaRetriever` -|A class that can be used to create tables and update schemas automatically. - -|`threadPoolSize` -|No -|`10` -|The size of the BigQuery write thread pool. -This determines the maximum number of concurrent writes to BigQuery. - -|`timePartitioningType` -|No -|`DAY` -|The time partitioning type to use when creating tables: `DAY`, `HOUR`, `MONTH`, or `YEAR`. -This applies to new tables only; existing tables aren't altered to this partitioning type. - -|`timestampPartitionFieldName` -|No -|Not set -|The name of the field in the message `value` that contains a timestamp to use for partitioning in BigQuery, and to enable timestamp partitioning on each table. - -If empty, tables use ingestion-time partitioning. - -|`topic2TableMap` -|No -|Not set -a|Optional map of topic names to table names formatted as comma-separated tuples, such as `topic1:table1,topic2:table2,topic3:table3`. - -[IMPORTANT] -==== -If you use this property, you must use the sanitized topic names, not the original {pulsar-short} topic names. -Because `sanitizeTopicName` is `true` in `<>`, the Kafka Connect BigQuery Sink receives sanitized topic names from the Kafka Connect adaptor. -For example, a {pulsar-short} topic named `persistent://a/b/c-d` must be mapped with the sanitized name `+persistent___a_b_c_d+`. -==== - -|`topics` -|Yes -|`""` -|Must be the same as the `topic` in the <>. - -|`upsertEnabled` -|No -|`false` -|Whether to enable upsert functionality on the connector by using record keys, intermediate tables, and periodic merge flushes. -Row-matching is performed based on the contents of record keys. -This feature doesn't work with SMTs that change the name of the topic. -|=== \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc deleted file mode 100644 index 772e153..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-clickhouse.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= JDBC ClickHouse -:connectorType: jdbc-clickhouse - -You can use the JDBC ClickHouse sink connector to stream data from {pulsar-short} topics into https://clickhouse.com/[ClickHouse] tables. - -[#compatibility] -== Compatibility - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/ClickHouse/clickhouse-jdbc[ClickHouse 0.3.2 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== JDBC ClickHouse sink connector properties (`configs`) - -include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc deleted file mode 100644 index 70c75ba..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-mariadb.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= JDBC MariaDB -:connectorType: jdbc-mariadb - -You can use the JDBC MariaDB sink connector to stream data from {pulsar-short} topics into https://mariadb.org/[MariaDB] tables. - -[#compatibility] -== Compatibility - -{product} supports {pulsar} {pulsar-version}, which uses the https://mariadb.com/kb/en/about-mariadb-connector-j/[MariaDB Connector/J 2.7.5 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== JDBC MariaDB sink connector properties (`configs`) - -include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc deleted file mode 100644 index b05947a..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-postgres.adoc +++ /dev/null @@ -1,37 +0,0 @@ -= JDBC PostgreSQL -:connectorType: jdbc-postgres - -You can use the JDBC PostgreSQL sink connector to stream data from {pulsar-short} topics into https://www.postgresql.org/[PostgreSQL] tables. - -[#compatibility] -== Compatibility - -The PostgreSQL JDBC driver is an open-source JDBC driver written in Pure Java (Type 4) that communicates using the PostgreSQL native network protocol. -This allows Java programs to connect to a PostgreSQL database using standard, database-independent Java code. - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://jdbc.postgresql.org/documentation/setup/[PostgreSQL JDBC 42.4.1 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== JDBC PostgreSQL sink connector properties (`configs`) - -include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc b/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc deleted file mode 100644 index 52d9bf5..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/jdbc-sqllite.adoc +++ /dev/null @@ -1,36 +0,0 @@ -= JDBC SQLite -:connectorType: jdbc-sqlite - -You can use the JDBC SQLite sink connector to stream data from {pulsar-short} topics into https://www.sqlite.org/index.html[SQLite] tables. - -[#compatibility] -== Compatibility - -SQLite JDBC is a library for accessing and creating SQLite database files in Java. - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/xerial/sqlite-jdbc[Xerial SQLite JDBC 3.8.11.2 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== JDBC SQLite sink connector properties (`configs`) - -include::pulsar-io:partial$connectors/sinks/jdbc-config-params.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc b/modules/pulsar-io/pages/connectors/sinks/kafka.adoc deleted file mode 100644 index 858e0a0..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/kafka.adoc +++ /dev/null @@ -1,37 +0,0 @@ -= Kafka -:connectorType: kafka - -The Kafka sink connector reads messages from {pulsar-short} topics and writes them to https://kafka.apache.org/[Kafka] topics. - -[#compatibility] -== Compatibility - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/apache/kafka/tree/2.7[Kafka 2.7.2 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== Kafka sink connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://pulsar.apache.org/docs/io-kafka-sink[OSS {pulsar} Kafka sink connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc b/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc deleted file mode 100644 index 4b572df..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/kinesis.adoc +++ /dev/null @@ -1,39 +0,0 @@ -= Kinesis -:connectorType: kinesis - -The Kinesis sink connector reads messages from {pulsar-short} topics and writes them to https://aws.amazon.com/kinesis/[Amazon Kinesis]. - -[#compatibility] -== Compatibility - -The Amazon Kinesis Client Library for Java (Amazon KCL) is used to consume and process data from Amazon Kinesis in Java applications. - -{product} supports {pulsar-reg} {pulsar-version}, which uses the https://github.com/awslabs/amazon-kinesis-client[Amazon Kinesis Client 2.2.8 library] and the https://github.com/aws/aws-sdk-java[AWS Java SDK 0.14.0 library]. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== Kinesis sink connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://pulsar.apache.org/docs/io-kinesis-sink[OSS {pulsar} Kinesis sink connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc b/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc deleted file mode 100644 index 2717622..0000000 --- a/modules/pulsar-io/pages/connectors/sinks/snowflake.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= Snowflake -:connectorType: snowflake - -A https://www.snowflake.com/en/[Snowflake] database ingests structured and semi-structured datasets for processing and analysis. -Snowflake automatically manages all parts of the data storage process, including organization, structure, metadata, file size, compression, and statistics. - -The Snowflake sink connector reads messages from {pulsar-short} topics and writes them to Snowflake databases. - -== Create the connector - -include::pulsar-io:partial$connectors/sinks/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sinks/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sinks/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} sink connector properties - -include::pulsar-io:partial$connectors/sinks/pulsar-config-params.adoc[] - -[#configs] -=== Snowflake sink connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -For all supported properties, examples, and exceptions, see the https://github.com/datastax/snowflake-connector[{company} Snowflake connector GitHub repository]. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc b/modules/pulsar-io/pages/connectors/sources/data-generator.adoc deleted file mode 100644 index d3f5848..0000000 --- a/modules/pulsar-io/pages/connectors/sources/data-generator.adoc +++ /dev/null @@ -1,45 +0,0 @@ -= Data Generator -:connectorType: data-generator - -Use the Data Generator source connector for testing purposes. - -The Data Generator source connector uses the https://github.com/Codearte/jfairy[jFairy library] to stream sample messages to a {pulsar-short} topic. -The sample messages contain simulated `Person` data with fields like `firstName`, `email`, and `telephoneNumber`. - -The connector generates data continuously while it is running. -There is no upper limit on the number of messages it can generate. - -[#compatibility] -== Compatibility - -{product} supports {pulsar-reg} {pulsar-version}, which uses version 0.5.9 of the jFairy library. - -For the `Person()` class specification, see the https://github.com/apache/pulsar/blob/branch-{pulsar-version}/pulsar-io/data-generator/src/main/java/org/apache/pulsar/io/datagenerator/Person.java[{pulsar} GitHub repository]. - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Data Generator source connector properties (`configs`) - -In the `configs` section of the connector configuration, the only available property is `sleepBetweenMessages`. -This property sets the delay between messages generated by the connector. -The default value is `50` milliseconds. -For an uninterrupted stream of messages, set this property to `0`. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc deleted file mode 100644 index f8b69c6..0000000 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mongodb.adoc +++ /dev/null @@ -1,80 +0,0 @@ -= Debezium MongoDB -:connectorType: debezium-mongodb - -The Debezium MongoDB source connector tracks either a MongoDB replica set or a MongoDB sharded cluster for document changes in databases and collections. -It streams those changes as messages to a {pulsar-short} topic. - -The connector automatically handles the following: - -* Addition and removal of shards in a sharded cluster. -* Changes in membership for each replica set. -* Elections within each replica set. -* Resolution of communications issues with replica set members. - -[#compatibility] -== Compatibility - -include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Debezium MongoDB source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -The following table lists some commonly used properties. -For more information and additional properties, see the documentation for the https://debezium.io/documentation/reference/stable/connectors/mongodb.html[Debezium connector for MongoDB] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector]. - -[cols=3] -|=== -|Name |Required |Description - -|`database.whitelist` -|No if alternative properties are used -|A list of databases hosted by the server monitored by the connector. - -There are multiple properties you can use to specify (inclusively or exclusively) the databases and tables to monitor. - -|`mongodb.hosts` -|Yes -|A comma-separated list of hosts (either as `host` or `host:port`) for the MongoDB servers in the replica set. - -If `mongodb.members.auto.discover` is `false`, then you must prefix hosts with the replica set name, such as `rs0/localhost:27017`. - -|`mongodb.name` -|Yes -|A unique name that identifies the connector, MongoDB replica set, or shared cluster that the source connector monitors. - -Use only one Debezium MongoDB source connector for each MongoDB server. - -|`mongodb.password` -|Yes if authentication is enabled -|The password to authenticate to the MongoDB server. - -|`mongodb.task.id` -|Yes -|The `taskId` of the MongoDB connector that attempts to use a separate task for each replica set. - -|`mongodb.user` -|Yes if authentication is enabled -|The name of the database user to authenticate to the MongoDB server. -|=== \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc deleted file mode 100644 index 31d9d75..0000000 --- a/modules/pulsar-io/pages/connectors/sources/debezium-mysql.adoc +++ /dev/null @@ -1,37 +0,0 @@ -= Debezium MySQL -:connectorType: debezium-mysql - -The Debezium MySQL source connector reads the `binlog` from MySQL database servers, produces change events for row-level `INSERT`, `UPDATE`, and `DELETE` operations, and then sends change event messages to {pulsar-short} topics. - -[#compatibility] -== Compatibility - -include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Debezium MySQL source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/mysql.html#mysql-connector-properties[Debezium connector for MySQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc deleted file mode 100644 index b9d772c..0000000 --- a/modules/pulsar-io/pages/connectors/sources/debezium-oracle.adoc +++ /dev/null @@ -1,40 +0,0 @@ -= Debezium Oracle -:connectorType: debezium-oracle - -The Debezium Oracle source connector captures and records row-level changes that occur in databases on Oracle servers, including tables that are added while the connector is running. - -You can configure the connector according to the events and data that you want to stream. -For example, you can configure it to emit change events for a subset of schemas and tables, or configure it to ignore, mask, or truncate values in specific columns. - -[#compatibility] -== Compatibility - -include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Debezium Oracle source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties[Debezium connector for Oracle] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc deleted file mode 100644 index 74a44cb..0000000 --- a/modules/pulsar-io/pages/connectors/sources/debezium-postgres.adoc +++ /dev/null @@ -1,37 +0,0 @@ -= Debezium PostgreSQL -:connectorType: debezium-postgres - -The Debezium PostgreSQL source connector produces a change event for every row-level `INSERT`, `UPDATE`, and `DELETE` operation that it captures, and then it sends change event records for each table to separate {pulsar-short} topics. - -[#compatibility] -== Compatibility - -include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Debezium PostgreSQL source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-connector-properties[Debezium connector for PostgreSQL] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc b/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc deleted file mode 100644 index 7e31175..0000000 --- a/modules/pulsar-io/pages/connectors/sources/debezium-sqlserver.adoc +++ /dev/null @@ -1,89 +0,0 @@ -= Debezium SQL Server -:connectorType: debezium-sqlserver - -The Debezium SQL Server source connector reads data from Debezium SQL Server databases and tables, and then emits change data event messages to {pulsar-short} topics. - -It is based on the change data capture (CDC) feature available in SQL Server 2016 Service Pack 1 (SP1) and later editions. - -The SQL Server capture process monitors designated databases and tables, and then stores changes into dedicated change tables with stored procedure facades. - -[#compatibility] -== Compatibility - -include::pulsar-io:partial$connectors/sources/debezium-compatibility.adoc[] - -[#create-the-connector] -== Create the connector - -To create a Debezium SQL Server source connector, you must prepare your SQL Server instance and {pulsar-short} topics before creating the connector. - -. If you don't already have one, create a compatible SQL Server instance, such as Microsoft Azure SQL Server. - -. In your SQL Server instance, select or create a database and table to use as the source of CDC events that the connector will stream to your {pulsar-short} tenant. - -. In your {pulsar-short} namespace, create four topics using the following naming convention: -+ -* `**CONNECTOR_NAME**-debezium-history-topic` -* `**CONNECTOR_NAME**-debezium-offset-topic` -* `**SERVER_NAME**` -* `**SERVER_NAME**.**DB_NAME**.**TABLE_NAME**` - -+ --- -`**CONNECTOR_NAME**` is the name that you will use for your Debezium SQL Server source connector. - -`**SERVER_NAME**`, `**DB_NAME**`, and `**TABLE_NAME**` are the names of your SQL Server instance, database, and table. - -[WARNING] -==== -You must use these exact topic names because the connector will fail if it can't find the expected topics. -For more information, see https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-topic-names[Debezium SQL Server connector topic names]. - -You must create the required topics before you create the connector because the connector cannot create the topics automatically. -==== --- - -. When you create the source connector in the next steps, make sure the following properties are set correctly: -+ -* The `name` property (or the `$SOURCE_NAME` environment variable) must match the `**CONNECTOR_NAME**` you used in the topic names. -* In `<>`, the `topic.prefix` and `database.server.name` must be set to your SQL Server instance name. -* In `<>`, the `task.id` value must be a string (`"task.id": "0"`). If it is an integer (`"task.id": 0`), then the connector throws a `NullPointerException`. - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -. Set your consumers to subscribe to the `events` topic in your {pulsar-short} namespace to receive CDC events. -This topic contains the CDC events emitted by Debezium for the configured tables. - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -[WARNING] -==== -The `name` property must match the connector name you used in the topic names as explained in <>. -==== - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Debezium SQL Server source connector properties (`configs`) - -[WARNING] -==== -Make sure you set the `topic.prefix`, `database.server.name`, and `task.id` properties as explained in <>. -==== - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://debezium.io/documentation/reference/stable/connectors/sqlserver.html#sqlserver-connector-properties[Debezium connector for SQL Server] and the https://pulsar.apache.org/docs/io-debezium-source[OSS {pulsar} Debezium source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that are only present in <>. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kafka.adoc b/modules/pulsar-io/pages/connectors/sources/kafka.adoc deleted file mode 100644 index eb857e0..0000000 --- a/modules/pulsar-io/pages/connectors/sources/kafka.adoc +++ /dev/null @@ -1,32 +0,0 @@ -= Kafka -:connectorType: kafka - -The Kafka source connector pulls data from https://kafka.apache.org/[Kafka] topics and persists it to {pulsar-short} topics. - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Kafka source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://pulsar.apache.org/docs/io-kafka-source[OSS {pulsar} Kafka source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc b/modules/pulsar-io/pages/connectors/sources/kinesis.adoc deleted file mode 100644 index 123bfb4..0000000 --- a/modules/pulsar-io/pages/connectors/sources/kinesis.adoc +++ /dev/null @@ -1,32 +0,0 @@ -= Kinesis -:connectorType: kinesis - -The Kinesis source connector pulls data from https://aws.amazon.com/kinesis/[Amazon Kinesis] and persists it to {pulsar-short} topics. - -== Create the connector - -include::pulsar-io:partial$connectors/sources/get-started.adoc[] - -== Edit the connector - -include::pulsar-io:partial$connectors/sources/edit.adoc[] - -== Manage the connector - -include::pulsar-io:partial$connectors/sources/manage.adoc[] - -== Connector configuration reference - -include::pulsar-io:partial$connectors/connector-params-intro.adoc[] - -=== {pulsar-short} source connector properties - -include::pulsar-io:partial$connectors/sources/pulsar-config-params.adoc[] - -[#configs] -=== Kinesis source connector properties (`configs`) - -Set these properties in the `configs` section of the connector configuration. - -Generally, all properties provided in the https://pulsar.apache.org/docs/io-kinesis-source[OSS {pulsar} Kinesis source connector] are supported. -Exceptions include properties that aren't relevant to {product} and properties that aren't present in {pulsar} {pulsar-version}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/connector-params-intro.adoc b/modules/pulsar-io/partials/connectors/connector-params-intro.adoc deleted file mode 100644 index 271d4f4..0000000 --- a/modules/pulsar-io/partials/connectors/connector-params-intro.adoc +++ /dev/null @@ -1,3 +0,0 @@ -To configure {product} {pulsar-short} connectors, you use a combination of common {pulsar-short} properties and provider-specific properties. - -Because {product} and the {product} {pulsar-short} connectors are based on a specific version of the open-source {pulsar} project and connectors, some properties and values might be unsupported or ignored by {product}. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/function-params-tip.adoc b/modules/pulsar-io/partials/connectors/function-params-tip.adoc deleted file mode 100644 index 3838444..0000000 --- a/modules/pulsar-io/partials/connectors/function-params-tip.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[TIP] -==== -{pulsar-short} connectors and functions both use https://pulsar.apache.org/docs/3.1.x/functions-concepts/[{pulsar-short} functions workers]. -Therefore, some function configuration properties are also used to configure connectors. -==== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc deleted file mode 100644 index 4080a24..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-archive.adoc +++ /dev/null @@ -1,4 +0,0 @@ -|`archive` -|Yes -|The type of built-in {product} {pulsar-short} connector that you want to deploy. -Formatted as `builtin://**CONNECTOR**`, such as `builtin://kafka`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc deleted file mode 100644 index f4531c5..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-configs.adoc +++ /dev/null @@ -1,6 +0,0 @@ -|`configs` -|Yes -|A JSON-formatted key-value map containing configuration properties specific to the connector type, including provider-specific authentication and integration settings. -For available subproperties, see <>. - -Default: `{}` (Empty map, uses defaults if they exist, fails otherwise) \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc deleted file mode 100644 index 2fce029..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-customruntimeoptions.adoc +++ /dev/null @@ -1,3 +0,0 @@ -|`customRuntimeOptions` -|No -|A string that encodes options to configure the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc deleted file mode 100644 index 7c8d2ea..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-name.adoc +++ /dev/null @@ -1,6 +0,0 @@ -|`name` -|Yes -|The name for the connector. -It must start with a lowercase letter, and contain only numbers, hyphens (`-`), and lowercase letters. -{company} recommends a memorable, human-readable name that summarizes the connector's purpose. -For example: `{connectorType}-prod-us-east-1`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc deleted file mode 100644 index 1a91a08..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-namespace.adoc +++ /dev/null @@ -1,3 +0,0 @@ -|`namespace` -|Yes -|The namespace in your {pulsar-short} tenant where you want to create the connector. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc deleted file mode 100644 index 5190814..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-parallelism.adoc +++ /dev/null @@ -1,5 +0,0 @@ -|`parallelism` -|Yes -|The number of https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instances] to run. - -Default: `1` \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc deleted file mode 100644 index 3a26219..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-processingguarantees.adoc +++ /dev/null @@ -1,9 +0,0 @@ -|`processingGuarantees` -|Yes -|The messaging delivery semantic to use when writing to topics: `ATLEAST_ONCE`, `ATMOST_ONCE`, or `EFFECTIVELY_ONCE`. - -Respect for the processing guarantee depends on the connector implementation. - -For more information, see the {pulsar-short} documentation on https://pulsar.apache.org/docs/3.1.x/functions-concepts/#processing-guarantees-and-subscription-types[Function processing guarantees] and https://pulsar.apache.org/docs/3.1.x/io-overview/#processing-guarantee[Processing guarantees in I/O connectors]. - -Default: `ATLEAST_ONCE` \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc deleted file mode 100644 index 976bdec..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-resources.adoc +++ /dev/null @@ -1,4 +0,0 @@ -|`resources` -|No -|A JSON string describing the compute resources to allocate to each https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-instance[{pulsar-short} function instance]. -For example: `{"cpu":0.25,"disk":1000000000,"ram":500000000}`. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc deleted file mode 100644 index 2cada19..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-runtimeflags.adoc +++ /dev/null @@ -1,4 +0,0 @@ -|`runtimeFlags` -|No -|A string that encodes flags to pass to the https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-runtime[{pulsar} function runtime]. -Only applicable to process and Kubernetes runtimes. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc deleted file mode 100644 index bdc4930..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-secrets.adoc +++ /dev/null @@ -1,9 +0,0 @@ -|`secrets` -|No -|If security is enabled on your https://pulsar.apache.org/docs/3.1.x/functions-concepts/#function-worker[function workers], you can provide a map of secret names (`secretName`) to secrets provider configuration objects. -The `secretName` is used by the connector to reference the secret. -The mapped object contains the required properties to fetch the secret from the secrets provider. - -To get the types for the values in this mapping, use the `https://pulsar.apache.org/docs/3.1.x/functions-develop-security/[SecretProviderConfigurator.getSecretObjectType()]` method. - -This is separate from connector-specific security settings in `configs` and the {pulsar-short} authentication token used to connect to your {pulsar-short} cluster. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc b/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc deleted file mode 100644 index bc56cd4..0000000 --- a/modules/pulsar-io/partials/connectors/pulsar-config-params-tenant.adoc +++ /dev/null @@ -1,3 +0,0 @@ -|`tenant` -|Yes -|The {pulsar-short} tenant where you want to create the connector. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/edit.adoc b/modules/pulsar-io/partials/connectors/sinks/edit.adoc deleted file mode 100644 index adec72e..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/edit.adoc +++ /dev/null @@ -1,26 +0,0 @@ -To update a connector, pass the new configuration definition to the connector. -For example, if you created the connector with a configuration file, you can pass an updated configuration file. - -You can include the entire configuration or only the properties that you want to change. -Additionally, some properties can be modified with specific arguments, such as `--parallelism`. - -To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-sink-connector-configuration-data[Get sink connector configuration data]. - -.pulsar-admin CLI -[source,shell,subs="+attributes"] ----- -./bin/pulsar-admin sinks update \ - --sink-type {connectorType} \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 ----- - -.{pulsar-short} Admin API -[source,shell] ----- -curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" ----- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc b/modules/pulsar-io/partials/connectors/sinks/get-started.adoc deleted file mode 100644 index becd67e..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/get-started.adoc +++ /dev/null @@ -1,40 +0,0 @@ -. Optional: If you are using the `pulsar-admin` CLI or {pulsar-short} Admin API, set the following commonly-used environment variables: -+ -[source,shell,subs="+quotes"] ----- -export TENANT="**TENANT_NAME**" -export TOPIC="**INPUT_TOPIC_NAME**" -export NAMESPACE="**NAMESPACE_NAME**" # or default -export SINK_NAME="**SINK_CONNECTOR_UNIQUE_NAME**" -export PULSAR_TOKEN="**TENANT_PULSAR_TOKEN**" # API only -export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only ----- -+ -`**SINK_NAME**` is the name for your new sink connector. -{company} recommends a memorable, human-readable name that summarizes the connector's purpose. -For example: `{connectorType}-sink-prod-us-east-1`. - -. Create the connector using JSON-formatted connector configuration data. -You can pass the configuration directly or with a configuration file. -+ -.pulsar-admin CLI -[source,shell,subs="+attributes"] ----- -./bin/pulsar-admin sinks create \ - --sink-type {connectorType} \ - --name "$SINK_NAME" \ - --inputs "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --sink-config-file configs.json ----- -+ -.{pulsar-short} Admin API -[source,shell] ----- -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sinks/$TENANT/$NAMESPACE/$SINK_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sinkConfig=@configs.json;type=application/json" ----- -+ -.Example configuration data structure -include::pulsar-io:example$connectors/sinks/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc deleted file mode 100644 index 4f930fa..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/jdbc-config-params.adoc +++ /dev/null @@ -1,2 +0,0 @@ -In the `configs` section of the connector configuration, set the https://pulsar.apache.org/docs/io-jdbc-sink[{pulsar} JDBC sink connector properties]. -All JDBC sink connectors use the same set of configuration properties, but not all properties apply to all database providers or deployments. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/manage.adoc b/modules/pulsar-io/partials/connectors/sinks/manage.adoc deleted file mode 100644 index dfc7b55..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/manage.adoc +++ /dev/null @@ -1,5 +0,0 @@ -* xref:pulsar-io:connectors/index.adoc#start-a-sink-connector[Start a sink connector] -* xref:pulsar-io:connectors/index.adoc#stop-a-sink-connector[Stop a sink connector] -* xref:pulsar-io:connectors/index.adoc#restart-a-sink-connector[Restart a sink connector] -* xref:pulsar-io:connectors/index.adoc#get-sink-connector-status[Get sink connector status] -* xref:pulsar-io:connectors/index.adoc#delete-a-sink-connector[Delete a sink connector] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc b/modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc deleted file mode 100644 index 16b0a69..0000000 --- a/modules/pulsar-io/partials/connectors/sinks/pulsar-config-params.adoc +++ /dev/null @@ -1,150 +0,0 @@ -include::pulsar-io:partial$connectors/function-params-tip.adoc[] - -The following table lists {product} {pulsar-short} sink connector configuration properties by JSON field name. -For the equivalent command line arguments and more information about these properties, see the following: - -* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] -* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sinks[`pulsar-admin sinks` specification] - -.{pulsar-short} configuration properties for sink connectors -[cols=3] -|=== -|Field name |Required |Description - -include::pulsar-io:partial$connectors/pulsar-config-params-archive.adoc[] - -|`autoAck` -|Yes -|Whether the framework automatically acknowledges messages. - -Default: `false` (automatic acknowledgment disabled) - -|`className` -|Yes -|The connector type's class reference beginning with `org.apache.pulsar`, such as -`org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.kafka.connect.KafkaConnectSink`. - -|`cleanupSubscription` -|No -|Whether to delete subscriptions that are created or used by a sink when the sink is deleted. - -Default: `false` - -include::pulsar-io:partial$connectors/pulsar-config-params-configs.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-customruntimeoptions.adoc[] - -|`deadLetterTopic` -|No -|The name of the https://pulsar.apache.org/docs/en/concepts-messaging/#dead-letter-topic[topic that receives unacknowledged messages], such as those that exceed the maximum number of retries or fail to be processed completely. - -If `null` or not set, unacknowledged messages are discarded. - -See also `maxMessageRetries` and `negativeAckRedeliveryDelayMs`. - -|`inputSpecs` -|No -a|A map of input topics to https://pulsar.apache.org/docs/3.1.x/functions-cli/#consumerconfig[consumer configuration]. -By default, most values are `null` or empty. -For example: - -[source,json] ----- - "inputSpecs": { - "persistent://$TENANT/$NAMESPACE/$TOPIC": { - "schemaType": null, - "serdeClassName": null, - "schemaProperties": {}, - "consumerProperties": {}, - "receiverQueueSize": null, - "cryptoConfig": null, - "poolMessages": false, - "regexPattern": false - } - }, ----- - -|`inputs` -|Yes -|An array of input topics that the sink consumes messages from, such as `["persistent://$TENANT/$NAMESPACE/$TOPIC"]`. - -To consume all topics matching a naming pattern, use `topicsPattern` instead. -`inputs` and `topicsPattern` are mutually exclusive. - -Default: `[]` - -|`maxMessageRetries` -|No -|Maximum number of times that a message attempts to be delivered before being sent to the dead letter queue as an unacknowledged message. - -See also `negativeAckRedeliveryDelayMs` and `deadLetterTopic`. - -include::pulsar-io:partial$connectors/pulsar-config-params-name.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-namespace.adoc[] - -|`negativeAckRedeliveryDelayMs` -|No -|The amount of time, in milliseconds, to wait before attempting redelivery if message delivery times out or fails. - -See also `maxMessageRetries` and `deadLetterTopic`. - -include::pulsar-io:partial$connectors/pulsar-config-params-parallelism.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-processingguarantees.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-resources.adoc[] - -|`retainKeyOrdering` -|No -|Whether the sink consumes and processes messages in key order. - -Default: `true` - -|`retainOrdering` -|No -|Whether the sink consumes and processes messages in the order they were written to the topic. - -Default: `false` - -include::pulsar-io:partial$connectors/pulsar-config-params-runtimeflags.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-secrets.adoc[] - -|`sourceSubscriptionName` -|No -|The name of a specific {pulsar-short} source subscription, if required by your input topic consumer. - -|`sourceSubscriptionPosition` -|No -|The position to begin reading from in the source, if `sourceSubscriptionName` is set. - -Default: `Latest` - -include::pulsar-io:partial$connectors/pulsar-config-params-tenant.adoc[] - -|`timeoutMs` -|No -|The message timeout in milliseconds - -Default: `5000` - -|`topicsPattern` -|No -|A topic naming pattern to select topics to consume from all topics in a namespace. - -To consume an exact list of topics, use `inputs` instead. -`inputs` and `topicsPattern` are mutually exclusive. - -|`topicToSchemaProperties` -|No -|A map of input topics to schema properties specified as a JSON object. - -|`topicToSchemaType` -|No -|A map of input topics to schema types or class names specified as a JSON object. - -|`topicToSerdeClassName` -|No -|A map of input topics to SerDe class names specified as a JSON object. -|=== \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc b/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc deleted file mode 100644 index de79b3b..0000000 --- a/modules/pulsar-io/partials/connectors/sources/debezium-compatibility.adoc +++ /dev/null @@ -1,3 +0,0 @@ -{product} supports {pulsar-reg} {pulsar-version}, which uses Debezium {debezium-version} libraries. - -For supported database versions, see https://debezium.io/releases/{debezium-version}/[Debezium {debezium-version} compatibility]. \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/edit.adoc b/modules/pulsar-io/partials/connectors/sources/edit.adoc deleted file mode 100644 index cf60e02..0000000 --- a/modules/pulsar-io/partials/connectors/sources/edit.adoc +++ /dev/null @@ -1,26 +0,0 @@ -To update a connector, pass the new configuration definition to the connector. -For example, if you created the connector with a configuration file, you can pass an updated configuration file. - -You can include the entire configuration or only the properties that you want to change. -Additionally, some properties can be modified with specific arguments, such as `--parallelism`. - -To get the current configuration, see xref:pulsar-io:connectors/index.adoc#get-source-connector-configuration-data[Get source connector configuration data]. - -.pulsar-admin CLI -[source,shell,subs="+attributes"] ----- -./bin/pulsar-admin sources update \ - --source-type {connectorType} \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --parallelism 2 ----- - -.{pulsar-short} Admin API -[source,shell] ----- -curl -sS --fail -L -X PUT "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sourceConfig=@mynetty-source-config.json;type=application/json" ----- \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/get-started.adoc b/modules/pulsar-io/partials/connectors/sources/get-started.adoc deleted file mode 100644 index fc6ac3d..0000000 --- a/modules/pulsar-io/partials/connectors/sources/get-started.adoc +++ /dev/null @@ -1,40 +0,0 @@ -. Optional: If you are using the `pulsar-admin` CLI or {pulsar-short} Admin API, set the following commonly-used environment variables: -+ -[source,shell,subs="+quotes"] ----- -export TENANT="**TENANT_NAME**" -export TOPIC="**OUTPUT_TOPIC_NAME**" -export NAMESPACE="**NAMESPACE_NAME**" # or default -export SOURCE_NAME="**SOURCE_CONNECTOR_UNIQUE_NAME**" -export PULSAR_TOKEN="**TENANT_PULSAR_TOKEN**" # API only -export WEB_SERVICE_URL="**TENANT_PULSAR_WEB_SERVICE_URL**" # API only ----- -+ -`**SOURCE_NAME**` is the name for your new source connector. -{company} recommends a memorable, human-readable name that summarizes the connector's purpose. -For example: `{connectorType}-source-prod-us-east-1`. - -. Create the connector using JSON-formatted connector configuration data. -You can pass the configuration directly or with a configuration file. -+ -.pulsar-admin CLI -[source,shell,subs="+attributes"] ----- -./bin/pulsar-admin sources create \ - --source-type {connectorType} \ - --name "$SOURCE_NAME" \ - --destination-topic-name "persistent://$TENANT/$NAMESPACE/$TOPIC" \ - --tenant "$TENANT" \ - --source-config-file configs.json ----- -+ -.{pulsar-short} Admin API -[source,shell] ----- -curl -sS --fail -L -X POST "$WEB_SERVICE_URL/admin/v3/sources/$TENANT/$NAMESPACE/$SOURCE_NAME" \ - --header "Authorization: Bearer $PULSAR_TOKEN" \ - --form "sourceConfig=@mynetty-source-config.json;type=application/json" ----- -+ -.Example configuration data structure -include::pulsar-io:example$connectors/sources/{connectorType}/sample-data.adoc[] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/manage.adoc b/modules/pulsar-io/partials/connectors/sources/manage.adoc deleted file mode 100644 index 3ab6857..0000000 --- a/modules/pulsar-io/partials/connectors/sources/manage.adoc +++ /dev/null @@ -1,5 +0,0 @@ -* xref:pulsar-io:connectors/index.adoc#start-a-source-connector[Start a source connector] -* xref:pulsar-io:connectors/index.adoc#stop-a-source-connector[Stop a source connector] -* xref:pulsar-io:connectors/index.adoc#restart-a-source-connector[Restart a source connector] -* xref:pulsar-io:connectors/index.adoc#get-source-connector-status[Get source connector status] -* xref:pulsar-io:connectors/index.adoc#delete-a-source-connector[Delete a source connector] \ No newline at end of file diff --git a/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc b/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc deleted file mode 100644 index 446f8da..0000000 --- a/modules/pulsar-io/partials/connectors/sources/pulsar-config-params.adoc +++ /dev/null @@ -1,81 +0,0 @@ -include::pulsar-io:partial$connectors/function-params-tip.adoc[] - -The following table lists {product} {pulsar-short} source connector configuration properties by JSON field name. -For the equivalent command line arguments and more information about these properties, see the following: - -* https://pulsar.apache.org/docs/3.1.x/functions-cli/[{pulsar-short} Functions CLI and YAML configuration reference] -* https://pulsar.apache.org/reference/#/{pulsar-version}.x/pulsar-admin/sources[`pulsar-admin sources` specification] - -.{pulsar-short} configuration properties for source connectors -[cols=3] -|=== -|Field name |Required |Description - -include::pulsar-io:partial$connectors/pulsar-config-params-archive.adoc[] - -|`batchBuilder` -|No -|The batch construction method: `DEFAULT` or `KEY_BASED`. - -Default: `DEFAULT` - -|`batchSourceConfig` -|No -|The batch source configuration key-value as a JSON string. - -include::pulsar-io:partial$connectors/pulsar-config-params-configs.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-customruntimeoptions.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-name.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-namespace.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-parallelism.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-processingguarantees.adoc[] - -|`producerConfig` -|No -a|A JSON string containing a https://pulsar.apache.org/docs/3.1.x/functions-cli/#producerconfig[custom producer configuration]. -By default, most values are `null` or empty. -For example: - -[source,json] ----- - "producerConfig": { - "maxPendingMessages": null, - "maxPendingMessagesAcrossPartitions": null, - "useThreadLocalProducers": false, - "cryptoConfig": null, - "batchBuilder": "" - }, ----- - -include::pulsar-io:partial$connectors/pulsar-config-params-resources.adoc[] - -include::pulsar-io:partial$connectors/pulsar-config-params-runtimeflags.adoc[] - -|`schemaType` -|No -|The schema type used to encode messages emitted from a {pulsar-short} source. -Accepts either a built-in schema like `avro` or `json`, or a custom `Schema` class name. - -include::pulsar-io:partial$connectors/pulsar-config-params-secrets.adoc[] - -|`serdeClassName` -|No -|The SerDe classname for the source. - -include::pulsar-io:partial$connectors/pulsar-config-params-tenant.adoc[] - -|`topicName` -|Yes -|An existing topic in your {product} tenant where messages are published. -Must be formatted as a full persistent or non-persistent topic name, such as `persistent://$TENANT/$NAMESPACE/$TOPIC`. - -|`typeClassName` -|Yes -|The class reference for the connector type. -Begins with `org.apache.pulsar`, such as `org.apache.pulsar.common.schema.KeyValue` or `org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource`. -|=== \ No newline at end of file From 11eb70964d527da7622f4e2497ddd71d122b3945 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:02:31 -0800 Subject: [PATCH 31/31] build errors --- modules/ROOT/nav.adoc | 23 ----------------------- modules/ROOT/pages/index.adoc | 9 +-------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 2249ed0..337df59 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -8,28 +8,5 @@ * xref:starlight-for-jms:ROOT:index.adoc[Starlight for JMS] .APIs and References -* Connectors -** xref:pulsar-io:connectors/index.adoc[] -** Sources -*** xref:pulsar-io:connectors/sources/data-generator.adoc[] -*** xref:pulsar-io:connectors/sources/debezium-mongodb.adoc[] -*** xref:pulsar-io:connectors/sources/debezium-mysql.adoc[] -*** xref:pulsar-io:connectors/sources/debezium-oracle.adoc[] -*** xref:pulsar-io:connectors/sources/debezium-postgres.adoc[] -*** xref:pulsar-io:connectors/sources/debezium-sqlserver.adoc[] -*** xref:pulsar-io:connectors/sources/kafka.adoc[] -*** xref:pulsar-io:connectors/sources/kinesis.adoc[] -** Sinks -*** xref:pulsar-io:connectors/sinks/astra-db.adoc[] -*** xref:pulsar-io:connectors/sinks/cloud-storage.adoc[] -*** xref:pulsar-io:connectors/sinks/elastic-search.adoc[] -*** xref:pulsar-io:connectors/sinks/google-bigquery.adoc[] -*** xref:pulsar-io:connectors/sinks/jdbc-postgres.adoc[] -*** xref:pulsar-io:connectors/sinks/jdbc-mariadb.adoc[] -*** xref:pulsar-io:connectors/sinks/jdbc-clickhouse.adoc[] -*** xref:pulsar-io:connectors/sinks/jdbc-sqllite.adoc[] -*** xref:pulsar-io:connectors/sinks/kafka.adoc[] -*** xref:pulsar-io:connectors/sinks/kinesis.adoc[] -*** xref:pulsar-io:connectors/sinks/snowflake.adoc[] * xref:astra-streaming:developing:astream-functions.adoc[{pulsar-short} functions] * xref:astra-streaming:ROOT:astream-subscriptions.adoc[Topic subscriptions] \ No newline at end of file diff --git a/modules/ROOT/pages/index.adoc b/modules/ROOT/pages/index.adoc index 7e7adc6..66e0ffe 100644 --- a/modules/ROOT/pages/index.adoc +++ b/modules/ROOT/pages/index.adoc @@ -83,14 +83,7 @@

EXa1M!jvR&eq>UDk4{tx0G`% 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 <1}APK1sq*eGbO5$NMBS!kDVGXw1Fnzz$`zRj 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 diff --git a/modules/functions/images/astream-function-controls.png b/modules/functions/images/astream-function-controls.png deleted file mode 100644 index 4ff5d1e5baae06380e4b5b40a985c2dac5c3f5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6390 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 diff --git a/modules/functions/images/astream-function-log.png b/modules/functions/images/astream-function-log.png deleted file mode 100644 index 765f3f0209774e74e59ff01021df2a6018b1d583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88529 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 bWxxJ2ZlB`Dx8gI`8IY`}tDnm{r-UW|Vn?*M diff --git a/modules/functions/images/astream-function-update.png b/modules/functions/images/astream-function-update.png deleted file mode 100644 index 9ac1c2aea98bf2e2679231c01929bdb4c1f40827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67305 zcmeFYWmuHo-Zp&E2qFzi2qGm&NGdr9h=2%4HzM8LFaxM4iXy4xDAFz6AP5N3-GX%I z5JS9cbnkupzu))$@_c-b&2hk7T(k1G*80_Xu9s>L6-bEah#&|eQM@nr2!e3IBMu88 zKKR(0D&mKri;_07vTBO5vdn6(PL?+I77%p*WsDAiuEuwoWP?Z7N+9e zc=>rT`pQ<%GWQ=_ox_Dy>W~Nmhyuq2za9}sx{U>GaV6_MB81di5>$DqI{58j2H2EO zy@M`V-EfY%XvMj8wNmvi1O2QB)Rt|S&q@rHDo0pRZGS;N*Jo;e$Wo_HnhtT3L{k*$a!~AFr9*znrCixb^w_yd}xwZ-#UCE>Y3E*sahw?{+gbNT)KVC% zB5XiG$B`hIJKj0*az-GR$fbbuIv1T8&kJe7BUktfb=xu_A@!NJbUQ>Ng_bZ{GY%f}mN*EKHx2)dk4<{nlU5d{@pZ6?OWli5~EQHgx%(ynVQoBp)((T-Im zg^!_LF1l|*F80y6M;Rh@pmiXum@@KO`dxc<)(2t1x+G?;!4rqhY28b+_MQXCw{mnG z9n;vew}UuYVISX8TPOwpiaxVA!VB5`CSpN+M_s9=fM5KYraDt@cx%ie>0+=E#S7h+ zA!5P7x5z`>W{9yvsN7nUFUY;zR!SnB{ffB#O*fIN>y`TPFU#N>vMWybMRqdkHLf?4 zH3?}y-(~8iqHSU2+-ZL0R`K{&nEzH9Gj^d2vnh1L{)#C}8`jr1Q!U2cX-gOI4Vkg@ zU=Ty}kDo8heclpY{Uvkjkdg(9^D-SR^CmTdr47z#My)^)abuGw@@*TQDsvaX3^S>* z@_eeCY;R=4lQzP0@+4w<(uD+qgxvG#-HW%!qKgDaF03(l;@aU}%*C_&I#!e_ zAW>3vwL@pvwB)vrRHd52;al$zFKzAb*ctj6S2Os+>h3mDjf&G1a)f0lJ=Gh1c9G_U zh43;1dAAF0)9Ck6JZSVle*4&$lKb3|xoUm7vJwvc>=)qYcRm!S9l~xfCOtf4I_?_f zpUIHLLllR4KT>=b++;z3?XR5K#G%4;8OO~OXYtp?i6GG}0vYCuav``8*ey+K#WP}Y zi0`Ii?{So5?&uO}2YHxYAHnuSOqw!T<0>>GqXN@ z-a{VHj9VnPMsD@=sw-^Mz8Z_a(a!daeT3B5yrCB zJ+#)+`25rlXa&D9@UyqHd@9nsNf~7-SR{~(ozt>XXz86&U}~hxha%^gbx#ZuZ=hxf z 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 diff --git a/modules/functions/images/astream-io-topics.png b/modules/functions/images/astream-io-topics.png deleted file mode 100644 index bfa3fbd290ccbb75ec04b6fed3142525cb156195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139593 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