You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2021/04/29 13:12:20 UTC

[camel-k] 06/30: doc(example): error handling kamelet binding

This is an automated email from the ASF dual-hosted git repository.

nferraro pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit 924378e018a7b458754a8f18e9a9484d39cb4007
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Apr 13 14:22:32 2021 +0200

    doc(example): error handling kamelet binding
---
 ...ror-handler.yaml => error-handler.kamelet.yaml} | 38 ++++++++-------
 .../kamelets/error-handler/error-sink.kamelet.yaml | 44 -----------------
 ...ler.yaml => incremental-id-source.kamelet.yaml} | 47 +++++++++++-------
 .../kamelet-binding-error-handler.yaml             | 17 ++++---
 ...ng-error-handler.yaml => log-sink.kamelet.yaml} | 30 +++++-------
 examples/kamelets/error-handler/readme.md          | 57 ++++++++++++++--------
 .../error-handler/timer-source.kamelet.yaml        | 54 --------------------
 7 files changed, 107 insertions(+), 180 deletions(-)

diff --git a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml b/examples/kamelets/error-handler/error-handler.kamelet.yaml
similarity index 56%
copy from examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
copy to examples/kamelets/error-handler/error-handler.kamelet.yaml
index d731d1f..dbfc4bb 100644
--- a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
+++ b/examples/kamelets/error-handler/error-handler.kamelet.yaml
@@ -16,23 +16,25 @@
 # ---------------------------------------------------------------------------
 
 apiVersion: camel.apache.org/v1alpha1
-kind: KameletBinding
+kind: Kamelet
 metadata:
-  name: http-error-source
+  name: error-handler
 spec:
-  source:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: timer-source
-    properties:
-      message: "Hello world!"
-  sink:
-    uri: https://log-source/failing-service
-  errorHandler:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: error-sink
-    properties:
-     defaultMessage: "ERROR ERROR!"      
+  sources:
+  - content: |
+      import org.apache.camel.builder.RouteBuilder;
+      public class ErrorHandlerSource extends RouteBuilder {
+        @Override
+        public void configure() throws Exception {
+            errorHandler(deadLetterChannel("log:error?showCaughtException=true&showException=true&showHeaders=true"));
+        }
+      }
+    name: ErrorHandlerSource.java
+  definition:
+    title: "Error Handler Log DLC"
+    description: "Dead letter channel"
+# We can use the below once this is fixed https://issues.apache.org/jira/browse/CAMEL-16486
+#  flow:
+#    error-handler:
+#      dead-letter-channel:
+#        dead-letter-uri: log:error-sink?showCaughtException=true&showException=true&showHeaders=true
diff --git a/examples/kamelets/error-handler/error-sink.kamelet.yaml b/examples/kamelets/error-handler/error-sink.kamelet.yaml
deleted file mode 100644
index e35a54d..0000000
--- a/examples/kamelets/error-handler/error-sink.kamelet.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-apiVersion: camel.apache.org/v1alpha1
-kind: Kamelet
-metadata:
-  name: error-sink
-  annotations:
-    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAACcBJREFUeJzt3XmsHVUdwPHva21poWGTUpAiVRQSFjWAyi5LcCmKLCEouLwQccMgGsISEkQRXMIfSKMGhQSMCCibkRIgghQEF4RIQYtG4YFsraRlb6G+1j9+94a50/fmvuW+OTN3vp9kkrnnzj3zu+/N786ZmTNnQJIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZKkfjOQOoAKGQA+DJwAvBfYCpieNKKJexk4E/h56kDUH94O3AOs76NpHfDlXv6R1Ey7ACtIv0FP1XRa7/5Uapo5wL9JvxFP9fSNXv3Bmu [...]
-  labels:
-    camel.apache.org/kamelet.type: "sink"
-spec:
-  definition:
-    title: "Error Log Sink"
-    description: "Consume events from a channel"
-    required:
-      - defaultMessage
-    properties:
-      defaultMessage:
-        title: Message
-        description: The default message to log
-        type: string
-        example: "error while checking the source"    
-  flow:
-    from:
-      uri: kamelet:source
-      steps:
-      - set-body:
-          constant: "{{defaultMessage}}"
-      - to: "log:error-sink"
diff --git a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml b/examples/kamelets/error-handler/incremental-id-source.kamelet.yaml
similarity index 55%
copy from examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
copy to examples/kamelets/error-handler/incremental-id-source.kamelet.yaml
index d731d1f..5e3181b 100644
--- a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
+++ b/examples/kamelets/error-handler/incremental-id-source.kamelet.yaml
@@ -16,23 +16,36 @@
 # ---------------------------------------------------------------------------
 
 apiVersion: camel.apache.org/v1alpha1
-kind: KameletBinding
+kind: Kamelet
 metadata:
-  name: http-error-source
+  name: incremental-id-source
+  labels:
+    camel.apache.org/kamelet.type: "source"
 spec:
-  source:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: timer-source
+  definition:
+    title: "Incremental ID Source"
+    description: "Produces periodic events with an incremental ID"
     properties:
-      message: "Hello world!"
-  sink:
-    uri: https://log-source/failing-service
-  errorHandler:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: error-sink
-    properties:
-     defaultMessage: "ERROR ERROR!"      
+      period:
+        title: Period
+        description: The interval between two events
+        type: integer
+        default: 1000
+  types:
+    out:
+      mediaType: text/plain
+  flow:
+    from:
+      uri: timer:tick
+      parameters:
+        period: "{{period}}"
+      steps:
+      - set-body:
+          simple: "Producing message #${exchangeProperty.CamelTimerCounter}"
+      - choice:
+          when:
+          - simple: "${bodyAs(String)} contains 0"
+            steps:
+            - set-body:
+                simple: "${mandatoryBodyAs(Boolean)}"
+      - to: "kamelet:sink"                
diff --git a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml b/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
index d731d1f..3602831 100644
--- a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
+++ b/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
@@ -18,21 +18,22 @@
 apiVersion: camel.apache.org/v1alpha1
 kind: KameletBinding
 metadata:
-  name: http-error-source
+  name: kamelet-binding-error-handler
 spec:
   source:
     ref:
       kind: Kamelet
       apiVersion: camel.apache.org/v1alpha1
-      name: timer-source
-    properties:
-      message: "Hello world!"
+      name: incremental-id-source
   sink:
-    uri: https://log-source/failing-service
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: log-sink
   errorHandler:
     ref:
       kind: Kamelet
       apiVersion: camel.apache.org/v1alpha1
-      name: error-sink
-    properties:
-     defaultMessage: "ERROR ERROR!"      
+      name: error-handler    
+#    uri: kamelet:error-handler
+    
diff --git a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml b/examples/kamelets/error-handler/log-sink.kamelet.yaml
similarity index 70%
copy from examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
copy to examples/kamelets/error-handler/log-sink.kamelet.yaml
index d731d1f..aa11481 100644
--- a/examples/kamelets/error-handler/kamelet-binding-error-handler.yaml
+++ b/examples/kamelets/error-handler/log-sink.kamelet.yaml
@@ -16,23 +16,17 @@
 # ---------------------------------------------------------------------------
 
 apiVersion: camel.apache.org/v1alpha1
-kind: KameletBinding
+kind: Kamelet
 metadata:
-  name: http-error-source
+  name: log-sink
+  labels:
+    camel.apache.org/kamelet.type: "sink"
 spec:
-  source:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: timer-source
-    properties:
-      message: "Hello world!"
-  sink:
-    uri: https://log-source/failing-service
-  errorHandler:
-    ref:
-      kind: Kamelet
-      apiVersion: camel.apache.org/v1alpha1
-      name: error-sink
-    properties:
-     defaultMessage: "ERROR ERROR!"      
+  definition:
+    title: "Regular Log Sink"
+    description: "Consume events from a channel"  
+  flow:
+    from:
+      uri: kamelet:source
+      steps:
+      - to: "log:ok"
diff --git a/examples/kamelets/error-handler/readme.md b/examples/kamelets/error-handler/readme.md
index 5438050..5ff4777 100644
--- a/examples/kamelets/error-handler/readme.md
+++ b/examples/kamelets/error-handler/readme.md
@@ -1,49 +1,64 @@
 # Kamelets Binding Error Handler example
-This example shows how to create a simple _timer-source_ `kamelet` bound to a failing sink in a `KameletBinding`. With the support of the `ErrorHandler` we will be able to redirect all errors to a `Dead Letter Channel` _error-sink_ `Kamelet`.
+This example shows how to create a simple _source_ `kamelet` bound to a log _sink_ in a `KameletBinding`. With the support of the `ErrorHandler` we will be able to redirect all errors to a `Dead Letter Channel` _error-handler_ `Kamelet`.
 
-## Timer Source Kamelet
-First of all, you must install the _timer-source_ Kamelet defined in `timer-source.kamelet.yaml` file:
+## Incremental ID Source Kamelet
+First of all, you must install the _incremental-id-source_ Kamelet defined in `incremental-id-source.kamelet.yaml` file. This source will emit events every second with an autoincrement counter that will be forced to fail when the number 0 is caught. With this trick, we will simulate possible event faults.
 ```
-$ kubectl apply -f timer-source.kamelet.yaml
+$ kubectl apply -f incremental-id-source.kamelet.yaml
 ```
 You can check the newly created `kamelet` checking the list of kamelets available:
 ```
 $ kubectl get kamelets
 
-NAME                   PHASE
-timer-source           Ready
+NAME                            PHASE
+incremental-id-source           Ready
 ```
-## Error Sink Kamelet
-Now it's the turn of installing the _error-sink_ Kamelet defined in `error-sink.kamelet.yaml` file:
+## Log Sink Kamelet
+Now it's the turn of installing the log-sink_ Kamelet defined in `log-sink.kamelet.yaml` file:
 ```
-$ kubectl apply -f error-sink.kamelet.yaml
+$ kubectl apply -f log-sink.kamelet.yaml
 ```
 You can check the newly created `kamelet` checking the list of kamelets available:
 ```
 $ kubectl get kamelets
 
-NAME           PHASE
-error-sink     Ready
-timer-source   Ready
+NAME                    PHASE
+log-sink                Ready
+incremental-id-source   Ready
+```
+## Error handler  Kamelet
+We finally install an error handler as a dead letter channel as specified in `error-handler.kamelet.yaml` file. You can specify any kind of error handler as expected by Apache Camel runtime.
+```
+$ kubectl apply -f error-handler.kamelet.yaml
+```
+You can check the newly created `kamelet` checking the list of kamelets available:
+```
+$ kubectl get kamelets
+
+NAME                    PHASE
+error-handler           Ready
+log-sink                Ready
+incremental-id-source   Ready
 ```
 ## Error Handler Kamelet Binding
-We can create a `KameletBinding` which is triggered by the _timer-source_ `Kamelet` and define a fake sink URI in order to make it fail on purpose. Then we can configure an _errorHandler_ as defined in `kamelet-binding-error-handler.yaml` file:
+We can create a `KameletBinding` which is triggered by the _incremental-id-source_ `Kamelet` and log events to _log-sink_ `Kamelet`. As this will sporadically fail, we can configure an _errorHandler_ as defined in `kamelet-binding-error-handler.yaml` file:
 ```
+...
   errorHandler:
     ref:
       kind: Kamelet
       apiVersion: camel.apache.org/v1alpha1
-      name: log-sink
-    properties:
-     defaultMessage: "ERROR ERROR!" 
+      name: error-handler
 ```
 Execute the following command to start the `Integration`:
 ```
 kubectl apply -f kamelet-binding-error-handler.yaml
 ```
-As soon as the `Integration` starts, it will log a message error for every failure it will print:
+As soon as the `Integration` starts, it will log the events on the `ok` log channel and errors on the `error` log channel:
+```
+[1] 2021-04-13 10:33:38,375 INFO  [ok] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Producing message #8]
+[1] 2021-04-13 10:33:39,376 INFO  [ok] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Producing message #9]
+[1] 2021-04-13 10:33:40,409 INFO  [error] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, Headers: {firedTime=Tue Apr 13 10:33:40 GMT 2021}, BodyType: String, Body: Producing message #10, CaughtExceptionType: org.apache.camel.CamelExecutionException, CaughtExceptionMessage: Exception occurred during execution on the exchange: Exchange[]]
+[1] 2021-04-13 10:33:41,375 INFO  [ok] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Producing message #11]
 ```
-[1] 2021-03-16 15:11:33,099 INFO  [error-sink] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: ERROR ERROR!]
-[1] 2021-03-16 15:11:33,988 INFO  [error-sink] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: ERROR ERROR!]
-[1] 2021-03-16 15:11:34,988 INFO  [error-sink] (Camel (camel-1) thread #0 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: String, Body: ERROR ERROR!]
-```
\ No newline at end of file
+This example is useful to guide you through the configuration of an error handler. In a production environment you will likely configure the error handler with a `Dead Letter Channel` pointing to a persistent queue.
\ No newline at end of file
diff --git a/examples/kamelets/error-handler/timer-source.kamelet.yaml b/examples/kamelets/error-handler/timer-source.kamelet.yaml
deleted file mode 100644
index f837fb5..0000000
--- a/examples/kamelets/error-handler/timer-source.kamelet.yaml
+++ /dev/null
@@ -1,54 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-apiVersion: camel.apache.org/v1alpha1
-kind: Kamelet
-metadata:
-  name: timer-source
-  annotations:
-    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gU3ZnIFZlY3RvciBJY29ucyA6IGh0dHA6Ly93d3cub25saW5ld2ViZm9udHMuY29tL2ljb24gLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm [...]
-  labels:
-    camel.apache.org/kamelet.type: "source"
-spec:
-  definition:
-    title: "Timer Source"
-    description: "Produces periodic events with a custom payload"
-    required:
-      - message
-    properties:
-      period:
-        title: Period
-        description: The interval between two events
-        type: integer
-        default: 1000
-      message:
-        title: Message
-        description: The message to generate
-        type: string
-        example: "hello world"
-  types:
-    out:
-      mediaType: text/plain
-  flow:
-    from:
-      uri: timer:tick
-      parameters:
-        period: "{{period}}"
-      steps:
-      - set-body:
-          constant: "{{message}}"
-      - to: "kamelet:sink"